思路:
1. 定义并初始化二维数组(初始化数组一定要用{})
2. 打印棋盘
3. 玩家落子
判断游戏是否达到结束条件
提示玩家输入落子坐标
判断玩家落子是否合法
给二维数组赋值,即落子
4. 电脑落子
判断是否到达结束条件
用随机数给电脑赋值坐标
判断电脑落子是否合法
给二维数组赋值,即落子
5. 执行步骤3
#define _CRT_SECURE_NO_WARNINGS//宏定义
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 3//定义棋盘的横行数
#define COL 3//定义棋盘的纵行数
int ChessBoard[ROW][COL] = { ' '};//定义二维数组,并对其初始化
void PrintBoard()
{ //打印棋盘
for (int row = 0; row < ROW; ++row)
{
printf("-------------\n");
printf("| %c | %c | %c|\n",ChessBoard[row][0],ChessBoard[row][1],ChessBoard[row][2]);
if (row ==2)
{
printf("-------------\n");
}
}
}
char CheckEnd()//检查游戏是否可以结束
{
//横行相等
for (int row = 0; row < ROW; ++row)
{
if (ChessBoard[row][0] == ChessBoard[row][1] && ChessBoard[row][0]
== ChessBoard[row][2] && ChessBoard[row][0] != ' ')
{
return ChessBoard[row][0];
}
}
//纵行相等
for (int col = 0; col < COL; ++col)
{
if (ChessBoard[0][col] == ChessBoard[1][col] && ChessBoard[2][col]
== ChessBoard[0][col] && ChessBoard[0][col] != ' ')
{
return ChessBoard[0][col];
}
}
//两条对角线各自相等
if (ChessBoard[0][0] == ChessBoard[1][1] && ChessBoard[0][0]
== ChessBoard[2][2] && ChessBoard[0][0] != ' ')
{
return ChessBoard[0][0];//返回给函数此时相等的字符
}
if (ChessBoard[2][0] == ChessBoard[1][1] && ChessBoard[1][1]
== ChessBoard[0][2] && ChessBoard[1][1] != ' ')
{
return ChessBoard[1][1];
}
//判断是否和棋
for (int row=0; row < ROW; row++)
{
for (int col=0; col < COL; ++col)
{
if (ChessBoard[row][col] != ' ')
{
goto a;
}
}
if (ChessBoard[2][2] != ' ')
{
return 'q';
}
}
a:;
}
void PlayerMove()//玩家下子
{
while (1)//设置循环如果用户输入不符合,再次输入
{
printf("请玩家落子:(x y)\n");
int row;
int col;
scanf("%d %d", &row, &col);
if (ChessBoard[row][col] == 'c' || ChessBoard[row][col] == 'p')
{ //玩家输入位置不能与输入的重叠
printf("您输入的地方有子,请重新输入\n");
continue;//如果重合就跳过这次,从函数入口在循环
}
if (row<0 || row>ROW - 1 || col<0 || col>COL - 1)
{ //判断用户输入是否超越边界
printf("非法输入,请重新输入\n");
continue;
}
ChessBoard[row][col] = 'p';//给二维数组赋值,即玩家下子
char n = CheckEnd();//调用CheckEnd函数判断是否结束
if (n =='p') //将它的返回值赋给n
{
printf("玩家获胜\n");
}
if (n == 'c')
{
printf("菜鸡,电脑都打不过\n");
}
if (n == 'q')
{
printf("平局\n");
}
break;//用户输入完成跳出循环
}
}
void ComputerMove()//电脑下子
{
while (1)//设置循环使下子完成
{
char n = CheckEnd();
//srand((unsigned int)time(NULL));//随机数生成器,使程序每打开一次,随机数就会发生变化
int row = rand() % 3;//取0-2之间的整数
int col = rand() % 3;
if (ChessBoard[row][col] == 'p' || ChessBoard[row][col] == 'c')
{ //保证成功下子
continue;
}
ChessBoard[row][col] = 'c';//给数组赋值,即电脑下子
if (n == 'p')
{
printf("玩家获胜\n");
}
if (n == 'c')
{
printf("菜鸡,电脑都打不过\n");
}
if (n == 'q')
{
printf("平局\n");
}
break;
}
}
int main()
{
while (1)
{
PrintBoard();
PlayerMove();
ComputerMove();
int n = CheckEnd();
if (n == 'p' || n == 'c')
{ //返回值若是这2个说明已经有一方结束了
break;//跳出循环,停止玩家,电脑循环下子
}
}
system("pause");
}
结果
版权声明:本文为Electronic_rest原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。