文章目录
- 游戏说明
- 游戏效果展示
- 游戏代码
- 游戏代码解析
-
- 游戏框架解析
- 棋盘绘制
- 棋盘初始化
- 布置雷
- 开始扫雷
- 输赢判断
- 主函数
游戏说明
游戏界面:可以选择开始游戏 或者退出
游戏操作:通过命令行输入坐标即可
我们使用二维数组来实现这个游戏
游戏效果展示
游戏代码
博友们可以将以下代码复制到自己的编译器当中运行:
#ifndef game_h
#define game_h
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROW 9
#define COL 9
#define ROWS 9+ROW
#define COLS 9+COL
#define Easy_count 10
void init_board(char board[ROWS][COLS],int rows, int cols,char set);
void display_board(char board[ROWS][COLS],int rows, int cols);
void set_mine(char board[ROWS][COLS],int rows, int cols);
void find_board(char mine_board[ROWS][COLS],char show_board[ROWS][COLS],int rows, int cols);
#endif /* game_h */
#include "game.h"
void init_board(char board[ROWS][COLS],int rows, int cols,char set)
{
for (int i = 0; i <ROWS; i++)
{
for (int j = 0; j < COLS ; j++)
{
board[i][j] = set ;
}
}
}
void display_board(char board[ROWS][COLS],int rows, int cols)
{
for(int j =0; j<=COL ; j++)
printf("%d ",j);
printf("\n");
for (int i = 1; i <=ROW; i++)
{
printf("%d ",i);
for (int j = 1; j <=COL ; j++)
{
printf("%c ",board[i][j]);
}
printf("\n");
}
}
void set_mine(char mine_board[ROWS][COLS],int rows, int cols)
{
int count = Easy_count;
while (count)
{
int x = rand()%ROW+1;
int y = rand()%ROW+1;
if ( mine_board[x][y] == '0')
{
mine_board[x][y] = '1';
count--;
}
}
}
int get_mine_board(char mine_board[ROWS][COLS],int x, int y)
{
return mine_board[x+1][y-1]+
mine_board[x+1][y]+
mine_board[x][y+1]+
mine_board[x+1][y+1]+
mine_board[x-1][y]+
mine_board[x][y-1]+
mine_board[x-1][y-1]+
mine_board[x-1][y+1]-8*'0';
}
void find_board(char mine_board[ROWS][COLS],char show_board[ROWS][COLS],int rows, int cols)
{
int x = 0;
int y = 0;
int win = 0;
//判断坐标合法性
while(win < ROW*COL-Easy_count)
{
printf("请输入坐标!!!\n");
scanf("%d %d",&x,&y);
if (x>=1 && x<= ROW && y>=1 && y<= COL)
{
if(show_board[x][y] == '*')
{
if (mine_board[x][y] == '1')
{
printf("BOOM!!!!你给炸死了QAQ\n");
display_board(mine_board,ROWS,COLS);
break;
}
int count = get_mine_board( mine_board , x , y );
show_board[x][y] = count + '0';
display_board(show_board,ROWS,COLS);
win++;
}
else
{
printf("目标已占用\n");
}
}
else
{
printf("坐标错误请重新输入~~~~~\n");
}
}
if(win == ROW*COL-Easy_count)
{
printf("恭喜你,排雷成功^ _ ^\n");
display_board(mine_board,ROWS,COLS);
}
}
#include "game.h"
#include <stdio.h>
void game(void)
{
char mine_board[ROWS][COLS] = {0};
char show_board[ROWS][COLS] = {0};
//初始化
init_board(mine_board,ROWS,COLS,'0');
init_board(show_board,ROWS,COLS,'*');
//打印
// display_borad(mine_borad,ROWS,COLS);
// display_borad(show_borad,ROWS,COLS);
//布置雷
set_mine(mine_board,ROWS,COLS);
display_board(show_board,ROWS,COLS);
// display_board(mine_board,ROWS,COLS);
//排查雷 把mine上的信息反馈到show上
find_board(mine_board,show_board,ROWS,COLS);
//输赢机制
}
void menu(void)
{
printf("*************************\n");
printf("********1.play***********\n");
printf("********0.exit***********\n");
printf("****** 扫雷 **********\n");
printf("***** 好扫,扫饱他 *****\n");
printf("*************************\n");
}
int main(int argc, const char * argv[])
{
int input = 0;
srand((unsigned int)time(NULL));
//写一个扫雷游戏
do
{
menu();
printf("请输入你的选择\n");
scanf("%d",&input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("推出成功\n");
break;
default:
printf("选择错误\n");
break;
}
} while (input);
return 0;
}
游戏代码详解
游戏框架构建
棋盘绘制
首先定义棋盘的大小,定义棋盘行数和列数。
#define ROW 9
#define COL 9
#define ROWS 9+ROW
#define COLS 9+COL
为了防止数组越界问题出现 我们使用两个棋盘来解决
一个棋盘 mine ,在其上面玩游戏
而另一个棋盘 show ,将结果打印给玩家看
void display_board(char board[ROWS][COLS],int rows, int cols)
{
for(int j =0; j<=COL ; j++)
printf("%d ",j);
printf("\n");
for (int i = 1; i <=ROW; i++)
{
printf("%d ",i);
for (int j = 1; j <=COL ; j++)
{
printf("%c ",board[i][j]);
}
printf("\n");
}
}
别忘记初始化了
棋盘初始化
void init_board(char board[ROWS][COLS],int rows, int cols,char set)
{
for (int i = 0; i <ROWS; i++)
{
for (int j = 0; j < COLS ; j++)
{
board[i][j] = set ;
}
}
}
现在我们有了已经初始化好的棋盘,下一步我们就要布置雷在我们的mine棋盘上
void set_mine(char mine_board[ROWS][COLS],int rows, int cols)
{
int count = Easy_count;
while (count)
{
int x = rand()%ROW+1;
int y = rand()%ROW+1;
if ( mine_board[x][y] == '0')
{
mine_board[x][y] = '1';
count--;
}
}
}
在本文中我们用1表示雷地 0表示安全地 而*是未探索的区域 我们会在show棋盘上打印*,再将玩家在mine棋盘上扫雷的结果反馈回show棋盘上,布置雷 我们仍是随机布置 使用到rand函数
开始扫雷
玩家输入坐标 我们判断该坐标的合法性 在判断是否为雷1还是安全地0
void find_board(char mine_board[ROWS][COLS],char show_board[ROWS][COLS],int rows, int cols)
{
int x = 0;
int y = 0;
int win = 0;
//判断坐标合法性
while(win < ROW*COL-Easy_count)
{
printf("请输入坐标!!!\n");
scanf("%d %d",&x,&y);
if (x>=1 && x<= ROW && y>=1 && y<= COL)
{
if(show_board[x][y] == '*')
{
if (mine_board[x][y] == '1')
{
printf("BOOM!!!!你给炸死了QAQ\n");
display_board(mine_board,ROWS,COLS);
break;
}
int count = get_mine_board( mine_board , x , y );
show_board[x][y] = count + '0';
display_board(show_board,ROWS,COLS);
win++;
}
else
{
printf("目标已占用\n");
}
}
else
{
printf("坐标错误请重新输入~~~~~\n");
}
}
为了更加贴近真正的扫雷游戏,如果该地为安全地 我们还得返回 四周八个空间内的雷的数量
int get_mine_board(char mine_board[ROWS][COLS],int x, int y)
{
return mine_board[x+1][y-1]+
mine_board[x+1][y]+
mine_board[x][y+1]+
mine_board[x+1][y+1]+
mine_board[x-1][y]+
mine_board[x][y-1]+
mine_board[x-1][y-1]+
mine_board[x-1][y+1]-8*'0';
}
输赢判断
void find_board(char mine_board[ROWS][COLS],char show_board[ROWS][COLS],int rows, int cols)
{
int x = 0;
int y = 0;
int win = 0;
//判断坐标合法性
while(win < ROW*COL-Easy_count)
{
printf("请输入坐标!!!\n");
scanf("%d %d",&x,&y);
if (x>=1 && x<= ROW && y>=1 && y<= COL)
{
if(show_board[x][y] == '*')
{
if (mine_board[x][y] == '1')
{
printf("BOOM!!!!你给炸死了QAQ\n");
display_board(mine_board,ROWS,COLS);
break;
}
int count = get_mine_board( mine_board , x , y );
show_board[x][y] = count + '0';
display_board(show_board,ROWS,COLS);
win++;
}
else
{
printf("目标已占用\n");
}
}
else
{
printf("坐标错误请重新输入~~~~~\n");
}
}
if(win == ROW*COL-Easy_count)
{
printf("恭喜你,排雷成功^ _ ^\n");
display_board(mine_board,ROWS,COLS);
}
}
主函数
有了上面这些函数,主函数可以轻松写出
#include "game.h"
#include <stdio.h>
void game(void)
{
char mine_board[ROWS][COLS] = {0};
char show_board[ROWS][COLS] = {0};
//初始化
init_board(mine_board,ROWS,COLS,'0');
init_board(show_board,ROWS,COLS,'*');
//打印
// display_borad(mine_borad,ROWS,COLS);
// display_borad(show_borad,ROWS,COLS);
//布置雷
set_mine(mine_board,ROWS,COLS);
display_board(show_board,ROWS,COLS);
// display_board(mine_board,ROWS,COLS);
//排查雷 把mine上的信息反馈到show上
find_board(mine_board,show_board,ROWS,COLS);
//输赢机制
}
void menu(void)
{
printf("*************************\n");
printf("********1.play***********\n");
printf("********0.exit***********\n");
printf("****** 扫雷 **********\n");
printf("***** 好扫,扫饱他 *****\n");
printf("*************************\n");
}
int main(int argc, const char * argv[])
{
int input = 0;
srand((unsigned int)time(NULL));
//写一个扫雷游戏
do
{
menu();
printf("请输入你的选择\n");
scanf("%d",&input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("推出成功\n");
break;
default:
printf("选择错误\n");
break;
}
} while (input);
return 0;
}
本文含有隐藏内容,请 开通VIP 后查看