学习了c语言的顺序、选择、循环分支结构、数组、函数之后,我们一起来做一个小游戏---三子棋。
1-游戏菜单设定:
为了使游戏运行之后就直接答应菜单,选择do-while循环,那故意选错怎么办?这点我们用switch选择结构来规避,代码如下:
<1.>菜单
int input = 0;
do
{
menu();
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
break;
default:
printf("输入错误,重新输入!n");
}
} while (input);
菜单选择用了menu来封装,代码如下:
menu:
void menu()
{
printf("******************n");
printf("******1-play******n");
printf("******0-exit******n");
printf("******************n");
printf("请输入数字--->");
}
2-棋盘的创建:
接下来就是棋盘的创建,为了达到以下效果:
显然,我们应该使用字符二维数组:char board[][];
这是一个3*3的棋盘,为了后期修改打印范围更广的棋盘,也为了后续操作的方便,我们可以在预处理的时候进行宏定义
#define ROW 3 #define COL 3
数组的创建我们应该先进初始化,这里我们选择用init_board函数来进行:
<1.数组初始化>
void init_board(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
board[i][j] = ' ';
}
}
}
接下来就是棋盘的边缘修饰部分,打印规律是:
1.空格%c空格
2.|
3.换行
4.---
5.|
6.换行
这里我们用display_board()函数和循环、选择结构来操作
<2.棋盘的修饰>
void display_board(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
printf(" %c ", board[i][j]);
if (j < col - 1)
{
printf("|");
}
}
printf("n");
for (j = 0; j < col; j++)
{
if (i < row - 1)
{
printf("---");
if (j < col - 1)
{
printf("|");
}
}
}
printf("n");
}
}
3-玩家下棋:
首先,在输入坐标的时候应该检验该位置是否被占领,或者输入的坐标非法,再次输入,这里就要用循环,输入正确就修改数组board里面的元素,跳出循环。
void player_move(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
while (1)
{
printf("请下棋--->");
scanf("%d %d", &x, &y);
if (x > 0 && y > 0 && x - 1 < 3 && y - 1 < 3)
{
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '*';
break;
}
else
{
printf("该地已被占领,重新输入!n");
}
}
else
{
printf("坐标非法,重新输入!n");
}
}
4-电脑下棋
这里我们就要用到随机函数rand(),和一个种子srand((unsigned int)time(NULL)),我们要得到坐标范围是0-2,用rand()%3可以解决这个问题,同时电脑走的时候还要检查这个地方是不是空的
void computer_move(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
while (1)
{
x = rand() % 3;
y = rand() % 3;
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
5-输赢判断
在以上的代码中仅仅只是下了一手棋,想要持续下就需要用到循环
char ret = 0;
while (1)
{
ret = is_win(board, ROW, COL);
if ('C' != ret)
{
break;
}
player_move(board, ROW, COL);
display_board(board, ROW, COL);
ret = is_win(board, ROW, COL);
if ('C' != ret)
{
break;
}
computer_move(board, ROW, COL);
display_board(board, ROW, COL);
}
这里用一个is_win函数来判断输赢,其返回值传递给ret来检验,三子棋赢得规则就不多说,如下:
<1.输赢>
char is_win(char board[ROW][COL], int row,int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ')
{
return board[i][0];
}
else if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')
{
return board[0][i];
}
}
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
{
return board[1][1];
}
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
{
return board[1][1];
平局怎么办呢?,这就用到的上面’C‘这个字符,用is_full()和is_win()的嵌套来决定
<2.平局>
int is_full(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (board[i][j] == ' ')
{
return 1;
break;
}
}
}
return -1;
}
//is_win部分:
if (1 == is_full(board, ROW, COL))
{
return 'C';
}
else
{
return 'X';
}
}
这样这就游戏就写完了
0.0
运行效果:



