简单实现扫雷

需要什么

1.首先先创建一个头文件game.h;
2.再创建两个源文件game.c和test.c;
我们把需要的库和自定义的函数声明包含到.h的头文件里:
在这里插入图片描述
把自定义的函数定义放在game.c中:
把主函数放在test.c中。
注意此时两.c文件都应包含game.h头文件:

#include"game.h"//自定义头文件用双引号

编写代码:

、首先在test.c中编写main函数:

int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));//需要生成随机数
	do
	{
		menu();//菜单
		printf("请输入:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();//进行游戏函数
			break;
		case 0:
			printf("结束!!!");
			break;
		default:
			printf("输入错误,请重新选择\n");
			break;

		}
	} while (input);
	return 0;
}

(1)进入游戏看到菜单menu:

void  menu()
{
	printf("*******************************\n");
	printf("*******      1.play     *******\n");
	printf("*******      0.exit     *******\n");
	printf("*******************************\n");
}

选1则进入game函数;
选2退出游戏。
(2)编写game函数:

void  game()
{
	char core[ROWS][COLS];//存放雷的网格(开始看不到)
	char show[ROWS][COLS];//展示的网格
	chushihua(core, ROWS, COLS, '0');//把内部棋盘初始化为0
	chushihua(show, ROWS, COLS, '*');//把展示棋盘全初始化为*

	dayinqipan(show, ROW, COL);//打印全是*的棋盘
	buzhilei(core, ROW, COL);//把1作为雷布置到内部棋盘
	zhaolei(core, show, ROW, COL);//查找雷
}

我们需要两个棋盘,一个为core存放雷,一个为show展示雷。
首先我们做的是9×9棋盘因为要计算周围一圈雷的个数所以我们把棋盘做成(9+2)×(9+2)在展示的时候只放出其中1~9行列;
在game.h中定义全局常数ROW,COL,ROWS,COLS;
第一步、把core初始化全为0,把show初始化全为*;
第二步、打印show棋盘;
第三步、将雷布置到core棋盘;
第四步、查找雷;
(3)具体函数的实现
必须在game.h中声明函数,在game.c中实现:
1.chushihua:

#include"game.h"
void chushihua(char board[ROWS][COLS], int rows, int cols, char set//需要输入的字符)
{
	int i = 0, j = 0;
	for (i = 0; i < rows; i++)
	{	
		for (j = 0; j < cols; j++)
		{
			board[i][j] = set;
		}
	}
}

2.dayinqipan:

void dayinqipan(char board[ROWS][COLS], int row, int col)
{
	int i = 0, j = 0;
	for (i = 0; i <= row; i++)
	{
		printf("%d ", i);//在第一排打印0~9序号为排雷标号的列
	}
	printf("\n");//换行
	for (i = 1; i <= row; i++)
	{
		printf("%d ", i);//在每列依次打印1~9为标号的行
		for (j = 1; j <= col; j++)
		{
			printf("%c ", board[i][j]);
		}
		printf("\n");
	}
}

运行结果如图:
在这里插入图片描述
3.buzhilei:

void buzhilei(char board[ROWS][COLS], int row, int col)
{
	int count = COUNT;//雷的个数在game.h中定义
	int x = 0, y = 0;
	while (count)
	{
		x = rand() % row + 1;
		y = rand() % col + 1;
		if (board[x][y] == '0')
		{
			board[x][y] = '1';//字符'1'定义为雷
			count--;
		}
	}
}

4.zhaolei:

void zhaolei(char core[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	int x = 0, y = 0, win = 0;
	while (win < row * col - COUNT)//当win要找棋盘格总数减去雷个数,当win==总格数减去雷个数才赢
	{
		printf("输入查找坐标:");
		scanf("%d%d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (core[x][y] == '1')//找到雷了
			{
				printf("ooooooooo,GG!!!\n");
				dayinqipan(core, ROW, COL);//把雷的位置展示
				break;
			}
			else//该位置非雷显示周围有几个雷
			{
				int count = zixizhao(core, x, y);//包含的函数定义在下
				show[x][y] = count + '0';//show中为字符类型所以int类的count要加上字符0(1+'0'='1')
				dayinqipan(show, ROW, COL);//打印当前棋盘
				win++;
			}	
		}
		else
		{
			printf("超出范围,重新输入!\n");
		}
	}
	if (win == row * col - COUNT)//赢游戏的条件
	{
		printf("winwinwin!!!\n");
		dayinqipan(core, ROW, COL);
	}
}
int zixizhao(char core[ROWS][COLS],int x,int y)//把周围八个字符全加起来,因为为int count所以需要全减去8个'0'(字符'1'-字符'0'=1)
{
	return(core[x - 1][y] +
		core[x - 1][y - 1] +
		core[x - 1][y + 1] +
		core[x + 1][y - 1] +
		core[x + 1][y] +
		core[x + 1][y + 1] +
		core[x][y - 1] +
		core[x][y + 1] -
		8 * '0'
		);
}

运行结果如图:
在这里插入图片描述
于是可以简单完成扫雷:
完整代码如下:

game.h:

#pragma once

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

#define ROW 9//能看到棋盘的行
#define COL 9//能看到棋盘的列

#define ROWS ROW+2//实际在程序中棋盘的行
#define COLS COL+2//实际在程序中棋盘的列

#define COUNT 10//放置雷的个数

void chushihua(char board[ROWS][COLS],int rows,int cols,char set);
//初始化棋盘

void dayinqipan(char board[ROWS][COLS], int row, int col);
//打印棋盘

void buzhilei(char board[ROWS][COLS], int row, int col);
//布置雷

void zhaolei(char core[ROWS][COLS], char show[ROWS][COLS], int row, int col);
//找雷!!!


game.c:

#define  _CRT_SECURE_NO_WARNINGS 1

#include"game.h"
void chushihua(char board[ROWS][COLS], int rows, int cols, char set)
{
	int i = 0, j = 0;
	for (i = 0; i < rows; i++)
	{	
		for (j = 0; j < cols; j++)
		{
			board[i][j] = set;
		}
	}
}

void dayinqipan(char board[ROWS][COLS], int row, int col)
{
	int i = 0, j = 0;
	for (i = 0; i <= row; i++)
	{
		printf("%d ", i);
	}
	printf("\n");
	for (i = 1; i <= row; i++)
	{
		printf("%d ", i);
		for (j = 1; j <= col; j++)
		{
			printf("%c ", board[i][j]);
		}
		printf("\n");
	}

}

void buzhilei(char board[ROWS][COLS], int row, int col)
{
	int count = COUNT;
	int x = 0, y = 0;
	while (count)
	{
		x = rand() % row + 1;
		y = rand() % col + 1;
		if (board[x][y] == '0')
		{
			board[x][y] = '1';
			count--;
		}
	}

}


int zixizhao(char core[ROWS][COLS],int x,int y)
{
	return(core[x - 1][y] +
		core[x - 1][y - 1] +
		core[x - 1][y + 1] +
		core[x + 1][y - 1] +
		core[x + 1][y] +
		core[x + 1][y + 1] +
		core[x][y - 1] +
		core[x][y + 1] -
		8 * '0'
		);

}

void zhaolei(char core[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	int x = 0, y = 0, win = 0;
	while (win < row * col - COUNT)
	{
		printf("输入查找坐标:");
		scanf("%d%d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (core[x][y] == '1')
			{
				printf("ooooooooo,GG!!!\n");
				dayinqipan(core, ROW, COL);
				break;
			}
			else//该位置非雷显示周围有几个雷
			{
				int count = zixizhao(core, x, y);
				show[x][y] = count + '0';
				dayinqipan(show, ROW, COL);
				win++;
			}	
		}
		else
		{
			printf("超出范围,重新输入!\n");
		}
	}
	if (win == row * col - COUNT)
	{
		printf("winwinwin!!!\n");
		dayinqipan(core, ROW, COL);
	}
}

test.c:

#define  _CRT_SECURE_NO_WARNINGS 1

#include"game.h"


void  menu()
{
	printf("*******************************\n");
	printf("*******      1.play     *******\n");
	printf("*******      0.exit     *******\n");
	printf("*******************************\n");

}



void  game()
{
	char core[ROWS][COLS];//存放雷的网格(开始看不到)
	char show[ROWS][COLS];//展示的网格
	chushihua(core, ROWS, COLS, '0');//把内部棋盘初始化为0
	chushihua(show, ROWS, COLS, '*');//把展示棋盘全初始化为*

	dayinqipan(show, ROW, COL);//打印全是*的棋盘
	buzhilei(core, ROW, COL);//把1作为雷布置到内部棋盘
	zhaolei(core, show, ROW, COL);//查找雷
}



int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	do
	{
		menu();
		printf("请输入:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("结束!!!");
			break;
		default:
			printf("输入错误,请重新选择\n");
			break;

		}
	} while (input);
	return 0;
}

完成要求!!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
下面是一个简单的 Java 扫雷游戏实现,你可以参考一下: ```java import java.util.Random; import java.util.Scanner; public class MineSweeperGame { private static final int ROWS = 10; // 行数 private static final int COLS = 10; // 列数 private static final int MINES = 10; // 雷数 private static final int MINE = -1; // 雷的标记 private static final int COVERED = 0; // 覆盖的标记 private static final int UNCOVERED = 1; // 已经被翻开的标记 private int[][] board; // 存储游戏状态的二维数组 private boolean gameOver; // 游戏是否结束 private int remaining; // 剩余未翻开的格子数 public MineSweeperGame() { board = new int[ROWS][COLS]; gameOver = false; remaining = ROWS * COLS - MINES; initBoard(); placeMines(); } // 初始化游戏面板 private void initBoard() { for (int i = 0; i < ROWS; i++) { for (int j = 0; j < COLS; j++) { board[i][j] = COVERED; } } } // 随机放置雷 private void placeMines() { Random random = new Random(); int count = 0; while (count < MINES) { int row = random.nextInt(ROWS); int col = random.nextInt(COLS); if (board[row][col] != MINE) { board[row][col] = MINE; count++; } } } // 显示游戏面板 private void displayBoard() { System.out.println(" 0 1 2 3 4 5 6 7 8 9"); System.out.println(" ---------------------"); for (int i = 0; i < ROWS; i++) { System.out.print(i + "| "); for (int j = 0; j < COLS; j++) { if (board[i][j] == COVERED) { System.out.print(". "); } else if (board[i][j] == UNCOVERED) { // 如果是已经被翻开的格子,显示数字 int count = countAdjacentMines(i, j); if (count > 0) { System.out.print(count + " "); } else { System.out.print(" "); } } else { System.out.print("* "); } } System.out.println("|" + i); } System.out.println(" ---------------------"); System.out.println(" 0 1 2 3 4 5 6 7 8 9"); } // 获取相邻的格子中雷的数量 private int countAdjacentMines(int row, int col) { int count = 0; for (int i = Math.max(0, row - 1); i <= Math.min(ROWS - 1, row + 1); i++) { for (int j = Math.max(0, col - 1); j <= Math.min(COLS - 1, col + 1); j++) { if (board[i][j] == MINE) { count++; } } } return count; } // 翻开格子 private void uncover(int row, int col) { if (board[row][col] == UNCOVERED) { return; } if (board[row][col] == MINE) { gameOver = true; return; } board[row][col] = UNCOVERED; remaining--; if (countAdjacentMines(row, col) == 0) { // 如果相邻的格子中没有雷,就翻开它们 for (int i = Math.max(0, row - 1); i <= Math.min(ROWS - 1, row + 1); i++) { for (int j = Math.max(0, col - 1); j <= Math.min(COLS - 1, col + 1); j++) { if (board[i][j] == COVERED) { uncover(i, j); } } } } } // 运行游戏 public void run() { Scanner scanner = new Scanner(System.in); while (!gameOver) { displayBoard(); System.out.print("Enter row and column (separated by a space): "); int row = scanner.nextInt(); int col = scanner.nextInt(); if (row < 0 || row >= ROWS || col < 0 || col >= COLS) { System.out.println("Invalid row or column!"); continue; } if (board[row][col] == UNCOVERED) { System.out.println("The cell has already been uncovered!"); continue; } uncover(row, col); if (remaining == 0) { System.out.println("Congratulations! You have won!"); break; } } displayBoard(); System.out.println("Game over!"); } public static void main(String[] args) { MineSweeperGame game = new MineSweeperGame(); game.run(); } } ``` 这个实现比较简单,只有基本的游戏逻辑,有些细节可能还需要完善。你可以根据自己的需求进行修改和扩展。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值