[关闭]
@Lilacy 2015-09-24T12:12:12.000000Z 字数 1555 阅读 1108

荒野求生


作者 : 许凌逸 尹聪

第一部分:规则讲解

游戏背景:
炮聪和他女朋友在野外露营,天快黑了,他们迷失在一片森林里,由于一到晚上森林中比较危险,所以他着急着在天黑前走出这片迷宫,因为天火来袭,加上连日大雨,地面凹凸不平,而天很黑了,炮聪拥有的照明工具只有手电,你能帮助他和女朋友迅速走出森林到达旅馆吗?
游戏规则:
用方向键(W/S/A/D)移动,鼠标控制手电照射方向,1分钟后手电会没电。在规定时间(2分钟内)内走出迷宫即为胜利。胜利有小奖品哦。

第二部分:游戏演示

第三部分:逻辑讲解

Created with Raphaël 2.1.2荒野求生游戏开始初始化绘图窗口欢迎界面 Welcome()准备开始游戏 ReadyGo()循环检测用户输入按键绘制场景 Paint()是否走出场景是否重开一局游戏结束yesnoyesno

第四部分:核心代码

  1. #include <easyX.h>//最核心一个库
  2. //小许强力推荐,[http://www.easyx.cn/help/?GetImageBuffer][1]
  3. // 初始化
  4. void Welcome(); // 绘制游戏界面
  5. void ReadyGo(); // 准备开始游戏
  6. void InitGame();// 初始化游戏数据
  7. // 设置游戏者位置
  8. g_ptPlayer.x = g_utPlayer.x * UNIT + UNIT / 2 + g_ptOffset.x;
  9. g_ptPlayer.y = g_utPlayer.y * UNIT + UNIT / 2 + g_ptOffset.y;
  10. // 地图生成
  11. void MakeMaze(int width, int height);// 初始化
  12. void TravelMaze(int x, int y, BYTE** aryMap);// 遍历 (x, y) 四周
  13. void DrawWall(int x, int y, bool left, bool top, bool right, bool bottom);// 画一个障碍物
  14. // 处理用户控制
  15. int GetCmd();// 获取用户输入的命令
  16. void OnUp();// 向上移动
  17. void OnLeft();// 向左移动
  18. void OnRight(); // 向右移动
  19. void OnDown();// 向下移动
  20. bool CheckWin();// 检查是否到出口
  21. //最有用的一个函数
  22. Paint()
  23. // 计算视野角度
  24. double dx, dy, a;
  25. dx = g_ptMouse.x - g_ptPlayer.x;
  26. dy = g_ptMouse.y - g_ptPlayer.y;
  27. if (dx == 0 && dy == 0)
  28. a = 0;
  29. else if (dx != 0 && dy != 0)
  30. a = atan(dy / dx);
  31. else if (dx == 0)
  32. a = (dy > 0) ? PI / 2 : PI * 3 / 2;
  33. else
  34. a = 0;
  35. if (dx < 0) a += PI;
  36. if (a < 0) a += PI * 2;
  37. // 绘制灯光
  38. Lighting(g_ptPlayer.x, g_ptPlayer.y, a);
  39. int i; // 定义循环变量
  40. int x, y; // 定义临时坐标
  41. double a; // 定义临时角度
  42. // 计算灯光照亮的角度区域
  43. double a1 = _a - LIGHT_A / 2;
  44. double a2 = _a + LIGHT_A / 2;
  45. for(a = a1; a < a2; a += PI / 360)// 扇形循环
  46. {
  47. for(int r = 0; r < LIGHT_R; r++)// 半径循环
  48. {
  49. // 计算照射到的位置
  50. x = (int)(_x + cos(a) * r);
  51. y = (int)(_y + sin(a) * r);
  52. // 光线超出屏幕范围,终止
  53. if (x < 0 || x >= WIDTH || y <= 0 || y >= HEIGHT - 1)
  54. break;
  55. // 光线碰到建筑物,终止
  56. if(g_bufMap[y * WIDTH + x])
  57. break;
  58. // 光线叠加
  59. g_bufRender[y * WIDTH + x] += 0x202000; // 0x202000 淡黄色
  60. }
  61. }

第五部分:互动环节

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注