java實(shí)現(xiàn)掃雷游戲
初學(xué)Java,寫了一個掃雷代碼來鍛煉一下自己的代碼能力。
一、代碼思路
代碼思路很重要,如果事先就想好了代碼思路,那么寫這一個代碼肯定是事半功倍,比在哪里瞎打要強(qiáng)不知道多少。
經(jīng)過思考,覺得可以創(chuàng)建一個二維數(shù)組來記錄情況
未翻開的牌:(統(tǒng)一顯示 █ )
數(shù)組的值 代表
-1 雷
0 旁邊沒有雷
1 旁邊有一個雷
以此類推
翻開的牌則:
if(a[x][y] == 9) System.out.print("?");
if(a[x][y] == 10) System.out.print("?");
if(a[x][y] == 11) System.out.print("①");
if(a[x][y] == 12) System.out.print("②");
if(a[x][y] == 13) System.out.print("③");
if(a[x][y] == 14) System.out.print("④");
if(a[x][y] == 15) System.out.print("⑤");
if(a[x][y] == 16) System.out.print("⑥");
if(a[x][y] == 17) System.out.print("⑦");
if(a[x][y] == 18) System.out.print("⑧");
二、代碼主題部分
注意不要越界和不要重復(fù)打開
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int x,y;
int a[][]=new int[10][20];
produce(a);
show(a);
while(true){
x=scanner.nextInt();y=scanner.nextInt();
if(x<=0||y<=0||x>10||y>20) {System.out.println("越界??!");continue;} //防止越界
if(a[x-1][y-1]>=10) {System.out.println("已開!?。?);continue;} //防止打開重復(fù)
if(bomb(a,x,y)) break;
draw(a,x,y);
show(a);
if(All(a)){ System.out.println("你避過了所有地雷?。?!");break; }
}
}
三、函數(shù)部分
1.顯示函數(shù)
打一個方格
public static void show(int a[][]) {
int lie = 0,x =0,y=0;
System.out.print(" ┃1 ");
for (short i = 2; i <= 20; i++){
if(i<9)System.out.print("┃"+i+" ");
else System.out.print("┃"+i);
}
System.out.println();
System.out.print(" ");
for (short i = 0; i <= 20; i++) { //輸出第一行
if (i == 0) System.out.print("┏─");
else if (i == 20) System.out.println("┓");
else System.out.print("┳─");
}
for (short i = 1; i < 2 * 10; i++) {
if (i % 2 == 0) {
System.out.print(" ");
for (short j = 0; j <= 20; j++) {
if (j == 0) System.out.print("┣─");
else if (j == 20) System.out.println("┫");
else System.out.print("╋─");
}
}
if (i % 2 == 1) {
if(lie+1 >= 10) System.out.print(lie+1);else System.out.print(" " + (lie+1));lie++;
for (short j = 0; j <= 2*20; j++) {
if (j % 2 == 0) System.out.print("┃");
else {
if(a[x][y] <= 8) System.out.print("█");
if(a[x][y] == 9) System.out.print("?");
if(a[x][y] == 10) System.out.print("?");
if(a[x][y] == 11) System.out.print("①");
if(a[x][y] == 12) System.out.print("②");
if(a[x][y] == 13) System.out.print("③");
if(a[x][y] == 14) System.out.print("④");
if(a[x][y] == 15) System.out.print("⑤");
if(a[x][y] == 16) System.out.print("⑥");
if(a[x][y] == 17) System.out.print("⑦");
if(a[x][y] == 18) System.out.print("⑧");
y++;
if(y>=20){
x++;y =0;
}
}
}
System.out.println();
}
}
System.out.print(" ");
for (short k = 0; k <= 20; k++) { //輸出最后一行
if (k == 0) System.out.print("┗─");
else if (k == 20) System.out.println("┛");
else System.out.print("┻─");
}
}
2.設(shè)置基本數(shù)據(jù)的函數(shù)
標(biāo)有 //雷 的是指雷的數(shù)量
public static void produce(int a[][]){
int random[] = new int[25]; //雷
Random random1 = new Random();
for(short i =0;i<25;){ //雷
short j = 0;
int t = random1.nextInt()%200+1;
if(t<0)t=-t;
for(;j<25;j++){ //雷
if(random[j]==t)break;
}
if(j==25){random[i]=t;i++;} //雷
}
java.util.Arrays.sort(random);
int x = 0;
System.out.println();
for(int i = 0; i<10;i++){ //地雷配置成功
for(int j = 0 ;j<20 ;j++){
if(x == 25)break; //雷
if((i*20)+j+1 == random[x])
{a[i][j]=-1;x++;}
}
}
//*************設(shè)置地雷周邊參數(shù)********************
for(short i = 0;i<10;i++){
for(short j = 0;j<20;j++){
if(a[i][j]==0){
int count=0;
if(i!=0&&j!=0&&a[i-1][j-1]==-1 ) count++; //左上
if(i!=0&&a[i-1][j]==-1 ) count++; //上
if(i!=0&&j<=18&&a[i-1][j+1]==-1 ) count++; //右上
if(j!=0&&a[i][j-1]==-1 ) count++; //左
if(j<=18&&a[i][j+1]==-1 ) count++; //右
if(i<=8&&j!=0&&a[i+1][j-1]==-1 ) count++; //左下
if(i<=8&&a[i+1][j]==-1 ) count++; //下
if(i<=8&&j<=18&&a[i+1][j+1]==-1 ) count++; //右下
a[i][j]=count;
}
}
}
}
3.翻牌函數(shù)
這個函數(shù)很簡單,卻也是精華所在,這個函數(shù)的作用就在點(diǎn)開一個牌,翻開一堆符合規(guī)則的牌。
public static void draw(int a[][],int x,int y){
a[x-1][y-1]+=10;
if(a[x-1][y-1]==10) {
if (x - 1 > 0 && y - 1 > 0 && a[x - 2][y - 2] < 10 && a[x - 2][y - 2] != -1) draw(a, x - 1, y - 1); //左上
if (x - 1 > 0 && a[x - 2][y - 1] < 10 && a[x - 2][y - 1] != -1) draw(a, x - 1, y); //上
if (x - 1 > 0 && y - 1 < 19 && a[x - 2][y] < 10 && a[x - 2][y] != -1) draw(a, x - 1, y + 1); //右上
if (y - 1 > 0 && a[x - 1][y - 2] < 10 && a[x - 1][y - 2] != -1) draw(a, x, y - 1); //zuo
if (y - 1 <= 18 && a[x - 1][y] < 10 && a[x - 1][y] != -1) draw(a, x, y + 1); //you
if (x - 1 < 9 && y - 1 > 0 && a[x][y - 2] < 10 && a[x][y - 2] != -1) draw(a, x + 1, y - 1); //zuo xia
if (x - 1 < 9 && a[x][y - 1] < 10 && a[x][y - 1] != -1) draw(a, x + 1, y);//xia
if (x - 1 < 9 && y - 1 < 19 && a[x][y] < 10 && a[x][y] != -1) draw(a, x + 1, y + 1);//you xia
}
}
4.踩雷爆炸部分
public static boolean bomb(int a[][],int x ,int y){
if(a[x-1][y-1]==-1){
for(int i =0;i<10;i++){
for(int j = 0 ;j<20;j++){
if(a[i][j]==-1)a[i][j]+=10;
}
}
show(a);
System.out.println("踩雷了?。?!");
return true;}else return false;
}
5.判斷是否掃雷干凈部分
public static boolean All(int a[][]){
int i,j=0,t=0;
for(i =0;i<10;i++){
for(j = 0 ;j<20;j++){
if(a[i][j]<10) t++;
if(t>25)break; //雷
}
}
if(t==25)return true;else return false; //雷
}
以上就是全部內(nèi)容了。
下面粘貼一下效果圖和完整代碼

完整代碼:
import java.util.Random;
import java.util.Scanner;
public class 掃雷 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int x,y;
int a[][]=new int[10][20];
produce(a);
show(a);
while(true){
x=scanner.nextInt();y=scanner.nextInt();
if(x<=0||y<=0||x>10||y>20) {System.out.println("越界?。?);continue;} //防止越界
if(a[x-1][y-1]>=10) {System.out.println("已開?。?!");continue;} //防止打開重復(fù)
if(bomb(a,x,y)) break;
draw(a,x,y);
show(a);
if(All(a)){ System.out.println("你避過了所有地雷!??!");break; }
}
}
public static void show(int a[][]) {
int lie = 0,x =0,y=0;
System.out.print(" ┃1 ");
for (short i = 2; i <= 20; i++){
if(i<9)System.out.print("┃"+i+" ");
else System.out.print("┃"+i);
}
System.out.println();
System.out.print(" ");
for (short i = 0; i <= 20; i++) { //輸出第一行
if (i == 0) System.out.print("┏─");
else if (i == 20) System.out.println("┓");
else System.out.print("┳─");
}
for (short i = 1; i < 2 * 10; i++) {
if (i % 2 == 0) {
System.out.print(" ");
for (short j = 0; j <= 20; j++) {
if (j == 0) System.out.print("┣─");
else if (j == 20) System.out.println("┫");
else System.out.print("╋─");
}
}
if (i % 2 == 1) {
if(lie+1 >= 10) System.out.print(lie+1);else System.out.print(" " + (lie+1));lie++;
for (short j = 0; j <= 2*20; j++) {
if (j % 2 == 0) System.out.print("┃");
else {
if(a[x][y] <= 8) System.out.print("█");
if(a[x][y] == 9) System.out.print("?");
if(a[x][y] == 10) System.out.print("?");
if(a[x][y] == 11) System.out.print("①");
if(a[x][y] == 12) System.out.print("②");
if(a[x][y] == 13) System.out.print("③");
if(a[x][y] == 14) System.out.print("④");
if(a[x][y] == 15) System.out.print("⑤");
if(a[x][y] == 16) System.out.print("⑥");
if(a[x][y] == 17) System.out.print("⑦");
if(a[x][y] == 18) System.out.print("⑧");
y++;
if(y>=20){
x++;y =0;
}
}
}
System.out.println();
}
}
System.out.print(" ");
for (short k = 0; k <= 20; k++) { //輸出最后一行
if (k == 0) System.out.print("┗─");
else if (k == 20) System.out.println("┛");
else System.out.print("┻─");
}
}
public static void produce(int a[][]){
int random[] = new int[25]; //雷
Random random1 = new Random();
for(short i =0;i<25;){ //雷
short j = 0;
int t = random1.nextInt()%200+1;
if(t<0)t=-t;
for(;j<25;j++){ //雷
if(random[j]==t)break;
}
if(j==25){random[i]=t;i++;} //雷
}
java.util.Arrays.sort(random);
int x = 0;
System.out.println();
for(int i = 0; i<10;i++){ //地雷配置成功
for(int j = 0 ;j<20 ;j++){
if(x == 25)break; //雷
if((i*20)+j+1 == random[x])
{a[i][j]=-1;x++;}
}
}
//*************設(shè)置地雷周邊參數(shù)********************
for(short i = 0;i<10;i++){
for(short j = 0;j<20;j++){
if(a[i][j]==0){
int count=0;
if(i!=0&&j!=0&&a[i-1][j-1]==-1 ) count++; //左上
if(i!=0&&a[i-1][j]==-1 ) count++; //上
if(i!=0&&j<=18&&a[i-1][j+1]==-1 ) count++; //右上
if(j!=0&&a[i][j-1]==-1 ) count++; //左
if(j<=18&&a[i][j+1]==-1 ) count++; //右
if(i<=8&&j!=0&&a[i+1][j-1]==-1 ) count++; //左下
if(i<=8&&a[i+1][j]==-1 ) count++; //下
if(i<=8&&j<=18&&a[i+1][j+1]==-1 ) count++; //右下
a[i][j]=count;
}
}
}
}
//*******************************翻牌****************************8
public static void draw(int a[][],int x,int y){
a[x-1][y-1]+=10;
if(a[x-1][y-1]==10) {
if (x - 1 > 0 && y - 1 > 0 && a[x - 2][y - 2] < 10 && a[x - 2][y - 2] != -1) draw(a, x - 1, y - 1); //左上
if (x - 1 > 0 && a[x - 2][y - 1] < 10 && a[x - 2][y - 1] != -1) draw(a, x - 1, y); //上
if (x - 1 > 0 && y - 1 < 19 && a[x - 2][y] < 10 && a[x - 2][y] != -1) draw(a, x - 1, y + 1); //右上
if (y - 1 > 0 && a[x - 1][y - 2] < 10 && a[x - 1][y - 2] != -1) draw(a, x, y - 1); //zuo
if (y - 1 <= 18 && a[x - 1][y] < 10 && a[x - 1][y] != -1) draw(a, x, y + 1); //you
if (x - 1 < 9 && y - 1 > 0 && a[x][y - 2] < 10 && a[x][y - 2] != -1) draw(a, x + 1, y - 1); //zuo xia
if (x - 1 < 9 && a[x][y - 1] < 10 && a[x][y - 1] != -1) draw(a, x + 1, y);//xia
if (x - 1 < 9 && y - 1 < 19 && a[x][y] < 10 && a[x][y] != -1) draw(a, x + 1, y + 1);//you xia
}
}
//*******************************爆炸******************************
public static boolean bomb(int a[][],int x ,int y){
if(a[x-1][y-1]==-1){
for(int i =0;i<10;i++){
for(int j = 0 ;j<20;j++){
if(a[i][j]==-1)a[i][j]+=10;
}
}
show(a);
System.out.println("踩雷了?。?!");
return true;}else return false;
}
//*******************************全翻了********************
public static boolean All(int a[][]){
int i,j=0,t=0;
for(i =0;i<10;i++){
for(j = 0 ;j<20;j++){
if(a[i][j]<10) t++;
if(t>25)break; //雷
}
}
if(t==25)return true;else return false; //雷
}
}
更多精彩游戲,請參考專題《java經(jīng)典小游戲》
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot查詢數(shù)據(jù)庫導(dǎo)出報表文件方式
這篇文章主要介紹了SpringBoot查詢數(shù)據(jù)庫導(dǎo)出報表文件方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-04-04
Java Fluent Mybatis 項(xiàng)目工程化與常規(guī)操作詳解流程篇 下
Java中常用的ORM框架主要是mybatis, hibernate, JPA等框架。國內(nèi)又以Mybatis用的多,基于mybatis上的增強(qiáng)框架,又有mybatis plus和TK mybatis等。今天我們介紹一個新的mybatis增強(qiáng)框架 fluent mybatis關(guān)于項(xiàng)目工程化與常規(guī)操作流程2021-10-10
Springboot整合RabbitMQ實(shí)現(xiàn)發(fā)送驗(yàn)證碼的示例代碼
這篇文章主要介紹了Springboot整合RabbitMQ實(shí)現(xiàn)發(fā)送驗(yàn)證碼的功能,基于AMQP協(xié)議實(shí)現(xiàn)的消息隊(duì)列,它是一種應(yīng)用程序之間的通信方法,消息隊(duì)列在分布式系統(tǒng)開 發(fā)中應(yīng)用非常廣泛,需要的朋友可以參考下2022-02-02
線程池之jdk1.8 Executors創(chuàng)建線程池的幾種方式
這篇文章主要介紹了線程池之jdk1.8 Executors創(chuàng)建線程池的幾種方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-08-08
解決feignclient調(diào)用服務(wù),傳遞的中文數(shù)據(jù)成???問題
這篇文章主要介紹了解決feignclient調(diào)用服務(wù),傳遞的中文數(shù)據(jù)成???問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01
java讀取excel文件并復(fù)制(copy)文件到指定目錄示例
這篇文章主要介紹了java讀取excel文件并復(fù)制文件到指定目錄示例,需要的朋友可以參考下2014-02-02

