想成为游戏开发大师吗?先试试简单的三子棋实现吧!!!(详解头文件&源文件)

相信有许多盆友喜欢玩游戏吧,有没有想过自己用代码实现一个游戏呢?
今天,就由我来带大家简单实现并讲解一下经典游戏《三子棋》吧!
可别怪我啰里啰嗦哦!!!
注意:程序中有不懂的地方记得看我给你们准备的注释哦!!!

头文件game.h

首先,介绍一下什么是头文件:
常见的像我们开头常引用的#include<stdio.h>、#include <stdlib.h>、 #include<string.h>这些以 “.h” 结尾的就是所谓的头文件。更详细点说,以上这些 #include后面用<>,也就是尖括号括起来的是库函数的头文件。而像我下面所写的这个game.h文件,即 程序员自己创建的头文件,是普通头文件。程序员自己创建的头文件中常用来存放 1 . 库函数头文件的引用 2 . 自定义函数的声明。 这样,在同一个项目的不同文件中只要像我下面的源文件game.c和test.c中一样,在开头引用 #include“game.h”,即对应的普通头文件就可以了。(这样就避免了在每个源文件中都需要重复引用库函数头文件和重复声明自定义函数了)

附:库函数即编辑器自带的函数,我们在应用了其头文件后便可按照格式来使用对应功能的函数。避免了程序员实现常用函数所做的重复无意义劳动,大大提高了编程效率。

#define _CRT_SECURE_NO_WARNINGS
//库函数头文件的引用
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
//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);

源文件game.c

再来介绍一下什么是源文件:
在开发软件的过程中,我们需要将编写好的代码保存到一个文件中,这样代码才不会丢失,才能够被编译器找到,才能最终变成可执行文件。这种用来保存代码的文件就叫做源文件。也就是说源文件是用来存放 主程序 和 函数具体实现 的
上面我们了解到,在头文件(.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';
}

源文件test.c

如果说 头文件(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;
}

最后,如果这篇文章帮到您了,可以点下赞吗~~~
拜托了,这对我真的很重要!!!

  • 20
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值