查看: 9811|回复: 94

[.Net] 【参赛】贪吃蛇

  [复制链接]
  • TA的每日心情
    慵懒
    2015-11-28 14:57
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2014-10-27 23:50:31 | 显示全部楼层 |阅读模式
    本帖最后由 x1n丶别吵 于 2014-10-29 22:49 编辑

    主要代码:
    1. using System;
    2. using System.Collections.Generic;
    3. using System.ComponentModel;
    4. using System.Data;
    5. using System.Drawing;
    6. using System.Linq;
    7. using System.Text;
    8. using System.Threading.Tasks;
    9. using System.Windows.Forms;
    10. using System.Threading;

    11. namespace 贪吃蛇
    12. {
    13. public partial class frmSnake : Form
    14. {
    15. public frmSnake()
    16. {
    17. InitializeComponent();
    18. }
    19. #region 窗体加载事件
    20. /// <summary>
    21. /// 窗体加载事件
    22. /// </summary>
    23. /// <param name="sender"></param>
    24. /// <param name="e"></param>
    25. private void frmSnake_Load(object sender, EventArgs e)
    26. {
    27. Initial();
    28. MoveFood();
    29. }
    30. #endregion
    31. #region 初始化蛇身
    32. /// <summary>
    33. /// 初始化蛇
    34. /// </summary>
    35. private void InitionSnake()
    36. {
    37. #region 自定义蛇身长度,自定义设置
    38. // this.Controls.Clear();

    39. // int x = 150;
    40. // int y = 150;
    41. // Label lable =null;
    42. //for (int i = 0; i < 15; i++)
    43. //{
    44. // lable = new Label();
    45. // lable.BorderStyle = BorderStyle.FixedSingle;
    46. // this.label1.BackColor = System.Drawing.Color.PeachPuff;
    47. // lable.Location = new System.Drawing.Point(x - 15, y);
    48. // lable.Name = "lblHead";
    49. // lable.Size = new System.Drawing.Size(15, 15);
    50. // lable.TabIndex = 0;
    51. // lable.Text = "X";
    52. // lable.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
    53. // list.Add(lblHead);
    54. //}
    55. #endregion
    56. //像集合中添加数据
    57. list.Add(lblHead);
    58. list.Add(label1);
    59. list.Add(label2);
    60. list.Add(label3);
    61. }
    62. #endregion
    63. #region 当首次按键后发生
    64. //当首次按键后发生
    65. private void frmSnake_KeyDown(object sender, KeyEventArgs e)
    66. {
    67. string fangxiang = e.KeyCode.ToString(); //蛇头移向的方向
    68. if (fangxiang == "Left" || fangxiang == "Right" || fangxiang == "Up" || fangxiang == "Down")
    69. {
    70. switch (direction)
    71. {
    72. case "Up":
    73. if (fangxiang == "Down") return;
    74. break;
    75. case "Down":
    76. if (fangxiang == "Up") return;
    77. break;
    78. case "Left":
    79. if (fangxiang == "Right") return;
    80. break;
    81. case "Right":
    82. if (fangxiang == "Left") return;
    83. break;
    84. }
    85. direction = fangxiang;
    86. }
    87. }
    88. #endregion
    89. #region 蛇身移动,原理每个list集合数据,后一个元素的下一个位置为前一个元素的位置
    90. bool isNo = false;
    91. /// <summary>
    92. /// 蛇身移动,原理每个list集合数据,后一个元素的下一个位置为前一个元素的位置
    93. /// </summary>
    94. private void MoveBody()
    95. {
    96. int x, y; //使用x,y保存前一个蛇身的距离
    97. for (int i = 1; i < list.Count; i++)
    98. {
    99. if (list[i] is Label)
    100. {
    101. x = list[i].Left;
    102. y = list[i].Top;
    103. //xold,yold为蛇头位置
    104. list[i].Left = xold;
    105. list[i].Top = yold;

    106. xold = x;
    107. yold = y;
    108. }

    109. }
    110. //循环判断蛇头位置与蛇身位置是否相同
    111. for (int i = 1; i < list.Count; i++)
    112. {
    113. if (lblHead.Location == list[i].Location)
    114. {
    115. trStatc.Stop();
    116. MessageBox.Show("游戏结束!吃了" + (list.Count - 4) + "个");
    117. isNo = true;
    118. return;
    119. }
    120. else
    121. {
    122. isNo = false;
    123. }
    124. }
    125. }
    126. #endregion
    127. #region 初始化
    128. /// <summary>
    129. /// 初始化
    130. /// </summary>
    131. private void Initial()
    132. {
    133. InitionSnake();
    134. }
    135. #endregion
    136. #region 公共变量声明,整个类任何地方都可以使用,可传提数据
    137. int xold, yold; //舌头坐标
    138. string direction = "Right"; //移动方向
    139. List<Label> list = new List<Label>(); //蛇的区块集合
    140. Label lblFood; //蛇的食物
    141. #endregion
    142. #region 蛇食生产方法
    143. /// <summary>
    144. /// 蛇食生产方法
    145. /// </summary>
    146. private void MoveFood()
    147. {
    148. lblFood = new Label();
    149. lblFood.Width = 15;
    150. lblFood.Height = 15;
    151. lblFood.BorderStyle = BorderStyle.FixedSingle;
    152. int x, y;
    153. bool isNo = true;
    154. Random r = new Random();
    155. do
    156. {
    157. x = r.Next(10, 550);
    158. y = r.Next(10, 550);
    159. if (x % 15 == 0 && y % 15 == 0)
    160. {
    161. lblFood.Left = x;
    162. lblFood.Top = y;
    163. isNo = false;
    164. }
    165. } while (isNo);
    166. lblFood.Move += new EventHandler(lblFood_Move);
    167. this.Controls.Add(lblFood);
    168. }

    169. void lblFood_Move(object sender, EventArgs e)
    170. {

    171. lblFood.Move -= new EventHandler(lblFood_Move);
    172. MoveFood();
    173. }
    174. #endregion
    175. #region 时间控件事件,控制蛇的速度,蛇头的移动
    176. /// <summary>
    177. /// 时间控件事件
    178. /// </summary>
    179. /// <param name="sender"></param>
    180. /// <param name="e"></param>
    181. private void trStatc_Tick(object sender, EventArgs e)
    182. {
    183. trStatc.Start();
    184. xold = this.lblHead.Left;
    185. yold = this.lblHead.Top;
    186. switch (direction)
    187. {
    188. case "Up":
    189. this.lblHead.Top -= 15;
    190. if (this.lblHead.Top <0)
    191. {
    192. this.lblHead.Top = 540;
    193. }
    194. break;
    195. case "Down":
    196. this.lblHead.Top += 15;
    197. if (this.lblHead.Top >= 555)
    198. {
    199. this.lblHead.Top = 0;
    200. }
    201. break;
    202. case "Left":
    203. this.lblHead.Left -= 15;
    204. if (this.lblHead.Left <0)
    205. {
    206. this.lblHead.Left = 570;
    207. }
    208. break;
    209. case "Right":
    210. this.lblHead.Left += 15;
    211. if (this.lblHead.Left > 570)
    212. {
    213. this.lblHead.Left = 0;
    214. }
    215. break;
    216. }
    217. //蛇身移动
    218. MoveBody();
    219. //根据公共变量,判断游戏是否结束
    220. if (isNo)
    221. {

    222. if (DialogResult.No == MessageBox.Show("游戏结束,是否继续", "", MessageBoxButtons.YesNo, MessageBoxIcon.Asterisk))
    223. {
    224. Application.Exit();
    225. }
    226. else
    227. {
    228. //在窗体上移除非初始化控件
    229. for (int i = 4; i < list.Count; i++)
    230. {
    231. this.Controls.Remove(list[i]);
    232. }
    233. //清空蛇身集合
    234. list.Clear();
    235. //给蛇身初始化,并且将蛇身添加到集合中
    236. Initial();
    237. //开启时间控件
    238. trStatc.Start();
    239. return;
    240. }
    241. }
    242. //如果吃到蛇食,则添加到集合中
    243. if (lblFood.Location == lblHead.Location)
    244. {
    245. list.Add(lblFood);
    246. }
    247. }
    248. #endregion
    249. }
    250. }
    复制代码

    功能图:

    Q1.png

    Q2.png

    Q3.png
    源码回复下载
    游客,如果您要查看本帖隐藏内容请回复

  • TA的每日心情
    开心
    2015-6-7 20:22
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-10-28 19:18:10 | 显示全部楼层
    时间长了,没看、net了都有点看不懂了、
  • TA的每日心情
    慵懒
    2015-11-28 14:57
  • 签到天数: 1 天

    [LV.1]初来乍到

     楼主| 发表于 2014-10-29 22:49:04 | 显示全部楼层
    代码随风 发表于 2014-10-28 19:18
    时间长了,没看、net了都有点看不懂了、

    代码简洁 适合学习 嘎嘎

    该用户从未签到

    发表于 2014-10-30 17:14:04 | 显示全部楼层
    代码随风 发表于 2014-10-28 19:18
    时间长了,没看、net了都有点看不懂了、

    同感
  • TA的每日心情
    郁闷
    2015-8-1 15:38
  • 签到天数: 26 天

    [LV.4]偶尔看看III

    发表于 2014-11-12 21:47:33 来自手机 | 显示全部楼层
    赞 赞  赞 赞
  • TA的每日心情
    无聊
    2015-3-22 16:00
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2014-11-15 22:50:06 | 显示全部楼层
    赞一个

    该用户从未签到

    发表于 2014-11-25 13:58:30 | 显示全部楼层
    dsadsadsad
  • TA的每日心情
    开心
    2015-8-28 16:15
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2015-7-16 15:14:32 | 显示全部楼层
    .net真有点不懂
    您需要登录后才可以回帖 登录 | 注册青鸟豆号

    本版积分规则

    Copyright 1999-2019 Beijing Aptech Beida Jade Bird Information Technology Co.,Ltd

    北大青鸟IT教育 北京阿博泰克北大青鸟信息技术有限公司 版权所有

    京ICP备11045574号-3 京公网安备11010802013845号

    快速回复 返回顶部 返回列表