贪吃蛇思路及源码

一个简单的贪吃蛇游戏

 

 

思路:贪吃蛇游戏大体可以分成三部分,首先绘出蛇,然后蛇的移动,最后就是吃食物了。

 

第一、绘蛇

将蛇分割成多个小方块,定义一个强类型列表List来存储每个小方块,其中SnackBody中存储蛇的基本信息(X、Y坐标及颜色)

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坐标 /// /// private void randomFood() { Random r = new Random(); randomX = r.Next(0, control.Width / snackLength) * snackLength; randomY = r.Next(0, control.Height / snackLength) * snackLength; } //显示食物 gh.DrawRectangle(new Pen(new SolidBrush(Color.Black), 1), randomX, randomY, snackLength, snackLength); gh.FillRectangle(new SolidBrush(color), randomX + 1, randomY + 1, snackLength - 1, snackLength - 1);

 

然后判断蛇头的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; } } 

 

这样,一个简单的贪吃蛇游戏就出炉了。

 

附上:贪吃蛇完整源码

 

有什么不足之处希望大家指正,谢谢!

 

你可能感兴趣的:(贪吃蛇思路及源码)