三子棋问题即在3 * 3的二维数组上下棋,只要有棋子在行、列或对角线连成一线即取得胜利。
可实现玩家与电脑对弈。
说明 :
(1)本游戏玩家输入的是棋盘的坐标。
(2)“X”代表玩家,“0”代表电脑。
(3)电脑下棋采用的是随机数给出,大大增加了游戏的随机性。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
char arr[3][3] = { 0 }; //直接定义外部变量所有的函数可以直接使用
int size = 9; //棋盘大小固定 每下一个子都会使可以下子的容量-1
void chessboard() //打印棋盘
{
int i = 0,j = 0;
printf(" | | \n");
for (i = 0; i < 3; i++)
{
printf("_%c_|_%c_|_%c_\n", arr[i][0], arr[i][1], arr[i][2]);//棋盘对应位置下棋
if (i < 2)
printf(" | | \n");
}
}
void player() //玩家下棋
{
int m = 0, n = 0;
printf("player(X):"); //输入的是对应的坐标
scanf("%d%d", &m,&n); //玩家输入的坐标必须在范围内并且不能是被下过的地方
if (m<1 || m>3 || n<1 || n>3 || arr[m - 1][n - 1] != ' ')
{
printf("this place can not play!\n"); //如果不符合要求则继续调用这个函数
player();
}
else
{
arr[m - 1][n - 1] = 'X'; //将棋子放入相应的内容 棋盘容量-1
size--;
}
}
void computer() //电脑下棋
{
printf("computer(0):\n");
int m = 0, n = 0;
srand(time(NULL)); //电脑的坐标是随机产生的 以时间为种子
m = rand() % 3; //对3取余产生0-2的随机数赋给数组下标
n = rand() % 3;
while (arr[m][n] != ' ') //如果产生的坐标不符合要求则循环产生 (效率比较低)
{
m = rand() % 3;
n = rand() % 3;
}
arr[m][n] = '0'; //操作后容量-1
size--;
}
int winner() //判断获胜者
{
if ((arr[0][0] == arr[0][1] && arr[0][1] == arr[0][2] && arr[0][2] == 'X') ||
(arr[1][0] == arr[1][1] && arr[1][1] == arr[1][2] && arr[1][2] == 'X') ||
(arr[2][0] == arr[2][1] && arr[2][1] == arr[2][2] && arr[2][2] == 'X') ||
(arr[0][0] == arr[1][0] && arr[1][0] == arr[2][0] && arr[2][0] == 'X') ||
(arr[0][1] == arr[1][1] && arr[1][1] == arr[2][1] && arr[2][1] == 'X') ||
(arr[0][2] == arr[1][2] && arr[1][2] == arr[2][2] && arr[2][2] == 'X') ||
(arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[2][2] == 'X') ||
(arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[2][0] == 'X'))
return 1; //玩家获胜
else if((arr[0][0] == arr[0][1] && arr[0][1] == arr[0][2] && arr[0][2] == '0') ||
(arr[1][0] == arr[1][1] && arr[1][1] == arr[1][2] && arr[1][2] == '0') ||
(arr[2][0] == arr[2][1] && arr[2][1] == arr[2][2] && arr[2][2] == '0') ||
(arr[0][0] == arr[1][0] && arr[1][0] == arr[2][0] && arr[2][0] == '0') ||
(arr[0][1] == arr[1][1] && arr[1][1] == arr[2][1] && arr[2][1] == '0') ||
(arr[0][2] == arr[1][2] && arr[1][2] == arr[2][2] && arr[2][2] == '0') ||
(arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[2][2] == '0') ||
(arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[2][0] == '0'))
return 0; //电脑获胜
else if (size == 0)
return -1; //平局
}
int main()
{
int i = 0, j = 0; //将数组初始化为空格
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
arr[i][j] = ' ';
}
}
while (1) //循环对弈直到一方获胜或者平局
{
chessboard(); //循环每次开始都打印棋盘
if (winner() == -1 || winner() == 0 || winner() == 1)
{
break;
}
player();
computer();
}
if (winner() == 1)
{
printf("player win!\n");
}
else if (winner() == 0)
{
printf("computer win!\n");
}
else
{
printf("no one win!\n");
}
system("pause");
return 0;
}
本游戏还有好多不足的地方,希望大家多提意见,我也会继续改进的,希望会提高它的效率。
转载于:https://blog.51cto.com/10922110/1725836