首先:创建2个源文件和1个头文件,主函数放于源.c, 函数定义放于game.c , 函数声明以及库函数的引用放于game.h。
开始的第一步,将游戏的第一个界面写出:菜单(menu)以及玩家输入选择尝试。
第二步:由于三子棋的棋盘是一个井字,此时我们可以通过二位数组来为棋盘构建位置,所以我们先进行数据的初始化。将数组的元素全部初始化为’空格‘。
第三步:打印棋盘
首先棋盘的样式大致为:
所以我们可以根据我们的二位数组的每一位打印后,打印’ | ‘以及’ --- ‘,并且只打印arr[i][1]左右两边的’ | ',以及arr[2][i] 上下的' --- '。所以我们使用循环嵌套for语句以及if判断语句进行棋盘的打印。
第四步:开始下棋,开始游戏后,由玩家先,电脑后的顺序,所以我们先进行玩家的下棋代码编写。在下棋时,玩家会根据棋盘输入1——3的位置,而我们的数组下表由0开始,至2结束,所以我们需要在玩家输入的基础上-1操作。
其次,对玩家当前的落子位置进行判断,若此处位置无子,则玩家下棋成功;若落子位置已有棋子,则提示玩家,让玩家重新落子。
第五步,电脑下棋。电脑需要生成2个位置,需要生成两个未知数,所以我们需要引入rand的库函数以及time的库函数,在main函数中引用srand函数。
具备生成随机数的条件后,只需要对所生成的随机数进行判定是否无子以及定义电脑所下的棋子就可以了。
最后,我们需要加入输赢判断机制。我们可以根据棋子来进行判断,如:
然后根据三子棋思路:三连则胜。所以我们的判断机制需要对行列以及对角线进行判断,于是我们运用for语句循环嵌套以及if判断语句。
以上为有一方获胜的判断,还存在平局的情况,所以我们需要构建一个判断机制来返回’ Q ‘来判断是否平局。
通过以上函数的构建,足以支撑我们构建的三子棋游戏,所以我们返回main函数中用game()函数来构建游戏
由此可以我们可以开始我们的三子棋游戏了
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define ROW 3
#define COL 3
void game();
void InitBoard(char board[ROW][COL], int row, int col);
void DisplayBoard(char board[ROW][COL], int row, int col);
void PlayerMove(char board[ROW][COL], int row, int col);
void ComputerMove(char board[ROW][COL], int row, int col);
char IsWin(char board[ROW][COL], int row, int col);
void menu()
{
printf("---------------------------------\n");
printf("----------- 1: 开始游戏 ---------\n");
printf("----------- 0: 退出游戏 ---------\n");
printf("---------------------------------\n");
}
//游戏主体定义
void game()
{
char ret = 0;
//棋盘应该由一个二位函数组成
char board[ROW][COL];
InitBoard(board, ROW, COL);
DisplayBoard(board, ROW, COL);
//下棋
while (1)
{
//玩家下棋
PlayerMove(board, ROW, COL);
DisplayBoard(board, ROW, COL);
//判断输赢
//返回‘C’‘*’‘#’'Q'
ret = IsWin(board, ROW, COL);
if (ret != 'C')
{
break;
}
//电脑下棋
ComputerMove(board, ROW, COL);
DisplayBoard(board, ROW, COL);
ret = IsWin(board, ROW, COL);
if (ret != 'C')
{
break;
}
}
if (ret == '*')
{
printf("玩家赢\n");
}
else if (ret == '#')
{
printf("电脑赢\n");
}
else
{
printf("平局\n");
}
}
int main()
{
int choose = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请输入你的选择:>>");
scanf("%d", &choose);
switch (choose)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("输入信息有误,请重新输入。\n");
break;
}
} while (choose);
return 0;
}
//数组初始化
void InitBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
board[i][j] = ' ';
}
}
}
//棋盘打印
void DisplayBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
printf(" %c ", board[i][j]);
if (j < col - 1)
printf("|");
}
printf("\n");
if(i < row - 1)
{
for (j = 0; j < col; j++)
{
printf("---");
if (j < col - 1)
printf("|");
}
}
printf("\n");
}
}
//玩家下棋
void PlayerMove(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
while (1)
{
printf("请输入要下棋的坐标:>>");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '*';
break;
}
else
printf("该坐标已被使用,请输入其他坐标\n");
}
else
printf("坐标非法,请重新输入\n");
}
}
//电脑下棋
void ComputerMove(char board[ROW][COL], int row, int col)
{
printf("电脑下棋\n");
int x = 0;
int y = 0;
while (1)
{
x = rand() % row;
y = rand() % col;
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
//判断输赢
char IsWin(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ')
{
return board[i][0];
}
}
for (i = 0; i < col; 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[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
{
return board[0][0];
}
if (IsFull(board, row, col))
{
return 'Q';
}
return 'C';
}
static int IsFull(char board[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 (board[i][j] == ' ')
return 0;
}
}
return 1;
}