三子棋小游戏
int main()
{
menu();
int input = 0;
srand((unsigned int)time(NULL));//rand函数实现的必要条件
while (1)
{
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
break;
default:
printf("输入错误,请重新输入\n");
break;
}
}
return 0;
写一个游戏首先需要知道需要实现哪些功能,所以需要提前构思框架,然后一步一步实现,我们必须写一个死循环,不能打印一次然后就退出,我们选择switch语句,更加直观,方便选择,选择1为玩游戏,选择0退出,默认值则代表输入值有误。
进入游戏,首先需要打印游戏菜单,所以创建一个菜单函数
void menu()
{
printf("***********************\n");
printf("*** 1 .play ******\n");
printf("*** 0 .exit ******\n");
printf("***********************\n");
}
选择1,则进入游戏,创建game()
void game()
{
int ret = 0;
char board[ROW][COL] = { 0 };
init_board(board,ROW,COL);
show_board(board, COL, ROW);
while (1)//必须写入循环,否则只可以执行一步。
{
player_run(board, ROW, COL);
show_board(board, COL, ROW);
ret = judge_win(board, COL, ROW);
if (ret != 'C')//如果不是平局,跳出循环不再执行
{
break;
}
computer_run(board, ROW, COL);
show_board(board, COL, ROW);
ret = judge_win(board, COL, ROW);
if (ret != 'C')//如果不是平局,跳出循环不再执行
{
break;
}
}
if (ret == '*')
{
printf("玩家赢\n");
}
else if (ret == '#')
{
printf("电脑赢\n");
}
else if (ret == 'Q')
{
printf("平局\n");
}
}
玩游戏时我们需要实现一个棋盘,可以使用一个二维数组实现,char board [ROW] [COL],ROW和COL均为常量,用define进行常量的声明,然后我们必须初始化棋盘,创建一个初始化棋盘的函数。
我们将功能模块化,将游戏所需要的功能单独放在一个源文件中,再创建一个头文件game.h,便于引用。
棋盘初始化
void init_board(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col; j++)
{
board[i][j] = ' ';
}
}
}
打印棋盘
void show_board(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col; j++)
{
printf(" %c |" ,board[i][j]);
//printf("---|");
}
printf("\n");
for (j = 0; j < col; j++)
{
printf("---|");
}
printf("\n");
}
}
玩家走
void player_run(char board[ROW][COL], int row, int col)
{
printf("玩家走->\n");
/*int i = 0;
int j = 0;*/
int x = 0;
int y = 0;
printf("请输入坐标:\n");
scanf("%d %d", &x, &y);
while (1)
{
if (board[x - 1][y - 1] == '#')
{
//board[x - 1][y - 1] = '*';
//break;
//break;
}
else if (x > 3 || x < -1 || y > 3 || y < -1)
{
printf("输入错误,请重新输入\n");
break;
}
else
{
board[x - 1][y - 1] = '*';
break;
}
}
}
电脑走
void computer_run(char board[ROW][COL], int row, int col)
{
printf("电脑走->\n");
int x = 0;
int y = 0;
x = rand() % ROW;
y = rand() % COL;
while (1)
{
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
判断输赢
char judge_win(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
//int j = 0;
//for (j = 0; j < col; j++)
if (board[0][i] == board[1][i] && board[0][i] == board[2][i] && board[0][i] != ' ')
{
return board[0][i];
}
}
for (i = 0; i < row; i++)
{
if (board[i][0] == board[i][1] && board[i][0] == board[i][2] && board[i][0] != ' ')
{
return board[i][0];
}
}
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[2][0] != ' ')
{
return board[2][0];
}
if (is_full(board, COL, ROW) == 1)
{
return 'Q';
}
return 'C';
}
棋盘是否为满
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 0;
/*else
return 0;*/
}
}
return 1;
}
#include
#define ROW 3
#define COL 3
void init_board(char board[ROW][COL], int row, int col);
void show_board(char board[ROW][COL], int row, int col);
void player_run(char board[ROW][COL], int row, int col);
void computer_run(char board[ROW][COL], int row, int col);
#include
#include
//玩家赢*
//电脑赢#
//平局'Q;
//继续“C”
char judge_win(char board[ROW][COL], int row, int col);
scanf一定要放在循环内部,否则break;跳出后回继续循环你所输入的值。
1.这个一个数组的遍历,为了判断棋盘是否打印满,此处存在一个bug,当你棋盘只走一步时,棋盘当然没有满,但是此时的逻辑为,遇到不是空格的位置,就会return1;显然不符合我们的需求。
2.修改后如下,如果遇到空格,则return0;代表棋盘没有填满,符合逻辑,当一个空格都没有,自然是满了,return1.