思路:贪吃蛇游戏大体可以分成三部分,首先绘出蛇,然后蛇的移动,最后就是吃食物了。
第一、绘蛇
将蛇分割成多个小方块,定义一个强类型列表List
public class SnackBody { public float x; public float y; public Color color; public SnackBody(float x, float y, Color color) { this.x = x; this.y = y; this.color = color; } }
开始游戏时在控件Control(这里为Panel)中根据小方块的X、Y坐标画出每个小方块,这样就可以组成一条蛇了。
public void ShowSnack() { gh = Graphics.FromImage(bmp); gh.Clear(control.BackColor); //显示蛇 for (int i = 0; i < listSnackBody.Count; i++) { gh.DrawRectangle(new Pen(new SolidBrush(Color.Black), 1), listSnackBody[i].x, listSnackBody[i].y, snackLength, snackLength); gh.FillRectangle(new SolidBrush(color), listSnackBody[i].x + 1, listSnackBody[i].y + 1, snackLength - 1, snackLength - 1); } control.CreateGraphics().DrawImage(bmp, 0, 0); gh.Dispose(); }
第二、移动蛇
要让蛇游动,则添加控件Timer,每相隔一段时间,每个小方块的X、Y坐标都等于他们前一个小方块的X、Y坐标,而最后一个小方块的坐标将特殊处理(如果向前则X坐标加上小方块的长度,如果向后则X坐标减去小方块的长度,如果向上则Y坐标减去小方块的高,如果向下则Y坐标加上小方块的高),同时若原来的方向是向前的,则不可以直接向后移动,向上的不可以直接向下移动,其他类似
for (int i = 1; i < listSnackBody.Count; i++) { listSnackBody[i - 1].x = listSnackBody[i].x; listSnackBody[i - 1].y = listSnackBody[i].y; } //上下左右(WSAD)按键控制 switch (direction) { case "Up": case "W": if (nowDirection == "Down") { listSnackBody[listSnackBody.Count - 1].y += snackLength; } else { listSnackBody[listSnackBody.Count - 1].y -= snackLength; nowDirection = "Up"; } break; case "Down": case "S": if (nowDirection == "Up") { listSnackBody[listSnackBody.Count - 1].y -= snackLength; } else { listSnackBody[listSnackBody.Count - 1].y += snackLength; nowDirection = "Down"; } break; case "Left": case "A": if (nowDirection == "Right") { listSnackBody[listSnackBody.Count - 1].x += snackLength; } else { listSnackBody[listSnackBody.Count - 1].x -= snackLength; nowDirection = "Left"; } break; case "Right": case "D": if (nowDirection == "Left") { listSnackBody[listSnackBody.Count - 1].x -= snackLength; } else { listSnackBody[listSnackBody.Count - 1].x += snackLength; nowDirection = "Right"; } break; default: canMove = false; break; }
第三、吃食物
吃食物时,先随机产生一个X、Y坐标,然后根据X、Y坐标绘出小方块(这里有个问题就是要判断下食物的X、Y坐标最好不要跟蛇的任一小方块的X、Y坐标相等,不然随机产生的食物小方块有可能会出现在蛇身上,这样的话只有蛇走开了才能看到食物小方块)
///
然后判断蛇头的X、Y坐标是否与食物的X、Y坐标相等,若相等则说明已吃到食物,将食物添加到List
public void Eat() { if (listSnackBody[listSnackBody.Count - 1].x == randomX && listSnackBody[listSnackBody.Count - 1].y == randomY) { sbody = new SnackBody(randomX, randomY, listSnackBody[0].color); listSnackBody.Add(sbody); randomFood(); } }
主要的三个都已经做完了,而作为一个游戏,肯定是会结束的,而要判断游戏是否结束,则判断蛇头的X坐标或Y坐标是否超过Control(这里是Panel)的四个边框,如果蛇头的X、Y坐标与任一蛇身的X、Y坐标相等了,则游戏同样也结束
//若蛇超出上下左右范围,则游戏结束 if (listSnackBody[listSnackBody.Count - 1].x >= control.Width || listSnackBody[listSnackBody.Count - 1].x < 0) { canMove = false; } if (listSnackBody[listSnackBody.Count - 1].y >= control.Height || listSnackBody[listSnackBody.Count - 1].y < 0) { canMove = false; } //若蛇与自己相交,则游戏结束 for (int k = 0; k < listSnackBody.Count - 1; k++) { if (listSnackBody[listSnackBody.Count - 1].x == listSnackBody[k].x && listSnackBody[listSnackBody.Count - 1].y == listSnackBody[k].y) { canMove = false; } }
这样,一个简单的贪吃蛇游戏就出炉了。
附上:贪吃蛇完整源码
有什么不足之处希望大家指正,谢谢!