1.思路讲解
2.注意事项
3.代码实现
思路讲解:首先,由于代码过长,一般将代码分为几个文件,大致分为如下:test.c(测试游戏逻辑),game.c(函数的实现),game.h(函数的声明)。接下来,先大致理清思路:提供菜单进入游戏,创建和初始化棋盘,划分好格子,玩家下棋,判断输赢,电脑下棋,判断输赢。
注意事项:1.棋盘的初始化看作二维数组的初始化,先把每个空给上空格,便于输入
2.判断输赢时要充分考虑好各种情况,例如:玩家赢,电脑赢,平局
3.电脑要做到随机下棋要使用rand函数,通过时间戳来设计srand
代码展示:
game.h:
#include<stdio.h>
#include<stdlib.h>
#define Hang 4
#define Lie 4
void game();
void InitBoard(board, lie, hang);
void DisplayBoard(board, lie, hang);
char Winer(board, lie, hang);
void Computer(board, lie, hang);
void Player(board, lie, hang);
test.c:
#include"game.h"
void menu()
{
printf("***********************\n");
printf("*******1.开始游戏******\n");
printf("*******0.退出游戏******\n");
}
int main()
{
int input;
srand((unsigned int)time(NULL));
menu();
do
{
scanf("%d", &input);
switch (input)
{
case 1:
{
game();
break;
}
case 0:
{
printf("退出游戏");
break;
}
default:
{
printf("错误");
break;
}
}
} while (input);
return 0;
}
game.c
#include"game.h"
void game()
{
int l=1;
char x;
char board[Lie][Hang];
printf("开始三子棋游戏\n");
InitBoard(board, Lie, Hang);//初始化棋盘
DisplayBoard(board, Lie, Hang);//打印棋盘
while (l)
{
Player(board, Lie, Hang);//玩家下棋
DisplayBoard(board, Lie, Hang);
x=Winer(board, Lie, Hang);//每输入一步就要判断一次输赢
if (x != 'c')
{
break;
}
Computer(board, Lie, Hang);
DisplayBoard(board, Lie, Hang);
x = Winer(board, Lie, Hang);
if (x != 'c')
{
break;
}
}
if (x == '*')
printf("获胜!!!\n");
else if (x == '+')
printf("失败\n");
else if (x == 'p')
printf("平局\n");
}
void InitBoard(char board[Lie][Hang], int hang, int lie)
{
for (int i = 0; i < lie; i++)
{
for (int j = 0; j < hang; j++)
{
board[i][j] = ' ';
}
}
}
void DisplayBoard(char board[Lie][Hang], int lie, int hang)
{
for (int i = 0; i < lie; i++)
{
for (int j = 0; j < hang; j++)
{
printf(" %c ", board[i][j]);
if (j < hang - 1)
printf("|");
}
printf("\n");
if (i < lie - 1)
{
for (int j = 0; j < hang; j++)
{
printf("---");
if (j < hang - 1)
printf("|");
}
}
printf("\n");
}
}
void Player(char board[Lie][Hang], int lie, int hang)
{
int i,j,z=1;
printf("玩家下棋\n");
printf("请输入坐标\n");
scanf("%d %d", &i, &j);
while(z)
{
if (i > lie || j > hang)
{
printf("输入错误,请重新输入\n");
scanf("%d %d", &i, &j);
}
else
{
if (board[i - 1][j - 1] == '*' || board[i - 1][j - 1] == '+')
{
printf("输入错误,请重新输入\n");
scanf("%d %d", &i, &j);
}
else if (board[i - 1][j - 1] == ' ')
break;
}
}
board[i - 1][j - 1] = '*';//这里要注意玩家输入不会以0开始
}
//玩家赢返回*
//电脑赢返回+
//平局返回p
//游戏继续返回c
char Winer(char board[Lie][Hang], int lie, int hang)
{
int flag = 0;
for (int i = 0; i < lie; i++)
{
if (board[i][0] == board[i][1] && board[i][1] ==board[i][2] && board[i][0] != ' ')//判断一行
return board[i][0];
}
for (int i = 0; i < hang; i++)
{
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')//判断一列
return board[0][i];
}
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ')//判断对角线
return board[0][0];
if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[2][0] != ' ')//判断对角线
return board[2][0];
for (int i = 0; i < lie; i++)//判断棋盘内是否还有空格,游戏是否可以继续
{
for (int j = 0; j < hang; j++)
{
if (board[i][j] == ' ')
return 'c';
}
}
return 'p';//判断平局
}
void Computer(char board[Lie][Hang], int lie, int hang)//电脑下棋
{
int x, y;
printf("电脑下棋\n");
while (1)
{
x = rand() % lie;
y = rand() % hang;
if (board[x][y] == ' ')
board[x][y] = '+'; break;
}
}