需要什么
1.首先先创建一个头文件game.h;
2.再创建两个源文件game.c和test.c;
我们把需要的库和自定义的函数声明包含到.h的头文件里:
把自定义的函数定义放在game.c中:
把主函数放在test.c中。
注意此时两.c文件都应包含game.h头文件:
#include"game.h"//自定义头文件用双引号
编写代码:
一、首先在test.c中编写main函数:
int main()
{
int input = 0;
srand((unsigned int)time(、NULL));//需要生成随机数
do
{
menu();//菜单
printf("请输入:");
scanf("%d", &input);
switch (input)
{
case 1:
game();//进行游戏函数
break;
case 0:
printf("结束!!!");
break;
default:
printf("输入错误,请重新选择\n");
break;
}
} while (input);
return 0;
}
(1)进入游戏看到菜单menu:
void menu()
{
printf("*******************************\n");
printf("******* 1.play *******\n");
printf("******* 0.exit *******\n");
printf("*******************************\n");
}
选1则进入game函数;
选2退出游戏。
(2)编写game函数:
void game()
{
char core[ROWS][COLS];//存放雷的网格(开始看不到)
char show[ROWS][COLS];//展示的网格
chushihua(core, ROWS, COLS, '0');//把内部棋盘初始化为0
chushihua(show, ROWS, COLS, '*');//把展示棋盘全初始化为*
dayinqipan(show, ROW, COL);//打印全是*的棋盘
buzhilei(core, ROW, COL);//把1作为雷布置到内部棋盘
zhaolei(core, show, ROW, COL);//查找雷
}
我们需要两个棋盘,一个为core存放雷,一个为show展示雷。
首先我们做的是9×9棋盘因为要计算周围一圈雷的个数所以我们把棋盘做成(9+2)×(9+2)在展示的时候只放出其中1~9行列;
在game.h中定义全局常数ROW,COL,ROWS,COLS;
第一步、把core初始化全为0,把show初始化全为*;
第二步、打印show棋盘;
第三步、将雷布置到core棋盘;
第四步、查找雷;
(3)具体函数的实现
必须在game.h中声明函数,在game.c中实现:
1.chushihua:
#include"game.h"
void chushihua(char board[ROWS][COLS], int rows, int cols, char set//需要输入的字符)
{
int i = 0, j = 0;
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
board[i][j] = set;
}
}
}
2.dayinqipan:
void dayinqipan(char board[ROWS][COLS], int row, int col)
{
int i = 0, j = 0;
for (i = 0; i <= row; i++)
{
printf("%d ", i);//在第一排打印0~9序号为排雷标号的列
}
printf("\n");//换行
for (i = 1; i <= row; i++)
{
printf("%d ", i);//在每列依次打印1~9为标号的行
for (j = 1; j <= col; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");
}
}
运行结果如图:
3.buzhilei:
void buzhilei(char board[ROWS][COLS], int row, int col)
{
int count = COUNT;//雷的个数在game.h中定义
int x = 0, y = 0;
while (count)
{
x = rand() % row + 1;
y = rand() % col + 1;
if (board[x][y] == '0')
{
board[x][y] = '1';//字符'1'定义为雷
count--;
}
}
}
4.zhaolei:
void zhaolei(char core[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
int x = 0, y = 0, win = 0;
while (win < row * col - COUNT)//当win要找棋盘格总数减去雷个数,当win==总格数减去雷个数才赢
{
printf("输入查找坐标:");
scanf("%d%d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (core[x][y] == '1')//找到雷了
{
printf("ooooooooo,GG!!!\n");
dayinqipan(core, ROW, COL);//把雷的位置展示
break;
}
else//该位置非雷显示周围有几个雷
{
int count = zixizhao(core, x, y);//包含的函数定义在下
show[x][y] = count + '0';//show中为字符类型所以int类的count要加上字符0(1+'0'='1')
dayinqipan(show, ROW, COL);//打印当前棋盘
win++;
}
}
else
{
printf("超出范围,重新输入!\n");
}
}
if (win == row * col - COUNT)//赢游戏的条件
{
printf("winwinwin!!!\n");
dayinqipan(core, ROW, COL);
}
}
int zixizhao(char core[ROWS][COLS],int x,int y)//把周围八个字符全加起来,因为为int count所以需要全减去8个'0'(字符'1'-字符'0'=1)
{
return(core[x - 1][y] +
core[x - 1][y - 1] +
core[x - 1][y + 1] +
core[x + 1][y - 1] +
core[x + 1][y] +
core[x + 1][y + 1] +
core[x][y - 1] +
core[x][y + 1] -
8 * '0'
);
}
运行结果如图:
于是可以简单完成扫雷:
完整代码如下:
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 COUNT 10//放置雷的个数
void chushihua(char board[ROWS][COLS],int rows,int cols,char set);
//初始化棋盘
void dayinqipan(char board[ROWS][COLS], int row, int col);
//打印棋盘
void buzhilei(char board[ROWS][COLS], int row, int col);
//布置雷
void zhaolei(char core[ROWS][COLS], char show[ROWS][COLS], int row, int col);
//找雷!!!
game.c:
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void chushihua(char board[ROWS][COLS], int rows, int cols, char set)
{
int i = 0, j = 0;
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
board[i][j] = set;
}
}
}
void dayinqipan(char board[ROWS][COLS], int row, int col)
{
int i = 0, j = 0;
for (i = 0; i <= row; i++)
{
printf("%d ", i);
}
printf("\n");
for (i = 1; i <= row; i++)
{
printf("%d ", i);
for (j = 1; j <= col; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");
}
}
void buzhilei(char board[ROWS][COLS], int row, int col)
{
int count = COUNT;
int x = 0, y = 0;
while (count)
{
x = rand() % row + 1;
y = rand() % col + 1;
if (board[x][y] == '0')
{
board[x][y] = '1';
count--;
}
}
}
int zixizhao(char core[ROWS][COLS],int x,int y)
{
return(core[x - 1][y] +
core[x - 1][y - 1] +
core[x - 1][y + 1] +
core[x + 1][y - 1] +
core[x + 1][y] +
core[x + 1][y + 1] +
core[x][y - 1] +
core[x][y + 1] -
8 * '0'
);
}
void zhaolei(char core[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
int x = 0, y = 0, win = 0;
while (win < row * col - COUNT)
{
printf("输入查找坐标:");
scanf("%d%d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (core[x][y] == '1')
{
printf("ooooooooo,GG!!!\n");
dayinqipan(core, ROW, COL);
break;
}
else//该位置非雷显示周围有几个雷
{
int count = zixizhao(core, x, y);
show[x][y] = count + '0';
dayinqipan(show, ROW, COL);
win++;
}
}
else
{
printf("超出范围,重新输入!\n");
}
}
if (win == row * col - COUNT)
{
printf("winwinwin!!!\n");
dayinqipan(core, ROW, COL);
}
}
test.c:
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void menu()
{
printf("*******************************\n");
printf("******* 1.play *******\n");
printf("******* 0.exit *******\n");
printf("*******************************\n");
}
void game()
{
char core[ROWS][COLS];//存放雷的网格(开始看不到)
char show[ROWS][COLS];//展示的网格
chushihua(core, ROWS, COLS, '0');//把内部棋盘初始化为0
chushihua(show, ROWS, COLS, '*');//把展示棋盘全初始化为*
dayinqipan(show, ROW, COL);//打印全是*的棋盘
buzhilei(core, ROW, COL);//把1作为雷布置到内部棋盘
zhaolei(core, show, ROW, COL);//查找雷
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请输入:");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("结束!!!");
break;
default:
printf("输入错误,请重新选择\n");
break;
}
} while (input);
return 0;
}
完成要求!!!