纯c语言版的打飞机游戏出炉了^_^

时间:2021-09-18 06:44:33

经过昨天的苦战,终于完成了纯C版的打飞机游戏——使用微信打飞机游戏的素材,不过玩法有些不同,下面会有详述

一、概述游戏的玩法、实现效果

1. 游戏第一步,简单判断一下,给你一个准备的时间:

<Win32_20>纯c语言版的打飞机游戏出炉了^_^

2.选择"是"进入游戏界面:

<Win32_20>纯c语言版的打飞机游戏出炉了^_^

3. 分数的记法规则和微信版的一样——小飞机1000、中号飞机6000、大boss10000

4. 使用鼠标点击响应的飞机,能实现爆炸效果

5. 你需要在飞机消失之前干掉它,否则游戏就结束了

6. 同样支持微信中暂停和继续的功能(左上角图标可以看见)

7. 当游戏结束的时候,还会提示你是否继续重玩

<Win32_20>纯c语言版的打飞机游戏出炉了^_^

二、写游戏过程中的一些心得

1. 链表和数组的纠结:

大家应该都知道 , 要想不断的加飞机、删除飞机,那么首选链表这个数据结构,因为它的优点就是插入、删除的时间复杂度小。

的确,不过对于应该是使用链表还是简单的数组,我一开始确实纠结了很久,最终大家猜猜我选择的是什么呢?

呵呵,我选择了简单的数组,原因如下: 我的算法总是在数组的最后添加飞机,飞机的数量有限(不多 , 最多10个),如果使用链表有些大材小用

使用越简单的方式效率也就相应的越高

2. 内存的泄漏

从表面上听着像是很严重——没错,它确实是我编写过程中的一个BUG。当我完成第一个初始版本时,我迫不及待的运行了一下,开始没什么问题,运行尚好。

不过问题不一会儿就出现了——飞机不动了,程序瞬间崩溃……

我还试了几次,最终都是一样的而结果——于是我就想: 首先确定这应该是内存泄漏的问题,但是没使用链表(指针),那会是什么呢?

原来问题出现在一个很低级的错误上:

由于我使用双缓冲技术来贴位图,那么必定会创建一个兼容的内存Bitmap,然后我却没有在不使用它时释放它所占的内存,那么问题自然就出现了。

在此,我必须再次强调一下,释放资源所占内存的重要性

三、代码阶段

这次呢,我不打算详细的讲解代码细节了,因为大部分技术都是之前详述过的,例如贴位图、透明位图、双缓冲技术==

但是呢,我还是将头文件中的一些声明注解一下,方便各位参看源代码:

#ifndef BEATPLANE_H

//调用TransparentBlt函数所需导入的库
#pragma comment(lib, "Msimg32.lib") //自定义消息——开始或重玩
#define WM_START (WM_USER+100) #define TIMER 100//定时器ID
#define WNDWIDTH 380//窗口宽度
#define WNDHEIGHT 550//窗口高度
#define SMALL 2 //飞机的类型——大中小
#define MIDDLE 3
#define BIG 4
#define GRADE 200000//等级 200000一个等级
#define MAX 10//窗口中一次显示最多的飞机数 //飞机结构体
typedef struct
{
HBITMAP hBmp;//飞机位图
POINT pos; //飞机当前的位置
SIZE size;//飞机的大小
int moveSpeed;//飞机当前飞行的速度
int type;//飞机的类型(大中小)
}Plane, *PPlane; //play结构体(控制继续或暂停)
typedef struct
{
HBITMAP hBmp;//状态位图(暂停或继续)
SIZE size;//位图大小
BOOL isPaused;//状态(暂停或继续)
}Pause; int iBmpNames[] = {IDB_BK, IDB_SMALL, IDB_MIDDLE, IDB_BIG};
Plane pPlaneArr[MAX];//飞机数组
Pause pauseBmp;//暂停、继续
HBITMAP hBmp[4];//背景、大中小飞机位图句柄
int iCurLen;//当前飞机数
int score;//标记分数
int grade;//等级(用于变速)
BOOL isBigAdd=FALSE;//判断打飞机是否已经添加 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);//回调函数
VOID StickPlanes(HDC);//用双缓冲贴飞机位图
VOID AddPlane(int, int);//添加飞机
BOOL Beat(HWND, POINT);//判断打飞机是否成功
VOID Boost(HWND, PPlane);//实现爆炸效果
VOID DeletePlane(int);//删除指定索引的飞机
BOOL Paused(POINT);//判断是否点击了暂停 #endif

四、最后我做了一个gif,当做一个演示吧^_^

<Win32_20>纯c语言版的打飞机游戏出炉了^_^

纯C版微信打飞机游戏

随机推荐

  1. 在sql语句中使用 xml for path 格式化字符串的方法总结

    此方法实现的是将查询表中的某个字段,格式化成  字符串1,字符串2,字符串3...的格式 假设我们现在有两个表 分别是 分组表 grouped和分组成员表 groupuser grouped表有连个字 ...

  2. JSP内置对象---request和 response

    <%@page import="java.net.URLEncoder"%> <%@page import="com.hanqi.web.CardDAO ...

  3. python数据结构与算法——小猫钓鱼&lpar;使用队列&rpar;

    按照<啊哈>里的思路实现这道题目,但是和结果不一样,我自己用一幅牌试了一下,发现是我的结果像一点,可能我理解的有偏差. # 小猫钓鱼 # 计算桌上每种牌的数量 # 使用defaultdic ...

  4. Windows下PHP开发环境搭建

    PHP集成开发环境有很多,如XAMPP.AppServ......只要一键安装就把PHP环境给搭建好了.但这种安装方式不够灵活,软件的*组合不方便,同时也不利于学习.所以我还是喜欢手工搭建PHP开发 ...

  5. Linux下arp用法

    [功能] 管理系统的arp缓存. [描述] 用来管理系统的arp缓存,常用的命令包括: arp: 显示所有的表项. arp  -d  address: 删除一个arp表项. arp  -s addre ...

  6. Android 获取截图 并将其保存到本地sd在卡路径

    /** * 获取当前屏幕和保存截图 */ private void GetandSaveCurrentImage() { //1.构建Bitmap WindowManager windowManage ...

  7. url操作一网打尽(一)

    1:url实际应用简介 近期研究发现通过url传递参数很普遍的(淘宝也是这样做的), 通过修改url来传递参数,比如通过关键字搜索某件商品的时候,链接便追加了相应参数.在请求接口的时候直接对url进行 ...

  8. Unity3d获取游戏对象的几种方法

    1.GameObject.Find() 通过场景里面的名子或者一个路径直接获取游戏对象. GameObject root = GameObject.Find("GameObject&quot ...

  9. sqlserver 删除表结构

    sqlserver-----------删除表结构use IndividualTaxGOdeclare @sql varchar(8000)while (select count(*) from sy ...

  10. React-Native 之 项目实战&lpar;一&rpar;

    前言 本文有配套视频,可以酌情观看. 文中内容因各人理解不同,可能会有所偏差,欢迎朋友们联系我. 文中所有内容仅供学习交流之用,不可用于商业用途,如因此引起的相关法律法规责任,与我无关. 如文中内容对 ...