java類與對(duì)象案例之打字游戲
類與對(duì)象案例-童年回憶之打字游戲
一、玩家類
二、等級(jí)類
三、游戲類
四、等級(jí)地圖
五、測(cè)試類
這次要做的案例是一個(gè)打字游戲的案例,相信大家小時(shí)候都玩過(guò)金山打字通的警察抓小偷和飛機(jī)大戰(zhàn),這次的案例是類似的簡(jiǎn)易版。
首先對(duì)于這個(gè)案例,我們要解決的是如何生成隨機(jī)的字符串,如何判斷生成的字符串和輸入的字符串是否相等。
一、玩家類
package com.yc.oop6.hc0705;
public class Player {
private int score; //積分
private long startTime; //各級(jí)別的開(kāi)始時(shí)間
private long dis; //每次闖關(guān)剩余時(shí)間
private int levelNo; //級(jí)別號(hào)碼
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
public long getStartTime() {
return startTime;
}
public void setStartTime(long startTime) {
this.startTime = startTime;
}
public int getLevelNo() {
return levelNo;
}
public void setLevelNo(int levelNo) {
this.levelNo = levelNo;
}
public Player(int score, long startTime, int levelNo) {
super();
this.score = score;
this.startTime = startTime;
this.levelNo = levelNo;
}
public Player() {
super();
}
public long getDis() {
return dis;
}
public void setDis(long dis) {
this.dis = dis;
}
}
二、等級(jí)類
package com.yc.oop6.hc0705;
public class Level {
private int levelNo; //第幾關(guān)
private int strLength; //字符串長(zhǎng)度
private int strTime; //需要輸入的次數(shù)
private int timeLimit; //時(shí)間限制
private int score; //答對(duì)一次獲得的積分
public int getLevelNo() {
return levelNo;
}
public int getStrLength() {
return strLength;
}
public int getStrTime() {
return strTime;
}
public int getTimeLimit() {
return timeLimit;
}
public int getScore() {
return score;
}
public Level(int levelNo, int strLength, int strTime, int timeLimit, int score) {
super();
this.levelNo = levelNo;
this.strLength = strLength;
this.strTime = strTime;
this.timeLimit = timeLimit;
this.score = score;
}
public Level() {
super();
}
}
三、游戲類
package com.yc.oop6.hc0705;
import java.util.Random;
import java.util.Scanner;
public class Game {
private Player player;
private Random r = new Random();
private Scanner sc = new Scanner(System.in) ;
public Game(Player player) {
this.player = player;
}
//開(kāi)始游戲
public void startGame() {
System.out.println("游戲開(kāi)始");
//開(kāi)始闖關(guān)
for(int i = 0; i < Levels.ls.length; i++) {
System.out.println("開(kāi)始進(jìn)入第" + (i+1) + "關(guān)");
//每一關(guān)的開(kāi)始在這里
player.setLevelNo(player.getLevelNo() + 1);
player.setStartTime(System.currentTimeMillis());
//循環(huán),這一關(guān)要輸入多少次
for(int j = 0 ; j < Levels.ls[player.getLevelNo() - 1].getStrTime() ; j++ ) {
String out = printStr();
System.out.println(out);
String in = sc.nextLine();
boolean flag = result(in, out);
if(flag == false) {
System.exit(1);;
}
}
//每剩下1s 增加20分
player.setScore(player.getScore() + (int)player.getDis() * 20);
System.out.println("完成第" + (i+1) + "關(guān),您現(xiàn)在的積分為:" + player.getScore());
System.out.println("進(jìn)入下一關(guān)");
}
}
//隨機(jī)字符串
public String printStr( ) {
String str = "";
double rNum = 0;
for(int i = 0; i < Levels.ls[player.getLevelNo()-1].getStrLength(); i++ ) {
rNum = r.nextDouble();
if(rNum < 0.3333) {
str += (r.nextInt(9)+1);
}else if(rNum < 0.6667){
str += (char)(r.nextInt(26)+65);
}else {
str += (char)(r.nextInt(26)+97);
}
}
return str;
}
//字符串對(duì)比
public boolean result(String in, String out) {
//字符串判斷
if(out.equals(in)) {
//先獲取一下當(dāng)前的系統(tǒng)時(shí)間
long endTimes = System.currentTimeMillis();
long startTimes = player.getStartTime();
//獲得下一關(guān)的時(shí)間
long dis = Levels.ls[player.getLevelNo() -1 ].getTimeLimit();
if((endTimes - startTimes)/1000 > dis) {
System.out.println("游戲超時(shí),游戲結(jié)束,您的最終得分為:" + player.getScore());
return false;
}else {
//輸入正確,且沒(méi)有超時(shí)
//加積分
int score = Levels.ls[player.getLevelNo()].getScore();
player.setDis(dis - (endTimes - startTimes)/1000);
player.setScore(player.getScore() + score );
System.out.println("輸入正確,您現(xiàn)在的積分為:"+ player.getScore() +" ,這一關(guān)您還有: " + player.getDis() + " 秒鐘");
return true;
}
}else {
System.out.println("輸入錯(cuò)誤,游戲結(jié)束,您的最終得分為:" + player.getScore());
return false;//輸入錯(cuò)誤
}
}
}
四、等級(jí)地圖
package com.yc.oop6.hc0705;
public class Levels {
//定義一個(gè)靜態(tài)的對(duì)象數(shù)組
public static Level ls[] = new Level[7];
static {
ls[0] = new Level(1,2,5,20,10);
ls[1] = new Level(2,3,5,18,20);
ls[2] = new Level(3,4,4,16,30);
ls[3] = new Level(4,5,4,15,40);
ls[4] = new Level(5,6,4,15,50);
ls[5] = new Level(6,7,3,15,60);
ls[6] = new Level(7,8,3,15,70);
}
}
五、測(cè)試類
package com.yc.oop6.hc0705;
public class Test {
public static void main(String[] args) {
Player p = new Player();
Game g = new Game(p);
g.startGame();
}
}
詳細(xì)的解釋都在代碼的注釋里了,大家細(xì)品。
更多有趣的經(jīng)典小游戲?qū)崿F(xiàn)專題,分享給大家:
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Ribbon負(fù)載均衡服務(wù)調(diào)用的示例詳解
Rbbo其實(shí)就是一個(gè)軟負(fù)載均衡的客戶端組件,他可以和其他所需請(qǐng)求的客戶端結(jié)合使用,這篇文章主要介紹了Ribbon負(fù)載均衡服務(wù)調(diào)用案例代碼,需要的朋友可以參考下2023-01-01
在實(shí)踐中了解Java反射機(jī)制應(yīng)用
當(dāng)程序運(yùn)行時(shí),允許改變程序結(jié)構(gòu)或變量類型,這種語(yǔ)言稱為動(dòng)態(tài)語(yǔ)言。我們認(rèn)為java并不是動(dòng)態(tài)語(yǔ)言,但是它卻有一個(gè)非常突出的動(dòng)態(tài)相關(guān)機(jī)制,俗稱:反射。下面我們來(lái)簡(jiǎn)單學(xué)習(xí)一下吧2019-05-05
Spring Cloud Alibaba和Dubbo融合實(shí)現(xiàn)
這篇文章主要介紹了Spring Cloud Alibaba和Dubbo融合實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04
SpringBoot2零基礎(chǔ)到精通之映射與常用注解請(qǐng)求處理
SpringBoot是一種整合Spring技術(shù)棧的方式(或者說(shuō)是框架),同時(shí)也是簡(jiǎn)化Spring的一種快速開(kāi)發(fā)的腳手架,本篇讓我們一起學(xué)習(xí)映射、常用注解和方法參數(shù)的小技巧2022-03-03
SpringBoot在一定時(shí)間內(nèi)限制接口請(qǐng)求次數(shù)的實(shí)現(xiàn)示例
在項(xiàng)目中,接口的暴露在外面,很多人就會(huì)惡意多次快速請(qǐng)求,本文主要介紹了SpringBoot在一定時(shí)間內(nèi)限制接口請(qǐng)求次數(shù)的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2022-03-03
Idea servlet映射方法優(yōu)缺點(diǎn)對(duì)比
這篇文章主要介紹了Idea servlet映射方法優(yōu)缺點(diǎn)對(duì)比,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11
easycode配置成mybatis-plus模板的實(shí)現(xiàn)方法
本文主要介紹了easycode配置成mybatis-plus模板的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
SpringBoot實(shí)現(xiàn)多端口監(jiān)聽(tīng)的代碼示例
當(dāng)你需要在同一個(gè)Spring Boot應(yīng)用中,通過(guò)不同的端口來(lái)提供不同的服務(wù)或功能時(shí),就需要實(shí)現(xiàn)多端口監(jiān)聽(tīng),所以本文給大家介紹了SpringBoot實(shí)現(xiàn)多端口監(jiān)聽(tīng)的方法示例,并有相關(guān)的代碼示例供大家參考,需要的朋友可以參考下2024-09-09
Springboot 中使用 Aop代碼實(shí)戰(zhàn)教程
AOP的編程思想是把對(duì)類對(duì)象的橫切問(wèn)題點(diǎn),從業(yè)務(wù)邏輯中分離出來(lái),從而達(dá)到解耦的目的,增加代碼的復(fù)用性,提高開(kāi)發(fā)效率,這篇文章主要介紹了Springboot中使用Aop代碼實(shí)戰(zhàn)教程,需要的朋友可以參考下2023-07-07

