• C++ 定义一个地图类和地点类,开发一个小游戏。


    一、问题描述:
    • 地图中有若干地点,到达每个地点可以随机获取金钱和食物(补给点),补给后补给点消失,并随即出现在其他地方。
    • 玩家随机进入地图的某一个点,通过a,w,d,s分别控制向左、向上、向右、向下移动,玩家不可走出边界。
    • 玩家每次移动,系统告诉玩家距离最近的三个补给点的距离(采用曼哈顿距离),玩家每移动一步,消耗若干食物,没有食物时,game over。

    二、具体实现:
    1、系统需要告诉玩家距离最近的三个补给点,这个需要知道的是曼哈顿距离如何去计算。下面代码是地点类内的一个函数,参数列表里面分别是补给点的坐标以及当前玩家的坐标。abs()函数是math头文件的求绝对值函数。最后返回曼哈顿距离。
    1. int Manhattan(int supply_X,int supply_Y,int x,int y)//计算曼哈顿距离
    2. {
    3. int distant_x;
    4. int distant_y;
    5. distant_x=abs(supply_X-x);
    6. distant_y=abs(supply_Y-y);
    7. distant = distant_x + distant_y;
    8. return distant;
    9. }
    2、计算完十个补给点距离玩家位置的曼哈顿距离后,我们需要对这十个补给点的曼哈顿距离进行排序(从小到大)。然后再输出距离最近的三个补给点的距离。
    1. void sort()
    2. {
    3. for(int k=0; k<9; k++)//对十个补给点的曼哈顿距离进行排序 (从小到大)
    4. {
    5. for(int m=0; m<10-k-1; m++ )
    6. {
    7. if(arrayDistant[m] > arrayDistant[m+1])//如果前面大于后面,则交换
    8. {
    9. int temp;
    10. temp=arrayDistant[m+1];
    11. arrayDistant[m+1]=arrayDistant[m];
    12. arrayDistant[m]=temp;
    13. }
    14. }
    15. }
    16. cout << "距离最近的三个补给点的距离分别为 :";
    17. //提示玩家最近的三个补给点距离
    18. for(int k=0;k<3;k++)
    19. {
    20. cout << arrayDistant[k] << " ";
    21. }
    22. cout << endl;
    23. }
    3、 我们再创建一个Move()函数,供玩家进行移动。玩家移动的同时,金钱和食物都要发生变化,还要注意的是不可以越界!!!
    1. void Move()
    2. {
    3. while(Food>=0 && success==1 && c!='o')
    4. {
    5. for(int i=0;i<10;i++)
    6. {
    7. arrayDistant[i]=Manhattan(supply__x[i],supply__y[i],x,y);
    8. }
    9. sort();//随着玩家坐标的移动,距离各补给点的距离也随之改变 ,需重新排序
    10. system("pause");
    11. system("cls");
    12. cout << "w--上,s--下,a--左,d--右,o--退出游戏,请输入 :"<
    13. cin >> c;
    14. switch(c)
    15. {
    16. case 'w': x--;
    17. if(x>0&&x<31)
    18. {
    19. array[x][y]='#';
    20. Food_();
    21. flag=Judge();
    22. }
    23. else
    24. {
    25. success=0;
    26. cout << "越界,You fail !!!"<
    27. }
    28. break;
    29. case 's': x++;
    30. if(x>0&&x<31)
    31. {
    32. array[x][y]='#';
    33. Food_();
    34. flag=Judge();
    35. }
    36. else
    37. {
    38. success=0;
    39. cout << "越界,You fail !!!"<
    40. }
    41. break;
    42. case 'a': y--;
    43. if(y>0&&y<31)
    44. {
    45. array[x][y]='#';
    46. Food_();
    47. flag=Judge();
    48. }
    49. else
    50. {
    51. success=0;
    52. cout << "越界,You fail !!!"<
    53. }
    54. break;
    55. case 'd': y++;
    56. if(y>0&&y<31)
    57. {
    58. array[x][y]='#';
    59. Food_();
    60. flag=Judge();
    61. }
    62. else
    63. {
    64. success=0;
    65. cout << "越界,You fail !!!"<
    66. }
    67. break;
    68. case 'o':
    69. cout<<"游戏结束 ! "<
    70. break;
    71. }
    72. if(Money1>=TargetMoney && Food>=0)
    73. {
    74. cout<<"达到目标金额You Win !!!"<
    75. break;
    76. }
    77. if(Food<0)
    78. {
    79. cout<<"没有食物了,You fail !!!"<
    80. c='o';
    81. }
    82. if(c=='o')
    83. break;
    84. for(int i=1;i<=30;i++)
    85. {
    86. for(int j=1;j<=30;j++)
    87. {
    88. if(i==x&&j==y)//玩家所在处为 "#"
    89. {
    90. cout << "# ";//补给点
    91. }
    92. else
    93. {
    94. cout << "■";
    95. }
    96. }
    97. cout << endl;
    98. }
    99. Print();
    100. }
    101. }
    4、我们可以用Judge()函数来判断是否到达补给点。
    1. int Judge()//判断是否到达补给点
    2. {
    3. if(distant==0)
    4. {
    5. Money1 += rand()%50+300;
    6. Food += rand()%5;
    7. cout<<"到达一个补给点,请寻找另外一个补给点!" <
    8. return 1;
    9. }
    10. else
    11. {
    12. cout<<"未到达补给点,请继续努力!" <
    13. return 0;
    14. }
    15. }
    5、测试代码。
    1. int main()
    2. {
    3. //测试小游戏
    4. system("cls");
    5. system("color f4");
    6. cout << "游戏规则说明:" <
    7. << "1.该地图中有若干地点,到达每个地点可以随机获取金钱和食物(补给点)" <
    8. << "2.补给后补给点消失,并随即出现在其他地方。" <
    9. << "3.游戏开始时,玩家随机进入地图的某一个点 " <
    10. << "4.玩家请通过a,w,d,s分别控制向左、向上、向右、向下移动,玩家不可走出边界。" <
    11. << "5.玩家每次移动,系统会告诉玩家距离最近的三个补给点的距离" <
    12. << "6.游戏开始提供给玩家的金钱为随机的(500~1000),食物为10KG" <
    13. << "7.玩家每移动一步,消耗0.5KG食物,玩家消耗玩食物时,游戏结束!" <
    14. << "8.玩家若达到自己设定的目标金钱数额,且食物未消耗完,玩家胜利!" <
    15. <
    16. string s="了解规则后,请按下任意键,游戏开始 ";
    17. for (int i = 0; i < s.size(); i++)
    18. {
    19. cout << s[i];
    20. Sleep(50);
    21. }
    22. cout << endl;
    23. system("pause");
    24. cout << "Game Start !!!" <
    25. cout << "请您设定目标金钱数额" <
    26. int num;
    27. cout << "目标金钱数额为 :" <
    28. cin >> num;
    29. Place text3(10.0,num);
    30. text3.Move() ;
    31. return 0;
    32. }

    三、完整代码如下。

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. using namespace std;
    8. //小游戏
    9. class Place
    10. {
    11. public:
    12. Place(float food,int targetMoney):Food(food),TargetMoney(targetMoney),count(10),success(1)//初始化金钱和食物
    13. {
    14. srand(time(NULL));
    15. x=rand()%30+1;//随机生成的初始坐标 x,y
    16. y=rand()%30+1;
    17. for(int h=0;h<10;h++)
    18. {
    19. supply__y[count]=0;
    20. supply__x[count]=0;
    21. }
    22. while( count >= 0 )//生成补给点
    23. { int supply_X;
    24. int supply_Y;
    25. supply_X =rand()%30+1;
    26. supply_Y =rand()%30+1;
    27. if(supply_X == x && supply_Y == y)//判断补给点坐标是否和当前玩家的坐标重合 ,若重合则需重新生成
    28. {
    29. continue;
    30. }
    31. array[supply_X][supply_Y]=1;
    32. supply__y[count]=supply_Y;
    33. supply__x[count]=supply_X;
    34. count--;
    35. }
    36. Money1=rand()%1000+500;
    37. }
    38. void sort()
    39. {
    40. for(int k=0; k<9; k++)//对十个补给点的曼哈顿距离进行排序 (从小到大)
    41. {
    42. for(int m=0; m<10-k-1; m++ )
    43. {
    44. if(arrayDistant[m] > arrayDistant[m+1])//如果前面大于后面,则交换
    45. {
    46. int temp;
    47. temp=arrayDistant[m+1];
    48. arrayDistant[m+1]=arrayDistant[m];
    49. arrayDistant[m]=temp;
    50. }
    51. }
    52. }
    53. cout << "距离最近的三个补给点的距离分别为 :";
    54. //提示玩家最近的三个补给点距离
    55. for(int k=0;k<3;k++)
    56. {
    57. cout << arrayDistant[k] << " ";
    58. }
    59. cout << endl;
    60. }
    61. int Manhattan(int supply_X,int supply_Y,int x,int y)//计算曼哈顿距离
    62. {
    63. int distant_x;
    64. int distant_y;
    65. distant_x=abs(supply_X-x);
    66. distant_y=abs(supply_Y-y);
    67. distant = distant_x + distant_y;
    68. return distant;
    69. }
    70. void Move()
    71. {
    72. while(Food>=0 && success==1 && c!='o')
    73. {
    74. for(int i=0;i<10;i++)
    75. {
    76. arrayDistant[i]=Manhattan(supply__x[i],supply__y[i],x,y);
    77. }
    78. sort();//随着玩家坐标的移动,距离各补给点的距离也随之改变 ,需重新排序
    79. system("pause");
    80. system("cls");
    81. cout << "w--上,s--下,a--左,d--右,o--退出游戏,请输入 :"<
    82. cin >> c;
    83. switch(c)
    84. {
    85. case 'w': x--;
    86. if(x>0&&x<31)
    87. {
    88. array[x][y]='#';
    89. Food_();
    90. flag=Judge();
    91. }
    92. else
    93. {
    94. success=0;
    95. cout << "越界,You fail !!!"<
    96. }
    97. break;
    98. case 's': x++;
    99. if(x>0&&x<31)
    100. {
    101. array[x][y]='#';
    102. Food_();
    103. flag=Judge();
    104. }
    105. else
    106. {
    107. success=0;
    108. cout << "越界,You fail !!!"<
    109. }
    110. break;
    111. case 'a': y--;
    112. if(y>0&&y<31)
    113. {
    114. array[x][y]='#';
    115. Food_();
    116. flag=Judge();
    117. }
    118. else
    119. {
    120. success=0;
    121. cout << "越界,You fail !!!"<
    122. }
    123. break;
    124. case 'd': y++;
    125. if(y>0&&y<31)
    126. {
    127. array[x][y]='#';
    128. Food_();
    129. flag=Judge();
    130. }
    131. else
    132. {
    133. success=0;
    134. cout << "越界,You fail !!!"<
    135. }
    136. break;
    137. case 'o':
    138. cout<<"游戏结束 ! "<
    139. break;
    140. }
    141. if(Money1>=TargetMoney && Food>=0)
    142. {
    143. cout<<"达到目标金额You Win !!!"<
    144. break;
    145. }
    146. if(Food<0)
    147. {
    148. cout<<"没有食物了,You fail !!!"<
    149. c='o';
    150. }
    151. if(c=='o')
    152. break;
    153. for(int i=1;i<=30;i++)
    154. {
    155. for(int j=1;j<=30;j++)
    156. {
    157. if(i==x&&j==y)//玩家所在处为 "#"
    158. {
    159. cout << "# ";//补给点
    160. }
    161. else
    162. {
    163. cout << "■";
    164. }
    165. }
    166. cout << endl;
    167. }
    168. Print();
    169. }
    170. }
    171. void Food_()//每移动一步消耗的食物
    172. {
    173. Food-=0.5;
    174. }
    175. void Print()
    176. {
    177. cout << "当前的金钱为:" << Money1 << endl << "当前的食物为:" << Food <
    178. cout << "当前坐标 :" <"x = " << x << endl << "y = " << y << endl;
    179. }
    180. int Judge()//判断是否到达补给点
    181. {
    182. if(distant==0)
    183. {
    184. Money1 += rand()%50+300;
    185. Food += rand()%5;
    186. cout<<"到达一个补给点,请寻找另外一个补给点!" <
    187. return 1;
    188. }
    189. else
    190. {
    191. cout<<"未到达补给点,请继续努力!" <
    192. return 0;
    193. }
    194. }
    195. private:
    196. int arrayDistant[10];
    197. int TargetMoney;//目标金额
    198. int array[30][30];
    199. int distant;
    200. int supply__x[10];//存放供给点横坐标
    201. int supply__y[10];//存放供给点纵坐标
    202. int Money1;//金钱
    203. float Food;//食物
    204. int count;//十个补给点
    205. int flag;//判断是否到达补给点
    206. int success;//判断游戏成败
    207. char c;//玩家移动
    208. int x;//记录横坐标位置
    209. int y;//纵坐标
    210. };
    211. int main()
    212. {
    213. //测试小游戏
    214. system("cls");
    215. system("color f4");
    216. cout << "游戏规则说明:" <
    217. << "1.该地图中有若干地点,到达每个地点可以随机获取金钱和食物(补给点)" <
    218. << "2.补给后补给点消失,并随即出现在其他地方。" <
    219. << "3.游戏开始时,玩家随机进入地图的某一个点 " <
    220. << "4.玩家请通过a,w,d,s分别控制向左、向上、向右、向下移动,玩家不可走出边界。" <
    221. << "5.玩家每次移动,系统会告诉玩家距离最近的三个补给点的距离" <
    222. << "6.游戏开始提供给玩家的金钱为随机的(500~1000),食物为10KG" <
    223. << "7.玩家每移动一步,消耗0.5KG食物,玩家消耗玩食物时,游戏结束!" <
    224. << "8.玩家若达到自己设定的目标金钱数额,且食物未消耗完,玩家胜利!" <
    225. <
    226. string s="了解规则后,请按下任意键,游戏开始 ";
    227. for (int i = 0; i < s.size(); i++)
    228. {
    229. cout << s[i];
    230. Sleep(50);
    231. }
    232. cout << endl;
    233. system("pause");
    234. cout << "Game Start !!!" <
    235. cout << "请您设定目标金钱数额" <
    236. int num;
    237. cout << "目标金钱数额为 :" <
    238. cin >> num;
    239. Place text3(10.0,num);
    240. text3.Move() ;
    241. return 0;
    242. }

  • 相关阅读:
    前缀和算法
    Android源码笔记--恢复出厂设置
    Python GUI开发库之nicegui使用详解
    docker(5)-数据卷
    自学Vue开发Dapp去中心化钱包(二)
    PostwomanApi接口测试工具
    vue学习笔记21-组件传递数据_Props
    大语言模型LangChain+ChatGLM3-6B的本地知识库与行业知识库价值体现
    代码随想录刷题| 多重背包理论基础、背包问题的总结
    OAuth2的定义和运行流程
  • 原文地址:https://blog.csdn.net/weixin_74287172/article/details/134091297