所谓三子棋游戏,在有些地方还被叫做井字棋。
现在,让我来为大家讲解三子棋游戏的详细过程;
先看游戏运行:
首先,我将游戏分成了三个部分:
1、text.c //测试三子棋游戏
2、game.h //三子棋游戏的函数声明
3、game.c //三子棋游戏函数的实现
创建好文件后,我们首先在text.c文件中写main函数
头文件include<stdio.h>只放在game.h文件中,再用text.c和game.c调用game.h即可
调用时采用#include "game.h"
这里采用do{}while循环,因为玩家打开程序后,首先看见的是游戏菜单界面(menu)
void menu() //打印菜单界面函数
{
printf("***************************\n");
printf("******** 1.play ********\n");
printf("******** 0.exit ********\n");
printf("***************************\n");
printf("***************************\n");
}int main()
{
int input = 0;
do
{
menu(); //打印菜单
printf("请选择;>");
scanf("%d", &input);
switch (input) //采用循环,游戏可以进行多次,直至你输入0
{ //表示退出游戏,这也是while循环中括号条件
case 1: //的缘故
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("输入错误,请重新选择\n");
break;
}
} while (input);
return 0;
};
之后也就是输入1 进入游戏模块,游戏的开始
game()函数:
首先给玩家呈现的是一个棋盘
例如
那么想要打印棋盘,首先要明白三子棋要怎样存放,这里我们定义一个数组来存放,
定义数组,首先得让数组初始化,为了方便之后改数据,可以使用全局变量
这里我都放在了game.h文件中,用来函数的声明
game.h
#include <stdio.h>
#define ROW 3
#define COL 3
game()函数:
char board[ROW][COL] = { 0 }; //定义数组来储存
init_board(board, ROW, COL); //数组的初始化
全部初始化为空格
放在game.c文件中
//初始化棋盘
void init_board(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] = ' ';
}
}
}
同时,在game.h文件中加入声明
void display_board(char board[ROW][COL], int row, int col);
再然后,初始化之后,就要开始打印棋盘了
void display_board(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 player_move(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("玩家下棋\n");
while (1)
{
printf("请输入你想下的的坐标:>\n");
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 computer_move(char board[ROW][COL], int row, int col)
{
printf("电脑下棋;>\n");
while (1)
{
int x = rand() % row;
int y = rand() % col;
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
这里采用rand函数,调用ranf函数必须先使用srand函数,这里采用时间,因为时间是在不断变化
在主函数中调用一次即可
接下来讲就是判断游戏状态,比如玩家在对角线,或者每一行、每一列相同就获胜,电脑也是一样,但是还有一种情况就是平局
int is_full(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;
}
char is_win(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[1][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][2];
}
if (is_full(board, row, col) == 1)
{
return 'Q';
}
else
{
return 'C';
}
}
最后,我将展示三个文件 的完整代码如下:
text.c
game.c
game.h
文章的最后,谢谢大家的观看,加油!!!