![](https://img-blog.csdnimg.cn/9b8a521d52f7462ab03147a180954fc2.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
游戏开发筑基(C语言)
该栏主要是展示博主日常关于C语言的所学知识以及见解,仅供参考。
ufgnix0802
这个作者很懒,什么都没留下…
展开
-
C语言常见知识点
C语言常见知识点1.windows是什么类型的系统(实时还是分时)?有什么区别? 答:分时操作系统。如果在单核的情况下,分时操作系统多个进程共用一个单核,该单核会将其执行时间分成相应的时间片,每个进程占用一定的时间片,时间片过后则跳转至下一个进程的时间片。而实时操作系统如果在单核的情况下,一个进程能独享该单核。2.描述每种结构体(struct、enum、union)的区别?struct变量依次存储,且结构体大小为内部最大成员的整数倍,不足需要补齐(内存对齐,具体内容可参照:https://blo原创 2022-05-10 22:42:30 · 1858 阅读 · 0 评论 -
游戏筑基开发之C语言编程技巧
游戏筑基开发之C语言编程技巧1.在使用free释放堆区内存时,指针一定要置空 for (int i = 0; i < ptConfig->lenMax; ++i) { free(ptConfig->pKeyNode[i].pKeyNode); //指针制空,便于再次处理时不是一个野指针 ptConfig->pKeyNode[i].pKeyNode = NULL; }2.使用特殊标记位,便于其它程序员阅读// 特殊标记为,无任何代码意义,给其它程序员辅助阅读原创 2021-08-19 16:09:44 · 103 阅读 · 0 评论 -
游戏筑基开发之字符串、字符指针、字符数组的相关知识梳理(C语言)
游戏筑基开发之字符串、字符指针、字符数组的相关知识梳理(C语言)该文章大部分均为转载内容,对其进行梳理【点击跳转】1.为什么可以将字符串常量赋值给字符指针变量?char *p,a='5';p=&a; //正确p="abcd"; //正确原因如下: 字符串常量的双引号的作用: 1. 在常量区申请内存保存该字符串 2. 在字符串的尾部加上’\0’ 3. 返回该字符串在常量区的地址即可以将该地址赋值给一个原创 2021-08-17 19:52:03 · 173 阅读 · 0 评论 -
游戏筑基开发之学生管理系统数据结构及数据结构解析图(C语言)
游戏筑基开发之学生管理系统数据结构及数据结构思维导图1.数据结构如下/**************************学生管理系统数据结构*************************/static struct tagGradeMgr* pGradeMgr;//唯一标识// 学生typedef struct tagStudent{ //学号 char key[N]; //姓名 char value[N]; //学院 //性别 //... //... //... s原创 2021-08-13 22:46:07 · 475 阅读 · 0 评论 -
游戏筑基开发之利用文件函数读出文件数据及处理(反序列化)(C语言)
游戏筑基开发之利用文件函数读出文件数据及处理(反序列化)(C语言)文件格式如下(txt文件):TIPS:最后一行,即50行末尾有一个\n(换行符)具体实现如下:可优化,思路仅供参考。Ini.h#ifndef INI_H_#define INI_H_#define N 1024typedef struct tagIniNode{ int value[N];//将字符型转化为int型保存}TIniNode, *PTIniNode;typedef struct tagIni{原创 2021-08-11 23:20:18 · 190 阅读 · 0 评论 -
游戏筑基开发之二进制文件操作的那点事儿(C语言)
游戏筑基开发之二进制文件操作的那点事儿(C语言)1.二进制写文件int main(){ //二进制文件的写 // 写入/读出的真实长度 = 写入元素的大小(字节数) * 写入元素的个数 FILE *pFile = fopen("1.exe", "wb"); int a[10] = { 1,2,3,4,5,6,7,8,9,10 }; //fwrite(a,sizeof(int),10,pFile); fwrite(a, 1, sizeof(int) * 10, pFile); fclose原创 2021-08-09 23:15:18 · 264 阅读 · 0 评论 -
游戏筑基开发之文件操作(C语言)
游戏筑基开发之文件操作(C语言)1.文件的分类 文件是用于存储信息的载体,是信息的集合。 文本文件:人们可以读懂的文件。 二进制文件:比如exe、bin文件就是二进制文件。2.文件的打开和关闭2.1 文件的打开 fopen的头文件是stdio.h 返回值 如果打开成功返回句柄 否则返回 NULL 每次打开文件需要判断文件句柄是否打开成功 FILE* 文件句柄 = fopen(文件路径,文件打开模式);文件打开模式中文描述r以只读方式打开文件,该文件必须存原创 2021-08-09 22:39:15 · 249 阅读 · 0 评论 -
游戏筑基开发之一级指针、二级指针的使用情形(C语言)
游戏筑基开发之二级指针及一级指针的使用情形(C语言) 根据C语言学习经验,下面讲述一下在什么情况下是使用一级指针存储数据,什么情况下使用二级指针存储数据。以下理解仅供参考。...原创 2021-08-04 21:55:51 · 180 阅读 · 0 评论 -
游戏筑基开发之利用文件函数取出配置文件(ini文件)的数据实体(C语言)
游戏筑基开发之利用文件函数取出配置文件(ini文件)的数据实体(C语言)ini文件数据如下: 我们需要取数“=”左边的数据以及“=”右边的数据。同时去除“=”左右两边的空格。 例如第一行取得数据应为:key和value。解决思路 按行取出数据,先取出:key = value。然后在“=”处隔断,分别取出:key , value(此时未去除空格)。然后去除空格即可。具体实现以下给出两个方案实现。第一个方案较为容易理解,第二个方案具有更优良的扩充性。(仅提供思路,仍可优化)。方案一#inc原创 2021-08-04 21:33:06 · 217 阅读 · 0 评论 -
游戏筑基开发之C语言打印(printf)中文时出现乱码的解决方案
游戏筑基开发之C语言打印(printf)中文时出现乱码的解决方案情况如下:解决方案(原因)原因是该文件编码使用了utf-8的编码。而C语言编译器使用的是gbk的编码格式,所以打印时出现乱码。解决方案:使用记事本打开该文件,另存为==>将编码格式从utf-8变为ANSI即可。点击确定覆盖即可解决问题。...原创 2021-07-30 00:04:38 · 5205 阅读 · 1 评论 -
游戏筑基开发之menset底层实现及C语言项目常见问题解决方案(C语言)
游戏筑基开发之menset底层实现及C语言项目常见问题解决方案(C语言)1.menset底层实现细节void *memset(void *s, int ch, size_t n);函数解释:将s中当前位置后面的n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s。具体实现细节: // 把当前指针指向地址的元素全部清零 //#define N 20 //int a[N]; memset(a, 0, sizeof(a) * N); //实现细节 v原创 2021-07-28 22:00:17 · 335 阅读 · 0 评论 -
游戏筑基开发之字符串的注意点(C语言)
游戏筑基开发之字符串的注意点(C语言)字符串用“ ”包裹“abc” 字符串默认会在结尾 添加一个 \000字符标记\ddd “\078"实际是”\007" 8大于7最高位补0puts函数:输出字符串,且自动换行putchar函数:输出单个字符串,可以’a’或者字符变量,不会自动换行printf最重要的输出函数:printf(格式控制串,[输出参数1],[输出参数2],[…]);// %d 用于输出整数 int short// %ld 输出长整形 long// %f 输出 浮点型原创 2021-07-27 23:45:06 · 140 阅读 · 0 评论 -
游戏筑基开发之变量、运算符、转义字符的注意点(C语言)
游戏筑基开发之变量、运算符、转义字符的注意点(C语言)1.变量浮点型:float double,float精度为7~8位,double精度为15~16位。空类型:万能类型,一般配合void*,void**使用。ASCII码(计算机中之能存储二进制,每一哥字符都会对应一个数值),例如’0’=48,a=‘97’,‘A’=65,‘A’-‘a’=32;C语言中万事万物都为char(byte字节)2.运算符如果除数和被除数都是整型,则结果为整型如果除数和被除数有一个是浮点型,则结果为浮点型除数原创 2021-07-27 23:28:32 · 111 阅读 · 0 评论 -
游戏筑基开发之魔塔游戏分析
魔塔游戏制作之前的分析图原创 2021-07-22 22:20:55 · 213 阅读 · 1 评论 -
游戏筑基开发之C语言回调函数使用实例及其.h库封装实例
C语言回调函数使用实例及其.h库封装实例主要利用void*、函数指针的妙用实现回调函数及其.h库的封装。关于void*、void**及其函数指针的基本用法【点击进入】接下来的实例使用回调函数及.h库封装结合实例,在此只介绍思想、思路。TIPS:使用双链表的实现部分功能进行描述。DoubleList.h文件#ifndef _DOUBLELIST_H_#define _DOUBLELIST_H_typedef void* PTDOUBLELIST;//隐藏结构体数据结构细节type原创 2021-07-20 22:16:33 · 298 阅读 · 2 评论 -
游戏筑基开发之栈、队列及基本功能实现(使用C语言链表的相关知识)
C语言使用链表实现栈、队列及其基本功能栈、队列主要使用结构体、一级指针、二级指针进行实现。栈的功能包括:初始化、入栈、出栈、打印数据等。队列的功能包括:初始化、入队、出队、打印数据等。栈的数据结构如下://栈struct tagStackNode{ int v;//存储数据 struct tagStackNode *next;//后继指针};typedef struct tagStack{ struct tagStackNode *nStart;//头节点标记位 struc原创 2021-07-19 00:19:45 · 192 阅读 · 1 评论 -
游戏筑基开发之环形链表及其基本功能(C语言)
C语言双链表主要使用结构体、一级指针、二级指针等基本知识实现。功能包括:尾插法、任意插入、任意删除、输出数据等。数据结构如下://循环链表struct tagCircularListNode{ int v;//数据存储 struct tagCircularListNode *prior;//前驱节点 struct tagCircularListNode *next;//后继节点};typedef struct tagCircularList{ struct tagCircular原创 2021-07-19 00:10:27 · 178 阅读 · 0 评论 -
游戏筑基开发之双链表及其基本功能(C语言)
C语言双链表主要使用结构体、一级指针、二级指针进行实现。功能包括:初始化、尾插法、任意插入法、任意删除法、打印数据等。数据结构如下://双链表struct tagDoubleListNode{ int v; struct tagDoubleListNode *prior;//前驱指针 struct tagDoubleListNode *next;//后继指针};typedef struct tagDoubleList{ struct tagDoubleListNode *nSta原创 2021-07-19 00:04:59 · 162 阅读 · 1 评论 -
游戏筑基开发之单链表及其增删改查(C语言)
C语言单链表及其增删改查主要利用结构体、一级指针、二级指针等C语言知识。数据结构如下:struct tagListNode { int v;//存储数据 struct tagListNode *next;//指向下一节点};typedef struct tagList { struct tagListNode *nStart;//指向头节点 struct tagListNode *nEnd;//指向尾节点 int Size;//记录数据大小}TList, *PTList;示原创 2021-07-17 00:00:30 · 148 阅读 · 1 评论 -
游戏筑基开发之回调函数(C语言)
利用结构体容器定义进行说明阐述C语言回调函数TIPS:void*可以存储任何无符号整型的数据且在32位操作系统中占4个字节。通常我们称void*为万能数据类型。void**相当于存储void数据所在的地址。void本身没有任何实际的含义,不能表示任何意思,因此可以理解为:值和一级指针的维度类似于void*和void*。void*另外也可简单的理解为二级指针,类似于一个指针数组。void为一级指针。void无任何实际含义。数据结构定义如下:typedef struct tagVector{原创 2021-07-15 22:13:48 · 175 阅读 · 1 评论 -
游戏筑基开发之动态数组(C语言)
利用结构体以及指针的相关知识创建动态整型数组主要功能包括: 初始化动态数组、释放动态数组、插入数据在动态数组尾部、指定下标删除数据(从0开始)、指定下标更新数据、打印动态数组等。该动态数组根据将根据使用者动态扩容。初始大小:10个整型大小。数据结构如下:// 动态数组typedef struct tagVector{ int* pArr;//存储数据 int nLen;//当前长度 int nLenMax;//最大长度}TVector, *PTVector;具体实现如下:#i原创 2021-07-15 21:40:21 · 124 阅读 · 0 评论 -
游戏筑基开发之结构体定义动态数组及常见问题(C语言)
定义动态数组结构体及初始化定义结构体如下:// 动态数组typedef struct tagVector{ int* pArr; int nLen; int nLenMax;}TVector, *PTVector;在初始化的时候,最开始想法是使用一级指针初始化即可。定义如下:// 初始化动态数组static int VectorInit(PTVector pv){ // 创建一个结构体,在堆区 PTVector pTv = malloc(sizeof(TVector));原创 2021-07-15 00:47:53 · 566 阅读 · 3 评论 -
游戏筑基开发之结构体(数组、指针)、枚举、共用体、typdef(C语言)
1.结构体类型 在C语言中,结构体是一种复合数据类型,也就是,一个数据类型中包含多种数据类型(包括复合数据类型)。其字节大小为所有成员函数所占大小之和。结构体声明:struct [结构体名]{数据类型 变量名;…数据类型 变量名N;}[变量名][, 变量名 = {值1,…,值N}];//标准定义结构体struct tagStu{ char name[1024]; int num;}stu1, stu2 = { "张三",20 };// 匿名结构体str原创 2021-07-14 23:45:39 · 257 阅读 · 0 评论 -
游戏筑基开发之函数指针及main函数利用指针传参(C语言)
1.函数指针(指向函数的指针)函数指针的声明数据类型 (*变量名)(参数列表);TIPS:声明时需要确定指向哪种数据类型的函数,且参数列表必须同指向的函数形参保持一致。 函数名本身是一个地址,是函数的入口地址。int Add(int a, int b){ return a + b;}int main(){ int (*pAdd)(int, int); pAdd = Add; printf("%d\n", pAdd(10, 20)); //30 ret原创 2021-07-14 22:17:02 · 254 阅读 · 0 评论 -
游戏筑基开开发之指针数组及数组指针详解(C语言)
1.指针数组(储存指针的数组)优先级“[]”的优先级比“*”的高,[]的优先级为1,的优先级为2。且优先级:()>[]>指针数组的声明数据类型 *变量名[size]; int *p[10]; 因为优先级的关系,p先跟[]结合,说明p是一个数组,然后p再跟*结合。即说明数组p中的元素是指向整型数据的一个指针。 相当于定义了10个指向整型变量的指针。在此,p的数组元素为指针的数组,本质上是数组。 指针数组的变量名相当于一个二级指针。示例如下: //例一 int原创 2021-07-14 21:56:14 · 202 阅读 · 0 评论 -
游戏筑基开发之广度优先搜索算法(C语言)
广度优先搜索算法思想:从起点开始,先查找四个方向(按照上右下左进行查找)。然后利用队列进行反复查找(先进先出),查照过的进行标记(从起点2开始增加)且不再查找。问题描述:从起点2开始,找到终点-1。其中1代表墙,大于2的值表示索引遍历,直至找到终点。效果图如下:数据变量如下:static int MapsQueue[N][N] = { {0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,1,-1,0,0,0,0}, {0,0,2,0,1,1,1,0,0,0}, {0,0,0原创 2021-07-14 21:45:02 · 253 阅读 · 0 评论 -
游戏筑基开发之指针的用途(C语言)
1.常量常量的声明(必须初始化且不能被修改):const 数据类型 变量名 = 值;const double PI = 3.1415926;2.指向常量的指针(指针常量)指针常量的声明:数据类型 *const 变量名 = 初始值(地址); 指针常量必须要初始化。 指针常量中,const是限制指针不可变,用于修饰变量,数组,指针等。简单的说,指针一旦被初始化就不可再修改,但是其指向对象的值是可以修改的。例如:int value = 100;int*const pValue = &原创 2021-07-13 22:28:22 · 242 阅读 · 0 评论 -
游戏筑基开发之深度优先搜索算法(C语言)
深度优先搜索算法思想:从起点开始,沿一个方向查询,直至无路可走。然后利用栈进行回退沿着未查找的方向继续查找,查照过的进行标记(赋值为-2)不再查找。问题描述:从起点2开始,找到终点-1。其中1代表墙,-2代表走过的地方。大于2的值表示索引,即找到终点的路径。效果图如下:数据变量如下:static int Maps[N][N] = { {0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,1,-1,0,0,0,0}, {0,0,2,0,1,1,1,0,0,0}, {0,0,0,0原创 2021-07-13 20:48:54 · 229 阅读 · 0 评论 -
游戏筑基开发之指针的练习掌握
C语言指针的相关注意点①数组名就是首地址(或是数组名[0]),且是一个不可修改的指针变量。②附代码如下(C语言标准默认规则) char* p1, p2; printf("%d %d\n", sizeof(p1), sizeof(p2)); //注意!!! //sizeof(p1) = 4,sizeof(p2) = 1。 //即char (*p1),p2;使用指针重写strcpy、strcmp、strcat、strlen的C源码细节部分暂未考虑,没有经过大量测试数据测试,仅提供思路,同时代原创 2021-07-12 21:52:49 · 103 阅读 · 0 评论 -
游戏筑基开发之初识指针
指针是C语言最重要的知识之一指针是内存的索引,内存中的每个单元相当于一个盒子,指针就是指向这些盒子的编号(唯一)。int number = 10;//该语句会分配一个整数的内存空间(32位操作系统 ,4个字节),该存储空间存储10.//变量名number只是一个代号,并不是真实的名称。真实的地址为一个32位的无符号整数(32位操作系统下)1.声明使用指针//数据类型 * 指针变量名 = NULL;//NULL表示声明的指针变量未指向任意地址,为空(0)。//指针变量的命名一般前导p(p原创 2021-07-12 21:42:21 · 132 阅读 · 0 评论 -
游戏筑基开发之环形数组(C语言)
C语言环形数组环形数组具有较低的时间复杂度的同时,充分利用数组的特性。在游戏中的应用场景主要是当玩家对某一游戏操作反悔的时候,有回退(反悔)功能的时候需要使用数组。(在此处暂且不考虑指针及链表)下面给出示例代码,代码较为精简,可供借鉴。主要使用一维数组以及conio.h库中的_getch()函数进行演示。关于conio.h库中的_getch(),大家可以参考以下描述:_getche及其相关函数简述【点击跳转】效果图如下:核心思想:代码如下:#include <stdio.h>原创 2021-07-10 20:36:47 · 965 阅读 · 0 评论 -
游戏筑基之位操作及预处理命令(C语言)
1.位操作<< 位左移把二进制中的内容做移动(最低位补0,如果发生溢出则省略)// 10 << 2 = 1010 << 2 = 10 1000>> 位右移和左移刚好相反(如果是有符号类型,即负数,则最高位补符号位;如果是无符号类型则补0)TIPS:具体和编译器有关short a = -1;a = a>>8;1000 0000 0000 0001 //二进制1111 1111 1111 1110 //反码1111 111原创 2021-07-08 23:55:47 · 133 阅读 · 2 评论 -
游戏筑基之游戏菜单制作(C语言)
利用windows.h中的SetConsoleCursorPosition光标位置控制SetConsoleCursorPosition是一个C语言中的windows.h库函数,声明变量COORD coord,COORD 是一个结构体,X,Y表示列和行,注意:X是列,Y是行(与正常逻辑相反)。通过修改pos.X和pos.Y的值就可以实现光标的位置控制。,其中pos.X=0,pos.Y=0,为控制台左上角。printf("\033[m<==\033[?25l");其中,格式为printf("\03原创 2021-07-05 22:05:03 · 3095 阅读 · 1 评论 -
游戏筑基开发之贪吃蛇移动算法(C语言)
主要利用C语言中最基础的方法及数据变量包括二位数组、静态全局变量、循环(循环嵌套)、switch语句等。注:未使用函数方法。实现效果如下:基础数据变量:static int map[N][N] = { {1,1,1,1,1,1,1,1,1,1}, {1,0,0,0,0,0,0,0,0,1}, {1,0,2,3,4,0,0,0,0,1}, {1,0,0,0,0,0,0,0,-1,1}, {1,0,0,0,0,0,0,0,0,1}, {1,0,0,0,-1,0,0,0,0,1}, {1原创 2021-07-02 20:47:10 · 1224 阅读 · 2 评论 -
游戏开发筑基之判断回文数及static(C语言)
1.static添加static的全局变量,在.c文件内部,则该静态变量的作用域仅仅只限本文件内部。没有添加static的全局变量,在.c文件内部,但其作用域为整个程序项目。2.回文数的两种实现方式算法思想基本相同,只是在具体实现有所差异。方式一该方式待优化。代码如下: char str[N]; scanf("%s", str); int Count = 0, CountH = 0; for (int i = 0; i < N; i++) { if (str[i原创 2021-07-02 20:23:08 · 130 阅读 · 0 评论 -
游戏筑基开发之简单迷宫行走(内附碰撞检测底层逻辑)
利用二维数组实现主要用到循环嵌套、switch、控制台光标定位。效果如下:具体实现如下:#include <stdio.h>#include <windows.h>#define N 10int map[N][N] = { {1,1,1,1,1,1,1,1,1,1}, {1,0,0,0,0,0,0,0,0,1}, {1,0,2,0,0,0,0,0,0,1}, {1,0,0,0,0,0,0,0,0,1}, {1,0,0,0,0,0,0,0,0,1}, {1原创 2021-07-01 22:09:03 · 162 阅读 · 0 评论 -
游戏筑基开发之printf及利用一维数组输出杨辉三角
1.printf中的%d、%ld、%lld在输出时的注意点在输出时,如果是int型的变量,务必使用%d输出。long型使用%ld,long long型使用%lld。如是long long的变量,使用%d,将会产生未知亦或无法理想的bug。2.利用一维数组实现杨辉三角思路如下(逆向思维,从右往左计算,每一行倒数第二位开始,每一位等于本位与前一位之和):11 11 1 1 ==》 1 2 11 2 1 1 ==》 1 2 3 1 ==》 1 3 3 11 3 3 1 1 ==》1 3 3原创 2021-07-01 22:00:39 · 151 阅读 · 0 评论 -
游戏开发筑基之用“*“输出三角形(一个for循环)及打印控制台进度条
1.利用一个for循环在控制台打印输出三角形效果如下:代码如下: int n = 5; for (int i = 1; i <= n; i++) { printf("*"); if (i == n) { n--; i = 0; printf("\n"); } }2.在控制台打印一条进度条,利用’\b’和控制台输出定位(SetConsoleCursorPosition)效果如下:代码如下: //#include <windows.h>原创 2021-06-30 23:52:50 · 204 阅读 · 0 评论 -
游戏筑基之选择分支语句(C语言)
switch语句主要介绍switch的一些妙用,实用性可能并不大,只供扩展思维。利用switch的特性:当匹配一个case以后便会停止匹配,按顺序执行语句。1.输出某一个月份的天数,默认都是平年示例如下: int month; scanf("%d", &month); switch (month) { case 2: printf("28天\n"); break; case 4: case 6: case 9: case 11: printf("30天\n");原创 2021-06-29 22:12:57 · 84 阅读 · 2 评论 -
游戏筑基之两个变量交换值与三个变量交换值的比较(C语言)
三个变量进行值交换 通常情况下,三个变量进行值交换是比较容易的,场景如: 输入a 的值为5,b的值为15。要求:交换两数的值,使得a的值为15,b的值为5。示例: int a = 5, b = 15; if (a < b) { int temp = a; a = b; b = temp; } 此时a、b从内存中读出和读入各两次。虽然定义临时变量temp,但是编译器对其进行优化,性能高,耗时相对于内存读出和读入较小。原创 2021-06-29 22:01:02 · 610 阅读 · 0 评论