java實(shí)現(xiàn)掃雷游戲控制臺(tái)版
本文實(shí)例為大家分享了java實(shí)現(xiàn)掃雷游戲控制臺(tái)版,供大家參考,具體內(nèi)容如下
掃雷游戲
a、游戲的分析
在游戲中需要存在對(duì)象包含哪些。格子對(duì)象(Grid):屬性:內(nèi)容(content)、狀態(tài)(type)
b、工程架構(gòu)
設(shè)計(jì)工程包結(jié)構(gòu)bean:存放實(shí)體類core:游戲核心類(游戲操作)test:掃雷玩的測(cè)試類
c、編寫類
Grid(屬性:content、type)Core類?游戲核心類(雷區(qū)創(chuàng)建、顯示雷區(qū)、布雷、踩雷)Test類?測(cè)試類
d、核心類設(shè)計(jì)
1、格子對(duì)象創(chuàng)建方法定義2、顯示雷區(qū)方法定義3、布雷方法定義
隨機(jī)數(shù)工具:
Random r=new Random();//獲得整數(shù)類型的隨機(jī)數(shù)int x=r.nextInt(參數(shù));參數(shù)表示隨機(jī)值范圍?>9
4、八個(gè)方向?qū)ο蟮姆椒ǘx
Point類:java中提供的坐標(biāo)對(duì)象類 x,y
5、設(shè)置雷數(shù)的方法
通過遍歷所有格子對(duì)象獲取雷數(shù)的添加
6、踩雷
遞歸調(diào)用:在一個(gè)類的方法中實(shí)現(xiàn)當(dāng)前方法調(diào)用自己的操作方式1)、通過傳入一個(gè)坐標(biāo)獲取當(dāng)前坐標(biāo)位置的格子對(duì)象內(nèi)容,判斷內(nèi)容的類型完成游戲操作1)、內(nèi)容為雷 -->游戲結(jié)束2)、內(nèi)容位數(shù)字 -->顯示當(dāng)前格子內(nèi)容3)、內(nèi)容為空白 -->通過當(dāng)前位置實(shí)現(xiàn)空白的輻射操作(遞歸調(diào)用)
7、游戲勝利
1)、方法的返回類型2)、test類中循環(huán)的結(jié)構(gòu)(break)
掃雷實(shí)體類
package minersgame.bean;/** * 格子實(shí)體類 * @author 木葉 *擁有格子的內(nèi)容和狀態(tài)屬性 */public class Grid { //定義格子的私有屬性 private char content; private boolean type; public char getContent() { return content; } public void setContent(char content) { this.content = content; } public boolean isType() { return type; } public void setType(boolean type) { this.type = type; }}
核心代碼
package minersgame.core;import java.awt.Point;import java.util.Random;import minersgame.bean.Grid;/** * 游戲核心類 * @author 木葉 *包含游戲核心的功能:雷區(qū)制定、布雷實(shí)現(xiàn)、踩雷操作、顯示雷區(qū)、獲取方向、設(shè)置雷數(shù)、踩雷、顯示勝利 */public class Core { //定義一個(gè)存放格子對(duì)象的二維數(shù)組完成雷區(qū)的保存 Grid[][] grid=new Grid[9][9]; //定義雷數(shù)的屬性 int count=10; int count2 = count; //定義一個(gè)屬性獲取當(dāng)前狀態(tài) public boolean state=true; //定義一個(gè)創(chuàng)建格子對(duì)象的方法,完成雷區(qū)中所有格子對(duì)象的創(chuàng)建 public void createGrid() { //通過二維數(shù)組實(shí)現(xiàn)每個(gè)下標(biāo)中添加格子對(duì)象 for(int i=0;i<grid.length;i++) { for(int j=0;j<grid[i].length;j++) { //創(chuàng)建格子對(duì)象完成二維數(shù)組下標(biāo)數(shù)據(jù)存放 grid[i][j]=new Grid(); //設(shè)置格子對(duì)象中的屬性內(nèi)容 grid[i][j].setContent(’ ’); grid[i][j].setType(false); } } } //定義一個(gè)布雷的方法 public void setMines() { //定義隨機(jī)數(shù)工具 Random r=new Random(); //通過隨機(jī)方式獲取隨機(jī)坐標(biāo) do { //獲得x坐標(biāo) int x=r.nextInt(9); //獲得y坐標(biāo) int y=r.nextInt(9); //判斷當(dāng)前隨機(jī)位置的格子對(duì)象內(nèi)容是否為雷,如果是雷就進(jìn)入下次循環(huán) if(grid[x][y].getContent()!=’*’) { //通過x和y獲得當(dāng)前位置的格子對(duì)象 grid[x][y].setContent(’*’); //實(shí)現(xiàn)數(shù)量自減 count--; } }while(count>0) ; } //定義顯示雷區(qū)的方法 public void show() { //通過遍歷二維數(shù)組獲得所有的格子個(gè)數(shù) System.out.println('xy 0 1 2 3 4 5 6 7 8'); for(int i=0;i<grid.length;i++) { System.out.print(i+' '); for(int j=0;j<grid[i].length;j++){ // if(grid[i][j].isType() ){ System.out.print(grid[i][j].getContent()+' '); }else { System.out.print('■ '); } } System.out.println(); } } //定義坐標(biāo)獲取的方法 --獲得8個(gè)方向的坐標(biāo)對(duì)象方法 public Point[] getPoint(int x,int y) {//超過一個(gè)以上的返回要用數(shù)組 //定義一個(gè)坐標(biāo)對(duì)象數(shù)組 Point[] point=new Point[8]; //左邊 point[0]=new Point(x-1,y); //左上 point[1]=new Point(x-1,y-1); //上邊 point[2]=new Point(x,y-1); //右上 point[3]=new Point(x+1,y-1); //右邊 point[4]=new Point(x+1,y); //右下 point[5]=new Point(x+1,y+1); //下邊 point[6]=new Point(x,y+1); //左下 point[7]=new Point(x-1,y+1); return point; }//定義一個(gè)設(shè)置雷數(shù)的方法 public void setMinesNumber() { //通過循環(huán)獲得所有的格子對(duì)象 for(int i=0;i<grid.length;i++) { for(int j=0;j<grid[i].length;j++) { //定義一個(gè)統(tǒng)計(jì)類屬的變量 int sum=0; //判斷當(dāng)前格子對(duì)象內(nèi)容是否為雷,如果是雷就進(jìn)入下次獲取,否則完成雷數(shù)統(tǒng)計(jì) if(grid[i][j].getContent()!=’*’) { //通過當(dāng)前的坐標(biāo)獲取八個(gè)方向坐標(biāo)對(duì)象 Point[] p=this.getPoint(i, j); //通過坐標(biāo)對(duì)象數(shù)組獲取對(duì)應(yīng)下標(biāo)格子對(duì)象 for(int k=0;k<p.length;k++) { //獲得每個(gè)坐標(biāo)對(duì)象 Point point=p[k]; //通過判斷過去的8個(gè)方向位置是否越界 if(point.x>=0&&point.x<9&&point.y>=0&&point.y<9) { //通過當(dāng)前方向坐標(biāo)獲取位置上的格子對(duì)象 if( grid[point.x][point.y].getContent()==’*’) { sum++;//雷數(shù)自增 } } } //通過雷數(shù)統(tǒng)計(jì)變量確定是否有雷存在,如果有就將當(dāng)前 //雷數(shù)添加到當(dāng)前位置的格子對(duì)象中 if(sum>0) { //在當(dāng)前格子對(duì)象中添加雷數(shù) grid[i][j].setContent((char)(48+sum)); } } } } } //定義一個(gè)踩雷踩雷 public void stampMine(int x,int y) { //開啟當(dāng)前格子狀態(tài)為打開 grid[x][y].setType(true); //判斷當(dāng)前坐標(biāo)位置的格子內(nèi)容是否為雷,如果是雷就結(jié)束否則就繼續(xù) if(grid[x][y].getContent()!=’*’) { //判斷當(dāng)前格子對(duì)象是否為數(shù)字,如果為數(shù)字就不操作 if(grid[x][y].getContent()==’ ’) { //獲得當(dāng)前格子周圍8個(gè)方向的坐標(biāo)對(duì)象 Point[] p=this.getPoint(x, y); //循環(huán)遍歷8個(gè)方向獲得對(duì)應(yīng)的格子對(duì)象 for(int k=0;k<p.length;k++) { //分別獲得的方向?qū)ο?Point point=p[k]; //判斷是否越界 if(point.x>=0&&point.x<9&&point.y>=0&&point.y<9) { /** * 判斷當(dāng)前坐標(biāo)對(duì)象對(duì)應(yīng)的格子對(duì)象內(nèi)容是否為空格, * 如果是空格實(shí)現(xiàn)遞歸調(diào)用,如果是數(shù)字就開啟當(dāng)前格子 */ if(grid[point.x][point.y].getContent()==’ ’&&grid[point.x][point.y].isType()==false) { //當(dāng)前格子為空格的情況 this.stampMine(point.x, point.y); }else { //當(dāng)前格子為數(shù)字的情況 grid[point.x][point.y].setType(true); } } } } }else { System.out.println('踩雷了,游戲結(jié)束!!!'); //修改游戲狀態(tài) state=false; //顯示出所有格子 for(int i=0;i<grid.length;i++) { for(int j=0;j<grid[i].length;j++) { grid[i][j].setType(true); } } } } //定義一個(gè)游戲勝利的方法 public boolean getVictory(){ //為打開格子數(shù) int number=0; //使用循環(huán)得出格子總數(shù) //使用循環(huán)得出打開格子總數(shù) for(int i=0;i<grid.length;i++) { for(int j=0;j<grid[i].length;j++) { if(!grid[i][j].isType()) { number++; } } } //判斷未打開鴿子數(shù)師傅等于雷數(shù),是則預(yù)習(xí)成功,不是進(jìn)入下次 if(number==count2) { for(int i=0;i<grid.length;i++) { for(int j=0;j<grid[i].length;j++) { grid[i][j].setType(true); } } System.out.println('游戲勝利!!!掃雷成功!!!'); return false; }else { return true; } } }
測(cè)試類
package minersgame.test;import java.util.Scanner;import minersgame.core.Core;public class Test { public static void main(String[] args) { /* * 實(shí)現(xiàn)游戲核心 */ //獲得游戲核心類對(duì)象 Core c=new Core(); c.createGrid(); c.setMines(); //顯示 c.show(); //添加雷數(shù) c.setMinesNumber(); Scanner scan=new Scanner(System.in); while(c.state){ System.out.println('請(qǐng)輸入X坐標(biāo):'); int x=scan.nextInt(); System.out.println('請(qǐng)輸入Y坐標(biāo):'); int y=scan.nextInt(); //調(diào)用踩雷方法 c.stampMine(x, y); //顯示雷區(qū)方法 c.show(); //判斷是否游戲勝利 if(c.getVictory()) { }else { c.show(); break; } } }}
更多精彩游戲,請(qǐng)參考專題《java經(jīng)典小游戲》
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. python excel和yaml文件的讀取封裝2. moment轉(zhuǎn)化時(shí)間戳出現(xiàn)Invalid Date的問題及解決3. python爬蟲實(shí)戰(zhàn)之制作屬于自己的一個(gè)IP代理模塊4. Android Studio插件5. Python內(nèi)存映射文件讀寫方式6. idea重置默認(rèn)配置的方法步驟7. php實(shí)現(xiàn)當(dāng)前用戶在線人數(shù)8. .net6 在中標(biāo)麒麟下的安裝和部署過程9. java——Byte類/包裝類的使用說(shuō)明10. Java CountDownLatch應(yīng)用場(chǎng)景代碼實(shí)例
