using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace 贪吃蛇游戏
{
public partial class Start : Form
{
private Floor f1;
//Bean b1;
//Block block;
Snake s1;
public Start()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
// b1 = new Bean();
//b1.Origin = new Point(50, 50);
//b1.Display(this.CreateGraphics());
//block = new Block();
//block.IsHead = false;
//block.Origin = new Point(100, 100);
//block.Display(this.CreateGraphics());
Point p1 = new Point(50, 50);
s1 = new Snake(p1, 10);
//s1.Display(this.CreateGraphics());
timer1.Enabled=true;
button1.Enabled = false;
button2.Enabled = false;
}
private void button2_Click(object sender, EventArgs e)
{
s1.UnDisplay(this.CreateGraphics());
}
private void timer1_Tick(object sender, EventArgs e)
{
f1.Display(this.CreateGraphics());
lblScore.Text = f1.score.ToString();
if (f1.score >= 100 && f1.score < 200)
{
入门ToolStripMenuItem_Click(sender, e);
}
else if (f1.score >= 200 && f1.score < 300)
{
高手ToolStripMenuItem_Click( sender, e);
}
else if (f1.score >=300)
{
大神ToolStripMenuItem_Click(sender, e);
}
if (f1.score >= 550)
{
this.timer1.Enabled = false;//结束游戏
MessageBox.Show("恭喜你通关了");
}
if (f1.CheckSnake())
{
timer1.Enabled = false;
MessageBox.Show("GameOver");
}
}
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
f1.Display(this.CreateGraphics());
if (f1.CheckSnake())
{
timer1.Enabled = false;
MessageBox.Show("游戏已经结束");
}
int k, d = 0;
k = e.KeyValue;
if (k == 37)
d = 3;
else if (k == 40)
d = 2;
else if (k == 38)
d = 0;
else if (k == 39)
d = 1;
f1.S.TurnDirection(d);
}
private void 暂停F2ToolStripMenuItem_Click(object sender, EventArgs e)
{
if (menuPause.Text == "暂停")
{
timer1.Enabled = false;
menuPause.Text = "继续";
}
else
{
timer1.Enabled = true;
menuPause.Text = "暂停";
}
}
private void Start_Load(object sender, EventArgs e)
{
this.BackColor = Color.Silver;
f1 = new Floor(new Point(80, 60));//用坐标点实例化运动场
菜鸟ToolStripMenuItem_Click(sender, e);
lblScore.Text = "0分";
}
private void 菜鸟ToolStripMenuItem_Click(object sender, EventArgs e)
{
timer1.Interval = 500;//设置等级速度
lblGrade.Text = "菜鸟";
}
private void 开始F1ToolStripMenuItem_Click(object sender, EventArgs e)
{
timer1.Enabled = true;
if (menuStart.Text == "开始")
{
menuStart.Text = "重新开始";
}
else
{
f1.ReSet(this.CreateGraphics());
f1.score = 0;
}
menuPause.Enabled = true;
}
private void 退出ToolStripMenuItem_Click(object sender, EventArgs e)
{
Application.Exit();
}
private void 入门ToolStripMenuItem_Click(object sender, EventArgs e)
{
timer1.Interval = 400;//设置等级速度
lblGrade.Text = "入门";
}
private void 高手ToolStripMenuItem_Click(object sender, EventArgs e)
{
timer1.Interval = 300;//设置等级速度
lblGrade.Text = "高手";
}
private void 大神ToolStripMenuItem_Click(object sender, EventArgs e)
{
timer1.Interval = 200;//设置等级速度
lblGrade.Text = "大神";
}
private void 帮助ToolStripMenuItem_Click(object sender, EventArgs e)
{
timer1.Enabled = false;
MessageBox.Show("F1开始/重新开始" + "\n" + "F2暂停/继续\n" + "上、下、左、右键为控制蛇的方向键");
timer1.Enabled = true;
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Drawing;
namespace 贪吃蛇游戏
{
class Floor
{
private static int unit = 10;//定义静态单位长度
private int lenth = 60 * unit;//运动场长度,并排60个蛇块儿的长度
private int width = 30 * unit;//运动场宽度,并排30个蛇块儿的长度
private Point dot;//运动场左上角位置
public int score;//游戏分数
private Snake s;//蛇对象字段
private Bean bean;//食物对象字段
public Snake S
{
get { return s; }
}
public Floor(Point d)//构造函数,参数为运动场左上角位置
{
dot = d;
s = new Snake(d, 5);
bean = new Bean();
bean.Origin = new Point(d.X + 30, d.Y + 30);//实例化食物位置
}
public void ReSet(Graphics g)//重新设置蛇的方法
{
s.UnDisplay(g);//消除以前的蛇
s = new Snake(dot, 5);
bean.UnDisplay(g);//消除以前的食物
bean.Origin = new Point(dot.X + 30, dot.Y + 30);
}
public void Display(Graphics g)//显示运动场方法,参数为一图形对象
{
Pen p = new Pen(Color.Red);//创建笔并用红色实例化
//用创建的笔画一个位置为dot,长、宽分别为length和width的矩形
g.DrawRectangle(p, dot.X, dot.Y, lenth, width);
bean.Display(g);//显示食物
//检查食物是否被吃
if (bean.Origin.Equals(s.HeadPoint))//判断食物的位置是否与蛇头相同
{
score = score + 10;//分数加10
bean.UnDisplay(g);//消除原来的食物
Random random = new Random();//创建伪随机数对象并实例化
int x = random.Next(1, lenth / unit);
int y = random.Next(1, width / unit);
//由运动场位置和x,y随机整数实例化点对象
Point d = new Point(dot.X + x * 10, dot.Y + y * 10);
bean.Origin = d;//点赋给新食物位置属性
bean.Display(g);
s.SnakeGrowth();//蛇自动增长
}
else
{
s.Go(g);
}
s.Display(g);//显示蛇
}
//检查蛇是否撞墙
public bool CheckSnake()
{
if ((dot.X < s.HeadPoint.X && s.HeadPoint.X < (dot.X + lenth) - 10) && (dot.Y < s.HeadPoint.Y && s.HeadPoint.Y < (dot.Y + width) - 10) && !s.getHitSelf)
{
return false;
}
else
{
return true;
}
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;
using System.Drawing;
namespace 贪吃蛇游戏
{
class Snake
{
private ArrayList blockList;//组成蛇的所有块儿
private int headNumber;//蛇的长度
private Point headPoint;//蛇头的位置
private int direction = 1;//默认是右0,1,2,3分别代表上,右,下,左
public Point HeadPoint
{
get { return headPoint; }
}
//蛇的运行方向属性
public int Direction
{
get { return direction; }
set { direction = value; }
}
public bool getHitSelf//蛇是否碰到墙
{
get
{
foreach (Block b in blockList)
{
if (b.Number != headNumber && b.Origin.Equals(headPoint))
{
return true;
}
}
return false;
}
}
public Snake(Point vertex,int count)
{
Block bb;
Point p = new Point(vertex.X + 40, vertex.Y + 40);//定义蛇尾起始位置
blockList = new ArrayList(count);//初始数组长度为count
for (int i = 0; i < count; i++)//通过循环填充blockList
{
bb = new Block();//实例化新块
bb.Origin = p;//块的位置
bb.Number = i+1 ;
blockList.Add(bb);
if (i == count-1 )//如果是蛇头,就把位置(顶点)赋给headPoint
{
headPoint = bb.Origin;
bb.IsHead = true;
}
p.X = p.X + 10;
}
headNumber = count;
}
public void TurnDirection(int pDirection)//0,1,2,3上,右,下,左蛇的转向方法,参数为蛇妖改变方向
{
switch (direction)//1
{
case 0:
if (pDirection == 3)
direction = 3;
else if (pDirection == 1)
direction = 1;
break;
case 1:
if (pDirection == 2)
direction = 2;
else if (pDirection == 0)
direction = 0;
break;
case 2:
if (pDirection == 3)
direction = 3;
else if (pDirection == 1)
direction = 1;
break;
case 3:
if (pDirection == 2)
direction = 2;
else if (pDirection == 0)
direction = 0;
break;
}
}
public void SnakeGrowth()
{
Block b = (Block)blockList[blockList.Count - 1];//蛇头那一块
int x = b.Origin.X;
int y = b.Origin.Y;
if (direction == 0)
{
y = y - 10;
}
else if (direction == 1)
{
x = x + 10;
}
else if (direction == 2)
{
y = y + 10;
}
else if (direction == 3)
{
x = x - 10;
}
b.IsHead = false;
Block newBlock = new Block();
Point headP = new Point(x, y);//由坐标构造头位置点
newBlock.Origin = headP;//把点赋给新块的位置属性
newBlock.IsHead = true;
//当前块儿的序数加1并赋给新块的序数属性
newBlock.Number = b.Number + 1;
blockList.Add(newBlock);//把新块添加到blockList中
headNumber++;
headPoint = headP;
}
public void Go(Graphics g)//显示蛇方法,参数为图形对象
{
Block b1 = (Block)blockList[0];//蛇尾那一块
b1.UnDisplay(g);
blockList.RemoveAt(0);
foreach (Block b in blockList)
{
b.Number--;
}
headNumber--;
SnakeGrowth();
Display(g);
}
public void Display(Graphics g)//显示的方法
{
foreach (Block b in blockList)
{
b.Display(g);//显示当前块
}
}
public void UnDisplay(Graphics g)//消除显示的方法
{
foreach (Block b in blockList)
{
b.UnDisplay(g);//消除当前块
}
}
}
}
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 贪吃蛇游戏
{
public class Block
{
private int number;//蛇块的编号
private Point origin;//蛇块的左上角位置
private bool isHead;//是否为蛇头
public int Number
{
get { return number; }
set { number = value; }
}
public Point Origin
{
get { return origin; }
set { origin = value; }
}
public bool IsHead
{
get { return isHead; }
set { isHead = value; }
}
//显示蛇块
public void Display(Graphics g)
{
SolidBrush sb;
if (isHead==true)
{
//蛇头
sb = new SolidBrush(Color.Red);
}
else
{
sb = new SolidBrush(Color.Blue);
}
g.FillEllipse(sb, origin.X, origin.Y,10,10);
}
//隐藏蛇块
public void UnDisplay(Graphics g)
{
SolidBrush sb = new SolidBrush(Color.Silver);
g.FillEllipse(sb, origin.X, origin.Y, 10, 10);
}
}
}
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 贪吃蛇游戏
{
public class Bean
{
public Point origin;//画食物左顶点坐标
//属性
public Point Origin
{
get { return origin; }
set { origin = value; }
}
//产生食物
public void Display(Graphics g)
{
//定义红色的画笔
SolidBrush sb = new SolidBrush(Color.Red);
//画实心矩形表示食物
g.FillRectangle(sb,origin.X, origin.Y, 10, 10);
}
//隐藏食物
public void UnDisplay(Graphics g)
{
//定义系统背景颜色的画笔
SolidBrush sb = new SolidBrush(Color.Silver);
//画实心矩形,颜色为系统背景颜色,相当于食物被吃掉了
g.FillRectangle(sb, origin.X, origin.Y, 10, 10);
}
}
}