相信有许多盆友喜欢玩游戏吧,有没有想过自己用代码实现一个游戏呢?
今天,就由我来带大家简单实现并讲解一下经典游戏《三子棋》吧!
可别怪我啰里啰嗦哦!!!
注意:程序中有不懂的地方记得看我给你们准备的注释哦!!!
首先,介绍一下什么是头文件:
常见的像我们开头常引用的#include
附:库函数即编辑器自带的函数,我们在应用了其头文件后便可按照格式来使用对应功能的函数。避免了程序员实现常用函数所做的重复无意义劳动,大大提高了编程效率。
#define _CRT_SECURE_NO_WARNINGS
//库函数头文件的引用
#include
#include
#include
//define定义的标识符常量
#define ROW 3
#define COL 3
//棋盘初始化函数的声明
void initial_board(char board[ROW][COL], int row, int col);
//棋盘打印函数的声明
void print_board(char board[ROW][COL],int row ,int col );
//判断输赢及状态函数的声明
char is_win(char board[ROW][COL], int row, int col);
再来介绍一下什么是源文件:
在开发软件的过程中,我们需要将编写好的代码保存到一个文件中,这样代码才不会丢失,才能够被编译器找到,才能最终变成可执行文件。这种用来保存代码的文件就叫做源文件。也就是说源文件是用来存放 主程序 和 函数具体实现 的。
上面我们了解到,在头文件(.h)中放函数的声明,那么在哪里真正具体的实现函数呢?没错,在对应的源文件中。源文件是可以存放函数的具体实现(即主程序中自定义函数的具体实现)的。
附:C语言的文件都有特定的后缀,以方便被编译器识别,被程序员理解。例如: C语言源文件的后缀是 .c ,C语言头文件的后缀是 .h
#include"game.h"
//棋盘初始化函数的实现
int a = 0;
void initial_board(char board[ROW][COL], int row, int col)
{
//用for循环给二维数组每个元素初始化为空格
int i = 0;
for (i=0;i<row;i++)
{
int j = 0;
for (j=0;j<col;j++)
{
board[i][j] = ' ';
}
}
}
//棋盘打印函数的实现
void print_board(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col; j++)
{
//打印数组元素(也就是棋子)
printf(" %c ", board[i][j]);
//控制打印列分割线
if (j < col - 1)
{
printf("|");
}
}
//打印完一行以后换行
printf("\n");
for (j = 0; j < col; j++)
{
//控制打印分割行
if (i < row - 1)
{
printf("----");
}
}
printf("\n");
}
}
//判断输赢及状态函数的实现
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];
}
}
//列
int j = 0;
for (j = 0; j < col; j++)
{
if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[0][j] != ' ')
{
return board[0][j];
}
}
//斜
if ((board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ') || (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' '))
{
return board[1][1];
}
//判断是平局还是继续
int h = 0;
//继续
for (h = 0; h < row; h++)
{
int j = 0;
for (j = 0; j < col; j++)
{
if (board[h][j] == ' ')
{
return 'c';
}
}
}
//平局
return 'p';
}
如果说 头文件(game.h) 和 存放函数具体实现的源文件(game.c) 是树枝树叶,那么 存放程序主体的源文件 就是树干。该源文件中存放着程序主体,即程序的整体思路和整个程序的基本实现过程。
#include"game.h"
//打印菜单函数的实现
void menu()
{
printf("**************************\n");
printf("**** 0.exit 1.play ****\n");
printf("**************************\n");
}
//game函数的实现
void game()
{
//创建数组
char board[ROW][COL];
//初始化棋盘
initial_board(board,ROW,COL);
//打印(初始)棋盘
print_board(board, ROW, COL);
//开始下棋
while (1)
{
//玩家下棋
while (1)
{
int a = 0;
int b = 0;
printf("请输入落子坐标,并中间用空格隔开:");
scanf("%d %d", &a, &b);
if ((a>=1&&a<=ROW)&&(b>=1&&b<=COL)&&(board[a - 1][b - 1] == ' '))
{
board[a-1][b-1] = '*';
break;
}
else
{
printf("落子不符合条件,请正确下棋");
}
}
//打印棋盘
printf("玩家下棋\n");
print_board(board, ROW, COL);
//判断输赢与状态 并返回值相应的值
char sult = is_win(board, ROW, COL);
//根据返回值做出调整
if (sult == '*')
{
printf("玩家赢\n");
break;
}
if (sult == 'p')
{
printf("平局\n");
break;
}
else
{
;
}
//电脑下棋
while (1)
{
//产生两个随机值并%ROW(COL)以产生0~ROW(COL)的随机值
int ret1 = rand() % ROW;
int ret2 = rand() % COL;
if (board[ret1][ret2] == ' ')
{
board[ret1][ret2] = '#';
break;
}
}
//打印棋盘
printf("电脑下棋\n");
print_board(board, ROW, COL);
//判断输赢与状态 并返回值相应的值
char sul = is_win(board, ROW, COL);
//根据返回值做出调整
if (sul == '#')
{
printf("电脑赢\n");
break;
}
if (sul == 'p')
{
printf("平局\n");
}
else
{
;
}
}
}
//定义了一个全局变量n
int n = 0;
int main()
{
srand((unsigned int)time(NULL));
do
{
//调用菜单打印函数
menu();
printf("请输入:>");
//让玩家根据菜单做出选择(用键盘输入值)
scanf("%d", &n);
switch (n)
{
case 0:
{
printf("退出游戏\n");
break;
}
case 1:
{
printf("游戏开始:\n");
//调用game函数
game();
break;
}
default:
{
printf("输入错误,请重新输入\n");
break;
}
}
}while(n);
return 0;
}
最后,如果这篇文章帮到您了,可以点下赞吗~~~
拜托了,这对我真的很重要!!!