目录
一、问题描述
二、基本流程
三、步骤
- 菜单界面
- 创建棋盘
- 棋盘初始化
- 打印棋盘
- 玩家落子
- 电脑落子
- 检验结果
四、代码实现
一、问题描述
用C语言实现三子棋。
二、基本流程
1.打印菜单选择开始或退出游戏
2.创建一个二维数组作为棋盘并初始化
3.打印棋盘
4.玩家落子“X”代表玩家
5.检验结果
6.电脑落子“O”代表电脑
7.检验结果
8.判断结果
9.回到步骤2
三、步骤
1.菜单界面
1.开始游戏 2.退出游戏
void Menu()
{
printf("+--------------------+\n");
printf("| 1.Play 2.Exit |\n");
printf("+--------------------+\n");
}
int main()
{
int select = 0;
int quit = 0;
while (!quit){
Menu();
printf("Please Select#");
scanf("%d",&select);
switch (select){
case 1: //选择1进入游戏
Game();
break;
case 2: //选择2退出游戏
quit = 1;
break;
default: //输入其他显示出错
printf("You Enter Error,Try Again!\n");
break;
}
}
printf("ByeBye!\n");
system("pause");
return 0;
}
结果:
2.创建棋盘
使用三行三列的二维数组表示,在这里使用宏定义,提高代码的可读性和可维护性。
#define ROW 3
#define COL 3
#define WHITE 'X' //玩家
#define BLACK 'O' //电脑
#define INIT ' '
#define DRAW 'D' //和棋
#define NEXT 'N' //继续
3.棋盘初始化
INIT表示空格
#define INIT ' '
static void InitBoard(char board[][COL], int row, int col){
for (int i = 0; i < row; i++){
for (int j = 0; j < col; j++){
board[i][j] = INIT;
}
}
}
4.打印棋盘
static void ShowBoard(char board[][COL], int row, int col){
system("cls");
for (int i = 0; i < col; i++){
printf(" %4d", i+1);
}
printf("\n +---+----+---+\n");
for (int i = 0; i < row; i++){
printf("%-2d", i+1);
for (int j = 0; j <col; j++){
printf("| %c", board[i][j]);
}
printf("\n +---+----+---+\n");
}
}
结果:
5.玩家落子
玩家输入行列坐标表示落子,“X”代表玩家。
注意:
1.玩家落子需要在棋盘范围内;
2.玩家要选择棋盘上空的位置落子;
3.如果输入的坐标不对要重新输入。
static void PlayerMove(char board[][COL], int row, int col){
int x = 0;
int y = 0;
while (1)
{
printf("Please Enter Position<x,y>#");
scanf("%d %d", &x, &y);
if (x<1 || y<1 || x>3 || y>3){ //判断玩家输入的坐标是否满足要求
printf("Enter Position Error!\n");
continue;
}
if (board[x - 1][y - 1] == INIT){ //判断玩家落子的地方是否为空
board[x - 1][y - 1] = WHITE;
break;
}
else{
printf("Position Is Not Empty!\n");
}
}
}
6.电脑落子
种一颗随机数种子,让电脑随机生成行列坐标,“O”表示电脑落子。
注意:
1.在数函数中使用srand((unsigned long)time(NULL)),用时间作为随机数种子;
2.电脑要在棋盘空格地方落子;(走到这里,表示一定还有空格,因为在玩家落子之后进行了结果判断,在这里就不需要在判断是否还有空格);
//srand((unsigned long)time(NULL)); 种一个随机数种子
static void ComputerMove(char board[][COL], int row, int col){
while (1){
int x = rand() % row; //x取值范围为0到2
int y = rand() % col; //y取值范围为0到2
if (board[x][y] == INIT){ //判断落子点是否为空
board[x][y] = BLACK;
break;
}
}
}
7.检验结果
1.返回结果:
(1).“X”表示玩家胜;
(2).“O”表示电脑胜;
(3).“D”表示和棋;
(4).“N”表示一盘棋还没下完,继续下棋。
2.判断和棋或者继续
如果数组元素中有空格,表示棋盘没满,继续;如果棋盘满了没分出胜负,和棋。
3.判断电脑或玩家胜
(1).判断所有行
(2).判断所有列
(3).判断两条对角线
static char IsEnd(char board[][COL], int row, int col){
for (int i = 0; i < row; i++){
if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != INIT){
return board[i][0]; //判断所有行
}
}
for (int j = 0; j < col; j++){
if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[0][j] != INIT)
{
return board[0][j]; //判断所有列
}
}
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != INIT){
return board[0][0];
}
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != INIT){
return board[0][2]; //判断两条对角线
}
for (int i = 0; i < row; i++){
for (int j = 0; j < col; j++){
if (board[i][j] == INIT){
return NEXT;
}
}
}
return DRAW;
}
玩家胜:
电脑胜:
和棋:
注意:每次玩家落子之后都要判断一下结果,每次电脑落子之后也要判断
四、代码实现
游戏逻辑:
void Game()
{
char board[ROW][COL]; //创建棋盘
InitBoard(board, ROW, COL); //初始化棋盘
srand((unsigned long)time(NULL)); //种随机数种子
char result = 0;
while (1){
ShowBoard(board, ROW, COL); //显示棋盘
PlayerMove(board, ROW, COL); //玩家下
result = IsEnd(board, ROW, COL); //判断结果
if (result != NEXT){
break;
}
ShowBoard(board, ROW, COL); //显示棋盘
ComputerMove(board, ROW, COL); //电脑下
result = IsEnd(board, ROW, COL); //判断结果
if (result != NEXT){
break;
}
}
ShowBoard(board, ROW, COL); //显示棋盘
switch (result){
case WHITE:
printf("You Win!\n");
break;
case BLACK:
printf("You Lose!\n");
break;
case DRAW:
printf("You==Computer!\n");
break;
default:
printf("BUG!\n");
break;
}
}