三子棋和五子棋C的实现,都是一样的,都要分为下面几个部分分别来实现。下面主要介绍三子棋的实现。
1. 棋盘的初始化
2. 棋盘显示
3. 玩家输入
4. 判定是否有三子情况
5. 电脑自动输入
6. 判定是否有三子情况
1.棋盘初始化:
void InitialArr(char Arr[][COL], int row, int col)
{
int i = 0;
for (; i < row; i++)
{
int j = 0;
for (; j < col; j++)
{
Arr[i][j] = ' ';
}
}
}
将最开始的棋盘的字符,全设为' '
。
2.棋盘显示:
void ShowArr(char Arr[][COL], int row, int col)
{
int i = 0;
printf("-----------\n");
printf(" 1| 2| 3|\n");
printf("-----------\n");
for (; i < row; i++)
{
printf("%d| %c| %c| %c|\n", i+1, Arr[i][0], Arr[i][1], Arr[i][2]);
printf("-----------\n");
}
}
这里就3*3的棋盘,不用很复杂,简单显示即可。
3.玩家输入:
int PlayerArr(char Arr[][COL], int row, int col)
{
printf("Please input your row and col:>");
int i = 0;
int j = 0;
scanf("%d %d", &i, &j);
if (i >= 1 && i <= 3 && j >= 1 && j <= 3)
{
if (Arr[i-1][j-1] != ' ')
{
return 2; //该位置已经有点了,不能再输入
}
else
{
Arr[i - 1][j - 1] = BLACK;
return 1; //输入正确
}
}
return -1; //坐标输入错误
}
玩家输入的显示为:‘X’
。
在这里玩家输入方式,我选用的从键盘输入坐标,如果输入错误(范围不对),或者坐标已经有点了,就提示错误,并让玩家重新输入。
4.判定是否有三子情况:
int JudgeArr(char Arr[][COL], int row, int col)
{
int i = 0;
for (;i<row;i++)//每行三子,且不为空
{
if (Arr[i][0]!=' '&& Arr[i][0] == Arr[i][1] && Arr[i][1] == Arr[i][2])
{
return Arr[i][0];
}
}
for (i=0; i < row; i++)//每列三子,且不为空
{
if (Arr[0][i] != ' '&&Arr[0][i] == Arr[1][i] && Arr[1][i] == Arr[2][i])
{
return Arr[0][i];
}
}
if (Arr[0][0] != ' '&&Arr[0][0] == Arr[1][1] && Arr[1][1] == Arr[2][2])
{
return Arr[0][0];
}//主对角线,且不为空
if (Arr[0][2] != ' '&&Arr[0][2] == Arr[1][1] && Arr[1][1] == Arr[2][0])
{
return Arr[0][2];
}//副对角线,且不为空
for (i = 0; i < row; i++)
{
int j = 0;
for (; j < col; j++)
{
if (Arr[i][j] == ' ')
{
return 'E'; //Empty,棋盘还有空,继续下棋
}
}
}
return 'D';//Draw,棋盘满了,未有输赢,平局
}
判定,是在玩家和电脑输入之后,均会进行判定。输赢有8种情况:每行三子,每列三子,主副对角线,且都不为空。
另外两种情况:
- 棋盘还有空,继续下棋
- 棋盘满了,未有输赢,平局
5.电脑自动输入:
void ComputerArr(char Arr[][COL], int row, int col)
{
while (1)
{
int i = rand() % row;
int j = rand() % col;
if (Arr[i][j] == ' ')
{
Arr[i][j] = WHITE;
break;
}
}
Sleep(500);
printf("Computer done!\n");
}
在这里用了,srand和rand函数,生成随机数。当生成的行和列,此时对应的棋盘为空时,就落入棋子,电脑的棋子为‘O’
。在这里设定了一点延时。
6.判定是否有三子
这里和上面4的步骤一样。
游戏的程序:
void Game()
{
printf("\n游戏开始!\n");
char Arr[ROW][COL];
InitialArr(Arr, ROW, COL);
char ret = 'E'; //Empty,棋盘最开始全为空,返回值可为D,WHITE和BLACK
int ProRet = 0;
while (1)
{
ShowArr(Arr, ROW, COL);
again: //输入不对的情况,重新输入
ProRet=PlayerArr(Arr, ROW, COL);
if (2 == ProRet)
{
printf("该位置已经有点了,请重新输入\n");
goto again;
}
else if (-1 == ProRet)
{
printf("坐标输入有误,请重新输入\n");
goto again;
}
else
{
printf("Player done!\n");
Sleep(500);
}
ret=JudgeArr(Arr, ROW, COL);
if (ret != 'E')//不等于空,棋盘满了,不执行了
{
break;
}
ComputerArr(Arr, ROW, COL);
ret = JudgeArr(Arr, ROW, COL);
if (ret != 'E')//不等于空,棋盘满了,不执行了
{
break;
}
}
ShowArr(Arr, ROW, COL);
switch (ret)//进行判定,谁输谁赢,平局
{
case BLACK:
printf("\n恭喜你,你赢了!\n");
break;
case WHITE:
printf("\n很遗憾,你输了!\n");
break;
case 'D':
printf("\n平局,再接再厉!\n");
break;
default:
break;
}
printf("\n游戏结束!\n");
}
五子棋的样图,和三子棋的实现方法一样。
我把三子棋和五子棋的程序都放在了我的Github上面,有需要的小伙伴请自取:三子棋五子棋