今天主要是C语言的学习三子棋的实现。
类似于三子棋,扫雷也分装成三个模块,game.h ,game.c,test.c。
首先在test.c里创建主函数,并使用test函数。
int main()
{
test();
return 0;
}
然后在test函数中实现是否玩游戏的选择,并利用循环确保每次进行完游戏和非法输入的情况能再次选择。
void test()
{
srand(time((unsigned int)NULL));//为后续生成随机雷做准备
while (1)
{
menu();
printf("请输入一个值:");
int n = 0;
scanf("%d", &n);
system("cls");
if (n == 1)
{
game();
}
else if (n == 0)
{
printf("退出游戏\n");
break;
}
else
{
printf("非法输入,请重试。\n");
}
}
}
当然,我们得有一个菜单提示选择
void menu()
{
printf("*********************************\n");
printf("******** 1.play ********\n");
printf("******** 0.exit ********\n");
printf("*********************************\n");
}
然后就是game函数
void game()
{
char mine[ROWS][COLS] = { 0 };
char show[ROWS][COLS] = { 0 };
//初始化
init(mine, ROWS, COLS, '0');
init(show, ROWS, COLS, '*');
//设置随机雷
set_mine(mine, ROWS, COLS);
print(mine, ROW, COL);
//打印玩家界面
printf("剩余雷的个数为:%d\n", MINE);
print(show, ROW, COL);
//玩家操作
//排查雷
player(mine, show, ROW, COL);
}
首先是初始化
void init(char board[ROWS][COLS], int rows, int cols, char set)
{
int i = 0;
int j = 0;
for (i = 0; i <= rows - 1; i++)
{
for (j = 0; j <= cols - 1; j++)
{
board[i][j] = set;
}
}
}
然后打印
void print(char board[ROWS][COLS], int row, int col)
{
int i = 0;
int j = 0;
int a = 0;
int b = 0;
printf("----------------扫雷----------------\n");
for (b = 0; b <= col; b++)
{
printf("%d ", b);
}
printf("\n");
for (i = 1 ,a = 1; i <= row && a <= row; i++, a++)
{
printf("%d ", a);
for (j = 1; j <= col; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");
}
printf("----------------扫雷----------------\n");
}
下一步是生成雷
void set_mine(char board[ROWS][COLS], int rows, int cols)
{
int n = 0;
for (n = 0; n < MINE;)
{
int i = rand() % (rows - 2) + 1;
int j = rand() % (rows - 2) + 1;
if (board[i][j] != '1')
{
board[i][j] = '1';
n++;
}
}
}
再来是玩家操作
void player(char board_mine[ROWS][COLS], char board_show[ROWS][COLS], int row, int col)
{
int i = 0;
int j = 0;
int n = 0;
int a = 0;
for(a=0;a<ROW*COL-MINE;a++)
{
printf("请输入一个坐标:");
scanf("%d %d", &i, &j);
//坐标是否已经被使用
if (board_show[i][j] != '*')
{
printf("坐标已被使用,请重新输入。\n");
a--;
continue;
}
//坐标是否在范围内1=<i<=row,1<=j<=col
if (i >= 1 && i <= row && j >= 1 && j <= col)
{
if (board_mine[i][j] == '1')
{
printf("很遗憾,您被雷炸死了。\n");
goto end;
}
n = count(board_mine, i, j);
board_show[i][j] = '0' + n;
print(board_show, row, col);
}
}
printf("恭喜你,游戏胜利!\n");
end:
{
}
}
最后是计算周围雷的个数
int count(char board[ROWS][COLS], int x, int y)
{
return(board[x - 1][y - 1] + board[x - 1][y] + board[x - 1][y + 1]
+ board[x][y - 1] + board[x][y + 1] + board[x + 1][y - 1]
+ board[x + 1][y] + board[x + 1][y + 1] - 8 * '0');
}
以下是头文件
#include <stdio.h>
#include <Windows.h>
#include <stdlib.h>
#include <time.h>
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define MINE 10
//初始化
void init(char board[ROWS][COLS], int rows, int cols, char set);
//打印棋盘
void print(char board[ROWS][COLS], int row, int col);
//随机生成雷
void set_mine(char board[ROWS][COLS], int rows, int cols);
//玩家操作
void player(char board_mine[ROWS][COLS] ,char board_show[ROWS][COLS], int row, int col);
以上就是今天的学习分享了,感谢您的阅读,如有发现错误也欢迎指出!