使用C语言实现三子棋基本流程
1.菜单界面选择开始游戏或退出游戏;
2.创建棋盘并初始化;
3.打印棋盘并开始下棋;
4.玩家先下,用*表示玩家下棋,以输入xy坐标来下棋;
5.判断输赢(*表示玩家赢;#表示电脑赢;Q表示平局;C表示继续下一局);
6.电脑下,用#表示电脑下棋;
7.判断输赢;
8.回到2继续下棋。
1开始游戏 0退出游戏;
void menu()
{
printf("**********************n");
printf("***1.play 0.exit ****n");
printf("**********************n");
}
界面显示
使用三行三列的二维数组表示,元素类型为char;
//数组存放走出的棋盘信息
char board[BOW][COL] = { 0 };//全部空格
#define BOW 3 #define COL 3
使用宏定义可提高代码扩展性
初始化棋盘void InitBoard(char board[BOW][COL], int bow, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < bow; i++)
{
for (j = 0; j < col; j++)
{
board[i][j] = ' ';
}
}
}
打印棋盘
void DisplayBoard(char board[BOW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
//打印一行的数据
//printf(" %c | %c | %c n",board[i][0],board[i][1],board[i][2]);//简单方法
int j = 0;
for (j = 0; j < col; j++)
{
printf(" %c ",board[i][j]);
if(j < col-1)
printf("|");
}
printf("n");
//打印分隔行
if (i < row - 1)
{
for (j = 0; j < col; j++)
{
printf("---");
if(j < col - 1)
printf("|");
}
printf("n");
//简单方法
}
}
}
此时棋盘打印出的结果为
输入行列坐标表示下棋,用*表示
void PlayerMove(char board[BOW][COL], int bow, int col)
{
int x = 0;
int y = 0;
printf("玩家走:>n");
while (1)
{
printf("请输入要下的坐标:>");
scanf("%d%d", &x, &y);
//判断xy坐标合法性
if (x >= 1 && x <= bow && y >= 1 && y <= col)
{
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '*';
break;//下棋成功跳出循环
}
else
{
printf("该坐标被占用n");
}
}
else
{
printf("坐标非法,请重新输入:n");
}
}
}
电脑下棋
电脑随机生成行列坐标来下棋,用#表示
void ComputerMove(char board[BOW][COL], int bow, int col)
{
int x = 0;
int y = 0;
printf("电脑走:>n");
while (1)
{
x = rand() % bow;
y = rand() % col;
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
在主函数中使用srand((unsigned int)time(NULL)); 确保得到的行列坐标为随机的;
判断输赢1.先约定‘*’为玩家赢;‘#’为电脑赢;‘Q’为平局;‘C’为继续游戏;
2.判定是否平局
a.调用IsFull函数。
b.如果数组中有元素为’ ‘,那么没满,返回0。如果全不为’ ',满了,返回1。
c.如果棋盘满了未分出胜负,平局。
3.判定输赢
//返回1表示棋盘满了
//返回0,没满
int IsFull(char board[BOW][COL], int bow, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < bow; i++)
{
for (j = 0; j < col; j++)
{
if (board[i][j] == ' ')
{
return 0;//没满
}
}
}
return 1;//满了
}
char IsWin(char board[BOW][COL], int bow, int col)
{
int i = 0;
//横三行
for (i = 0; i < bow; 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 < col; 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[2][0] == board[1][1] && board[1][1] == board[0][2] && board[1][1] != ' ')
return board[1][1];
//判断是否平局
if(i == IsFull(board, BOW, COL))
{
return 'Q';
}
return 'C';
}
结果演示
1.玩家赢
2.电脑赢
3.平局
1.test.c
#define _CRT_SECURE_NO_WARNINGS
//测试三子棋游戏
#include "game.h"
void menu()
{
printf("**********************n");
printf("***1.play 0.exit ****n");
printf("**********************n");
}
void game()
{
printf("三子棋n");
//数组存放走出的棋盘信息
char board[BOW][COL] = { 0 };//全部空格
//初始化棋盘
InitBoard(board, BOW, COL);
//打印棋盘
DisplayBoard(board, BOW, COL);
char ret = 0;
//下棋
while (1)
{
//玩家下棋
PlayerMove(board, BOW, COL);
DisplayBoard(board, BOW, COL);
//判断玩家是否赢
ret = IsWin(board, BOW, COL);
if (ret != 'C')
break;
//电脑下棋
ComputerMove(board, BOW, COL);
DisplayBoard(board, BOW, COL);
//判断电脑是否赢
ret = IsWin(board, BOW, COL);
if (ret != 'C')
break;
}
if (ret == '*')
{
printf("玩家赢n");
}
else if (ret == '#')
{
printf("电脑赢n");
}
else
{
printf("平局n");
}
}
void test1()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请选择:>");
scanf("%d",&input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏n");
break;
default:
printf("选择错误,请重新选择n");
break;
}
} while (input);
}
int main()
{
test1();
return 0;
}
2.game.c
#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
void InitBoard(char board[BOW][COL], int bow, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < bow; i++)
{
for (j = 0; j < col; j++)
{
board[i][j] = ' ';
}
}
}
void DisplayBoard(char board[BOW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
//打印一行的数据
//printf(" %c | %c | %c n",board[i][0],board[i][1],board[i][2]);
int j = 0;
for (j = 0; j < col; j++)
{
printf(" %c ",board[i][j]);
if(j < col-1)
printf("|");
}
printf("n");
//打印分隔行
if (i < row - 1)
{
for (j = 0; j < col; j++)
{
printf("---");
if(j < col - 1)
printf("|");
}
printf("n");
}
}
}
void PlayerMove(char board[BOW][COL], int bow, int col)
{
int x = 0;
int y = 0;
printf("玩家走:>n");
while (1)
{
printf("请输入要下的坐标:>");
scanf("%d%d", &x, &y);
//判断xy坐标合法性
if (x >= 1 && x <= bow && y >= 1 && y <= col)
{
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '*';
break;//下棋成功跳出循环
}
else
{
printf("该坐标被占用n");
}
}
else
{
printf("坐标非法,请重新输入:n");
}
}
}
void ComputerMove(char board[BOW][COL], int bow, int col)
{
int x = 0;
int y = 0;
printf("电脑走:>n");
while (1)
{
x = rand() % bow;
y = rand() % col;
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
//返回1表示棋盘满了
//返回0,没满
int IsFull(char board[BOW][COL], int bow, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < bow; i++)
{
for (j = 0; j < col; j++)
{
if (board[i][j] == ' ')
{
return 0;//没满
}
}
}
return 1;//满了
}
char IsWin(char board[BOW][COL], int bow, int col)
{
int i = 0;
//横三行
for (i = 0; i < bow; 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 < col; 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[2][0] == board[1][1] && board[1][1] == board[0][2] && board[1][1] != ' ')
return board[1][1];
//判断是否平局
int ret = IsFull(board, BOW, COL);
if(ret == 1)
{
return 'Q';
}
return 'C';
}
3.game.h
#pragma once #define BOW 3 #define COL 3 #include#include #include //声明 void InitBoard(char board[BOW][COL], int bow, int col); void DisplayBoard(char board[BOW][COL], int row, int col); void PlayerMove(char board[BOW][COL], int bow, int col); void ComputerMove(char board[BOW][COL], int bow, int col); //告诉四种游戏状态; //玩家赢; '*' //电脑赢; '#' //平局; 'Q' //继续; 'C' char IsWin(char board[BOW][COL], int bow, int col);



