一、规则
两个玩家,一个打圈(O),一个打叉(X),轮流在3乘3的格上打自己的符号,最先以横、直、斜连成一线则为胜。如果双方都下得正确无误,将得和局。
二、代码
#include <stdio.h>
#include <stdlib.h>
void init_chess(char arr[3][3]);//初始化数组
void print_chess(char arr[3][3]);//画棋盘
void menu();//开始菜单
int whom_action();//选择谁先落子
int chess_full(char arr[3][3]);//判断棋盘是否下满
char fail_win(char arr[3][3]);//判断输赢
void player_action(char arr[3][3]);//玩家落子
void computer_action(char arr[3][3]);//电脑落子
int main()
{
int input = 0;
char arr[3][3] = { 0 };//定义一个3x3的数组,用来存放棋子
do
{
menu();
printf("请选择你想进行的动作:=》");
scanf_s("%d", &input);
switch (input)
{
case 1:
system("cls");//清屏
init_chess(arr);
if (whom_action())//电脑先手
{
while (1)
{
system("cls");
computer_action(arr);
print_chess(arr);
if ((fail_win(arr)) == 'X')
{
printf("你赢了,真棒!\n");
break;
}
else if ((fail_win(arr)) == 'O')
{
printf("你输了,加油!\n");
break;
}
else if (chess_full(arr))
{
printf("平局,实力相当!\n");
break;
}
player_action(arr);
print_chess(arr);
if ((fail_win(arr)) == 'X')
{
printf("你赢了,真棒!\n");
break;
}
else if ((fail_win(arr)) == 'O')
{
printf("你输了,加油!\n");
break;
}
else if (chess_full(arr))
{
printf("平局,实力相当!\n");
break;
}
}
}
else
{
while (1)
{
system("cls");
print_chess(arr);
player_action(arr);
print_chess(arr);
if ((fail_win(arr)) == 'X')
{
printf("你赢了,真棒!\n");
break;
}
else if ((fail_win(arr)) == 'O')
{
printf("你输了,加油!\n");
break;
}
else if (chess_full(arr))
{
printf("平局,实力相当!\n");
break;
}
computer_action(arr);
print_chess(arr);
if ((fail_win(arr)) == 'X')
{
printf("你赢了,真棒!\n");
break;
}
else if ((fail_win(arr)) == 'O')
{
printf("你输了,加油!\n");
break;
}
else if (chess_full(arr))
{
printf("平局,实力相当!\n");
break;
}
}
}
break;
case 0:
printf("\n正在退出游戏...\n\n");
system("pause");
return 0;
}
if (input < 0 || input > 1)
{
printf("\n这你都能输错,要你有何用!\n\n");
system("pause");
system("cls");
}
} while (input);
system("pause");
return 0;
}
//初始化数组
void init_chess(char arr[3][3])
{
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
arr[i][j] = ' ';
}
}
}
//画棋谱
void print_chess(char arr[3][3])
{
printf("\n");
for (int i = 0; i < 3; i++)
{
printf(" %c | %c | %c \n", arr[i][0], arr[i][1], arr[i][2]);
if (i < 2)
{
printf("-+-+-+-+-+-\n");
}
}
printf("\n");
}
//开始菜单
void menu()
{
printf("*****************************\n");
printf("*** 1、开始游戏 ***\n");
printf("*** ***\n");
printf("*** 0、退出游戏 ***\n");
printf("*****************************\n");
}
//判断谁先下
int whom_action()
{
int input = 0;
while (1)
{
printf("*****************************\n");
printf("*** 1、电脑先手 ***\n");
printf("*** ***\n");
printf("*** 0、玩家先手 ***\n");
printf("*****************************\n");
printf("请选择谁先落子:=>");
scanf_s("%d", &input);
if (input == 1)
return 1;
else if (input == 0)
return 0;
else
{
printf("\n选择错误,请重新选择。\n\n");
system("pause");
printf("\n");
}
system("cls");
}
}
//判断九个格子是否全部下满
int chess_full(char arr[3][3])
{
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
if (arr[i][j] == ' ')
return 0;
}
}
return 1;
}
//判断输赢
char fail_win(char arr[3][3])
{
for (int i = 0; i < 3; i++)
{
if ((arr[i][0] == arr[i][1]) && (arr[i][1] == arr[i][2]) && (arr[i][2] != ' '))//判断一行是否相等
return arr[i][0];
else if ((arr[0][i] == arr[1][i]) && (arr[1][i] == arr[2][i]) && (arr[0][i] != ' '))//判断一列是否相等
return arr[0][i];
else if ((arr[0][0] == arr[1][1]) && (arr[1][1] == arr[2][2]) && (arr[1][1] != ' '))//判断斜对角是否相等
return arr[1][1];
else if ((arr[0][2] == arr[1][1]) && (arr[1][1] == arr[2][0]) && (arr[1][1] != ' '))
return arr[1][1];
}
return ' ';
}
//玩家落子
void player_action(char arr[3][3])
{
int x = 0;
int y = 0;
while (1)
{
printf("请输入x轴的坐标(1~3):=》");
scanf_s("%d", &x);
printf("\n请输入y轴的坐标(1~3):=》");
scanf_s("%d", &y);
if (arr[--x][--y] == ' ')
{
arr[x][y] = 'X';
break;
}
else
{
printf("\n您选择的位置已有棋子,请重新选择。\n");
continue;
}
}
}
//电脑落子
void computer_action(char arr[3][3])
{
srand((unsigned)time(NULL));
while (1)
{
int x = rand() % 3;
int y = rand() % 3;
if (arr[x][y] == ' ')
{
arr[x][y] = 'O';
break;
}
}
}
三、说明
该代码没有实现机器人智能化,可能还有一些BUG,机器人落子只是简单的随机,如有感兴趣的朋友可自行完善。