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

 更新时间:2023年09月26日 10:46:23   作者: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语言工程文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++不使用变量求字符串长度strlen函数的实现方法

    C++不使用变量求字符串长度strlen函数的实现方法

    这篇文章主要介绍了C++不使用变量求字符串长度strlen函数的实现方法,实例分析了strlen函数的实现原理与不使用变量求字符串长度的实现技巧,需要的朋友可以参考下
    2015-06-06
  • Opencv图像处理之图像增加边框

    Opencv图像处理之图像增加边框

    这篇文章主要为大家详细介绍了Opencv图像处理之图像增加边框,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-10-10
  • C/C++宽窄字符转换与输出的多种实现方法

    C/C++宽窄字符转换与输出的多种实现方法

    本文主要介绍了C/C++宽窄字符转换与输出的多种实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • C++模拟实现STL容器vector的示例代码

    C++模拟实现STL容器vector的示例代码

    这篇文章主要为大家详细介绍了C++如何模拟实现STL容器vector的相关资料,文中的示例代码讲解详细,对我们学习C++有一定帮助,需要的可以参考一下
    2022-11-11
  • 你真的理解C语言qsort函数吗 带你深度剖析qsort函数

    你真的理解C语言qsort函数吗 带你深度剖析qsort函数

    这篇文章主要介绍了你真的理解C语言qsort函数吗?带你深度剖析qsort函数,本篇将引入一个库函数来实现我们希望的顺序,结合示例代码给大家介绍的非常详细,需要的朋友可以参考下
    2023-02-02
  • C语言中的常量详解

    C语言中的常量详解

    本文主要讲解C语言 常量,这里整理了 C语言常量的基础知识,并附代码示例和示例详细讲解,希望能帮助开始学习C 语言的同学
    2021-09-09
  • C语言 推理证明带环链表详细过程

    C语言 推理证明带环链表详细过程

    单链表中同样也有具有挑战性的题目,链表的带环问题可以说是众多难题中的佼佼者,在这里可能更看重的是逻辑推理和证明的过程
    2022-04-04
  • C语言扫雷游戏的实现代码

    C语言扫雷游戏的实现代码

    这篇文章主要为大家详细介绍了C语言扫雷游戏实现代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • Qt添加MSVC2017编译器的实现方法

    Qt添加MSVC2017编译器的实现方法

    Qt添加MSVC2017编译器是开发者在Windows平台上进行Qt应用程序开发的重要步骤,本文详细介绍了如何为Qt配置MSVC2017编译器的具体步骤,感兴趣的可以了解一下
    2023-09-09
  • c++命名对象和匿名对象的解析

    c++命名对象和匿名对象的解析

    像按值传递的对象(函数入参,函数返回值)都是匿名对象,那匿名对象的特点是什么呢?下面通过实例代码给大家解析c++命名对象和匿名对象的相关知识,感兴趣的朋友一起看看吧
    2021-10-10

最新评论