一、结构
如果设计的游戏不需要保存数据,只是游戏的过程当中产生了数据变化,那么我们就可以用一种结构描述一个物体,用多种结构去描述多种物体,用多种结构的数据变化去描述物体间的行为。
假如你正在制作一款“王者荣耀”的游戏,你需要去描述一个玩家。简单化,我们考虑:血量、蓝、一技能、二技能、三技能、闪现、武器。
typedef struct Player{
int blood;//血量
int cd;//蓝
int first;//一技能是否释放,1释放,0未释放
int attack_first;//一技能的伤害值
int second;//二技能是否释放,1释放,0未释放
int attack_second;//二技能的伤害值
int third;//三技能是否释放,1释放,0未释放
int attack_third;//二技能的伤害值
int flash;//闪现
int weapon[6];//装备,用数字代表装备
}Player;
二、结构数组
如果设计的游戏不需要保存数据,只是游戏过程中会产生许多同类型物体,我们会用结构数组去描述它们。
假如你正在制作一款“贪吃蛇”的游戏,随机摆放的食物就是许多同类型物体。
typedef struct Food{
int arrey[20][20];//位置信息
int status;//食物是否被吃,1吃了,0未被吃
}food[50];
三、链表
如果设计的游戏不需要保存数据,游戏过程中的物体数量不确定,我们会考虑使用链表去节省空间。
假如你正在制作一款创造性游戏,可以制作传送点,只要材料足够,你制作的传送点数量你也不知道,你可以随时再去制作。我们虽然可以用一个很大的结构数组去存储传送点的位置坐标,但却不节省空间。
基于链表的算法描述:
- 头指针和尾指针都指向NULL的结点
- 新建传送点:尾插法插入坐标结点,新结点指向NULL,尾指针指向新结点,尾指针向前移动一个结点
- 删除传送点:声明一扫描指针指向头指针,声明一记录指针指向扫描结点的前一个结点,扫描指针移动到指定位置,记录指针指向扫描指针的下一个指针,释放扫描指针指向的空间
//坐标结点
typedef struct Arrey{
int x;
int y;
}arrey;
//创建链表
typedef struct Link{
arrey position;
struct Link* next;
}link;
link *rear,*head;
head = (link*)malloc(sizeof(link));
rear->next = head->next = NULL;
//尾插法插入坐标结点
void insert_link(link *rear,arrey site)
{
link *temp = (link*)malloc(sizeof(link));
temp->next = NULL;
temp->position.x = site.x;
temp->position.y = site.y;
rear->next = temp;
rear = temp;
}
//删除坐标结点
void delete_link(link *head,arrey site)
{
link *front,*move;//front 扫描结点的前一个结点指针,move 扫描结点指针
front= move = head;
head = head->next;
if(head!=NULL)
{
while(1)
{
if(move->position.x==site.x&&move->position.y==site.y)
{
front->next = head->next;
free(move);
break;
}
else
{
front= head;
head = head->next;
}
}
}
}
四、文件
如果设计的游戏需要保存数据,如玩家的登录信息、游戏数据,就需要文件去保存数据。
假如你正在制作一款“2048”的游戏,游戏最后你可能会要求记录最高分,这个时候就得靠文件了。
基于文件更改的算法描述:
- 打开游戏数据文件,参数为读入
- 新建一临时文件,参数为写入
- 把游戏数据文件更改到临时文件中
- 删除游戏数据文件
- 重命名临时文件为原游戏数据文件的名称
//保存最高分
void save(int score)
{
FILE *fp = fopen("data.txt","r");
FILE *fq = fopen("temp.txt","w");
if(fp==NULL)
{
fprintf(fp,"%d",score);
}
else{
int high;
fscanf(fp,"%d",&high);
if(score>high)
{
fprintf(fq,"%d",score);
}
}
fclose(fp);
fclose(fq);
unlink("data.txt");//删除游戏数据文件
rename("temp.txt","data.txt");//重命名临时文件为原游戏数据文件的名称
}
五、链表+文件
在游戏过程中,直接在文件上更改数据并不高效,我们常常结合链表和指针。
算法描述:
- 游戏开始前,把文件中的数据储存到链表中
- 游戏进行时,数据的变化都在链表中进行
- 游戏结束后,把链表中的数据储存到文件中