java实现扫雷游戏

初学Java,写了一个扫雷代码来锻炼一下自己的代码能力。

一、代码思路

代码思路很重要,如果事先就想好了代码思路,那么写这一个代码肯定是事半功倍,比在哪里瞎打要强不知道多少。
经过思考,觉得可以创建一个二维数组来记录情况
未翻开的牌:(统一显示 █ )
数组的值 代表
-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("⑧");

二、代码主题部分

注意不要越界和不要重复打开

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;} //防止打开重复
  if(bomb(a,x,y)) break;
  draw(a,x,y);
  show(a);
  if(All(a)){ System.out.println("你避过了所有地雷!!!");break; }
 }
 }

三、函数部分

1.显示函数

打一个方格

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.设置基本数据的函数

标有 //雷 的是指雷的数量

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++;}
 }
 }
 //*************设置地雷周边参数********************
 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.翻牌函数

这个函数很简单,却也是精华所在,这个函数的作用就在点开一个牌,翻开一堆符合规则的牌。

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; //雷
}

以上就是全部内容了。

下面粘贴一下效果图和完整代码

完整代码:

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;} //防止打开重复
 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++;}
 }
 }
 //*************设置地雷周边参数********************
 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经典小游戏》

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • java实现简单扫雷游戏

    本文实例为大家分享了java实现简单扫雷游戏的具体代码,供大家参考,具体内容如下 package com.test.swing; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import javax.swing.JButton; import javax.

  • Java Swing实现扫雷小游戏

    swing设计扫雷心得,供大家参考,具体内容如下 最近学习swing学习之余做了一个小游戏:扫雷 1.前期设计 2.实现 其实完成这个游戏的核心就在于对数组的操纵,下面贴主要代码Main.java: package first; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.GridLayout; import java.awt.Image; import java.

  • java swing实现的扫雷游戏及改进版完整示例

    本文实例讲述了java swing实现的扫雷游戏及改进版.分享给大家供大家参考,具体如下: 版本1: package awtDemo; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import javax.swing.JButton; import jav

  • Java实现简单的扫雷小程序

    前两天看了个扫雷的视频,于是自己跟着做了下,感觉还不是很难. 初学Java的同学可以尝试自己操作下Java小程序 这样子才能提高自己的理解能力和编程水平 不用多说了,直接上代码吧! 具体代码操作如下: import java.awt.BorderLayout; import java.awt.Color; import java.awt.Container; import java.awt.GridLayout; import java.awt.event.ActionEvent; import

  • Java语言实现的扫雷游戏(2)

    本文实例为大家分享了Java语言实现的扫雷游戏的第2部分代码,供大家参考,具体内容如下 在上一篇文章中,我们已经将扫雷的绘制了方格阵列并随机分配了炸弹的位置,接下来我们要将阵列全部覆盖上按钮.因为我们要通过按钮来获知当前方格的坐标,所以简单的Button按钮还无法满足我们的要求,所以,我们就自定义一个按钮的类,让它继承自Button类,但要给他加上行号和列号,这样我们就能直接通过按钮读取它的位置了 import javax.swing.JButton; public class MyButton

  • java实现扫雷小游戏

    本文实例为大家分享了java实现扫雷小游戏的具体代码,供大家参考,具体内容如下 代码: package GUI; import java.util.Random; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.awt.BorderLayout; import java.awt.GridLayo

  • java实现简单扫雷小游戏

    本文实例为大家分享了java实现扫雷游戏的具体代码,供大家参考,具体内容如下 import java.awt.BorderLayout; import java.awt.Color; import java.awt.Container; import java.awt.GridLayout; import java.awt.Insets; import java.awt.Label; import java.awt.event.ActionEvent; import java.awt.event

  • Java语言实现的扫雷游戏(1)

    Java类库中提供了用于GUI的swing开发工具包,我们可以利用swing设计出一些简单的经典小游戏,如扫雷,推箱子,俄罗斯方块等.接下来我就简单分享一下用Java设计扫雷游戏的思路与过程. 首先,我们要设计出扫雷的窗口界面,说白了,也就是在窗口上绘制出指定行数和列数的小方格.要在窗体上绘制方格,我们需要一个JPanel面板,所以我们定义类GamePanel让它继承自JPanel,然后我们在就可以这个类上绘制我们所要的信息了.然后,在类中,我们定义一些基本的变量,如行数,列数,雷的数量等等,方

  • java实现扫雷游戏控制台版

    本文实例为大家分享了java实现扫雷游戏控制台版,供大家参考,具体内容如下 扫雷游戏 a.游戏的分析 在游戏中需要存在对象包含哪些. 格子对象(Grid): 属性:内容(content).状态(type) b.工程架构 设计工程包结构 bean:存放实体类 core:游戏核心类(游戏操作) test:扫雷玩的测试类 c.编写类 Grid(属性:content.type) Core类–游戏核心类(雷区创建.显示雷区.布雷.踩雷) Test类–测试类 d.核心类设计 1.格子对象创建方法定义 2.显

  • 教你怎么用Java开发扫雷游戏

    一.效果图        二.实现思路 1.界面上可以点开的各种实际都是按钮,创建9行9列的二维数组,然后根据这个数组来创建JButton. 2.对应创建二维数组data,用来存取数据,0表示周围无雷,-1表示当前是雷,其他数字表示周围雷的数量. 3.对应创建二维数组state,用来存取按钮状态,0未打开,1 打开  2旗子  3 未知(控制显示对应的图标) 4.设置雷:随机行数 i 和列数 j,根据随机到 i.j 从二维数组data中取出对应的元素值,若值不为-1(不是雷),则将此元素data

  • Java实现扫雷游戏的代码分享

    目录 效果展示 主类:GameWin类 底层地图MapBottom类 顶层地图MapTop类 底层数字BottomNum类 初始化地雷BottomRay类 工具GameUtil类 总结 效果展示 主类:GameWin类 package com.sxt; import javax.swing.*; import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; public class

  • Java实现扫雷游戏详细代码讲解

    目录 效果展示 难度选择展示 游戏界面展示 代码展示 主类:GameWin类 底层地图MapBottom类 顶层地图MapTop类 底层数字BottomNum类 初始化地雷BottomRay类 工具GameUtil类 难度选择GameSelect类 项目结构 程序界面布局 总结 大家好!上一期我们使用GUI技术写了一个简单的扫雷小游戏,今天对这个Java应用程序更新迭代,增加了难度选择等功能,修复了已知的几个问题.成为初学者学习的好项目!Java实现扫雷小游戏[完整版] 效果展示 难度选择展示

  • java实现扫雷游戏入门程序

    本文实例为大家分享了java实现扫雷游戏入门程序的具体代码,供大家参考,具体内容如下 分析: 1.首先布一个10*10的雷阵,即二维数组map,每个地方都为0 2.再在雷阵中随机选取10个位置设置为雷,雷用-1表示,即map[i][j] = -1; 3.计算雷周围的数.这里有两种方法. 第一种是用一个二维数组保存所有雷的位置,然后遍历所有的雷,查看雷周围的8个位置,如果是值-1就不做++,如果值不是-1就做++. 第二种是遍历所有不为雷的地方,然后再计算它周围的雷的数目,周围的雷的数目就是该位置

  • java实现扫雷游戏

    初学Java,写了一个扫雷代码来锻炼一下自己的代码能力. 一.代码思路 代码思路很重要,如果事先就想好了代码思路,那么写这一个代码肯定是事半功倍,比在哪里瞎打要强不知道多少. 经过思考,觉得可以创建一个二维数组来记录情况 未翻开的牌:(统一显示 █ ) 数组的值 代表 -1 雷 0 旁边没有雷 1 旁边有一个雷 以此类推 翻开的牌则: if(a[x][y] == 9) System.out.print("?"); if(a[x][y] == 10) System.out.print(&

  • 用java实现扫雷游戏

    用java做出简单一个扫雷游戏1.创造窗口2.定义数据结构以及初始化3.窗体按钮4.埋雷5.计算周围雷的数量6.Banner设置7.游戏胜利还是失败8.空白级联打开(实现点击一个即可打开多个)9.最终游戏界面总结1.创造窗口   //创建扫雷窗口界面      public Saolei() {                    frame.setSize(600,700);            frame.setResizable(false);//设置窗口尺寸不能变化         

  • 利用java开发简易版扫雷游戏

    1.简介 学了几周的Java,闲来无事,写个乞丐版的扫雷,加强一下Java基础知识. 2.编写过程 编写这个游戏,一共经历了三个阶段,编写了三个版本的游戏代码. 第一版:完成了扫雷游戏的基本雏形,实现了游戏的基本功能,游戏运行在cmd黑窗口中,以字符绘制游戏界面,无图形化窗口,通过控制台输入字符完成游戏控制.代码放置在一个java文件中,代码的可读性以及可扩展性都比较差. 第二版:在第一版实现基本功能的基础之上,对游戏代码进行重构,根据各部分的功能创建多个类,增加代码注释,提高代码的可读性以及可

随机推荐