贪吃蛇大作战单人版完整代码以及详细解释
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
贪吃蛇⼤作战单⼈版完整代码以及详细解释贪吃蛇总结:
1. 创建WPF应⽤程序
2. 添加Canvas标签。
Name=back;
3. 添加loaded事件
4. 在loaded事件中创建蛇(设置蛇的位置,⼤⼩,颜⾊)
this.Left = 0;
this.Top = 0;
this.Width = 800;
this.Height = 600;
for (int i = 0; i < 5; i++)
{
bd = new Border();
bd.Width = bd.Height = 10;
bd.CornerRadius = new CornerRadius(5);
if (i == 0)
bd.Background = Brushes.Red;
else
bd.Background = Brushes.Black;
Canvas.SetTop(bd,200+i*bd.Height);
Canvas.SetLeft(bd,200);
back.Children.Add(bd);
snake.Add(bd);
5. 添加⼀个timer,(问题:添加timer和winform程序中不⼀样
Winform 程序中直接添加。
WPF应⽤程序中不能直接添加,需要引⼊命名空间:
Using System.Thearing
)
DispatcherTimer tm1 = new DispatcherTimer();
tm1.Interval =TimeSpan.FromMilliseconds(200);
tm1.Tick += Tm1_Tick;
tm1.Start();
this.KeyDown += MainWindow_KeyDown;
6. 添加键盘事件,读取键盘敲下的字符
if (e.Key==Key.Up&&str!="d" )
{
str = "up";
}
if (e.Key==Key.Down&&str!="up")
{
str = "d";
[csharp]
1.
{
str = "l";
}
if (e.Key == Key.Right&&str!="l")
{
str = "r";
}
7.在timer事件中实现蛇的移动(问题:在实现向左移动时出现错误
解决:添加⼀个集合,来存储蛇的位置信息,与此同时添加⼀个border储存位置信息border)
//创建蛇的位置集合
List<Border> snakeback =new List<Border>();
//创建蛇的位置border
Border bdback = new Border();
bdback.Height = bdback.Width = 10;
Canvas.SetTop(bdback, 200 + i * bd.Height);
Canvas.SetLeft(bdback, 200);
snakeback.Add(bdback);
if (str == "up")
{
Canvas.SetTop(snake[0],Canvas.GetTop(snake[0]) - snake[0].Height);
run();
}
if (str=="d")
{
Canvas.SetTop(snake[0],Canvas.GetTop(snake[0])+ snake[0].Height);
run();
}
if (str == "l")
{
Canvas.SetLeft(snake[0],Canvas.GetLeft(snake[0]) - snake[0].Height);
run();
}
if (str == "r")
{
Canvas.SetLeft(snake[0],Canvas.GetLeft(snake[0]) + snake[0].Height);
run();
}
private void run()
{
for (int i = 1; i < snake.Count; i++)
{
Canvas.SetTop(snake[i],Canvas.GetTop(snakeback[i - 1]));
Canvas.SetLeft(snake[i],Canvas.GetLeft(snakeback[i - 1]));
}
for (int i = 0; i < snake.Count; i++)
{
Canvas.SetTop(snakeback[i],Canvas.GetTop(snake[i]));
Canvas.SetLeft(snakeback[i],Canvas.GetLeft(snake[i]));
}
}
8. 判断与⾷物相撞时,⾷物改变位置
if (Canvas.GetTop(snake[0])==Canvas.GetTop(food)&&Canvas.GetLeft(snake[0])==Canvas.GetLeft(food)) {
Canvas.SetTop(food, ra.Next(60) * 10);
Canvas.SetLeft(food, ra.Next(80) * 10);
}
9. 在与⾷物相撞时添加⼀节蛇尾
10. 添加⼀个border来作为蛇尾,添加到snake集合中
11. 添加⼀个border存储所增加的蛇尾的位置信息
if (Canvas.GetTop(snake[0])==Canvas.GetTop(food)&&Canvas.GetLeft(snake[0])==Canvas.GetLeft(food)) {
Canvas.SetTop(food, ra.Next(60) * 10);
Canvas.SetLeft(food, ra.Next(80) * 10);
//定义⼀个增加的蛇尾的border
Border bdfood = new Border();
bdfood.Height = bdfood.Width = 10;
bdfood.CornerRadius = new CornerRadius(5);
bdfood.Background = Brushes.Azure;
Canvas.SetTop(bdfood,Canvas.GetTop(snake[snake.Count-1]));
Canvas.SetLeft(bdfood,Canvas.GetLeft(snake[snake.Count - 1]));
back.Children.Add(bdfood);
snake.Add(bdfood);
//定义⼀个border存储增加的的集合
Border br = new Border();
br.Height = br.Width = 10;
Canvas.SetTop(br, Canvas.GetTop(snakeback[snakeback.Count - 1]));
Canvas.SetLeft(br, Canvas.GetLeft(snakeback[snakeback.Count - 1]));
snakeback.Add(br);
}
12.判断蛇与⾯板四周相撞或者蛇撞到⾃⼰,游戏结束。
for (int i = 1; i < snake.Count; i++)
{
if (Canvas.GetTop(snake[0]) ==Canvas.GetTop(snake[i]) && Canvas.GetLeft(snake[0]) == Canvas.GetLeft(snake[i]))
{
tm1.Stop();
MessageBox.Show("GAME OVER!");
}
}
if (Canvas.GetTop(snake[0]) == 0 ||Canvas.GetTop(snake[0]) == 560 || Canvas.GetLeft(snake[0]) == 0 || Canvas.GetLeft(snake[0]) == 790) {
tm1.Stop();
MessageBox.Show("GAME OVER!");
}
完整版代码:
[csharp]
1. using System;
2. using System.Collections.Generic;
3. using System.Windows;
4. using System.Windows.Controls;
5. using System.Windows.Input;
6. using System.Windows.Media;
7. using System.Windows.Threading;
8.
9. namespace 贪吃蛇1._0
10. {
11. /// <summary>
12. /// MainWindow.xaml 的交互逻辑
13. /// </summary>
14. public partial class MainWindow : Window
15. {
16. public MainWindow()
17. {
18. InitializeComponent();
19. this.Background = Brushes.Pink;
20. }
21. string str = "";
22. Border bd;
23. DispatcherTimer tm1;
24. Border food;
25. List<Border> snake = new List<Border>();
26. //创建蛇的位置集合
27. List<Border> snakeback = new List<Border>();
28. List<Border> foodback = new List<Border>();
29. Random ra = new Random();
30. private void Window_Loaded(object sender, RoutedEventArgs e)
31. {
32. this.Left = 0;
33. this.Top = 0;
34. this.Width = 800;
35. this.Height = 600;
36. for (int i = 0; i < 5; i++)
37. {
38. bd = new Border();
39. bd.Width = bd.Height = 10;
40. bd.CornerRadius = new CornerRadius(5);
41. if (i == 0)
42. bd.Background = Brushes.Red;
43. else
44. bd.Background = Brushes.Black;
45. Canvas.SetTop(bd, 200 + i * bd.Height);
46. Canvas.SetLeft(bd, 200);
47. back.Children.Add(bd);
48. snake.Add(bd);
49.
50. //创建蛇的位置border
51. Border bdback = new Border();
52. bdback.Height = bdback.Width = 10;
53. Canvas.SetTop(bdback, 200 + i * bd.Height);
54. Canvas.SetLeft(bdback, 200);
55. snakeback.Add(bdback);
56. }
57.
58. tm1 = new DispatcherTimer();
59. tm1.Interval = TimeSpan.FromMilliseconds(200);
60. tm1.Tick += Tm1_Tick;
61. tm1.Start();
62. this.KeyDown += MainWindow_KeyDown;
63. for (int i = 0; i < 30; i++)
64. {
65. //创建⾷物
66. food = new Border();
67. food.Height = food.Width = 10;
68. food.CornerRadius = new CornerRadius(5);
69. Canvas.SetTop(food, ra.Next(60) * 10);
70. Canvas.SetLeft(food, ra.Next(80) * 10);
71. food.Background = Brushes.Orange;
72. back.Children.Add(food);
73. foodback.Add(food);
74. }
75. }
76.
77. private void MainWindow_KeyDown(object sender, KeyEventArgs e)
78. {
79. if (e.Key == Key.Up && str != "d")
80. {
81. str = "up";
82. }
83. if (e.Key == Key.Down && str != "up")
84. {
85. str = "d";
86. }
87. if (e.Key == Key.Left && str != "r")
88. {
89. str = "l";
90. }
91. if (e.Key == Key.Right && str != "l")
92. {
93. str = "r";
94. }
95. }
96.
97. private void Tm1_Tick(object sender, EventArgs e)
98. {
99. if (str == "up")
100. {
101. Canvas.SetTop(snake[0], Canvas.GetTop(snake[0]) - snake[0].Height);
102. run();
103. }
104. if (str == "d")
105. {
106. Canvas.SetTop(snake[0], Canvas.GetTop(snake[0]) + snake[0].Height);
107. run();
108. }
109. if (str == "l")
110. {
111. Canvas.SetLeft(snake[0], Canvas.GetLeft(snake[0]) - snake[0].Height);
112. run();
113. }
114. if (str == "r")
115. {
116. Canvas.SetLeft(snake[0], Canvas.GetLeft(snake[0]) + snake[0].Height);
117. run();
118. }
119. for (int i = 0; i < 30; i++)
120. {
121. if (Canvas.GetTop(snake[0]) == Canvas.GetTop(foodback[i]) && Canvas.GetLeft(snake[0]) == Canvas.GetLeft(foodback[i]))
122. {
123. Canvas.SetTop(foodback[i], ra.Next(60) * 10);
124. Canvas.SetLeft(foodback[i], ra.Next(80) * 10);
125. //定义⼀个增加的蛇尾的border
126. Border bdfood = new Border();
127. bdfood.Height = bdfood.Width = 10;
128. bdfood.CornerRadius = new CornerRadius(5);
129. bdfood.Background = Brushes.Black;
130. Canvas.SetTop(bdfood, Canvas.GetTop(snake[snake.Count - 1]));
131. Canvas.SetLeft(bdfood, Canvas.GetLeft(snake[snake.Count - 1]));
132. back.Children.Add(bdfood);
133. snake.Add(bdfood);
134.
135. //定义⼀个border存储增加的的集合
136. Border br = new Border();
137. br.Height = br.Width = 10;
138. Canvas.SetTop(br, Canvas.GetTop(snakeback[snakeback.Count - 1]));
139. Canvas.SetLeft(br, Canvas.GetLeft(snakeback[snakeback.Count - 1]));
140. snakeback.Add(br);
141. }
142. }
143. for (int i = 1; i < snake.Count; i++)
144. {
145. if (Canvas.GetTop(snake[0]) == Canvas.GetTop(snake[i]) && Canvas.GetLeft(snake[0]) == Canvas.GetLeft(snake[i]))
146. {
147. tm1.Stop();
148. MessageBox.Show("GAME OVER!");
149. }
150. }
151. if (Canvas.GetTop(snake[0]) == 0 || Canvas.GetTop(snake[0]) == 560 || Canvas.GetLeft(snake[0]) == 0 || Canvas.GetLeft(snake[0]) == 790) 152. {
153. tm1.Stop();
154. MessageBox.Show("GAME OVER!");
155. }
156. }
157.
158. private void run()
159. {
160. for (int i = 1; i < snake.Count; i++)
161. {
162. Canvas.SetTop(snake[i], Canvas.GetTop(snakeback[i - 1]));
163. Canvas.SetLeft(snake[i], Canvas.GetLeft(snakeback[i - 1]));
164. }
165. for (int i = 0; i < snake.Count; i++)
166. {
167. Canvas.SetTop(snakeback[i], Canvas.GetTop(snake[i]));
168. Canvas.SetLeft(snakeback[i], Canvas.GetLeft(snake[i]));
169. }
170. }
171. }
172. }。