如何编写一个扫雷速度最快的自动扫雷程序

如何编写一个扫雷速度最快的自动扫雷程序,第1张

#include

#include

#include

using namespace std;

int map[12][12]; // 为避免边界的特殊处理,故将二维数组四周边界扩展1

int derection[3] = { 0, 1, -1 }; //方向数组

int calculate ( int x, int y )

{

int counter = 0;

for ( int i = 0; i < 3; i++ )

for ( int j = 0; j < 3; j++ )

if ( map[ x+derection[i]][ y+derection[j] ] == 9 )

counter++; // 统计以(x,y)为中心的四周的雷数目

return counter;

}

void game ( int x, int y )

{

if ( calculate ( x, y ) == 0 )

{

map[x][y] = 0;

for ( int i = 0; i < 3; i++ )

{ // 模拟游戏过程,若点到一个空白,则系统自动向外扩展

for ( int j = 0; j < 3; j++ )

if ( x+derection[i] <= 9 && y+derection[j] <= 9 && x+derection[i] >= 1 && y+derection[j] >= 1

&& !( derection[i] == 0 && derection[j] == 0 ) && map[x+derection[i]][y+derection[j]] == -1 )

game( x+derection[i], y+derection[j] ); // 条件比较多,一是不可以让两个方向坐标同时为0,否则

递归调用本身!

} //二是递归不能出界三是要保证不返回调用。

}

else

map[x][y] = calculate(x,y);

}

void print ()

{

for ( int i = 1; i < 10; i++ )

{

for ( int j = 1; j < 10; j++ )

{

if ( map[i][j] == -1 || map[i][j] == 9 )

cout << "#";

else

cout <> x >> y )

{

if ( map[x][y] == 9 )

{

cout << "GAME OVER" <> ch;

cout << "\n\n";

} while ( ch == 'Y' );

return 0;

}

从控制面板里,点添加删除程序,选中windws组件,选择附件,点祥细,再点游戏。把前面的勾去掉后,再点确定,就可以了。

经典的扫雷游戏是一片二维矩阵单元里隐藏着地雷,无地雷的单元隐藏着数字,表示这个单元周围的八个单元中藏雷雷的数量,根据这些数字的提示判断哪些单元是地雷,把他们标记出来,全部标记完成且没有标记错的,则游戏成功,点到地雷所在单元则表示踩到地雷了,踩到雷则游戏结束。

这款小游戏是在包含经典扫雷游戏的玩法外,另外多一种六边形玩法的扫雷游戏。每个单元都是正六边形,每个单元周围均匀分布着六个单元,数字表示这个单元周围的六个单元中藏雷的数量,游戏规则与经典玩法类似。

第一个JAVA文件

import javaxswing;

import javaawt;

import javaawtevent;

/

显示所有按钮的面板

@author Administrator

/

public class AllButtonPanel extends JPanel implements ActionListener{

private int row;//行数

private int col;//列数

private int mineCount;//地雷数

private MineButton[][] allButtons;//所有按钮

public AllButtonPanel(int row,int col,int mineCount){

thisrow=row;

thiscol=col;

thismineCount=mineCount;

allButtons=new MineButton[row][col];

createButtons();

createMine();

init();

}

private void init(){

thissetLayout(new GridLayout(row,col));

for(int i=0;i<allButtonslength;i++){

for(int j=0;j<allButtons[i]length;j++){

thisadd(allButtons[i][j]);

}

}

}

/

随机布雷的方法

/

private void createMine(){

int n=0;

while(n<mineCount){//随机生成mineCount个地雷

int i=(int)(Mathrandom()row);

int j=(int)(Mathrandom()col);

if(allButtons[i][j]getCountOfSurroundMines()!=-1){

allButtons[i][j]setCountOfSurroundMines(-1);

n++;

}

}

for(int i=0;i<allButtonslength;i++){//计算每个位置的周围地雷数

for(int j=0;j<allButtons[i]length;j++){

if(allButtons[i][j]getCountOfSurroundMines()!=-1){

allButtons[i][j]setCountOfSurroundMines(getSurroundMineCount(i,j));

}

}

}

}

/

统计(i,j)坐标周围8个位置的地雷数

@param data

@param i

@param j

@return

/

private int getSurroundMineCount(int i,int j){

int num=0;//统计周围的雷数

if(i-1>=0&&j-1>=0){

num+=(allButtons[i-1][j-1]getCountOfSurroundMines()==-11:0);

}

if(i-1>=0){

num+=(allButtons[i-1][j]getCountOfSurroundMines()==-11:0);

}

if(i-1>=0&&j+1<allButtons[0]length){

num+=(allButtons[i-1][j+1]getCountOfSurroundMines()==-11:0);

}

if(j-1>=0){

num+=(allButtons[i][j-1]getCountOfSurroundMines()==-11:0);

}

if(j+1<allButtons[0]length){

num+=(allButtons[i][j+1]getCountOfSurroundMines()==-11:0);

}

if(i+1<allButtonslength&&j-1>=0){

num+=(allButtons[i+1][j-1]getCountOfSurroundMines()==-11:0);

}

if(i+1<allButtonslength){

num+=(allButtons[i+1][j]getCountOfSurroundMines()==-11:0);

}

if(i+1<allButtonslength&&j+1<allButtons[0]length){

num+=(allButtons[i+1][j+1]getCountOfSurroundMines()==-11:0);

}

return num;

}

/

生成按钮

/

private void createButtons(){

for(int i=0;i<allButtonslength;i++){

for(int j=0;j<allButtons[i]length;j++){

allButtons[i][j]=new MineButton(i,j);

allButtons[i][j]setSize(6,6);

allButtons[i][j]addActionListener(this);//添加点击事件监听

allButtons[i][j]addMouseListener(new MouseAdapter(){//添加鼠标右键事件监听

public void mouseClicked(MouseEvent e) {

if(egetButton()==MouseEventBUTTON3){

int remain=IntegerparseInt(CleanMineremainMinegetText());

JButton b=(JButton)egetSource();

if(bgetText()equals("")){

remain--;

CleanMineremainMinesetText(remain+"");

bsetText("&");

}else if(bgetText()equals("&")){

remain++;

CleanMineremainMinesetText(remain+"");

bsetText("");

}

}

}

});

}

}

}

public void actionPerformed(ActionEvent e) {//点击事件监听的方法

MineButton b=(MineButton)egetSource();

int r=bgetRow();

int c=bgetCol();

if(allButtons[r][c]getCountOfSurroundMines()==-1){//如果是地雷

for(int i=0;i<allButtonslength;i++){//把所有按钮都显示出来

for(int j=0;j<allButtons[i]length;j++){

if(allButtons[i][j]getCountOfSurroundMines()==-1){//如果该位置是地雷

allButtons[i][j]setText("$");

}else if(allButtons[i][j]getCountOfSurroundMines()==0){//如果该位置为空(该位置不是地雷,周围8个位置也没有地雷)

allButtons[i][j]setText("");

allButtons[i][j]setBackground(ColorCYAN);

}else{//如果该位置不是地雷,但周围8个位置中有地雷

allButtons[i][j]setText(allButtons[i][j]getCountOfSurroundMines()+"");

allButtons[i][j]setBackground(ColorCYAN);

}

}

}

}else{//如果不是地雷

showEmpty(r,c);//执行排空 *** 作

}

}

/

排空方法,若(i,j)位置为空,则显示空白。然后依次递归找它周围的8个位置。

@param data

@param i

@param j

/

private void showEmpty(int i,int j){

MineButton b=allButtons[i][j];

if(bisCleared()){

return;

}

if(allButtons[i][j]getCountOfSurroundMines()==0){

bsetBackground(ColorCYAN);

bsetCleared(true);

if(i-1>=0&&j-1>=0){

showEmpty(i-1,j-1);

}

if(i-1>=0){

showEmpty(i-1,j);

}

if(i-1>=0&&j+1<allButtons[0]length){

showEmpty(i-1,j+1);

}

if(j-1>=0){

showEmpty(i,j-1);

}

if(j+1<allButtons[0]length){

showEmpty(i,j+1);

}

if(i+1<allButtonslength&&j-1>=0){

showEmpty(i+1,j-1);

}

if(i+1<allButtonslength){

showEmpty(i+1,j);

}

if(i+1<allButtonslength&&j+1<allButtons[0]length){

showEmpty(i+1,j+1);

}

}else if(allButtons[i][j]getCountOfSurroundMines()>0){

bsetText(allButtons[i][j]getCountOfSurroundMines()+"");

bsetBackground(ColorCYAN);

bsetCleared(true);

}

}

}

第二个JAVA文件

import javaxswing;

import javaawt;

import javaawtevent;

/

扫雷游戏主界面

@author tonytang

/

public class CleanMine extends JFrame implements ActionListener{

private JLabel text1,text2;

public static JLabel remainMine;//剩余地雷数

private JLabel time;//消耗时间

private JButton reset;//重新开始

private JPanel center;

private int row,col,mine;

public CleanMine(){

text1=new JLabel("剩余地雷:");

text2=new JLabel("消耗时间:");

remainMine=new JLabel("10");

time=new JLabel("0");

reset=new JButton("重新开始");

resetaddActionListener(this);

JMenuBar bar=new JMenuBar();

JMenu game=new JMenu("游戏");

JMenu help=new JMenu("帮助");

JMenuItem item;

gameadd(item=new JMenuItem("开局"));itemaddActionListener(this);

gameaddSeparator();

ButtonGroup bg=new ButtonGroup();

gameadd(item=new JCheckBoxMenuItem("初级",true));bgadd(item);itemaddActionListener(this);

gameadd(item=new JCheckBoxMenuItem("中级"));bgadd(item);itemaddActionListener(this);

gameadd(item=new JCheckBoxMenuItem("高级"));bgadd(item);itemaddActionListener(this);

gameadd(item=new JCheckBoxMenuItem("自定义"));bgadd(item);itemaddActionListener(this);

gameaddSeparator();

gameadd(item=new JMenuItem("退出"));itemaddActionListener(this);

helpadd(item=new JMenuItem("查看帮助"));itemaddActionListener(this);

helpadd(item=new JMenuItem("关于扫雷"));itemaddActionListener(this);

baradd(game);

baradd(help);

thissetJMenuBar(bar);

init();

}

private void init(){

JPanel north=new JPanel();

northadd(text1);

northadd(remainMine);

northadd(reset);

northadd(text2);

northadd(time);

thisadd(north,BorderLayoutNORTH);

thisrow=9;

thiscol=9;

thismine=10;

restart();

thissetDefaultCloseOperation(JFrameEXIT_ON_CLOSE);

new Thread(){

public void run(){

while(IntegerparseInt(remainMinegetText())>0){

try {

Threadsleep(1000);

} catch (InterruptedException e) {

eprintStackTrace();

}

timesetText((IntegerparseInt(timegetText())+1)+"");

}

}

}start();

}

public void actionPerformed(ActionEvent e) {

if(egetActionCommand()equals("初级")){

thisrow=9;

thiscol=9;

thismine=10;

restart();

return;

}

if(egetActionCommand()equals("中级")){

thisrow=16;

thiscol=16;

thismine=40;

restart();

return;

}

if(egetActionCommand()equals("高级")){

thisrow=16;

thiscol=30;

thismine=99;

restart();

return;

}

if(egetActionCommand()equals("重新开始")){

restart();

return;

}

}

private void restart(){

if(center!=null){

thisremove(center);

}

center=new AllButtonPanel(row,col,mine);

thisadd(center,BorderLayoutCENTER);

thisremainMinesetText(mine+"");

thistimesetText("0");

thissetSize(col30,row30+10);

thissetResizable(false);

thissetVisible(true);

}

/

@param args

/

public static void main(String[] args) {

new CleanMine();

}

}

第三个JAVA文件

import javaxswingJButton;

import javaawt;

public class MineButton extends JButton {

private int row;

private int col;

private boolean cleared=false;

private int countOfSurroundMines;//周围地雷数,如果本按钮是雷,则为-1;

public MineButton(int row,int col){

thisrow=row;

thiscol=col;

thissetMargin(new Insets(0,0,0,0));

}

public int getCol() {

return col;

}

public int getRow() {

return row;

}

public boolean isCleared() {

return cleared;

}

public void setCleared(boolean cleared) {

thiscleared = cleared;

}

public int getCountOfSurroundMines() {

return countOfSurroundMines;

}

public void setCountOfSurroundMines(int countOfSurroundMines) {

thiscountOfSurroundMines = countOfSurroundMines;

}

}

全部编译以后就可以执行了

以上就是关于如何编写一个扫雷速度最快的自动扫雷程序全部的内容,包括:如何编写一个扫雷速度最快的自动扫雷程序、如何删除扫雷游戏、怎么用Java做一个扫雷程序,要原创。。。 做好了给加100等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9717928.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存