基于控制台的C语言游戏数据存储

一、结构 

如果设计的游戏不需要保存数据,只是游戏的过程当中产生了数据变化,那么我们就可以用一种结构描述一个物体,用多种结构去描述多种物体,用多种结构的数据变化去描述物体间的行为。

假如你正在制作一款“王者荣耀”的游戏,你需要去描述一个玩家。简单化,我们考虑:血量、蓝、一技能、二技能、三技能、闪现、武器。

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");//重命名临时文件为原游戏数据文件的名称
}

五、链表+文件

在游戏过程中,直接在文件上更改数据并不高效,我们常常结合链表和指针。

算法描述:

  • 游戏开始前,把文件中的数据储存到链表中
  • 游戏进行时,数据的变化都在链表中进行
  • 游戏结束后,把链表中的数据储存到文件中​​​​​​​ 
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ོ栖落

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值