利用c语言编写三子棋的代码,相对来说比较简单,三子棋其实就可以看作是以个三行三列的二维数组,然后对其里面的每个元素进行赋值。因此我们首先需要理清楚三子棋完成的思路。
1.首先我们需要一个棋盘,所以需要一个print()函数来打印棋盘。而棋盘内容需要什么呢,很显然是棋子。我们选择‘x’为玩家落子,‘o’为电脑落子。
2.然后就是落子的过程了。我们玩家落子的时候,以输入坐标的方式来进行,我们用player()函数实现;而电脑落子的话,我们就直接采用随机数的方式完成电脑落子,用computer()函数实现。
3.落子完了之后,我们就需要判定当前棋局的状况了。当前棋局的状况可以能有以下几种情况:(1)玩家获胜;(2)电脑获胜;(3)和棋。这三种情况都是游戏结束时的情况,当然还有一种就是棋局没有结束,玩家电脑继续落子。判定当前棋局状况的话我们就用一个check()函数来完成。
理清楚思路后,接下来看看各个函数如何实现吧。
首先时print()函数来打印棋盘:由于每个函数都需要进行二维数组传参,所以我直接将二维数组arr[row][col]定义为全局变量,这样也更加方便,打印棋盘很简单,就是直接printf就可以了,至于打印出来的效果,看个人的看法吧。
void print()
{
for (int i = 0; i < row; ++i)
{
for (int j = 0; j < col; ++j)
{
printf("| %c ",arr[i][j]);
if (j == 2)
{
printf("|");
}
}
printf("\n");
printf("|____|____|____|");
printf("\n");
}
}
然后是用play()函数完成玩家落子:play()函数需要注意的是你输入的坐标问题,如果你输入的坐标超过数组下标了,或者该坐标已经落过子了,则显示输入错误,请重新输入,因此我们需要一个while循环来完成。当输入的坐标合法了,就把该位置赋值为‘x',也就可以退出循环了。
void player()
{
int x = 0;
int y = 0;
while (1)
{
printf("请输入坐标:");
scanf("%d %d", &x, &y);
if (x<0 || x>=row || y<0 || y>=col)
{
printf("输入错误,请重新输入!\n");
continue;
}
if (arr[x][y] != ' ')
{
printf("输入错误,请重新输入!\n");
continue;
}
arr[x][y] = 'x';
break;
}
}
然后是computer()函数完成电脑落子:由于电脑落子是直接采用随机数,所以需要使用rand()函数和随机种子。我们知道rand()函数的随机值是0~99,而我们的数组是3X3的,所以让数组下标等于rang()%3就可以保证电脑落子有坐标越界的问题,但是依旧要考虑坐标上有子的问题,所以也需要while循环重新落子。
void computer()
{
while (1)
{
int a = rand() % row;
int b = rand() % col;
if (arr[a][b] != ' ')
{
continue;
}
arr[a][b] = 'o';
break;
}
}
接下来是check()函数来完成棋局的判断:判断也很简单,就是一行或者一列或者对角线相同时,当然还要保证它们不等于’ ‘,因为我们一开始打印棋盘时,把二维数组里的元素全部定义为空格也就是字符’ ‘。check()函数我们需要返回一个值用来表示棋局状况,当玩家赢时,我们返回’x’;当电脑赢时,我们返回‘o’;若是和棋,则返回‘p’ ;若游戏没有结束我们就返回‘ ’。而判断和棋我定义了一个Isfull函数,若棋盘满了且不满足上面两种胜负情况就表示和棋。
int Isfull()
{
for (int i = 0; i < row; ++i)
{
for (int j = 0; j < col; ++j)
{
if (arr[i][j] == ' ')
return 0;
}
}
return 1;
}
char check()
{
int i = 0;
for (i = 0; i < row; ++i)
{
if (arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2]&&arr[i][0] != ' ')
{
return arr[i][0];
}
}
for (i = 0; i < col; ++i)
{
if (arr[0][i] == arr[1][i] && arr[1][i] == arr[2][i] && arr[0][i] != ' ')
{
return arr[i][0];
}
}
if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[1][1] != ' ')
{
return arr[1][1];
}
else if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[1][1] != ' ')
{
return arr[1][1];
}
else if (Isfull() == 1)
{
return 'p';
}
else
return ' ';
}
最后就是主函数部分了。主函数部分这里我定义了一个init()函数完成二维数组的初始化。然后就是我们需要在每一次玩家和电脑落子之后调用check()函数,还有我使用了一个system("cls")清理屏幕,让输出结果更明了,最后当游戏结束时,再打印一次棋盘,看最后的棋盘状况。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define row 3
#define col 3
char arr[row][col];
void init()
{
for (int i = 0; i < row; ++i)
{
for (int j = 0; j < col; ++j)
{
arr[i][j] = ' ';
}
}
}
int main()
{
srand((unsigned int)time(0));
init();
char winner = '\0';
while (1)
{
print();
player();
winner = check();
if (winner != ' ')
{
break;
}
computer();
winner = check();
if (winner != ' ')
{
break;
}
system("cls");
}
if (winner == 'x')
{
printf("you win\n");
}
else if (winner == '0')
{
printf("you lost\n");
}
else if (winner == 'p')
{
printf("和棋!\n");
}
print();
system("pause");
return 0;
}