构建三子棋需要做的基本操作就是主函数,下面就是三子棋的框架,玩游戏的都知道游戏的开始就是菜单,所以菜单得先执行一次就用do...while循环其次就是想接着玩可以继续也可以退出。
//三子棋的主函数
int main()
{
int input = 0;
do
{
menu();//游戏菜单
printf("请输入你的选择:");
scanf("%d", &input);
switch (input)//选择后出现的情况
{
case 1:
game();//进入游戏
break;
case 0:
printf("退出程序!");
break;
default:
printf("选择错误!请重新输入");
break;
}
} while(input);
return 0;
}
下面菜单的内容
//菜单
void menu()
{
printf("************************");
printf("******* 1.play *******");
printf("******* 0.exit *******");
printf("************************");
}
接下来就是三子棋的实现了
1.初始化:设置棋盘大小为三行三列,初始化棋盘为空,并设定玩家(X或O)
2.选择:玩家先走还是电脑先走
3.移动:对选择进行移动,选择玩家则玩家先移动,反之电脑先移动,并且打印下完后的棋盘。
4.判断:无论是玩家还是电脑每下完一次都需要进行判断是否赢,其次就是看棋盘是否满,没满且没赢则继续下棋,直至棋盘满或一方赢则游戏结束。
初始化棋盘
棋盘可以想象成一个二维数组,初始化就是‘ ’(空格),没有任何什么棋子即未落子时。
void Init_Chess(char arr[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
arr[i][j] = ' ';
}
}
}
建立棋盘
这个棋盘有局限性,仅限于三子棋盘,当然也可以写一个通用代码,这里我就不在展示了。
void Print_Chess(char arr[ROW][COL])
{
printf(" 1 2 3 \n");
printf(" |---|---|---|\n");
printf("1| %c | %c | %c |\n", arr[0][0], arr[0][1], arr[0][2]);
printf(" |---|---|---|\n");
printf("2| %c | %c | %c |\n", arr[1][0], arr[1][1], arr[1][2]);
printf(" |---|---|---|\n");
printf("3| %c | %c | %c |\n", arr[2][0], arr[2][1], arr[2][2]);
printf(" |---|---|---|\n");
}
选择先落子一方
由玩家选择先下棋一方,选择1或0。
int First_Decide()
{
int i = 0;
printf("请选择(1.玩家 0.电脑):");
scanf("%d", &i);
return i;
}
移动
假设电脑先移动
电脑随即产生一个行及列构成一个坐标下棋,如果下的这个位置本身有棋子,则继续下棋,直至电脑占领一个位置就停止,其后就是打印电脑下棋后的棋盘。和之前的猜数字游戏一个原理,都是电脑随机产生。
void Computer_Chess(char arr[ROW][COL], int row, int col)
{
printf("电脑下棋:\n");
while (1)
{
srand((unsigned int)time(NULL));
row = rand() % row ;//行 电脑随机选取[0,2]
col = rand() % col ;列
if (arr[row][col] == ' ')
{
arr[row][col] = 'O';
break;
}
}
}
假设玩家先移动
玩家输入一个位置,位置为空则占领成功,相反已被占领的位置不能再占领需要重新输入位置占领,还有一种情况就是玩家输入错误,超过了3X3的棋盘,则提醒玩家位置不存在需要重新输入,其后则打印玩家下完后的棋盘。
void Player_Chess(char arr[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("请玩家输入你想要下的位置:");
scanf("%d,%d", &x, &y);
if (x > 0 && x <= row && y>0 && y <= col)
{
if (arr[x - 1][y - 1] == ' ')
{
arr[x - 1][y - 1] = 'X';
break;
}
else
printf("已被占领,请重新输入\n");
}
else
{
printf("选择位置不存在!请重新输入\n");
}
}
判断
接下来就是判断了,每次一方下完棋都需要判断是否赢。分三种情况:
1.某方赢了( 玩家赢或电脑赢)
三子棋顾名思义就是三个子相连,现在讨论赢家的所有情况又分三种:
行
一行三个全部相同,有三行。
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 (j = 0; j < col; j++)//列
{
if (arr[0][j] == arr[1][j] && arr[1][j] == arr[2][j] && arr[1][j] != ' ')
return arr[1][j];
}
对角线
对角线相同,有两条。
//两条对角线
if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[0][0] != ' ')
return arr[0][0];
if (arr[2][0] == arr[1][1] && arr[1][1] == arr[0][2] && arr[1][1] != ' ')
return arr[1][1];
2.棋盘满了(双方平局)
运用两层循环,找棋盘中是否还可以下棋的位置,如若没有则双方平局。
3.棋盘未满(继续下棋)
若有,则继续下棋。
int Is_Full(char arr[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (arr[i][j] == ' ')
return 0;//棋盘未满,有位置下棋
}
}
return 1;//棋盘已满
}
int temp = Is_Full(arr, ROW, COL);
if (temp==1)
return 'Q';
else
return 'C';
最后就是打印结果了
void game()
{
char arr[ROW][COL] = { 0 };//建立一个二维数组
char ret = '0';
Init_Chess(arr, ROW, COL);//初始化棋盘
Print_Chess(arr);//打印棋盘
int first = First_Decide();//选择先下棋的对象
while (1)
{
if (first)//这个和first!=0等价
{
Player_Chess(arr, ROW, COL);
Print_Chess(arr);
ret = Is_Win(arr, ROW, COL);
//judge(ret);
if (ret != 'C')
break;
Computer_Chess(arr, ROW, COL);
Print_Chess(arr);
ret = Is_Win(arr, ROW, COL);
if (ret != 'C')
break;
}
else
{
Computer_Chess(arr, ROW, COL);
Print_Chess(arr);
ret = Is_Win(arr, ROW, COL);
if (ret != 'C')
break;
Player_Chess(arr, ROW, COL);
Print_Chess(arr);
ret = Is_Win(arr, ROW, COL);
if (ret !='C')
break;
}
}
if (ret == 'X')
printf("玩家胜利!\n");
else if (ret == "O")
printf("电脑胜利!\n");
else
printf("平局!\n");
}
以上就是整个代码的分解过程了。
全部代码发到下面了。
#include "chess.h"
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{
printf("************************\n");
printf("******* 1.play *******\n");
printf("******* 0.exit *******\n");
printf("************************\n");
}
void Init_Chess(char arr[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
arr[i][j] = ' ';
}
}
}
void Print_Chess(char arr[ROW][COL])
{
printf(" 1 2 3 \n");
printf(" |---|---|---|\n");
printf("1| %c | %c | %c |\n", arr[0][0], arr[0][1], arr[0][2]);
printf(" |---|---|---|\n");
printf("2| %c | %c | %c |\n", arr[1][0], arr[1][1], arr[1][2]);
printf(" |---|---|---|\n");
printf("3| %c | %c | %c |\n", arr[2][0], arr[2][1], arr[2][2]);
printf(" |---|---|---|\n");
}
int First_Decide()
{
int i = 0;
printf("请选择(1.玩家 0.电脑):");
scanf("%d", &i);
return i;
}
void Player_Chess(char arr[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
while (1)
{
printf("请玩家输入你想要下的位置:");
scanf("%d,%d", &x, &y);
if (x > 0 && x <= row && y>0 && y <= col)
{
if (arr[x - 1][y - 1] == ' ')
{
arr[x - 1][y - 1] = 'X';
break;
}
else
printf("已被占领,请重新输入\n");
}
else
{
printf("选择位置不存在!请重新输入\n");
}
}
}
void Computer_Chess(char arr[ROW][COL], int row, int col)
{
printf("电脑下棋:\n");
while (1)
{
srand((unsigned int)time(NULL));
row = rand() % row + 1;
col = rand() % col + 1;
if (arr[row - 1][col - 1] == ' ')
{
arr[row - 1][col - 1] = 'O';
break;
}
}
}
int Is_Full(char arr[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (arr[i][j] == ' ')
return 0;
}
}
return 1;
}
char Is_Win(char arr[ROW][COL], int row, int col)
{
int i = 0;
int j = 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 (j = 0; j < col; j++)//列
{
if (arr[0][j] == arr[1][j] && arr[1][j] == arr[2][j] && arr[1][j] != ' ')
return arr[1][j];
}
//两条对角线
if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[0][0] != ' ')
return arr[0][0];
if (arr[2][0] == arr[1][1] && arr[1][1] == arr[0][2] && arr[1][1] != ' ')
return arr[1][1];
//棋盘是否满
int temp = Is_Full(arr, ROW, COL);
if (temp==1)
return 'Q';
else
return 'C';
}
//judge(char ret)
//{
// if (ret == 'X')
// printf("玩家胜利!\n");
// else
// if (ret == "O")
// printf("电脑胜利!\n");
// else
//
//}
void game()
{
char arr[ROW][COL] = { 0 };//建立一个二维数组
char ret = '0';
Init_Chess(arr, ROW, COL);//初始化棋盘
Print_Chess(arr);//打印棋盘
int first = First_Decide();//选择先下棋的对象
while (1)
{
if (first)//这个和first!=0等价
{
Player_Chess(arr, ROW, COL);
Print_Chess(arr);
ret = Is_Win(arr, ROW, COL);
//judge(ret);
if (ret != 'C')
break;
Computer_Chess(arr, ROW, COL);
Print_Chess(arr);
ret = Is_Win(arr, ROW, COL);
if (ret != 'C')
break;
}
else
{
Computer_Chess(arr, ROW, COL);
Print_Chess(arr);
ret = Is_Win(arr, ROW, COL);
if (ret != 'C')
break;
Player_Chess(arr, ROW, COL);
Print_Chess(arr);
ret = Is_Win(arr, ROW, COL);
if (ret !='C')
break;
}
}
if (ret == 'X')
printf("玩家胜利!\n");
else
if (ret == "O")
printf("电脑胜利!\n");
else
printf("平局!\n");
}
int main()
{
int input = 0;
do
{
menu();
printf("请输入你的选择:");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出程序!\n");
break;
default:
printf("选择错误!请重新输入\n");
break;
}
} while (input);
return 0;
}