大家都玩过五子棋,其实三子棋与五子棋是一样的,只是棋子的数量不同而已。
先定义两个常量 #define ROW 3 #define COL 3
1.先对棋盘进行初始化,每个没有落子的位置都是空格,所以可以用空格赋值给当前位置的字符。
void init()//棋盘初始化
{
for (int row = 0; row < ROW; row++)
{
for (int col = 0; col < COL;col++)
g_board[row][col]=' ';
}
}
2.打印棋盘,打印一个九宫格,并用for循环把初始化的空格字符赋值给给九宫格中的空格。
void print()//打印棋盘
{
printf("\t\t\t\t ___ ___ ___ \n");
for (int row= 0; row< ROW; row++)
{
printf("\t\t\t\t| %c | %c | %c |\n", g_board[row][0],g_board[row][1],g_board[row][2]);
printf("\t\t\t\t|___|___|___|\n");
}
}
3.打印完棋盘就开始游戏
(1)提示玩家落子=>玩家输入坐标=>判断坐标是否合法=>判断坐标位置是否为空格=>判断是否平局,判断是否结束游戏
两种情况:如果不是空格,说明输入位置已经有子,需重新输入坐标。
如果为空格,就把该位置赋值为X,作为玩家落的子,就判断是否平局(没有空格则平局),在判断是否连成线,连城线,玩家胜,游戏结束,如果没有连成线,然后提示电脑落子
(2)电脑随机产生两个[0,2]的整数作为电脑落子的位置坐标=>判断落子位置是否为空格,如果为空格则重新产生两个数作为坐标,否则 就将“o”赋值给这个位置,判断是否为平局,是否结束游戏。
(3)如果检查后发现电脑赢了或者平局,就退出游戏,否则提示玩家落子,就到了第一步。
print();
playmove();
print();
winner=checkwinner();
if (winner != ' ')
break;
computermove();
winner=checkwinner();
if (winner != ' ')
break;
}
if (winner == 'X')
{
print();
printf(" \t恭喜您赢了!!!\n");
}
else if (winner == 'C')
{
print();
printf(" \t 很遗憾您输了!!!\n");
}
else
{
print();
printf(" \t和棋\n");
}
需要定义一个checkwinner函数,来判断是否结束游戏。
判断输赢的函数,需要从所有的行、列、斜线检查,是否连成一条线,根据空格的数量判断是否平局。
//winner=='x' 玩家胜
//winner=='o' 电脑胜
//winner==' '胜负未定continue到while语句
//else 和棋
完整代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROW 3
#define COL 3
char g_board[ROW][COL];//定义全局变量
void init()//棋盘初始化
{
for (int row = 0; row < ROW; row++)
{
for (int col = 0; col < COL;col++)
g_board[row][col]=' ';
}
}
void print()//打印棋盘
{
printf("\t\t\t\t ___ ___ ___ \n");
for (int row= 0; row< ROW; row++)
{
printf("\t\t\t\t| %c | %c | %c |\n", g_board[row][0],g_board[row][1],g_board[row][2]);
printf("\t\t\t\t|___|___|___|\n");
}
}
void playmove()//玩家落子
{
printf("请玩家落子!\n");
printf("请玩家输入落子的位置坐标:(row col)");
while (1)
{
int row; int col;
scanf_s("%d %d", &row, &col);
if (row < 0 || row >= ROW || col < 0 || col >= COL)
{
printf("坐标位置非法,请重新输入:(row col)");
continue;
}
if (g_board[row][col] !=' ')
{
printf("该位置已落子,请重新输入:(row col)");
continue;
}
g_board[row][col] = 'X';
break;
}
}
void computermove( )//电脑落子
{
printf("别着急,我正在思考!\n");
while (1)
{
int row = rand() % ROW;
int col = rand() % COL;
if (g_board[row][col] != ' ')
{
continue;
}
g_board[row][col] = 'C';
printf("我落子的位置为(%d %d)\n", row, col);
break;
}
}
char checkwinner()//判断输赢,检查所有的行、列、斜线方向
{
for (int row = 0; row < ROW; row++)//检查所有的行
{
if (g_board[row][0] == g_board[row][1] &&
g_board[row][1] == g_board[row][2] &&
g_board[row][0] != ' ')
{
return g_board[row][1];
}
}
for (int col = 0; col < COL; col++)//检查所有的列
{
if (g_board[0][col] == g_board[1][col] &&
g_board[1][col] == g_board[2][col] &&
g_board[1][col] != ' ')
{
return g_board[1][col];
}
}
if (g_board[0][0] == g_board[1][1] &&
g_board[2][2] == g_board[1][1]&&
g_board[0][0] !=0)//检查两条对角线
return g_board[1][1];
if (g_board[0][2] == g_board[1][1] &&
g_board[2][0] == g_board[1][1] &&
g_board[1][1] != 0)//检查两条对角线
return g_board[1][1];
//判断胜负未定情况:有空格,胜负未定
for (int row = 0; row < ROW; row++)
{
for (int col = 0; col < COL; col++)
{
if (g_board[row][col] == ' ')
{
return ' ';
}
}
}
}
int main()
{
srand((unsigned int)time(0));
printf("\n\n");
init();
char winner;
while (1)
{
//winner=='x' 玩家胜
//winner=='o' 电脑胜
//winner==' '胜负未定continue到while语句
//else 和棋
print();
playmove();
print();
winner=checkwinner();
if (winner != ' ')
break;
computermove();
winner=checkwinner();
if (winner != ' ')
break;
}
if (winner == 'X')
{
print();
printf(" \t恭喜您赢了!!!\n");
}
else if (winner == 'C')
{
print();
printf(" \t 很遗憾您输了!!!\n");
}
else
{
print();
printf(" \t和棋\n");
}
printf("\n\n");
system("pause");
return 0;
}