• 七夕特制:《牛郎会织女》


      

    相传,天帝的女儿织女下凡间游玩,

    爱上了聪明忠厚的凡人牛郎,

    织女偷偷下凡与牛郎成婚,过起了男耕女织的幸福生活,

    天上一日,人间数年,他们很快便生下了一儿一女,

    但好景不长,这件事很快就让天帝和王母娘娘知道了,王母娘娘亲自下凡,强行带走了织女,

    老牛帮助牛郎很快就要追上了织女,

    王母眼看情势不妙,就用头上的银钗在两人之间一挥,一条波涛汹涌的大河出现也就就是所谓的银河,挡在了牛郎前面,

    牛郎过不去于是在河这边哀伤。织女也在河那边哭泣,

    王母感于两人的感情,开恩让他们每年见一面,

    到了见面之日,喜鹊自动搭桥,两人在桥上拥抱,诉说一年的相思和想念。

    以上就是中国传统神话《牛郎织女》的故事,正所谓有情人终成眷属,但是一年才能见一次,这俩人也太惨了点,于是乎,为了能让牛郎织女顺利相见,顺便展示一下我的才华,直接撸起袖子,打开了我尘封已久的visual studio。

    借助《牛郎织女》的传统神话故事为背景,我有一个初步的想法,做个牛郎拯救织女的小游戏,用unity?但是缺少素材,一天又画不完,所以果断放弃了,那就重操旧业,用C++和那个简单好操作的EasyX图形库。

    先设计一个玩法:

    首先弄一张游戏地图,其实就是一个n*n的网格。

    然后随机找个格子,放入织女。

     玩家通过点击网格一步一步找到织女,来个鹊桥相会!

     但是这样就感觉过于简单了,在来点其他元素。

    随机放几个炸弹,组织牛郎见织女,就说这是王母娘娘的陷阱!(王母娘娘:这锅我不背a!)

    但是光有炸弹也不行,得把它和织女全部隐藏,然后稍微给牛郎一点点提示,比如目前的位置周围有几个炸弹,距离织女的半径是多少……

    (怎么有点扫雷那味了……)

    大致设计好了,接下来就撸代码了!

    +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

     首先得有个游戏地图就用二维数组来表示:

    1. //定义地图数组并初始化为0
    2. int map[MAX][MAX] = { 0 };

    然后还要有织女和炸弹等元素:

    1. int w_num = 1;//设置织女星数量
    2. int trap = 10;//设置陷阱数量

    随机设置织女的位置和炸弹位置:

    1. //游戏初始化设置,定义织女星和陷阱的位置
    2. void InitSetting()
    3. {
    4. //loadimage(&Bridge, L"bridge.jpg", SIZE, SIZE);
    5. //随机生成织女星位置
    6. if (w_num > 0)
    7. {
    8. srand((unsigned)time(NULL));
    9. int pos_i = rand() % (MAX - 1);//0~MAX-1
    10. int pos_j = rand() % (MAX - 1);//0~MAX-1
    11. if (pos_i * SIZE < border && pos_i * SIZE < border)
    12. {
    13. if (map[pos_i][pos_j] == 0)//确保不出地图有效边界
    14. {
    15. map[pos_i][pos_j] = 1;//设置织女星位置
    16. w_num--;
    17. }
    18. }
    19. }
    20. //获取陷阱个数
    21. trap = rand() % 17 + 15;//产生15到32个炸弹
    22. //随机生成陷阱
    23. while (trap > 0)
    24. {
    25. srand((unsigned)time(NULL));
    26. int pos_i = rand() % (MAX - 1);//0~MAX-1
    27. int pos_j = rand() % (MAX - 1);//0~MAX-1
    28. if (pos_i * SIZE < border && pos_j * SIZE < border)
    29. {
    30. if (map[pos_i][pos_j] == 0)//确保陷阱位置自身不重合且与织女星位置不重合
    31. {
    32. map[pos_i][pos_j] = 2;//设置陷阱位置
    33. trap--;
    34. }
    35. }
    36. }
    37. }

    然后新建一个绘制函数,用来显示游戏画面:

    1. void Show()
    2. {
    3. //遍历网格
    4. for (int i = 0; i < MAX; i++)
    5. {
    6. for (int j = 0; j < MAX; j++)
    7. {
    8. if (map[i][j] != 3)//绘制空格(map[i][j]==0)
    9. {
    10. setlinecolor(BLACK);
    11. rectangle(i * SIZE, j * SIZE, (i + 1) * SIZE, (j + 1) * SIZE);
    12. setfillcolor(WHITE);
    13. fillrectangle(i * SIZE, j * SIZE, (i + 1) * SIZE, (j + 1) * SIZE);
    14. }
    15. if (map[i][j] == 1)//绘制织女星
    16. {
    17. setlinecolor(BLUE);
    18. circle(j * SIZE + SIZE / 2, i * SIZE + SIZE / 2, SIZE / 2);
    19. }
    20. if (map[i][j] == 2)//绘制陷阱
    21. {
    22. setlinecolor(WHITE);
    23. circle(j * SIZE + SIZE / 2, i * SIZE + SIZE / 2, SIZE / 2);
    24. }
    25. if (map[i][j] == 3)//绘制玩家位置
    26. {
    27. setlinecolor(WHITE);
    28. circle(j * SIZE + SIZE / 2, i * SIZE + SIZE / 2, SIZE / 2);
    29. putimage(i * SIZE, j * SIZE, &Bridge);
    30. }
    31. }
    32. }
    33. }

    在让用户从键盘输入当前位置:

    1. void WithInput()//用户输入函数
    2. {
    3. int pos_x, pos_y;//定义用户选择输入的位置
    4. //scanf_s("%d,%d", &pos_x, &pos_y);//获取用户键盘输入
    5. cin >> pos_x >> pos_y;
    6. if (map[pos_x-1][pos_y-1] == 2) {
    7. //踩中陷阱游戏结束
    8. gameOver = 0;
    9. }
    10. else if (map[pos_x-1][pos_y-1] == 1) {
    11. //找到织女星游戏胜利
    12. gameOver = 2;
    13. }
    14. else if (map[pos_x-1][pos_y-1] == 0
    15. && pos_x >= 1 && pos_x <= 10
    16. && pos_y >= 1 && pos_y <= 10)
    17. {
    18. map[pos_x-1][pos_y-1] = 3;
    19. for (int i = 0; i < MAX; i++)
    20. for (int j = 0; j < MAX; j++)
    21. temp[i][j] = 0;
    22. temp[pos_x - 1][pos_y - 1] = 3;
    23. }
    24. }

    计算一下周围的炸弹个数:

    1. if (map[i][j] == 3)//绘制玩家位置
    2. {
    3. int t_num = 0;
    4. //判断周围九宫格中的陷阱数量
    5. if (map[i - 1][j - 1] == 2)t_num++;//左上
    6. if (map[i][j - 1] == 2)t_num++;//上
    7. if (map[i + 1][j - 1] == 2)t_num++;//右上
    8. if (map[i - 1][j] == 2)t_num++;//左
    9. if (map[i + 1][j] == 2)t_num++;//右
    10. if (map[i - 1][j + 1] == 2)t_num++;//左下
    11. if (map[i][j + 1] == 2)t_num++;//下
    12. if (map[i + 1][j + 1] == 2)t_num++;//右下
    13. //显示陷阱个数
    14. printText(t_num, j*SIZE, i*SIZE);
    15. //cout << t_num << endl;
    16. }

    在计算一下距离织女的位置:

    这里显示的是方圆位置,也就是半径,因为直接告诉横纵坐标太简单了!!!

    所以用勾股定理简单算一下半径:

    1. //结算终点距离
    2. void getLength()
    3. {
    4. int x1, y1, x2, y2;
    5. for (int i = 0; i < MAX; i++)
    6. {
    7. for (int j = 0; j < MAX; j++)
    8. {
    9. if (temp[i][j] == 3)//当前位置
    10. {
    11. x2 = i;
    12. y2 = j;
    13. }
    14. if (map[i][j] == 1)//终点位置
    15. {
    16. x1 = i;
    17. y1 = j;
    18. }
    19. }
    20. }
    21. int x = x1 - x2;
    22. int y = y1 - y2;
    23. if (x < 0)x = -x;
    24. if (y < 0)y = -y;
    25. int length = (int)sqrt(x * x + y * y);
    26. printText(length, 550, 550);
    27. }

    然后在稍加润色,小游戏就完成了!

    1. #include
    2. #include
    3. #include
    4. #include
    5. #define SIZE 50
    6. #define MAX 10
    7. using namespace std;
    8. //定义全局变量
    9. const int border = MAX * SIZE;
    10. const int weidth = 640;
    11. const int heigth = 640;
    12. int map[MAX][MAX] = { 0 };
    13. int temp[MAX][MAX] = { 0 };
    14. int w_num = 1;//织女星
    15. int trap = 10;//陷阱数量
    16. int gameOver = 1;
    17. //函数声明
    18. void InitSetting();//游戏初始化函数
    19. void printMap();//打印地图函数
    20. void printText(int t_count, int x, int y);//打印文字函数
    21. void Show();//绘制游戏画面
    22. void WithInput();//获取用户输入
    23. void getLength();//计算终点距离
    24. int main()
    25. {
    26. initgraph(weidth, heigth);
    27. InitSetting();
    28. while (1)
    29. {
    30. Show();
    31. WithInput();
    32. if (gameOver == 0)
    33. {
    34. MessageBox(NULL, TEXT("游戏失败!牛郎掉入了王母娘娘的陷阱!"), TEXT("《鹊桥会》"), MB_OK);
    35. printf("游戏失败!牛郎掉入了王母娘娘的陷阱!\n");
    36. printf("游戏地图:1是织女星2是陷阱\n");
    37. printMap();
    38. break;
    39. }
    40. else if (gameOver == 2)
    41. {
    42. MessageBox(NULL, TEXT("游戏胜利!你已成功帮助牛郎和织女相会!"), TEXT("《鹊桥会》"), MB_OK);
    43. printf("游戏胜利!你已成功帮助牛郎和织女相会!\n");
    44. printf("游戏地图:1是织女星2是陷阱\n");
    45. printMap();
    46. break;
    47. }
    48. getLength();
    49. }
    50. return 0;
    51. }
    52. void InitSetting() {
    53. if (w_num > 0)
    54. {
    55. srand((unsigned)time(NULL));
    56. int pos_i = rand() % (MAX - 1);//0~MAX-1
    57. int pos_j = rand() % (MAX - 1);//0~MAX-1
    58. if (pos_i * SIZE < border && pos_i * SIZE < border)
    59. {
    60. if (map[pos_i][pos_j] == 0)//确保不出地图有效边界
    61. {
    62. map[pos_i][pos_j] = 1;//设置织女星位置
    63. w_num--;
    64. }
    65. }
    66. }
    67. //获取陷阱个数
    68. trap = rand() % 17 + 15;//产生15到32个炸弹
    69. //随机生成陷阱
    70. while (trap > 0)
    71. {
    72. srand((unsigned)time(NULL));
    73. int pos_i = rand() % (MAX - 1);//0~MAX-1
    74. int pos_j = rand() % (MAX - 1);//0~MAX-1
    75. if (pos_i * SIZE < border && pos_j * SIZE < border)
    76. {
    77. if (map[pos_i][pos_j] == 0)//确保陷阱位置自身不重合且与织女星位置不重合
    78. {
    79. map[pos_i][pos_j] = 2;//设置陷阱位置
    80. trap--;
    81. }
    82. }
    83. }
    84. }
    85. void printMap() {
    86. for (int i = 0; i < MAX; i++) {
    87. for (int j = 0; j < MAX; j++) {
    88. cout << map[i][j] << ' ';
    89. }
    90. cout << endl;
    91. }
    92. }
    93. void printText(int t_count, int x, int y) {
    94. TCHAR text[20];
    95. _stprintf_s(text, _T("%d"), t_count);
    96. settextcolor(RED);
    97. settextstyle(SIZE, SIZE, _T("宋体"));
    98. outtextxy(x, y, text);
    99. }
    100. void Show() {
    101. //遍历网格
    102. for (int i = 0; i < MAX; i++)
    103. {
    104. for (int j = 0; j < MAX; j++)
    105. {
    106. if (map[i][j] != 3)//绘制空格(map[i][j]==0)
    107. {
    108. setlinecolor(BLACK);
    109. rectangle(i * SIZE, j * SIZE, (i + 1) * SIZE, (j + 1) * SIZE);
    110. setfillcolor(WHITE);
    111. fillrectangle(i * SIZE, j * SIZE, (i + 1) * SIZE, (j + 1) * SIZE);
    112. }
    113. if (map[i][j] == 1)//绘制织女星
    114. {
    115. setlinecolor(BLUE);
    116. //circle(j * SIZE + SIZE / 2, i * SIZE + SIZE / 2, SIZE / 2);
    117. }
    118. if (map[i][j] == 2)//绘制陷阱
    119. {
    120. setlinecolor(WHITE);
    121. //circle(j * SIZE + SIZE / 2, i * SIZE + SIZE / 2, SIZE / 2);
    122. }
    123. if (map[i][j] == 3)//绘制玩家位置
    124. {
    125. int t_num = 0;
    126. //setlinecolor(RED);
    127. //circle(j * SIZE + SIZE / 2, i * SIZE + SIZE / 2, SIZE / 2);
    128. if (map[i - 1][j - 1] == 2)t_num++;//左上
    129. if (map[i][j - 1] == 2)t_num++;//上
    130. if (map[i + 1][j - 1] == 2)t_num++;//右上
    131. if (map[i - 1][j] == 2)t_num++;//左
    132. if (map[i + 1][j] == 2)t_num++;//右
    133. if (map[i - 1][j + 1] == 2)t_num++;//左下
    134. if (map[i][j + 1] == 2)t_num++;//下
    135. if (map[i + 1][j + 1] == 2)t_num++;//右下
    136. //显示陷阱个数
    137. printText(t_num, j * SIZE, i * SIZE);
    138. //cout << t_num << endl;
    139. }
    140. }
    141. }
    142. }
    143. void WithInput() {
    144. int pos_x, pos_y;//定义用户选择输入的位置
    145. //scanf_s("%d,%d", &pos_x, &pos_y);//获取用户键盘输入
    146. cin >> pos_x >> pos_y;
    147. if (map[pos_x - 1][pos_y - 1] == 2) {
    148. //踩中陷阱游戏结束
    149. gameOver = 0;
    150. }
    151. else if (map[pos_x - 1][pos_y - 1] == 1) {
    152. //找到织女星游戏胜利
    153. gameOver = 2;
    154. }
    155. else if (map[pos_x - 1][pos_y - 1] == 0
    156. && pos_x >= 1 && pos_x <= 10
    157. && pos_y >= 1 && pos_y <= 10)
    158. {
    159. map[pos_x - 1][pos_y - 1] = 3;
    160. for (int i = 0; i < MAX; i++)
    161. for (int j = 0; j < MAX; j++)
    162. temp[i][j] = 0;
    163. temp[pos_x - 1][pos_y - 1] = 3;
    164. }
    165. }
    166. void getLength() {
    167. int x1, y1, x2, y2;
    168. for (int i = 0; i < MAX; i++)
    169. {
    170. for (int j = 0; j < MAX; j++)
    171. {
    172. if (temp[i][j] == 3)//当前位置
    173. {
    174. x2 = i;
    175. y2 = j;
    176. }
    177. if (map[i][j] == 1)//终点位置
    178. {
    179. x1 = i;
    180. y1 = j;
    181. }
    182. }
    183. }
    184. int x = x1 - x2;
    185. int y = y1 - y2;
    186. if (x < 0)x = -x;
    187. if (y < 0)y = -y;
    188. int length = (int)sqrt(x * x + y * y);
    189. printText(length, 550, 550);
    190. }

    结果演示:

    因为初始化炸弹数量有点多所以要耐心等一等:

    一开始是已经隐藏好的网格:

    键盘输入坐标会显示周围炸弹数和距离织女的半径

     运气比较好,第二步就踩雷了

    再来一把,胜利来的很突然:

  • 相关阅读:
    快速排序 ← PPT
    CIE A-Level化学Paper 1真题讲解(5)
    HTML5期末考核大作业,网站——旅游景点。 学生旅行 游玩 主题住宿网页
    算法的复杂度
    springcloud的负载均衡两种实现方式
    html进阶语法
    百度飞桨EasyDL X 韦士肯:看轴承质检如何装上“AI之眼”
    计算机毕业设计springboot+vue基本微信小程序的驾校宝典系统-驾照考试系统
    鸿蒙HarmonyOS实战-ArkUI事件(组合手势)
    R语言详解二
  • 原文地址:https://blog.csdn.net/qq_51701007/article/details/126163186