本文主要详细介绍了扫雷游戏的C语言代码。本文中的示例代码非常详细,具有一定的参考价值。感兴趣的朋友可以参考一下。
前言
扫雷是一款经典的电脑游戏。扫雷就是找出所有非矿格,即赢,输入矿格,即输。游戏的主要区域由许多方块组成。输入一个正方形坐标,正方形将被打开,并显示正方形中的数字。方块中的数字表示在它周围的八个方块中隐藏着几个地雷。如果点击的方块是0,那么它周围有0个地雷。
本文将用VS2013带领大家用C语言编写这个小游戏。
一、所需函数
1.埋雷功能(SetMines)
2.展示线
3.展示板
(2,3函数是水平线和垂直线)
4.雷霆的计数函数(CountMines)
5.游戏功能(游戏)
6.菜单功能(菜单)
7.主要功能(主要)
二、实现过程
1.算法分析
memset函数初始化棋盘,使用SetMines函数埋雷,读取用户输入的坐标。当与mine_board的地雷“1”坐标一致时,游戏结束,否则,使用CountMines函数输出当前坐标附近的地雷数量,直到排出地雷。
我们用二维数组打印棋盘。如果要打印一个66的棋盘,我们设置的二维数组元素应该是88,因为设计算法时需要统计坐标周围的闪电个数。如果要统计边界坐标周围的闪电个数,就会出现数组越界的问题。我们可以在66的边界上加一圈元素,还需要定义88的数组元素。
c库函数memset用于初始化两个棋盘,一个埋雷,一个显示。
memset(show_board,STYLE,sizeof(show _ board));
memset(mine_board,' 0 ',sizeof(mine _ board));
添加一个memset函数:
void *memset(void *str,int c,size_t n)
str参数指向要填充的内存块。c是要设置的值,以int的形式传递,但函数在填充内存块时使用该值的无符号字符形式。n是要设置为该值的字符数。这个值返回一个指向存储字符串的指针。
2.详细代码
# define _ CRT _ SECURE _ NO _ WARNINGS 1
#包含stdio.h
#包含stdlib.h
#包含时间. h
#包含windows.h
#定义第8行
#定义第8列
#定义样式'?'
#定义NUM 10 //埋设地雷的数量
Void set mines (charboard [] [col],int row,int col)//掩埋地雷
{
int count=NUM
while(计数){
int x=rand()%(row-2)1;
int y=rand()%(col-2)1;
if (board[x][y]=='0'){
board[x][y]=' 1 ';
count-;
}
}
}
Void ShowLine(int col) //网格的水平线
{
for(int I=0;I=(col-2);i ){
printf('-');
}
printf(' \ n ');
}
Void show board (charboard [] [col],int row,int col)//网格的垂直线
{
printf(“”);
for(int I=1;I=(col-2);i ){
printf('%d ',I);
}
printf(' \ n ');
显示线(col);
for(int I=1;I=(row-2);i ){
printf('%-3d| ',I);
for(int j=1;j=(col-2);j ){
printf(' %c | ',board[I][j]);
}
printf(' \ n ');
显示线(col);
}
}
Count mines (char board [] [col],int x,int y)//统计雷数。
{
返回板[x - 1][y - 1]板[x - 1][y]板[x-1][y-1]\
board[x][y 1]board[x 1][y 1]board[x 1][y]\
board[x 1][y-1]board[x][y-1]-7 * ' 0 ';
}
无效游戏()
{
srand((无符号长整型)时间(空));
char show _ board[ROW][COL];
char mine _ board[ROW][COL];
memset(show_board,STYLE,sizeof(show _ board));//将字符样式复制到参数指向的字符串的第一个sizeof(show_board)字符。
memset(mine_board,' 0 ',sizeof(mine _ board));//将字符0复制到参数指向的字符串的第一个sizeof(mine_board)字符。
SetMines(mine_board,ROW,COL);
int count=(ROW-2)*(COL-2)-NUM;
while(计数){
系统(“cls”);
ShowBoard(show_board,ROW,COL);
printf('请输入您的位置x,y:');
int x=0;
int y=0;
scanf('%d %d ',x,y);
if(x ^ 1 | | x row-2 | | y ^ 1 | | y col-2){//判断输入坐标是否合法
printf('位置错误!\ n’);
继续;
}
if (show_board[x][y]!=STYLE){ //判断输入坐标是否已被占用
printf('位置不是* \ n ');
继续;
}
if (mine_board[x][y]=='1'){ //判断用户输入坐标是否为雷坐标
printf('游戏结束!\ n’);
ShowBoard(mine_board,ROW,COL);
打破;
}
show _ board[x][y]=count mines(mine _ board,x,y);
count-;
}
}
无效菜单()
{
printf(' # # # # # # # # # # # # # # # # # \ n ');
printf(# 1 .播放0。退出# \ n ');
printf(' # # # # # # # # # # # # # # # # # \ n ');
}
int main()
{
int quit=0;
int select=0;
而(!退出){
menu();
printf('请输入一或0:');
scanf('%d ',select);
开关(选择){
案例1:
game();
打破;
案例0:
退出=1;
打破;
默认值:
printf('位置错误,请重试!\ n’);
打破;
}
}
printf('欢迎你下次再来玩!\ n’);
系统("暂停");
返回0;
}
三、总结
这就是我的本篇文章了,此代码思路较为直接,欢迎大家和我继续讨论。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。