扫雷是曾经每台Windows系统电脑上都带有的小游戏,每个人或多或少对它有回忆,但随着时代的发展,曾经风靡的扫雷游戏已经被越开越多游戏所代替,今天我们就用C语言实现扫雷游戏,一起重温曾经的回忆。
扫雷游戏:
功能描述:
本次实现的扫雷游戏,玩家进入游戏后需要选择输入对应格子的坐标,若此格子有雷,则游戏结束,若没有雷,则会提示玩家该格子为中心周围的8个格子中共有几颗雷,直到所有格子选择完毕,玩家即获胜。
具体功能实现:
- 在界面选择关卡
- 利用两个二维数组分别存放数据和打印棋盘
- 电脑将根据给出的随机值,在棋盘上置雷
- 玩家输入相应的坐标进行排雷
- 若输入的坐标正好有雷,则判为输,游戏结束
- 若将所有未有雷的格子全部选完,则判为赢,游戏结束
- 结束后返回菜单,提示玩家继续或退出游戏
各函数具体构建:
- 菜单函数:当玩家打开程序,首先弹出一个菜单,供玩家选择,直接使用printf打印即可。
void Menu() {
printf("######欢迎来到扫雷游戏室#####\n");
printf("#############################\n");
printf("####### 1、开始游戏 #######\n");
printf("####### 2、退出游戏 #######\n");
printf("#############################\n");
printf("请输入你的选择:");
}
- 初始化棋盘:进入游戏后,需要清空两个数组,将数据数组的元素全赋值为“0“,将棋盘数组的元素全部赋值为” ”(空格)。
void IntiBoard(char arr[][COL], int row, int col,char symbol) {
int i, j;
for(i=0;i<row;i++)
for (j = 0; j < col; j++) {
arr[i][j] = symbol;
}
}
- 打印棋盘:当二维数组清空后,直接将二维数组个元素并配合“----------”“|”利用循环逐一打印,实现棋盘的打印
void ShowBoard(char arr[][COL], int row, int col) {
int i;
printf("---------------------------------------------\n");
printf("| | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |10 |\n");
for (i = 1; i < row-2; i++) {
printf("---------------------------------------------\n");
printf("| %d | %c | %c | %c | %c | %c | %c | %c | %c | %c | %c |\n",i,arr[1][i], arr[2][i], arr[3][i], arr[4][i], arr[5][i], arr[6][i], arr[7][i], arr[8][i], arr[9][i], arr[10][i]);
}
printf("---------------------------------------------\n");
printf("|10 | %c | %c | %c | %c | %c | %c | %c | %c | %c | %c |\n",arr[1][10], arr[2][10], arr[3][10], arr[4][10], arr[5][10], arr[6][10], arr[7][10], arr[8][10], arr[9][10], arr[10][10]);
}
- 玩家选择排雷:判断若选择的坐标在棋盘上未被选过,则将其数据数组的对应元素赋值为“X"。
void PlayerMove(char arr[][COL], int row, int col) {
char board[ROW][COL];
char mine[ROW][COL];
int x = 0, y = 0;
printf("请选择坐标:\n");
next:
scanf("%d%d", &x, &y);
if (arr[x][y] == ' ')
arr[x][y] = 'X';
else {
printf("此处已排过雷,请重选:");
goto next;
}
}
- 电脑置雷:根据棋盘范围内的随机数,将有限个数据数组的元素赋值为”1”。
void SetMine(char arr[][COL], int row, int col) {
int ray=RAY;
while(ray){
int x = rand() % 10 + 1;
int y = rand() % 10 + 1;
if (arr[x][y] == '0') {
arr[x][y] = '1';
ray--;
}
else
continue;
}
}
- 判断周围雷个数:若判断所选位置没雷,则判断其周围雷的个数,并打印到棋盘数组对应的元素上
void JudgeNum(char board[][COL],char mine[][COL], int x, int y) {
int ray = 0;
char c;
if (board[x - 1][y - 1] == '1')
ray++;
if (board[x - 1][y] == '1')
ray++;
if (board[x - 1][y + 1] == '1')
ray++;
if (board[x][y - 1] == '1')
ray++;
if (board[x][y + 1] == '1')
ray++;
if (board[x + 1][y - 1] == '1')
ray++;
if (board[x + 1][y] == '1')
ray++;
if (board[x + 1][y + 1] == '1')
ray++;
c = ray + '0';
mine[x][y] = c ;
}
7.Game函数,各函数编写完毕后再用Game函数联系起来
void Game() {
int sum = BLANK;
char board[ROW][COL];
char mine[ROW][COL];
IntiBoard(board,ROW,COL,'0');
IntiBoard(mine,ROW,COL,' ');
srand((unsigned long)time(NULL));
SetMine(board, ROW, COL);
while (sum!=0) {
ShowBoard(mine, ROW, COL);
ShowBoard(board, ROW, COL);
int x = 0, y = 0;
printf("请选择坐标:\n");
next:
scanf("%d%d", &x, &y);
if(x>0&&x<11&&y>0&&y<11){
if (board[x][y] == '1') {
printf("对不起你的选的坐标有雷,游戏结束!\n");
break;
}
if (mine[x][y] == ' ') {
board[x][y] = 'X';
sum--;
}
else {
printf("此处已排过雷,请重选:");
goto next;
}
JudgeNum(board, mine, x, y);
}
else {
printf("你输入的坐标有误,请重新输入!\n");
goto next;
}
}
if (sum == 0) {
printf("恭喜你,赢了!\n");
}
}
头文件声明:
为防止跨文件计算机无法找到函数和变量,在头文件中将函数统一声明
#ifndef _WINMINE_H_
#define _WINMINE_H_
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 12
#define COL 12
#define RAY 20
#define BLANK 100-RAY
void Menu();
void Game();
void IntiBoard(char arr[][COL], int row, int col,char symbol);
void ShowBoard(char arr[][COL], int row, int col);
void JudgeNum(char board[][COL], char mine[][COL], int x, int y);
void SetMine(char arr[][COL], int row, int col);
#endif
函数定义:
#include"winmine.h"
void Menu() {
printf("######欢迎来到扫雷游戏室#####\n");
printf("#############################\n");
printf("####### 1、开始游戏 #######\n");
printf("####### 2、退出游戏 #######\n");
printf("#############################\n");
printf("请输入你的选择:");
}
void IntiBoard(char arr[][COL], int row, int col,char symbol) {
int i, j;
for(i=0;i<row;i++)
for (j = 0; j < col; j++) {
arr[i][j] = symbol;
}
}
void ShowBoard(char arr[][COL], int row, int col) {
int i;
printf("---------------------------------------------\n");
printf("| | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |10 |\n");
for (i = 1; i < row-2; i++) {
printf("---------------------------------------------\n");
printf("| %d | %c | %c | %c | %c | %c | %c | %c | %c | %c | %c |\n",i,arr[1][i], arr[2][i], arr[3][i], arr[4][i], arr[5][i], arr[6][i], arr[7][i], arr[8][i], arr[9][i], arr[10][i]);
}
printf("---------------------------------------------\n");
printf("|10 | %c | %c | %c | %c | %c | %c | %c | %c | %c | %c |\n",arr[1][10], arr[2][10], arr[3][10], arr[4][10], arr[5][10], arr[6][10], arr[7][10], arr[8][10], arr[9][10], arr[10][10]);
}
void PlayerMove(char arr[][COL], int row, int col) {
char board[ROW][COL];
char mine[ROW][COL];
int x = 0, y = 0;
printf("请选择坐标:\n");
next:
scanf("%d%d", &x, &y);
if (arr[x][y] == ' ')
arr[x][y] = 'X';
else {
printf("此处已排过雷,请重选:");
goto next;
}
}
void SetMine(char arr[][COL], int row, int col) {
int ray=RAY;
while(ray){
int x = rand() % 10 + 1;
int y = rand() % 10 + 1;
if (arr[x][y] == '0') {
arr[x][y] = '1';
ray--;
}
else
continue;
}
}
void JudgeNum(char board[][COL],char mine[][COL], int x, int y) {
int ray = 0;
char c;
if (board[x - 1][y - 1] == '1')
ray++;
if (board[x - 1][y] == '1')
ray++;
if (board[x - 1][y + 1] == '1')
ray++;
if (board[x][y - 1] == '1')
ray++;
if (board[x][y + 1] == '1')
ray++;
if (board[x + 1][y - 1] == '1')
ray++;
if (board[x + 1][y] == '1')
ray++;
if (board[x + 1][y + 1] == '1')
ray++;
c = ray + '0';
mine[x][y] = c ;
}
void Game() {
int sum = BLANK;
char board[ROW][COL];
char mine[ROW][COL];
IntiBoard(board,ROW,COL,'0');
IntiBoard(mine,ROW,COL,' ');
srand((unsigned long)time(NULL));
SetMine(board, ROW, COL);
while (sum!=0) {
ShowBoard(mine, ROW, COL);
ShowBoard(board, ROW, COL);
int x = 0, y = 0;
printf("请选择坐标:\n");
next:
scanf("%d%d", &x, &y);
if(x>0&&x<11&&y>0&&y<11){
if (board[x][y] == '1') {
printf("对不起你的选的坐标有雷,游戏结束!\n");
break;
}
if (mine[x][y] == ' ') {
board[x][y] = 'X';
sum--;
}
else {
printf("此处已排过雷,请重选:");
goto next;
}
JudgeNum(board, mine, x, y);
}
else {
printf("你输入的坐标有误,请重新输入!\n");
goto next;
}
}
if (sum == 0) {
printf("恭喜你,赢了!\n");
}
}
main函数:
#include"winmine.h"
int main() {
int choice;
int quit=0;
Menu();
again:
scanf("%d", &choice);
switch (choice) {
case(1):
Game();
printf("还要再来一局吗?1.继续2.退出\n");
goto again;
case(2):
break;
default:
printf("你的输入有误,请重新输入!\n");
goto again;
}
}
如上就是扫雷的全部代码
如若此篇博客对你有所帮助,不胜荣幸,若有建议,敬请斧正。