java實現(xiàn)掃雷游戲控制臺版
本文實例為大家分享了java實現(xiàn)掃雷游戲控制臺版,供大家參考,具體內(nèi)容如下
掃雷游戲
a、游戲的分析
在游戲中需要存在對象包含哪些。
格子對象(Grid):
屬性:內(nèi)容(content)、狀態(tài)(type)
b、工程架構(gòu)
設計工程包結(jié)構(gòu)
bean:存放實體類
core:游戲核心類(游戲操作)
test:掃雷玩的測試類
c、編寫類
Grid(屬性:content、type)
Core類–游戲核心類(雷區(qū)創(chuàng)建、顯示雷區(qū)、布雷、踩雷)
Test類–測試類
d、核心類設計
1、格子對象創(chuàng)建方法定義
2、顯示雷區(qū)方法定義
3、布雷方法定義
隨機數(shù)工具:
Random r=new Random();
//獲得整數(shù)類型的隨機數(shù)
int x=r.nextInt(參數(shù));參數(shù)表示隨機值范圍–>9
4、八個方向?qū)ο蟮姆椒ǘx
Point類:java中提供的坐標對象類 x,y
5、設置雷數(shù)的方法
通過遍歷所有格子對象獲取雷數(shù)的添加
6、踩雷
遞歸調(diào)用:在一個類的方法中實現(xiàn)當前方法調(diào)用自己的操作方式
1)、通過傳入一個坐標獲取當前坐標位置的格子對象內(nèi)容,判斷內(nèi)容的類型完成游戲操作
1)、內(nèi)容為雷 -->游戲結(jié)束
2)、內(nèi)容位數(shù)字 -->顯示當前格子內(nèi)容
3)、內(nèi)容為空白 -->通過當前位置實現(xiàn)空白的輻射操作(遞歸調(diào)用)
7、游戲勝利
1)、方法的返回類型
2)、test類中循環(huán)的結(jié)構(gòu)(break)
掃雷實體類
package minersgame.bean;
/**
* 格子實體類
* @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ū)制定、布雷實現(xiàn)、踩雷操作、顯示雷區(qū)、獲取方向、設置雷數(shù)、踩雷、顯示勝利
*/
public class Core {
//定義一個存放格子對象的二維數(shù)組完成雷區(qū)的保存
Grid[][] grid=new Grid[9][9];
//定義雷數(shù)的屬性
int count=10;
int count2 = count;
//定義一個屬性獲取當前狀態(tài)
public boolean state=true;
//定義一個創(chuàng)建格子對象的方法,完成雷區(qū)中所有格子對象的創(chuàng)建
public void createGrid() {
//通過二維數(shù)組實現(xiàn)每個下標中添加格子對象
for(int i=0;i<grid.length;i++) {
for(int j=0;j<grid[i].length;j++) {
//創(chuàng)建格子對象完成二維數(shù)組下標數(shù)據(jù)存放
grid[i][j]=new Grid();
//設置格子對象中的屬性內(nèi)容
grid[i][j].setContent(' ');
grid[i][j].setType(false);
}
}
}
//定義一個布雷的方法
public void setMines() {
//定義隨機數(shù)工具
Random r=new Random();
//通過隨機方式獲取隨機坐標
do {
//獲得x坐標
int x=r.nextInt(9);
//獲得y坐標
int y=r.nextInt(9);
//判斷當前隨機位置的格子對象內(nèi)容是否為雷,如果是雷就進入下次循環(huán)
if(grid[x][y].getContent()!='*') {
//通過x和y獲得當前位置的格子對象
grid[x][y].setContent('*');
//實現(xiàn)數(shù)量自減
count--;
}
}while(count>0) ;
}
//定義顯示雷區(qū)的方法
public void show() {
//通過遍歷二維數(shù)組獲得所有的格子個數(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();
}
}
//定義坐標獲取的方法 --獲得8個方向的坐標對象方法
public Point[] getPoint(int x,int y) {//超過一個以上的返回要用數(shù)組
//定義一個坐標對象數(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;
}
//定義一個設置雷數(shù)的方法
public void setMinesNumber() {
//通過循環(huán)獲得所有的格子對象
for(int i=0;i<grid.length;i++) {
for(int j=0;j<grid[i].length;j++) {
//定義一個統(tǒng)計類屬的變量
int sum=0;
//判斷當前格子對象內(nèi)容是否為雷,如果是雷就進入下次獲取,否則完成雷數(shù)統(tǒng)計
if(grid[i][j].getContent()!='*') {
//通過當前的坐標獲取八個方向坐標對象
Point[] p=this.getPoint(i, j);
//通過坐標對象數(shù)組獲取對應下標格子對象
for(int k=0;k<p.length;k++) {
//獲得每個坐標對象
Point point=p[k];
//通過判斷過去的8個方向位置是否越界
if(point.x>=0&&point.x<9&&point.y>=0&&point.y<9) {
//通過當前方向坐標獲取位置上的格子對象
if( grid[point.x][point.y].getContent()=='*') {
sum++;//雷數(shù)自增
}
}
}
//通過雷數(shù)統(tǒng)計變量確定是否有雷存在,如果有就將當前
//雷數(shù)添加到當前位置的格子對象中
if(sum>0) {
//在當前格子對象中添加雷數(shù)
grid[i][j].setContent((char)(48+sum));
}
}
}
}
}
//定義一個踩雷踩雷
public void stampMine(int x,int y) {
//開啟當前格子狀態(tài)為打開
grid[x][y].setType(true);
//判斷當前坐標位置的格子內(nèi)容是否為雷,如果是雷就結(jié)束否則就繼續(xù)
if(grid[x][y].getContent()!='*') {
//判斷當前格子對象是否為數(shù)字,如果為數(shù)字就不操作
if(grid[x][y].getContent()==' ') {
//獲得當前格子周圍8個方向的坐標對象
Point[] p=this.getPoint(x, y);
//循環(huán)遍歷8個方向獲得對應的格子對象
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) {
/**
* 判斷當前坐標對象對應的格子對象內(nèi)容是否為空格,
* 如果是空格實現(xiàn)遞歸調(diào)用,如果是數(shù)字就開啟當前格子
*/
if(grid[point.x][point.y].getContent()==' '&&grid[point.x][point.y].isType()==false) {
//當前格子為空格的情況
this.stampMine(point.x, point.y);
}else {
//當前格子為數(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);
}
}
}
}
//定義一個游戲勝利的方法
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ù),是則預習成功,不是進入下次
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;
}
}
}
測試類
package minersgame.test;
import java.util.Scanner;
import minersgame.core.Core;
public class Test {
public static void main(String[] args) {
/*
* 實現(xiàn)游戲核心
*/
//獲得游戲核心類對象
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("請輸入X坐標:");
int x=scan.nextInt();
System.out.println("請輸入Y坐標:");
int y=scan.nextInt();
//調(diào)用踩雷方法
c.stampMine(x, y);
//顯示雷區(qū)方法
c.show();
//判斷是否游戲勝利
if(c.getVictory()) {
}else {
c.show();
break;
}
}
}
}
更多精彩游戲,請參考專題《java經(jīng)典小游戲》
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
springboot項目中實現(xiàn)訪問druid內(nèi)置監(jiān)控頁面
這篇文章主要介紹了springboot項目中實現(xiàn)訪問druid內(nèi)置監(jiān)控頁面的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06
mybatisplus實現(xiàn)自動創(chuàng)建/更新時間的項目實踐
Mybatis-Plus提供了自動填充功能,可以通過實現(xiàn)MetaObjectHandler接口來實現(xiàn)自動更新時間的功能,本文就來介紹一下mybatisplus實現(xiàn)自動創(chuàng)建/更新時間的項目實踐,感興趣的可以了解下2024-01-01
Mybatis攔截器注解@Intercepts與@Signature注解使用
本文主要介紹了Mybatis攔截器注解@Intercepts與@Signature注解使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2024-07-07
Java GraphQL數(shù)據(jù)加載器批處理的實現(xiàn)詳解
GraphQL 數(shù)據(jù)加載器是優(yōu)化 GraphQL API 的關鍵組件,旨在解決臭名昭著的 N+1 查詢問題,在本中,我們將深入研究其批處理功能,感興趣的小伙伴可以了解下2023-12-12

