BrickMansions 运行演示 C语言作业

分享19级同学大一上学期用C语言实现的BrickMansions,可从码云下载:

https://gitee.com/Brick_Mansions/Brick_Mansions.git

一、 设计思路(内容摘要)

根据原版游戏僵尸危机3进行创新,通过socket——udp协议进行通信增加局域网联机对战功能,增添刺激的音效,丰富游戏的可玩性。

关键词:射击、僵尸、双人

二、 功能描述

游戏有单人模式和双人局域网联机对战两种模式,有完整用户界面,并且实现了音量大小的控制。游戏时有三种武器可供玩家选择。三把枪具有不同的威力、射速、射程。

开发游戏时的模块总体上采用课堂上的模版,其中主要的三个模块为用户输入模块、数据更新模块和显示模块。在局域联机的玩法中,对程序增加一个线程,用于电脑之间的通信。

1、基本功能(单人模式)

地图两侧不断出现僵尸并向玩家坐标聚拢,既而攻击玩家。玩家需要使用武器(枪)去攻击僵尸。此种模式下的界面上方有连击统计,当连击增加时,僵尸的数目也会相应增加。玩家可以通过杀死僵尸,拾取随机掉落的红盒子来补充弹药和恢复血量;并且在击杀僵尸数目到达一定程度时可以释放大招(射速加快三倍),此时出现的大招图片和音乐具有搞笑效果。

2、添加功能(双人对战模式)

该功能下的地图范围缩小,背景音乐更加激情、紧张。两位玩家的三种武器均可任意替换使用。当其中一位玩家体力值为0时,游戏结束。

三、分步骤实现方法

1、 规划游戏基本界面:开始菜单、游戏进程、游戏结束。

2、 首先从游戏过程入手:

由于三把枪的各类设置不一样,所以要分别进行初始化(此处展示定义记录枪的信息的结构体后初始化所需要的),并在紧接其后的初始化(start up)函数中引用这三个函数。由于思路一致,对三把枪进行初始化的工作仅存在参数上的差异,此处只以对手枪的初始化为例:

void initialize_handgun()//初始化handgun-------1
{handgun.power = 5;handgun.fire_length = 300;   handgun.fire_time = 20;handgun.fire_time_count = 0;handgun.bullet_max = 60;handgun.bullet = handgun.bullet_max;handgun.gun_stop = 0;handgun.gun_speed = 200;         // 射速handgun.gun_music = 20;handgun.gun_music_count = 0;
}

由于游戏要实现枪的转换,所以又相应写了替换枪图片的函数(void change_gun_img())、替换后的枪的信息更新的函数(void change_gun_info()),并在更换武器的函数(void change_gun())中引入。

然后要处理各类转向过程中的图片显示,僵尸行走涉及向玩家坐标靠拢的判断和更多方向的变换,其内容在另一份报告中展示,故此处只展示与实现玩家行走动画效果相关的函数:

void update_walk()
{if (player_direction == 'w'){img_player = img_w;img_player_cover = img_w_cover;}else if (player_direction == 'a'){img_player = img_a;img_player_cover = img_a_cover;}else if (player_direction == 's'){img_player = img_s;img_player_cover = img_s_cover;}else if (player_direction == 'd'){img_player = img_d;img_player_cover = img_d_cover;}if (player_walk >= 4){player_walk = player_walk % 4;}
}

该更新玩家方向(包括更新己方方向和更新敌方方向)的办法在双人对战模式中也有使用。

另一个问题就是一个僵尸被击杀后要有新的僵尸诞生。首先要判断前一个僵尸的存亡状况,若已被击杀则需要诞生新的僵尸。新僵尸诞生的过程和初始化函数中关于僵尸参数的初始化类似:

void zombie_birth()        // 控制僵尸出现
{int i;int p;for (i = 0; i < zombie_num; i ++){if (zombie_alive[i] == 0){           // 判断死僵尸让僵尸重新出现p = rand() % 2;    // 两个方向出现僵尸if (p == 0){img_zombie[i] = img_zombie_d;     // 初始化僵尸方向img_zombie_cover[i] = img_zombie_d_cover;zombie_move_direction[i] = 'd';zombie_x[i] = -300;zombie_y[i] = rand() % 450 + 150;   // 初始化僵尸位置}else if (p == 1){img_zombie[i] = img_zombie_a;     // 初始化僵尸方向img_zombie_cover[i] = img_zombie_a_cover;zombie_move_direction[i] = 'a';zombie_x[i] = 1900;zombie_y[i] = rand() % 450 + 150;   // 初始化僵尸位置}attack[i] = 0;zombie_move_count[i] = 0;zombie_attack_count[i] = 0;zombie_hp[i] = 10;       // 初始化僵尸血量zombie_alive[i] = 1;    // 初始化僵尸存活zombie_walk[i] = 0;zombie_walk_count[i] = 0;}}

关于僵尸是否对玩家造成攻击伤害的判断:

void zombie_attack(){ int x, y, distance;int i;for(i = 0; i < zombie_num; i ++){if (zombie_alive[i] == 1){x = abs(player_x + 35/*一半的图片尺寸*/+ Width / 2 - map_x - (zombie_x[i] + 36));y = abs(player_y + 35/*一半的图片尺寸*/+ High / 2 - map_y - (zombie_y[i] + 50));distance = sqrt(x * x + y * y);if (distance <= 50){attack[i] = 1;zombie_attack_count[i] ++;zombie_move_direction[i] = 'p';if (zombie_attack_count[i] == zombie_attack_speed){zombie_attack_count[i] = 0;player_attacked(i);}}elseattack[i] = 0;}}
}

玩家每次收到攻击血量减一。

3、 后来在用户体验上做了一些文章:

首先是在实现各界面上鼠标移动到选项上之后的音效和文字抖动效果(下简称特效)实现,此处以选项“SINGLE PLAY”不同状态下的效果作为例子:

    int a;a = rand() % 5;int b;b = rand() % 5;
if (pick_start == 1){if (sound_switch == 1){mciSendString("open bm_music\\pass_button.mp3 alias pass", NULL, 0, NULL);  //鼠标经过按键的声音mciSendString("play pass", NULL, 0, NULL); }putimage (420 + a, 105 + b, &img_singleplay_cover,NOTSRCERASE);  //特效putimage (420 + a, 105 + b, &img_singleplay_pick,SRCINVERT);}else{putimage (420, 105, &img_singleplay_cover,NOTSRCERASE);putimage (420, 105, &img_singleplay,SRCINVERT);}

开枪玩家射击时四个方向枪焰(弹道)的绘制,此处以绘制手枪四个方向的枪焰为例:

void show_fire_handgun()
{setlinecolor (YELLOW);if (player_direction == 's'){       // 向下射击line (Width / 2 + player_x + 8, High / 2 + player_y + 35, Width / 2 + player_x + 8, High / 2 + player_y + 35 + gun_present.fire_length);}if (player_direction == 'a'){       // 向左射击line (Width / 2 + player_x + 5, High / 2 + player_y + 35, Width / 2 + player_x + 5 - gun_present.fire_length, High / 2 + player_y + 35);}if (player_direction == 'w'){       // 向上射击line (Width / 2 + player_x + 37, High / 2 + player_y + 35, Width / 2 + player_x + 37, High / 2 + player_y + 35 - gun_present.fire_length);}if (player_direction == 'd'){       // 向右射击line (Width / 2 + player_x + 37, High / 2 + player_y + 35, Width / 2 + player_x + 37 + gun_present.fire_length, High / 2 + player_y + 35);
}
}

类似地还有控制绘制猎枪(shotgun)和UZI冲锋枪(uzi)枪焰的函数(思路一致,参数略有不同)。三个函数整合到另一个函数(show fire)中,通过程序判断枪的类型来绘制相应枪焰并播放不同的设计音乐。

在双人对战模式的枪焰绘制中(绘制己方枪焰和绘制敌方枪焰)也使用了同样的方法。

为了模仿游戏的加载效果,加入了两个不同的加载动画。

单人模式下玩家连击统计,僵尸被击杀后随机掉落红盒子,红盒子用于恢复血量或补充子弹,玩家捡到红盒子后的功能实现。

四、体会与总结

1、前期协商

初步协商好整体制作流程和明确分工很重要,既可以发挥每个人的长处,又可以在开工后按照流程进行工作,节约制作时间。当然期间会有突发状况或是发现前期定下的计划不够完善,但是面对这些情况都可以当即做出应变。

2、游戏功能实现过程

首先是关于版本控制重要性的体会,码云提供了一个很好的管理和对比代码的平台。不过由于码云一次性上传文件数量的限制,在后来的制作过程中由本人负责的部分全部采取整合后打包发送给队友的方法,故后期码云的上传者只有一人。

然后是以简便性为出发点对代码进行改进的感触。首先是全局变量,它使后期修改变得更加方便快速。其次是封装函数的必要性。由于要不断进行代码修改和重构,将重复代码封装成函数便给这一步骤带来了很多便利之处。

接着是在游戏样式设计和素材绘制方面的一些体会。游戏整体根据《僵尸危机3》进行设计,但是考虑时间等其他条件限制,只制作了一个游戏场景,且对地图内的障碍物进行了一定简化。由于找不到可直接使用的素材,并且对原游戏进行截图效果也很不理想,所以主要素材来自亲自设计绘制 ,但由于本人自身的不成熟(不管是对游戏设计的熟练度上还是对绘画软件的高效使用上),在美工上用掉不少时间,有点耽误了总体完工速度,今后还需改进。

3、合作沟通

两人平时写代码和注释的习惯并不相同,所以再最初进行了注释格式上的统一。

分工合作的特性导致队员之间不能保证随时了解对方进度和完成模块,所以需要进行频繁沟通和联络交流,以保证某以时间段内各组员都在加工同一模块,便于检测代码和及时发现问题并做出快速调整。

2019级C语言大作业 - BrickMansions相关推荐

  1. 2019级C语言大作业 - 火柴人试炼之地

    火柴人试炼之地 C语言大作业 分享19级同学大一上学期用C语言实现的火柴人试炼之地.分步骤代码.图片音乐素材.可执行程序可以从百度网盘下载: 链接:https://pan.baidu.com/s/1X ...

  2. 2019级C语言大作业 - HP1的勇者

    分享19级同学大一上学期用C语言实现的HP1的勇者.分步骤代码.图片音乐素材.可执行程序可以从百度网盘下载: 链接:https://pan.baidu.com/s/1ox12uOVHsqO-dL8lS ...

  3. 2019级C语言大作业 - 冷冻双侠

    冷冻双侠 C语言作业 分享19级同学大一上学期用C语言实现的冷冻双侠,可从码云下载: https://gitee.com/xingguiweichen/frozen_couple 一. 游戏介绍 程序 ...

  4. 2019级C语言大作业 - 十步万度

    十步万度 C语言作业 分享19级同学大一上学期用C语言实现的十步万度,可从码云下载: 期末作业/十步万度 摘要 本组设计并编写的游戏<十步万度>,是我们仿照原有的<十步万度>游 ...

  5. 2019级C语言大作业 - 泡泡龙

    分享19级同学大一上学期用C语言实现的泡泡龙.分步骤代码.可执行程序可从百度网盘下载: 链接:https://pan.baidu.com/s/1r5S3oH54hM3OQeIQuwnjjQ 提取码:j ...

  6. 2019级C语言大作业 - 三国杀

    三国杀19年 C语言演示视频 分享19级同学大一上学期用C语言实现的三国杀游戏.分步骤代码.图片音乐素材.可执行程序可以从百度网盘下载: https://pan.baidu.com/s/1K3ANkU ...

  7. 2010C语言添加背景图片_2019级C语言大作业 - 火柴人试炼之地

    C语言大作业 - 火柴人试炼之地https://www.zhihu.com/video/1200491618794606592 分享19级同学大一上学期用C语言实现的火柴人试炼之地.分步骤代码.图片音 ...

  8. 2020级C语言大作业 - 王国保卫战

    王国保卫战 C语言大作业 分享20级同学大一上学期用C语言(及少量C++)实现的王国保卫战.由于同学们刚学了三个月的编程,实现还不够完善,工程代码.图片音乐素材可以从百度网盘下载: 链接:https: ...

  9. 2020级C语言大作业 - 丛林大作战

    丛林大作战_C语言大作业 分享20级同学大一上学期用C语言(及少量C++)实现的丛林大作战游戏.由于同学们刚学了三个月的编程,实现还不够完善,工程代码.图片音乐素材可以从百度网盘下载: 链接:http ...

最新文章

  1. 使Element默认字体为中文
  2. Linux LED驱动源码简析
  3. leetcode 792. Number of Matching Subsequences | 792. 匹配子序列的单词数(Java)
  4. nagios监控mysql
  5. 前端学习(936):缓动动画原理
  6. MySQL常见面试题与答案
  7. 面试题:在日常工作中怎么做MySQL优化的?
  8. ORA-01919: role 'OLAPI_TRACE_USER' does not exist
  9. 第四篇:决策树分类算法原理分析与代码实现
  10. SENT (Single Edge Nibble Transmission) 协议 接口
  11. MySQL卸载不干净问题
  12. 中断系统c语言程序,51单片机中断系统程序实例 (STC89C52RC)
  13. (三)展望Java技术的未来
  14. Linux安装idea步骤
  15. 重做系统之后,如何配置java完整环境
  16. r语言算巢式设计方差分析_应用统计学与R语言实现学习笔记(八)——方差分析...
  17. 以点带面,全面解决现有问题的网吧路由器解决方案(转)
  18. MOSFET:结温Tj(junction)与封装外壳表面温度Tc(case)
  19. outlook HTML签名制作方法
  20. Vscode 中:Expected linebreaks to be ‘LF‘ but found ‘CRLF‘ linebreak-style

热门文章

  1. NOI Online能力测试2视频版,让我们看看出题专家怎么说!(入门组)
  2. 可见光迁移——学习笔记
  3. npm下载缓慢解决方法
  4. MQTT 控制报文 - PUBLISH发布消息,PUBACK,PUBREC,PUBREL,PUBCOMP - 第6章
  5. 轻量化神经网络篇(SqueezeNet、Xception、MobileNet、ShuffleNet)
  6. 在Razor中如何引入命名空间?(import namespace in razor view)
  7. 可恶的Java数组下标越界检查
  8. 红黑树源码及错误解析
  9. HTML 中img标签不显示
  10. 【Spark-core学习之六】 Spark资源调度和任务调度