文件的创建
test.c :用于程序的测试
game.c:游戏函数的封装
game.h:头文件的声明
1.1main函数逻辑
首先得有菜单提供选项,输入有效数字后会出现三种情况
情况1:进行游戏同时也会产生 情况1-1:游戏结束后还想再玩一遍的情况。
情况2:退出游戏。
情况3:输入选项有错,重新输入。
有了这些分析可以判断出这个游戏是个循环语句,首先的出现菜单,当我选择选项的时候会进入游戏或退出游戏或者重新输入。这里抛出问题应该用什么循环语句,用什么判断语句呢?当程序运行时候应该先打印菜单然后再循环,貌似do while语句反而会更合适。这里我们输入0退出游戏,输入1进入游戏这样设置的好处是do while语句输入数字1 的时候进入循环判断由于1为真可以继续循环,输入数字0为假进入循环语句判断部分直接就不循环了。
选择语句的话我们选择switch case语句input为1的时候进行游戏,input为0退出游戏,input为其他数的时候提示然后重新输入。
void meun()
{
printf("******************************\n");
printf("************1.play************\n");
printf("************0.exit************\n");
printf("******************************\n");
}
int main()
{
srand((size_t time(NULL)))//SetMine函数建立后才写这个
int input =0;
do
{
meun();//打印菜单的函数
printf("请选择:>\n");
scanf("%d",&input);
switch(input)
{
case 1:printf("游戏开始\n");
// game();//这里我们要封装game函数用于游戏的实现
break;
case 0:printf("退出游戏\n");
break;
default:printf("输入有误请重新输入\n");
break;
}
}while(input);
return 0;
}
这里呢我们可以把case 1中的game函数屏蔽一下测试下主函数的逻辑是否有问题。
1.2game函数如何实现
假如我们的扫雷的规格是9x9的规格,是有两个数组,一个数组是存放雷的信息是玩家看不见的。另一个数组是给玩家提供雷的信息,数字代表的是其周围雷的个数。那么既然是9x9规格的我的数据就定义9x9的二维数组吗?答案是否定的当排查四个最边上的雷的信息时,其会出现越界所以我们应该要设置大一圈的数组。
game.h中
#include<stdio.h> #define ROW 9; #define COL 9; #define ROWS ROW+2; #define COLS COL+2;
void game() { //定义棋盘 char mine[ROWS][COLS]={0}; char show[ROWS][COLS]={0}; //初始化棋盘 InitBoard(mine,ROWS,COLS,'0'); InitBoard(show,ROWS,COLS,'*'); //打印棋盘 DisplayBoard(show,ROW,COL); //布置雷 SetMine(mine, ROW, COL); //雷信息 FindMine(mine, show, ROW, COL); }
game.h文件中添加
void InitBoard(board[ROWS][COLS],int rows,int cols,char set);
InitBoard初始化函数
game.c文件
#include"game.h" void InitBoard(board[ROWS][COLS],int rows,int cols,char set) { int i,j=0; for(i=0;i<rows;i++) { for(j=0;j<cols;j++) { board[i][j]=set; } } }
DisplayBoard打印棋盘函数
game.h
void DisplayBoard(board[ROWS][COLS],int row,int col);
这里要注意我们实际打印出来的应该是小一码的数组所以传参的时候应该是小的参数
game.c
void DisplayBoard(board[ROWS][COLS],int row,int col) { int i, j = 0; printf("_____________________________\n\n"); printf(" "); for (j=1;j<=col;j++) { printf("[%d]", j); } printf("\n"); for (i = 1; i <= row; i++) { printf("[%d]", i); for (j = 1; j <= col; j++) { printf(""); printf(" %c ", board[i][j]); } printf("\n"); } printf("_____________________________\n"); }
SetMine雷布置
game.h
#define MINE_NUM 10 #include<time.h> #include<stdlib.h> void SetMine(board[ROWS][COLS], int row,int col);
geme.c
void SetMine(board[ROWS][COLS], int row,int col) { int count= MINE_NUM; int i,j=0; while(count) { int x=rand()%row+1; int y=rand()%col+1; if(board[x][y]!='1') { board[x][y]='1'; count--; } } }
FindMine雷信息
game.h
int FindMine(char mine[ROWS][COLS], char show[ROWS][COLS],int row,int col);
game.c
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col) { int x, y = 0; int win = 0; while(win<row*col- MINE_NUM) { printf(" 请输入坐标:>\n"); scanf("%d %d", &x, &y); if ((x >= 1 && x <= row) && (y >= 1 && y <= col)) { if (mine[x][y] == '1') { printf("很遗憾你无了\n"); DisplayBoard(mine, ROW, COL); break; } else { int count = GetMinecount(mine, x, y); show[x][y] = (count+ '0'); DisplayBoard(show, ROW, COL); win++; } } else { printf("坐标输入有误\n"); } } if (win == row * col - MINE_NUM) { printf("恭喜你,排雷成功\n"); } } int GetMinecount(char mine[ROWS][COLS], int x, int y) { int i, j ,count= 0; for (i = x -1; i <= x+ 1; i++) { for (j = y- 1; j <= y + 1; j++) { if (mine[j][i] == '1') { count++; } } } printf("%d",count); return count; }