欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java實(shí)現(xiàn)掃雷游戲控制臺(tái)版

 更新時(shí)間:2020年04月23日 11:30:22   作者:Leslie木葉  
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)掃雷游戲控制臺(tái)版,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(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í)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • springboot項(xiàng)目中實(shí)現(xiàn)訪問druid內(nèi)置監(jiān)控頁面

    springboot項(xiàng)目中實(shí)現(xiàn)訪問druid內(nèi)置監(jiān)控頁面

    這篇文章主要介紹了springboot項(xiàng)目中實(shí)現(xiàn)訪問druid內(nèi)置監(jiān)控頁面的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • mybatisplus實(shí)現(xiàn)自動(dòng)創(chuàng)建/更新時(shí)間的項(xiàng)目實(shí)踐

    mybatisplus實(shí)現(xiàn)自動(dòng)創(chuàng)建/更新時(shí)間的項(xiàng)目實(shí)踐

    Mybatis-Plus提供了自動(dòng)填充功能,可以通過實(shí)現(xiàn)MetaObjectHandler接口來實(shí)現(xiàn)自動(dòng)更新時(shí)間的功能,本文就來介紹一下mybatisplus實(shí)現(xiàn)自動(dòng)創(chuàng)建/更新時(shí)間的項(xiàng)目實(shí)踐,感興趣的可以了解下
    2024-01-01
  • Java文件拒絕訪問問題及解決

    Java文件拒絕訪問問題及解決

    這篇文章主要介紹了Java文件拒絕訪問問題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Java鎖競(jìng)爭(zhēng)導(dǎo)致sql慢日志原因分析

    Java鎖競(jìng)爭(zhēng)導(dǎo)致sql慢日志原因分析

    這篇文章主要介紹了Java鎖競(jìng)爭(zhēng)導(dǎo)致sql慢的日志原因分析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2022-11-11
  • Mybatis攔截器注解@Intercepts與@Signature注解使用

    Mybatis攔截器注解@Intercepts與@Signature注解使用

    本文主要介紹了Mybatis攔截器注解@Intercepts與@Signature注解使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-07-07
  • Java GraphQL數(shù)據(jù)加載器批處理的實(shí)現(xiàn)詳解

    Java GraphQL數(shù)據(jù)加載器批處理的實(shí)現(xiàn)詳解

    GraphQL 數(shù)據(jù)加載器是優(yōu)化 GraphQL API 的關(guān)鍵組件,旨在解決臭名昭著的 N+1 查詢問題,在本中,我們將深入研究其批處理功能,感興趣的小伙伴可以了解下
    2023-12-12
  • springboot集成測(cè)試最小化依賴實(shí)踐示例

    springboot集成測(cè)試最小化依賴實(shí)踐示例

    這篇文章主要為大家介紹了springboot集成測(cè)試最小化依賴實(shí)踐示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • Java實(shí)現(xiàn)提取QSV文件視頻內(nèi)容

    Java實(shí)現(xiàn)提取QSV文件視頻內(nèi)容

    QSV是一種加密的視頻文件格式。是愛奇藝公司研發(fā)的一種視頻文件格式,這篇文章主要為大家介紹了如何利用Java實(shí)現(xiàn)提取QSV文件視頻內(nèi)容,感興趣的可以了解一下
    2023-03-03
  • Java 隨機(jī)取字符串的工具類

    Java 隨機(jī)取字符串的工具類

    隨機(jī)數(shù)在實(shí)際中使用很廣泛,比如要隨即生成一個(gè)固定長(zhǎng)度的字符串、數(shù)字?;蛘唠S即生成一個(gè)不定長(zhǎng)度的數(shù)字、或者進(jìn)行一個(gè)模擬的隨機(jī)選擇等等。Java提供了最基本的工具,可以幫助開發(fā)者來實(shí)現(xiàn)這一切
    2014-01-01
  • Java微信分享接口開發(fā)詳解

    Java微信分享接口開發(fā)詳解

    這篇文章主要為大家詳細(xì)介紹了Java微信分享接口開發(fā)的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-04-04

最新評(píng)論