游戏介绍
游戏界面实现9*9棋盘,棋盘里面隐藏十个炸弹,输入坐标一一排查每一个坐标,若最终十个雷全部被找到,扫雷成功,游戏结束。若输入的坐标埋藏炸弹,则扫雷失败。重新选择是否开始游戏。
函数构成和详解
函数一int main()
主函数决定游戏的开始结束,选则开始游戏选择输入1,结束游戏输入0,输入其他数字提示输入错误。
int main()
{
int flag = 1;
while (flag)
{
//选择菜单
menu();
int input = 0;
printf("请输入想要的操作:");
scanf("%d", &input);
switch (input)
{
case 1:
printf("游戏开始\n");
game();
break;
case 0:
printf("游戏结束!\n");
flag = 0;
break;
default:
printf("输入数字错误,请重新选择!\n");
break;
}
}
}
函数二void menu()
主要作用提示玩家选择1或者0。
void menu()
{
printf("********************\n");
printf("*****1.开始游戏*****\n");
printf("*****0.结束游戏*****\n");
printf("********************\n");
}
函数三 void game()
定义两个11*11的棋盘,分别是内部的放置雷的棋盘mine和展示出来的棋盘show。然后分别初始化两个棋盘,mine棋盘全部为‘0’,show棋盘全部为‘*‘ (具体代码看函数四)。初始化后展示show棋盘。方便玩家选择坐标。然后在函数PutLei(mine,ROW,COL)放置十个炸弹。做好准备工作之后,就可以开始排雷了。
void game()
{
char mine[ROWS][COLS] = { '0' };//后台棋盘
char show[ROWS][COLS] = { '0' };//展示棋盘
//初始化棋盘
InitBoard(mine, ROWS, COLS, '0');
InitBoard(show, ROWS, COLS, '*');
//打印棋盘
//printBoard(mine, ROW, COL);
printBoard(show, ROW, COL);
//放置雷
PutLei(mine,ROW,COL);
//printBoard(mine, ROW, COL);//查看雷是否安置成功
//输入坐标开始排雷
SelectBoard(mine, show, ROW, COL);
}
函数四void InitBoard(char board[ROWS][COLS], int rows,int cols,char set)
mine棋盘全部为’0‘,show棋盘全部为’*‘。
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{
int i = 0;
for (i = 0; i < rows; i++)
{
int j = 0;
for (j = 0; j < cols; j++)
{
board[i][j] = set;
}
}
}
函数五void printBoard(char board[ROWS][COLS], int row, int col)
虽然棋盘创建的是11*11但是最终使用的部分是9*9所以只展示9*9的部分。可以在任何部分加上这个函数来检查自己的代码是否有问题。
void printBoard(char board[ROWS][COLS], int row, int col)
{
int i = 0;
for (i = 0; i <= row; i++)
{
printf("%d ", i);//横坐标
}
printf("\n");
for (i = 1; i <= row; i++)
{
printf("%d ", i);//纵坐标
int j = 0;
for (j = 1; j <= col; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");
}
}
函数六void PutLei(char mine[ROWS][COLS], int row, int col)
随机生成十个坐标放置雷在mine棋盘上面,雷的位置为’1‘。
void PutLei(char mine[ROWS][COLS], int row, int col)
{
srand((unsigned int)time(NULL));
int count = LEI;
//'1'为雷 放置十个雷
while (count)
{
//随机生成坐标
int i = rand() % 9 + 1;//余数(0~9)+1
int j = rand() % 9 + 1;//余数(0~9)+1
if (mine[i][j] == '0')
{
mine[i][j] = '1';//放置雷
count--;
}
}
}
函数七 void SelectBoard(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
输入想要排查的坐标,并修改show棋盘展示出想要排查的坐标周围雷的个数,在int CountLei(char mine[ROWS][COLS], int x, int y)中查雷的个数,如果中雷就直接结束游戏。
void SelectBoard(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
int a = 0;
while (a < row * col - LEI)
{
printf("请输入排查的坐标:");
scanf("%d %d", &x, &y);
if (x > 0 && x <= row && y > 0 && y <= col)
{
if (mine[x][y] == '1')
{
printf("很遗憾,踩到了雷!\n");
printBoard(mine, ROW, COL);
break;
}
else
{
int count = CountLei(mine, x, y);
show[x][y] = count + '0';
printBoard(show, ROW, COL);
a++;
}
}
else
{
printf("您的坐标输入错误,请重新输入:\n");
}
}
if (a >= row * col - LEI)
{
printf("恭喜你,成功排查出所有的雷!");
printBoard(mine, ROW, COL);
}
}
函数八 int CountLei(char mine[ROWS][COLS], int x, int y)
因为需要排查mine[x][y]周围的雷,但是边缘部分在9*9的部分不能排查,所以初始化的时候在周围又增加一圈,方便计算雷的数量。
int CountLei(char mine[ROWS][COLS], int x, int y)
{
int i = 0;
int j = 0;
int count = 0;
//(x-1,y-1)(x-1,y)(x-1,Y+1)
// (x,y-1) (x,y) (x,y+1)
//(x+1,y-1)(x+1,y)(x+1,y+1)
for (i = -1; i <= 1; i++)
{
for (j = -1; j <= 1; j++)
{
//ASCII mine[x][y]周围的值与‘0’相减
// 如果有雷也就是‘1’
//‘1’-‘0’得到数字1
//相加在一起就是这个点附近的雷的数量
count += (mine[x + i][y + j] - '0');
}
}
return count;
}
代码总览
Add.c
//Add.c
#define _CRT_SECURE_NO_WARNINGS
#include"game.h"
int main()
{
int flag = 1;
while (flag)
{
//选择菜单
menu();
int input = 0;
printf("请输入想要的操作:");
scanf("%d", &input);
switch (input)
{
case 1:
printf("游戏开始\n");
game();
break;
case 0:
printf("游戏结束!\n");
flag = 0;
break;
default:
printf("输入数字错误,请重新选择!\n");
break;
}
}
}
void game()
{
char mine[ROWS][COLS] = { '0' };//后台棋盘
char show[ROWS][COLS] = { '0' };//展示棋盘
//初始化棋盘
InitBoard(mine, ROWS, COLS, '0');
InitBoard(show, ROWS, COLS, '*');
//打印棋盘
//printBoard(mine, ROW, COL);
printBoard(show, ROW, COL);
//放置雷
PutLei(mine,ROW,COL);
//printBoard(mine, ROW, COL);//查看雷是否安置成功
//输入坐标开始排雷
SelectBoard(mine, show, ROW, COL);
}
game.c
#define _CRT_SECURE_NO_WARNINGS
#include"game.h"
void menu()
{
printf("********************\n");
printf("*****1.开始游戏*****\n");
printf("*****0.结束游戏*****\n");
printf("********************\n");
}
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{
int i = 0;
for (i = 0; i < rows; i++)
{
int j = 0;
for (j = 0; j < cols; j++)
{
board[i][j] = set;
}
}
}
void printBoard(char board[ROWS][COLS], int row, int col)
{
int i = 0;
for (i = 0; i <= row; i++)
{
printf("%d ", i);//横坐标
}
printf("\n");
for (i = 1; i <= row; i++)
{
printf("%d ", i);//纵坐标
int j = 0;
for (j = 1; j <= col; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");
}
}
void PutLei(char mine[ROWS][COLS], int row, int col)
{
srand((unsigned int)time(NULL));
int count = LEI;
//'1'为雷 放置十个雷
while (count)
{
//随机生成坐标
int i = rand() % 9 + 1;//余数(0~9)+1
int j = rand() % 9 + 1;//余数(0~9)+1
if (mine[i][j] == '0')
{
mine[i][j] = '1';//放置雷
count--;
}
}
}
int CountLei(char mine[ROWS][COLS], int x, int y)
{
int i = 0;
int j = 0;
int count = 0;
//(x-1,y-1)(x-1,y)(x-1,Y+1)
// (x,y-1) (x,y) (x,y+1)
//(x+1,y-1)(x+1,y)(x+1,y+1)
for (i = -1; i <= 1; i++)
{
for (j = -1; j <= 1; j++)
{
//ASCII mine[x][y]周围的值与‘0’相减
// 如果有雷也就是‘1’
//‘1’-‘0’得到数字1
//相加在一起就是这个点附近的雷的数量
count += (mine[x + i][y + j] - '0');
}
}
return count;
}
void SelectBoard(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
int a = 0;
while (a < row * col - LEI)
{
printf("请输入排查的坐标:");
scanf("%d %d", &x, &y);
if (x > 0 && x <= row && y > 0 && y <= col)
{
if (mine[x][y] == '1')
{
printf("很遗憾,踩到了雷!\n");
printBoard(mine, ROW, COL);
break;
}
else
{
int count = CountLei(mine, x, y);
show[x][y] = count + '0';
printBoard(show, ROW, COL);
a++;
}
}
else
{
printf("您的坐标输入错误,请重新输入:\n");
}
}
if (a >= row * col - LEI)
{
printf("恭喜你,成功排查出所有的雷!");
printBoard(mine, ROW, COL);
}
}
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 LEI 10
void menu();
void game();
//初始化棋盘
void InitBoard(char board[ROWS][COLS], int rows,int cols,char set);
//打印棋盘
void printBoard(char board[ROWS][COLS], int row, int col);
//防置雷
void PutLei(char mine[ROWS][COLS], int row, int col);
//输入坐标开始排雷
void SelectBoard(char mine[ROWS][COLS],int show[ROWS][COLS], int row,int col);
//查询坐标周围雷的个数
int CountLei(char mine[ROWS][COLS],int x,int y);
最后
欢迎各位大佬批评指正和修改。