前言:这个小项目(暂且称为项目)主要考察数组以及函数的基础知识。作为初学者,可将其作为一个阶段性测试,这里提供思路及部分代码以供参考。
1.棋盘相关
以二维字符数组作为棋盘,玩家下棋以及电脑下棋均是对二维数组中的数据进行修改,我们可以按照个人喜好个性化棋盘,这里给出一种参考。图中的棋盘已进行初始化,二维数组中元素均为空格。
void PrintBoard(char Board[Len][Wid], int len, int wid)
{
for (int i = 0; i < len; i++)
{
for (int j = 0; j < wid; j++)
{
printf(" %c ", Board[i][j]);
if (j < wid - 1)
printf("|");
if (j == wid - 1)
printf("\n");
}
if(i<Len-1)
printf("---|---|---\n");
}
}
2.下棋
1.玩家下棋
玩家输入坐标,然后将二维数组对应位置的数据进行更改,下棋动作即完成,考虑程序的健壮性 此处用while循环确保玩家输入的坐标可用,这里将‘*’作为玩家棋子
void Player(char Board[Len][Wid], int len, int wid)
{
int x = 0, y = 0;
while (1)
{
printf("请输入坐标:\n");
scanf("%d %d", &x, &y);
if (Board[x - 1][y - 1] == ' ')
{
Board[x - 1][y - 1] = '*';
break;
}
else
{
printf("该坐标不可用,请重新输入\n");
}
}
}
2.电脑下棋
电脑下棋需要随机生成坐标,并确保该坐标可用,这里将‘#’作为电脑棋子
void Computer(char Board[Len][Wid], int len, int wid)
{
while (1)
{
int x = rand() % 3;
int y = rand() % 3;
if (Board[x][y]== ' ')
{
Board[x][y] = '#';
break;
}
}
printf("电脑已下棋\n");
}
这里需要注意 调用rand()函数生成随机数时要先调用srand()
3.判断游戏是否要继续
当玩家或者电脑下棋后需要判断是否产生赢家或棋盘是否已满,并输出判断结果。
char Judge(char Board[Len][Wid], int len, int wid)
{
int i = 0,j=0;
//判断行
for (i = 0; i < len; i++)
{
if (Board[i][0] == Board[i][1] && Board[i][1] == Board[i][2] && Board[i][1] != ' ')
{
return Board[i][1];
}
}
//判断列
for (i = 0; i < wid; i++)
{
if (Board[0][i] == Board[1][i] && Board[1][i] == Board[2][i] && Board[1][i] != ' ')
{
return Board[1][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];
}
for (i = 0; i < len; i++)
{
for (j = 0; j < wid; j++)
{
if (Board[i][j] == ' ')
return 'C';
}
}
return 'E';
}
4.各个模块的组织
能实现各个模块的功能还不够,组织各个模块也很重要。玩家下棋和电脑下棋显然是一个循环的过程,在这个循环中每当玩家或者电脑下棋后我们都应该使结果可视化,即打印棋盘并判断是否产生赢家以及棋盘是否已满
void game()
{
srand((unsigned int)time(NULL));
char Board[Len][Wid] = {'0'};
InitBoard(Board, Len, Wid);
PrintBoard(Board, Len, Wid);
char ret = 0;
while (1)
{
Player(Board, Len, Wid);
PrintBoard(Board, Len, Wid);
ret = Judge(Board, Len, Wid);
if (ret != 'C')
break;
Computer(Board, Len, Wid);
PrintBoard(Board, Len, Wid);
ret = Judge(Board, Len, Wid);
if (ret != 'C')
break;
}
if (ret == '*')
printf("玩家赢\n");
if (ret == '#')
printf("电脑赢\n");
if (ret == 'E')
printf("平局\n");
}
最后给出程序演示