相信每个人都玩过五子棋,今天我就用程序来实现一下三子棋(没错,是三子棋,不是五子棋(lll¬ω¬))。
首先,捋一下整体思路。
1.先定义一个3*3的二维数组(这里采用宏定义数组的长度,方便日后改更多子棋)
2.定义一个Init函数将数组初始化为空(此处的”srand((unsigned int)time(NULL));“为一个时间种子,为后续的随机数的产生铺垫)
3.下棋必须要有棋盘,这里定义一个 Print函数进行棋盘打印。
4.准备工作做好后,就可以下棋了。这里先定义一个 playermove函数让玩家先落子,假设玩家的子为‘x’。输入一个坐标(即为先前定义好的二维数组的下标,范围为0~2,注意此处要考虑到输入非法的情况,即输入的坐标不在范围内或者重复输入同一个坐标的情况意即该处已落子,此时应该让玩家重新输入)。
5.然后就是电脑落子了,假设电脑的子为‘o’,这里定义一个com_move函数,用俩个随机数来模拟电脑落子,这里要用到rand函数以即之前的时间种子,时间种子设在Init函数内是为了让程序每次运行时时间都不相同,使产生的随机数随机。此处也要考虑非法的情况,与4类似,就不再重复了。
6.然后就是检查胜利了,定义一个check函数,检查数组的每一行及每一列以及斜线是否一致,如果是且为‘x’,则玩家胜利,为‘o’,电脑胜利,如果下满了,都没出现一致的情况,则为和棋。
7.分支写完后就可以进行主程序的编写了,先定义及初始化数组,并打印棋盘,然后一个while循环,然后玩家和电脑分别下棋,每下一步都要验证胜利,出现胜者就跳出循环,并打印胜利者。
以下就是程序啦。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#define ROW 3
#define COL 3
char g_baord[ROW][COL];
void Init()
{
srand((unsigned int)time(NULL));
for (int row = 0; row <= ROW; row++)
{
for (int col = 0; col <= COL; col++)
{
g_baord[row][col] = ' ';
}
}
}
void Print()
{
for (int row = 0; row <ROW; row++)
{
printf("| %c| %c| %c\n", g_baord[row][0], g_baord[row][1],
g_baord[row][2]);
printf("|--|--|--\n");
}
}
void playermove()
{
printf("请玩家落子\n");
printf("请玩家输入坐标\n");
while (1)
{
int row, col;
scanf_s("%d %d", &row, &col);
if (row >= ROW || col >= COL || row < 0 || col < 0)
{
printf("请重新输入\n");
continue;
}
if (g_baord[row][col] != ' ')
{
printf("该处已落子,请玩家重新落子\n");
continue;
}
g_baord[row][col] = 'x';
break;
}
}
void com_move()
{
printf("请电脑落子\n");
while (1)
{
int row, col;
row = rand() % ROW;
col = rand() % COL;
if (g_baord[row][col] != ' ')
{
continue;
}
g_baord[row][col] = 'o';
break;
}
}
char check(char a,char b)
{
for (int row = 0; row <= ROW; row++)
{
if (g_baord[row][0] == g_baord[row][1] &&
g_baord[row][0] == g_baord[row][2] &&
g_baord[row][0] != ' ')
return a=g_baord[row][0];
}
for (int col = 0; col <= COL; col++)
{
if (g_baord[0][col] == g_baord[1][col] &&
g_baord[0][col] == g_baord[2][col] &&
g_baord[0][col] != ' ')
return b =g_baord[0][col];
}
if (g_baord[0][0] == g_baord[1][1] &&
g_baord[0][0] == g_baord[2][2] &&
g_baord[0][0] != ' ')
return a = g_baord[0][0];
if (g_baord[0][2] == g_baord[1][1] &&
g_baord[0][2] == g_baord[2][0] &&
g_baord[0][2] != ' ')
return b= g_baord[0][2];
for (int row = 0; row <= ROW; row++)
{
for (int col = 0; col <= COL; col++)
{
if (g_baord[row][col] == ' ')
break;
}
}
return 0;
}
int main()
{
printf("****************************\n");
printf("**** 欢迎来到三子棋游戏 ****\n");
Init();
Print();
char a=0;
char b=0;
while (1)
{
playermove();
Print();
check(a, b);
if (check(a, b) == '0' || check(a, b) == 'x' || check(a, b) == 'o')
{
break;
}
com_move();
Print();
check(a,b);
if (check(a, b) == '0' || check(a, b) == 'x' || check(a, b) == 'o' )
{
break;
}
}
if (check(a, b) == 'x')
printf("玩家获胜\n");
if (check(a, b) == 'o')
printf("电脑获胜\n");
if (check(a, b) == '0')
printf("和棋\n");
system("pause");
}