当前位置:   article > 正文

C#核心--实践小项目(贪吃蛇)_c#贪吃蛇

c#贪吃蛇

C#核心实践小项目 -- 贪吃蛇

必备知识点--多脚本文件

(可观看CSharp核心--52集进行了解)

必备知识点--UML类图

必备知识点--七大原则

贪吃蛇

项目展示

控制方向的是:WSAD

确定键是:J

需求分析(UML类图)

自个先写--贪吃蛇

结合自己所学进行开发(UML类图是老师提供的,因为自己暂时还不太会绘制,主要是代码逻辑还不够清晰)

补充知识点:

检测键盘是否激活

Console.KeyAvailable == true;

按照UML类图逐个去写逐个去实现(但是有些模块我没有用上)

主要精力是放在了功能实现上

下面是我实现的过程

一、万事开头难--游戏类

(我先确定了开始着手的地方--游戏类,因为它是所有类和方法的汇聚地)

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. //游戏类
  7. namespace 自个先写CSharp核心小项目_贪吃蛇_
  8. {
  9. enum E_Scene
  10. {
  11. BeginID,
  12. GamingID,
  13. FinishID,
  14. }
  15. class Game
  16. {
  17. public static int x;
  18. public static int y;
  19. public static E_Scene scene = new E_Scene();
  20. Begin begin = new Begin();
  21. Finish finish = new Finish();
  22. public Game()
  23. {
  24. x = 100;
  25. y = 30;
  26. scene = E_Scene.BeginID;
  27. }
  28. //初始化控制台
  29. public void Consoles()
  30. {
  31. //隐藏光标
  32. Console.CursorVisible = false;
  33. //设置舞台大小
  34. Console.SetWindowSize(x, y);
  35. Console.SetBufferSize(x, y);
  36. }
  37. //游戏主循环
  38. public void MajorCycle()
  39. {
  40. while (true)
  41. {
  42. //思考一下,为什么把开始场景和结束场景的类申明放在外面,而游戏场景的类申明放循环里面
  43. //因为开始结束场景是一成不变的,只需申明一次就够用了
  44. //而游戏场景进入一次就会执行出结果出来,每次结果都将不一样,所以每次都得重新申明
  45. switch (scene)
  46. {
  47. case E_Scene.BeginID:
  48. Console.Clear();
  49. begin.newers();
  50. break;
  51. case E_Scene.GamingID:
  52. Console.Clear();
  53. GameScene gameScene = new GameScene();
  54. gameScene.newers();
  55. break;
  56. case E_Scene.FinishID:
  57. Console.Clear();
  58. finish.newers();
  59. break;
  60. default:
  61. break;
  62. }
  63. }
  64. }
  65. //场景切换
  66. public void SceneMove()
  67. {
  68. }
  69. }
  70. }
二、游戏帧更新接口
1.更新接口

2.开始和结束场景基类

开始场景类
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. //开始场景
  7. namespace 自个先写CSharp核心小项目_贪吃蛇_
  8. {
  9. class Begin : BeginAndFinish
  10. {
  11. public Begin()
  12. {
  13. str = "贪吃蛇";
  14. str1 = "开始游戏";
  15. str2 = "结束游戏";
  16. }
  17. //重写更新方法
  18. public override void newers()
  19. {
  20. Console.SetCursorPosition(48, 10);
  21. Console.ForegroundColor = ConsoleColor.White;
  22. Console.WriteLine(str);
  23. Console.SetCursorPosition(47, 13);
  24. Console.ForegroundColor = key == 1 ? ConsoleColor.Red : ConsoleColor.White;
  25. Console.WriteLine(str1);
  26. Console.SetCursorPosition(47, 15);
  27. Console.ForegroundColor = key == 2 ? ConsoleColor.Red : ConsoleColor.White;
  28. Console.WriteLine(str2);
  29. char c = Console.ReadKey(true).KeyChar;
  30. switch (c)
  31. {
  32. case 'W':
  33. case 'w':
  34. key = 1;
  35. break;
  36. case 'S':
  37. case 's':
  38. key = 2;
  39. break;
  40. case 'J':
  41. case 'j':
  42. if (key == 2)
  43. {
  44. //关闭控制台
  45. Environment.Exit(0);
  46. }
  47. Game.scene = (E_Scene)key;
  48. break;
  49. default:
  50. break;
  51. }
  52. }
  53. }
  54. }
结束场景类
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. //结束场景
  7. namespace 自个先写CSharp核心小项目_贪吃蛇_
  8. {
  9. class Finish : BeginAndFinish
  10. {
  11. string str0;
  12. public static int num;
  13. public Finish()
  14. {
  15. key = 0;
  16. str = "游戏结束";
  17. str0 = "本次游戏的长度为:";
  18. str1 = "回到开始界面";
  19. str2 = "结束游戏";
  20. }
  21. //重写更新方法
  22. public override void newers()
  23. {
  24. Console.SetCursorPosition(47, 10);
  25. Console.ForegroundColor = ConsoleColor.White;
  26. Console.WriteLine(str);
  27. Console.SetCursorPosition(42, 12);
  28. Console.ForegroundColor = ConsoleColor.White;
  29. Console.WriteLine(str0 + num);
  30. Console.SetCursorPosition(45, 15);
  31. Console.ForegroundColor = key == 0 ? ConsoleColor.Red : ConsoleColor.White;
  32. Console.WriteLine(str1);
  33. Console.SetCursorPosition(47, 17);
  34. Console.ForegroundColor = key == 2 ? ConsoleColor.Red : ConsoleColor.White;
  35. Console.WriteLine(str2);
  36. char c = Console.ReadKey(true).KeyChar;
  37. switch (c)
  38. {
  39. case 'W':
  40. case 'w':
  41. key = 0;
  42. break;
  43. case 'S':
  44. case 's':
  45. key = 2;
  46. break;
  47. case 'J':
  48. case 'j':
  49. if (key == 2)
  50. {
  51. //关闭控制台
  52. Environment.Exit(0);
  53. }
  54. Game.scene = (E_Scene)key;
  55. break;
  56. default:
  57. break;
  58. }
  59. }
  60. }
  61. }

(这里面其实可以把这些方法提取到开始和结束场景基类里面的,但我懒,没有去整!!!)

3.游戏场景类

(第二个大类,游戏里的墙壁、食物、蛇、各种方法等等都汇聚在这个类中)

三、游戏场景中的各类
1.绘制接口

2.游戏对象类

(讲真的这个类没怎么用上,具体怎么用我还得看看老师是怎么用的)

3.位置结构体

(这个是完全没有用上!!)

4.地图墙壁类

5.食物类

6.蛇类--(最复杂的类)

蛇身体类--没用上

蛇类
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. //蛇类
  7. namespace 自个先写CSharp核心小项目_贪吃蛇_
  8. {
  9. //移动方向枚举
  10. enum E_Move
  11. {
  12. Up,
  13. Down,
  14. Left,
  15. Right,
  16. }
  17. class Snake
  18. {
  19. string snakeHead = "●";
  20. string snakeBody = "◎";
  21. int x = 10;
  22. int y = 5;
  23. E_Move move = E_Move.Down;
  24. char c;
  25. Foods foods = new Foods();
  26. int bodyNum = 0;
  27. //标识符
  28. int[] num1 = new int[10000];
  29. int[] num2 = new int[10000];
  30. //打印出长度
  31. public string longs = "当前长度为:";
  32. //蛇绘制
  33. public void SnakePlan()
  34. {
  35. //打印长度
  36. Console.SetCursorPosition(2, 1);
  37. Console.ForegroundColor = ConsoleColor.Red;
  38. Console.WriteLine(longs + bodyNum);
  39. Finish.num = bodyNum;
  40. //蛇头的绘制
  41. Console.SetCursorPosition(x, y);
  42. Console.ForegroundColor = ConsoleColor.Yellow;
  43. Console.WriteLine(snakeHead);
  44. //蛇身的绘制
  45. for (int i = 0; i < bodyNum; i++)
  46. {
  47. Console.SetCursorPosition(num1[i], num2[i]);
  48. Console.ForegroundColor = ConsoleColor.Green;
  49. Console.WriteLine(snakeBody);
  50. }
  51. }
  52. //蛇清除
  53. public void SnakeClear()
  54. {
  55. //打印长度清除
  56. Console.SetCursorPosition(2, 1);
  57. Console.WriteLine(" ");
  58. //蛇头的清除
  59. Console.SetCursorPosition(x, y);
  60. Console.WriteLine(" ");
  61. //蛇身的清除
  62. for (int i = 0; i < bodyNum; i++)
  63. {
  64. Console.SetCursorPosition(num1[i], num2[i]);
  65. Console.WriteLine(" ");
  66. }
  67. }
  68. //蛇转向
  69. public void SnakeTurn()
  70. {
  71. //老师漏讲的知识点,Console.KeyAvailable -- 检测键盘是否被激活
  72. if (Console.KeyAvailable == true)
  73. {
  74. c = Console.ReadKey(true).KeyChar;
  75. switch (c)
  76. {
  77. case 'W':
  78. case 'w':
  79. if (move == E_Move.Down && bodyNum != 0)
  80. {
  81. move = E_Move.Down;
  82. }
  83. else
  84. {
  85. move = E_Move.Up;
  86. }
  87. break;
  88. case 'S':
  89. case 's':
  90. if (move == E_Move.Up && bodyNum != 0)
  91. {
  92. move = E_Move.Up;
  93. }
  94. else
  95. {
  96. move = E_Move.Down;
  97. }
  98. break;
  99. case 'A':
  100. case 'a':
  101. if (move == E_Move.Right && bodyNum != 0)
  102. {
  103. move = E_Move.Right;
  104. }
  105. else
  106. {
  107. move = E_Move.Left;
  108. }
  109. break;
  110. case 'D':
  111. case 'd':
  112. if (move == E_Move.Left && bodyNum != 0)
  113. {
  114. move = E_Move.Left;
  115. }
  116. else
  117. {
  118. move = E_Move.Right;
  119. }
  120. break;
  121. default:
  122. break;
  123. }
  124. }
  125. }
  126. //吃食物
  127. //死亡
  128. //蛇移动 -- (包含了蛇绘制、蛇转向、吃食物)
  129. public void SnakeMove()
  130. {
  131. if(foods.x == 0 || foods.y == 0)
  132. {
  133. foods.Plan();
  134. }
  135. SnakeTurn();
  136. switch (move)
  137. {
  138. case E_Move.Up:
  139. SnakeClear();
  140. y -= 1;
  141. //判断是否死亡
  142. //撞墙死亡
  143. if (y == 0)
  144. {
  145. Game.scene = E_Scene.FinishID;
  146. GameScene.bo = false;
  147. break;
  148. }
  149. //撞身体死亡
  150. for (int i = 0; i < bodyNum; i++)
  151. {
  152. if(num1[i] == x && num2[i] == y)
  153. {
  154. Game.scene = E_Scene.FinishID;
  155. GameScene.bo = false;
  156. break;
  157. }
  158. }
  159. if (foods.x == x && foods.y == y)
  160. {
  161. foods.Plan();
  162. //给个判断,让生成的food不会出现在有蛇身体的位置上
  163. for (int i = 0; i < bodyNum; i++)
  164. {
  165. if (foods.x == num1[i] && foods.y == num2[i])
  166. {
  167. Console.SetCursorPosition(foods.x, foods.y);
  168. Console.WriteLine(" ");
  169. foods.Plan();
  170. i = 0;
  171. }
  172. }
  173. bodyNum += 1;
  174. for (int i = bodyNum - 1; i > 0; i--)
  175. {
  176. num1[i] = num1[i - 1];
  177. num2[i] = num2[i - 1];
  178. }
  179. num1[0] = x;
  180. num2[0] = y + 1;
  181. }
  182. else
  183. {
  184. for (int i = bodyNum - 1; i > 0; i--)
  185. {
  186. num1[i] = num1[i - 1];
  187. num2[i] = num2[i - 1];
  188. }
  189. num1[0] = x;
  190. num2[0] = y + 1;
  191. }
  192. SnakePlan();
  193. break;
  194. case E_Move.Down:
  195. SnakeClear();
  196. y += 1;
  197. //判断是否死亡
  198. //撞墙死亡
  199. if (y == 29)
  200. {
  201. Game.scene = E_Scene.FinishID;
  202. GameScene.bo = false;
  203. break;
  204. }
  205. //撞身体死亡
  206. for (int i = 0; i < bodyNum; i++)
  207. {
  208. if (num1[i] == x && num2[i] == y)
  209. {
  210. Game.scene = E_Scene.FinishID;
  211. GameScene.bo = false;
  212. break;
  213. }
  214. }
  215. if (foods.x == x && foods.y == y)
  216. {
  217. foods.Plan();
  218. //给个判断,让生成的food不会出现在有蛇身体的位置上
  219. for (int i = 0; i < bodyNum; i++)
  220. {
  221. if (foods.x == num1[i] && foods.y == num2[i])
  222. {
  223. Console.SetCursorPosition(foods.x, foods.y);
  224. Console.WriteLine(" ");
  225. foods.Plan();
  226. i = 0;
  227. }
  228. }
  229. bodyNum += 1;
  230. for (int i = bodyNum - 1; i > 0; i--)
  231. {
  232. num1[i] = num1[i - 1];
  233. num2[i] = num2[i - 1];
  234. }
  235. num1[0] = x;
  236. num2[0] = y - 1;
  237. }
  238. else
  239. {
  240. for (int i = bodyNum - 1; i > 0; i--)
  241. {
  242. num1[i] = num1[i - 1];
  243. num2[i] = num2[i - 1];
  244. }
  245. num1[0] = x;
  246. num2[0] = y - 1;
  247. }
  248. SnakePlan();
  249. break;
  250. case E_Move.Left:
  251. SnakeClear();
  252. x -= 2;
  253. //判断是否死亡
  254. //撞墙死亡
  255. if (x == 0)
  256. {
  257. Game.scene = E_Scene.FinishID;
  258. GameScene.bo = false;
  259. break;
  260. }
  261. //撞身体死亡
  262. for (int i = 0; i < bodyNum; i++)
  263. {
  264. if (num1[i] == x && num2[i] == y)
  265. {
  266. Game.scene = E_Scene.FinishID;
  267. GameScene.bo = false;
  268. break;
  269. }
  270. }
  271. if (foods.x == x && foods.y == y)
  272. {
  273. foods.Plan();
  274. //给个判断,让生成的food不会出现在有蛇身体的位置上
  275. for (int i = 0; i < bodyNum; i++)
  276. {
  277. if (foods.x == num1[i] && foods.y == num2[i])
  278. {
  279. Console.SetCursorPosition(foods.x, foods.y);
  280. Console.WriteLine(" ");
  281. foods.Plan();
  282. i = 0;
  283. }
  284. }
  285. bodyNum += 1;
  286. for (int i = bodyNum - 1; i > 0; i--)
  287. {
  288. num1[i] = num1[i - 1];
  289. num2[i] = num2[i - 1];
  290. }
  291. num1[0] = x + 2;
  292. num2[0] = y;
  293. }
  294. else
  295. {
  296. for (int i = bodyNum - 1; i > 0; i--)
  297. {
  298. num1[i] = num1[i - 1];
  299. num2[i] = num2[i - 1];
  300. }
  301. num1[0] = x + 2;
  302. num2[0] = y;
  303. }
  304. SnakePlan();
  305. break;
  306. case E_Move.Right:
  307. SnakeClear();
  308. x += 2;
  309. //判断是否死亡
  310. //撞墙死亡
  311. if (x == 98)
  312. {
  313. Game.scene = E_Scene.FinishID;
  314. GameScene.bo = false;
  315. break;
  316. }
  317. //撞身体死亡
  318. for (int i = 0; i < bodyNum; i++)
  319. {
  320. if (num1[i] == x && num2[i] == y)
  321. {
  322. Game.scene = E_Scene.FinishID;
  323. GameScene.bo = false;
  324. break;
  325. }
  326. }
  327. if (foods.x == x && foods.y == y)
  328. {
  329. foods.Plan();
  330. //给个判断,让生成的food不会出现在有蛇身体的位置上
  331. for (int i = 0; i < bodyNum; i++)
  332. {
  333. if (foods.x == num1[i] && foods.y == num2[i])
  334. {
  335. Console.SetCursorPosition(foods.x, foods.y);
  336. Console.WriteLine(" ");
  337. foods.Plan();
  338. i = 0;
  339. }
  340. }
  341. bodyNum += 1;
  342. for (int i = bodyNum - 1; i > 0; i--)
  343. {
  344. num1[i] = num1[i - 1];
  345. num2[i] = num2[i - 1];
  346. }
  347. num1[0] = x - 2;
  348. num2[0] = y;
  349. }
  350. else
  351. {
  352. for (int i = bodyNum - 1; i > 0; i--)
  353. {
  354. num1[i] = num1[i - 1];
  355. num2[i] = num2[i - 1];
  356. }
  357. num1[0] = x - 2;
  358. num2[0] = y;
  359. }
  360. SnakePlan();
  361. break;
  362. default:
  363. break;
  364. }
  365. }
  366. }
  367. }
全部代码文件:看资源
实现视频展示:

C#核心实践项目(自个先写)--贪吃蛇

总结:

代码有点屎山,but跑起来就好!!!

还是知识点运用的不够,很多没用上。

跟着老师实现--贪吃蛇

一.需求分析 -- 就是UML类图

二.游戏对象和场景更新接口
1.游戏类 ---- Game 

场景类型枚举 ---- E_SceneType

2.场景更新接口 ---- ISceneUpdate

三、实现多场景切换
1.游戏场景类

2.开始和结束场景基类

3.开始场景

将Game类中的nowScene 改为静态的

将Game类中的场景切换方法也改静态的

4.结束场景

Game中的调用也改

四、游戏场景逻辑实现
1.游戏对象基类的实现
绘制接口

游戏对象类

位置结构体

2.继承游戏对象基类的对象
地图墙壁类

食物类

蛇身子类

3.地图对象

在GameScene实现Map中的方法

到这里可以实现的功能有:三个场景

4.蛇对象

5.蛇对象移动 -- (Lesson7 部分)
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using 贪吃蛇.Lesson3;
  7. using 贪吃蛇.Lesson4;
  8. namespace 贪吃蛇.Lesson6
  9. {
  10. /// <summary>
  11. /// 蛇的移动方向
  12. /// </summary>
  13. enum E_MoveDir
  14. {
  15. Up,
  16. Down,
  17. Left,
  18. Right,
  19. }
  20. class Snake : IDraw
  21. {
  22. SnakeBody[] bodys;
  23. //记录当前蛇的长度
  24. int nowNum;
  25. //当前移动方向
  26. E_MoveDir dir;
  27. public Snake(int x, int y)
  28. {
  29. //粗暴的方法 直接申明200个空间 来装蛇身体的数组
  30. bodys = new SnakeBody[200];
  31. bodys[0] = new SnakeBody(E_SnakeBody_Type.Head, x, y);
  32. nowNum = 1;
  33. dir = E_MoveDir.Down;
  34. }
  35. public void Draw()
  36. {
  37. //画一节一节的身子
  38. for (int i = 0; i < nowNum; i++)
  39. {
  40. bodys[i].Draw();
  41. }
  42. }
  43. #region Lesson7 蛇的移动
  44. public void Move()
  45. {
  46. //移动前
  47. //擦除最后一个位置
  48. Console.SetCursorPosition(bodys[nowNum - 1].pos.x, bodys[nowNum - 1].pos.y);
  49. Console.WriteLine(" ");
  50. //再移动
  51. switch (dir)
  52. {
  53. case E_MoveDir.Up:
  54. --bodys[0].pos.y;
  55. break;
  56. case E_MoveDir.Down:
  57. ++bodys[0].pos.y;
  58. break;
  59. case E_MoveDir.Left:
  60. bodys[0].pos.x -= 2;
  61. break;
  62. case E_MoveDir.Right:
  63. bodys[0].pos.x += 2;
  64. break;
  65. default:
  66. break;
  67. }
  68. }
  69. #endregion
  70. }
  71. }

6.蛇对象改变移动方向(Lesson8 部分)
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using 贪吃蛇.Lesson3;
  7. using 贪吃蛇.Lesson4;
  8. namespace 贪吃蛇.Lesson6
  9. {
  10. /// <summary>
  11. /// 蛇的移动方向
  12. /// </summary>
  13. enum E_MoveDir
  14. {
  15. Up,
  16. Down,
  17. Left,
  18. Right,
  19. }
  20. class Snake : IDraw
  21. {
  22. SnakeBody[] bodys;
  23. //记录当前蛇的长度
  24. int nowNum;
  25. //当前移动方向
  26. E_MoveDir dir;
  27. public Snake(int x, int y)
  28. {
  29. //粗暴的方法 直接申明200个空间 来装蛇身体的数组
  30. bodys = new SnakeBody[200];
  31. bodys[0] = new SnakeBody(E_SnakeBody_Type.Head, x, y);
  32. nowNum = 1;
  33. dir = E_MoveDir.Down;
  34. }
  35. public void Draw()
  36. {
  37. //画一节一节的身子
  38. for (int i = 0; i < nowNum; i++)
  39. {
  40. bodys[i].Draw();
  41. }
  42. }
  43. #region Lesson7 蛇的移动
  44. public void Move()
  45. {
  46. //移动前
  47. //擦除最后一个位置
  48. Console.SetCursorPosition(bodys[nowNum - 1].pos.x, bodys[nowNum - 1].pos.y);
  49. Console.WriteLine(" ");
  50. //再移动
  51. switch (dir)
  52. {
  53. case E_MoveDir.Up:
  54. --bodys[0].pos.y;
  55. break;
  56. case E_MoveDir.Down:
  57. ++bodys[0].pos.y;
  58. break;
  59. case E_MoveDir.Left:
  60. bodys[0].pos.x -= 2;
  61. break;
  62. case E_MoveDir.Right:
  63. bodys[0].pos.x += 2;
  64. break;
  65. default:
  66. break;
  67. }
  68. }
  69. #endregion
  70. #region Lesson8 改变方向
  71. public void ChangeDir(E_MoveDir dir)
  72. {
  73. //只有头部的时候 可以直接左转右 右转左 上转下 下转上
  74. //有身体时 这些情况就不能直接转
  75. if (this.dir == dir ||
  76. nowNum > 1 &&
  77. (this.dir == E_MoveDir.Up && dir == E_MoveDir.Down ||
  78. this.dir == E_MoveDir.Down && dir == E_MoveDir.Up ||
  79. this.dir == E_MoveDir.Left && dir == E_MoveDir.Right ||
  80. this.dir == E_MoveDir.Right && dir == E_MoveDir.Left))
  81. {
  82. return;
  83. }
  84. //只要没有 return 就记录外面传入的方向 之后就会按照这个方向去移动
  85. this.dir = dir;
  86. }
  87. #endregion
  88. }
  89. }

在GameScene里面实现调用

7.撞墙撞身体结束游戏 -- (Lesson9 部分)
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using 贪吃蛇.Lesson3;
  7. using 贪吃蛇.Lesson4;
  8. using 贪吃蛇.Lesson5;
  9. namespace 贪吃蛇.Lesson6
  10. {
  11. /// <summary>
  12. /// 蛇的移动方向
  13. /// </summary>
  14. enum E_MoveDir
  15. {
  16. Up,
  17. Down,
  18. Left,
  19. Right,
  20. }
  21. class Snake : IDraw
  22. {
  23. SnakeBody[] bodys;
  24. //记录当前蛇的长度
  25. int nowNum;
  26. //当前移动方向
  27. E_MoveDir dir;
  28. public Snake(int x, int y)
  29. {
  30. //粗暴的方法 直接申明200个空间 来装蛇身体的数组
  31. bodys = new SnakeBody[200];
  32. bodys[0] = new SnakeBody(E_SnakeBody_Type.Head, x, y);
  33. nowNum = 1;
  34. dir = E_MoveDir.Down;
  35. }
  36. public void Draw()
  37. {
  38. //画一节一节的身子
  39. for (int i = 0; i < nowNum; i++)
  40. {
  41. bodys[i].Draw();
  42. }
  43. }
  44. #region Lesson7 蛇的移动
  45. public void Move()
  46. {
  47. //移动前
  48. //擦除最后一个位置
  49. Console.SetCursorPosition(bodys[nowNum - 1].pos.x, bodys[nowNum - 1].pos.y);
  50. Console.WriteLine(" ");
  51. //再移动
  52. switch (dir)
  53. {
  54. case E_MoveDir.Up:
  55. --bodys[0].pos.y;
  56. break;
  57. case E_MoveDir.Down:
  58. ++bodys[0].pos.y;
  59. break;
  60. case E_MoveDir.Left:
  61. bodys[0].pos.x -= 2;
  62. break;
  63. case E_MoveDir.Right:
  64. bodys[0].pos.x += 2;
  65. break;
  66. default:
  67. break;
  68. }
  69. }
  70. #endregion
  71. #region Lesson8 改变方向
  72. public void ChangeDir(E_MoveDir dir)
  73. {
  74. //只有头部的时候 可以直接左转右 右转左 上转下 下转上
  75. //有身体时 这些情况就不能直接转
  76. if (this.dir == dir ||
  77. nowNum > 1 &&
  78. (this.dir == E_MoveDir.Up && dir == E_MoveDir.Down ||
  79. this.dir == E_MoveDir.Down && dir == E_MoveDir.Up ||
  80. this.dir == E_MoveDir.Left && dir == E_MoveDir.Right ||
  81. this.dir == E_MoveDir.Right && dir == E_MoveDir.Left))
  82. {
  83. return;
  84. }
  85. //只要没有 return 就记录外面传入的方向 之后就会按照这个方向去移动
  86. this.dir = dir;
  87. }
  88. #endregion
  89. #region Lesson9 撞墙撞身体结束逻辑
  90. public bool CheckEnd(Map map)
  91. {
  92. for (int i = 0; i < map.walls.Length; i++)
  93. {
  94. if (bodys[0].pos == map.walls[i].pos)
  95. {
  96. return true;
  97. }
  98. }
  99. for (int i = 1; i < nowNum; i++)
  100. {
  101. if (bodys[0].pos == bodys[i].pos)
  102. {
  103. return true;
  104. }
  105. }
  106. return false;
  107. }
  108. #endregion
  109. }
  110. }

GameScene中调用

8.蛇吃食物

Snake类里面添加的相关方法 -- (Lesson10 部分)

GameScene类中调用

9.蛇长身体

Snake类中添加方法

(加了Lesson11--长身体AddBody方法,在Lesson10吃食物方法里面调用了AddBody方法,然后在Lesson7中添加了蛇尾跟着蛇头移动的逻辑处理)

至此跟着老师进行的制作的功能都已实现

视频展示

C#核心实践--贪吃蛇(老师实现的)

完整代码在资源里。

总结一下下

还是得多敲多练,多想想怎么让代码更精简,逻辑怎么更清晰!

多挤些时间啊!

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号