C 语言

关注公众号 jb51net

关闭
首页 > 软件编程 > C 语言 > C语言工程文件

C语言工程文件该如何写(以三子棋游戏为例)

作者:Chris·Bosh

工程上写代码应分为多个文件,那么你知道C语言工程文件该如何写吗,本文就以以三子棋游戏为例,介绍一下,具有一定的参考价值,感兴趣的可以了解一下

1.工程上(作为程序员应如何写代码)

1.1 新手如何写代码

我们知道在进行C语言文件的编写时,我们通常只在一个文件中进行,从头写到尾

如下图所示

这种方式写代码适用于初学者,实际上在程序员的工作中并不这样写代码,这样既不利于员工之间的合作,也不利于将代码作为产品进行出售。

1.2 程序员如何写代码

工程上写代码应分为多个文件,如:

主文件.c           自定义函数.c            头文件.h        具体如下图所示

此图为三子棋游戏的代码

我们可以看到图中分为三部分,首先主函数部分game.c   其次是自定义函数部分 game_my_function.c 以及头文件部分game.h

为什么要分开,而不像一开始学的那样在一起写呢?①多人协作,在工作中我们要面对的是一个庞大的工程,每个人要负责各自的模块,如果放在一个.c文件中,那么只有等一个人写完自己的部分,下一个人才能开始工作,这显然不符合工作常理。分开写能够提高工作效率,在各个模块完成之后组合起来即可。

②代码保护,在程序员写完自己的自定义函数而不想让别人知道自己是如何写的,便可以将自己写的自定函数编译成一个库文件,这样别人再打开库文件时就是一堆乱码。这是,只需要将头文件提供给别人,别人依然可以使用此代码。下图所示为转为库文件的方法。可以看到库文件为乱码。

 2.三子棋游戏代码示例

我们先列出一个思维导图,分析这个程序需要什么,有哪些情况,这样我们才会很好地完成这个程序哦

1.菜单界面选择开始游戏或者退出游戏。
2.创建棋盘并初始化。
3.打印棋盘。
4.玩家落子(玩家输入行列坐标的方式来落子),'*’表示玩家落子。
5.电脑落子(随机位置落子) ,'#’表示电脑落子。
6.判定胜负关系(输,赢,平局(棋盘满了))。
7.判定胜负关系。
8.如未结束,回到 步骤2 继续执行。

2.1 打印菜单

void menu()
{
	printf("---------------------------------------------------\n");
	printf("---------------------------------------------------\n");
	printf("---------------    1.开始游戏    ------------------\n");
	printf("---------------    2.退出游戏    ------------------\n");
	printf("---------------------------------------------------\n");
	printf("---------------------------------------------------\n");
}

2.2 创建棋盘并初始化。+2.3打印棋盘

void star_arr(char arr[Line][Column], int line, int column)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < line; i++)
	{
		for (j = 0; j < column; j++)
		{
			arr[i][j] = ' ';
		}
	}
}
void Display_arr(char arr[Line][Column], int line, int column)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < line; i++)
	{
		int j = 0;
		for(j=0;j<column;j++)
		{ 
			printf(" %c ", arr[i][j]);
			if (j < column - 1)
				printf("|");
		} 
		printf("\n");//走三轮,占3行
		if (i < line - 1)
		{
			int j = 0;
			for (j = 0; j < column; j++)
			{
				printf("---");
				if (j < column - 1)
					printf("|");
			}
		}
		printf("\n");//走两轮,最后i=2时,不进入,一共5行
	}
}

2.4玩家落子(玩家输入行列坐标的方式来落子),'*’表示玩家落子。

void player(char arr[Line][Column], int line, int column)
{
	int x = 0;
	int y = 0;
	while (1)
	{
		printf("玩家请下棋\n");
		printf("请输入下棋的坐标:");
		scanf("%d %d", &x, &y);
		if (x > 0 && x <= line && y>0 && y <= column)
		{
			if (arr[x - 1][y - 1] == ' ')
			{
				arr[x - 1][y - 1] = '*';
				break;
			}
			else
			{
				printf("该位置已有棋,请选择其他位置\n");
			}
		}
		else
		{
			printf("输入坐标不合理,请重新输入\n");
		}
	}
}

2.5电脑落子(随机位置落子) ,'$’表示电脑落子。

void computer(char arr[Line][Column], int line, int column)
{
	printf("电脑已下棋:\n");
	int x = 0;
	int y = 0;
	while (1)
	{
		x = rand() % line;
		y = rand() % column;
		if (arr[x][y] == ' ')
		{
			arr[x][y] = '$';
			break;
		}
	}
}

2.6判定胜负关系(输,赢,平局(棋盘满了))

//玩家赢  *
	//电脑赢  $
	//平局    O
	//继续    C
	char why_win(char arr[Line][Column], int line, int column)
	{
		int i = 0;
		for (i = 0; i < line; i++)
		{
			if (arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2] && arr[i][0] != ' ')
			{
				return arr[i][0];
			}
		}
		for (i = 0; i < column; i++)
		{
			if (arr[0][i] == arr[1][i] && arr[1][i] == arr[2][i] && arr[2][i] != ' ')
			{
				return arr[2][i];
			}
		}
		if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[0][0] != ' ')
		{
			return arr[0][0];
		}
		if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[1][1] != ' ')
		{
			return arr[1][1];
		}
		 if (chess_full(arr, line, column))
		{
			return 'O';
		}
		return 'C';
	}

以上为思路牵引,完整代码如下,分为三个部分

1.头文件

#pragma once
#include <stdio.h>
#define Line 3
#define Column 3
void star_arr(char arr[Line][Column],int line,int column);
void Display_arr(char arr[Line][Column], int line, int column);
void player(char arr[Line][Column], int line, int column);
void computer(char arr[Line][Column], int line, int column);
#include <time.h>
#include <stdlib.h>
char why_win(char arr[Line][Column], int line, int column);
int  chess_full(char arr[Line][Column], int line, int column);

2.自定义函数文件

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void star_arr(char arr[Line][Column], int line, int column)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < line; i++)
	{
		for (j = 0; j < column; j++)
		{
			arr[i][j] = ' ';
		}
	}
}
void Display_arr(char arr[Line][Column], int line, int column)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < line; i++)
	{
		int j = 0;
		for(j=0;j<column;j++)
		{ 
			printf(" %c ", arr[i][j]);
			if (j < column - 1)
				printf("|");
		} 
		printf("\n");//走三轮,占3行
		if (i < line - 1)
		{
			int j = 0;
			for (j = 0; j < column; j++)
			{
				printf("---");
				if (j < column - 1)
					printf("|");
			}
		}
		printf("\n");//走两轮,最后i=2时,不进入,一共5行
	}
}
void player(char arr[Line][Column], int line, int column)
{
	int x = 0;
	int y = 0;
	while (1)
	{
		printf("玩家请下棋\n");
		printf("请输入下棋的坐标:");
		scanf("%d %d", &x, &y);
		if (x > 0 && x <= line && y>0 && y <= column)
		{
			if (arr[x - 1][y - 1] == ' ')
			{
				arr[x - 1][y - 1] = '*';
				break;
			}
			else
			{
				printf("该位置已有棋,请选择其他位置\n");
			}
		}
		else
		{
			printf("输入坐标不合理,请重新输入\n");
		}
	}
}
void computer(char arr[Line][Column], int line, int column)
{
	printf("电脑已下棋:\n");
	int x = 0;
	int y = 0;
	while (1)
	{
		x = rand() % line;
		y = rand() % column;
		if (arr[x][y] == ' ')
		{
			arr[x][y] = '$';
			break;
		}
	}
}
int  chess_full(char arr[Line][Column], int line, int column)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < line; i++)
	{
		for (j = 0; j < column; j++)
		{
			if (arr[i][j] == ' ')
				return 0;
		}
	}
	return 1;
}
	//玩家赢  *
	//电脑赢  $
	//平局    O
	//继续    C
	char why_win(char arr[Line][Column], int line, int column)
	{
		int i = 0;
		for (i = 0; i < line; i++)
		{
			if (arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2] && arr[i][0] != ' ')
			{
				return arr[i][0];
			}
		}
		for (i = 0; i < column; i++)
		{
			if (arr[0][i] == arr[1][i] && arr[1][i] == arr[2][i] && arr[2][i] != ' ')
			{
				return arr[2][i];
			}
		}
		if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[0][0] != ' ')
		{
			return arr[0][0];
		}
		if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[1][1] != ' ')
		{
			return arr[1][1];
		}
		 if (chess_full(arr, line, column))
		{
			return 'O';
		}
		return 'C';
	}

3.主函数文件

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void menu()
{
	printf("---------------------------------------------------\n");
	printf("---------------------------------------------------\n");
	printf("---------------    1.开始游戏    ------------------\n");
	printf("---------------    2.退出游戏    ------------------\n");
	printf("---------------------------------------------------\n");
	printf("---------------------------------------------------\n");
}
void game()
{
	char ret = 0;
	char arr[Line][Column];
	star_arr(arr, Line, Column);
	Display_arr(arr, Line, Column);
	while ( 1 )
	{
		player(arr, Line, Column);
		Display_arr(arr, Line, Column);
		ret=why_win (arr, Line, Column);
		if (ret != 'C')
		{
			break;
		}
		computer(arr, Line, Column);
		Display_arr(arr, Line, Column);
		ret = why_win(arr, Line, Column);
		if (ret != 'C')
		{
			break;
		}
	}
	if (ret == '*')
	{
		printf("恭喜你战胜了电脑\n");
	}
	else if (ret == '$')
	{
		printf("很遗憾你输给了电脑\n");
	}
	else if (ret == 'O')
	{
		printf("游戏平局\n");
	}
}
int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	do
	{
		menu();
		scanf("%d", &input);
		switch(input)
		{
		case 1:
			printf("请准备好,游戏即将开始\n");
			game();
			break;
		case 2:
			printf("已退出游戏\n");
			input = 0;
			break;
		default:
			printf("输入错误,请重新输入\n");
		}
	}	while (input);
	return 0;
}

只需将以上三个文件代码组合在一个工程即可进行三子棋游戏,同时也希望学习者们这样写代码,为以后成为打工人做铺垫。

到此这篇关于C语言工程文件该如何写(以三子棋游戏为例)的文章就介绍到这了,更多相关C语言工程文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文