该程序分成3个文件:
第一个文件:Fang.cs
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
namespace Snake
{
public class Fang:Button
{
public const int Len = 20;
//列索引
public int X
{
set
{
this.Left = value * Fang.Len;
}
get
{
return this.Left / Fang.Len;
}
}
//行索引
public int Y
{
set
{
this.Top = value * Fang.Len;
}
get
{
return this.Top / Fang.Len;
}
}
//坐标
public Point newLaction
{
set
{
this.X = ((Point)value).X;
this.Y = ((Point)value).Y;
}
get
{
return new Point(this.X, this.Y);
}
}
//构造函数
public Fang()
{
this.Size = new Size(Fang.Len, Fang.Len);
this.Enabled = false;
}
}
}
(这个文件定义了一个Fang类,继承于Button,蛇身是一个Fang的集合,食物是一个Fang类的对象)
第二个文件:Form1.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Collections;
namespace Snake
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public ArrayList Snake = new ArrayList();
public int snakeLen = 5;
public byte SnkDrt=6;
public bool sign;
public Fang food = new Fang();
public Fang first = new Fang();
//初始状态
public void Start()
{
this.panel1.Controls.Clear();
Snake.Clear();
SnkDrt = 6;
snakeLen = 5;
for (int i = 0; i<snakeLen; i++)
{
Fang body;
body = new Fang();
Snake.Add(body);
((Fang)Snake[i]).X = i;
((Fang)Snake[i]).Y = 0;
}
}
//食物
public void Food()
{
Random Ram = new Random();
food.X = Ram.Next(0, 19);
food.Y = Ram.Next(0, 12);
food.BackColor = Color.DarkGray;
this.panel1.Controls.Add(food);
}
//开始按钮
private void menuItem2_Click(object sender, EventArgs e)
{
Start();
Food();
for (int i = 0; i < snakeLen; i++)
{
this.panel1.Controls.Add((Fang)Snake[i]);
}
this.timer1.Enabled = true;
}
//判断
public bool Sign()
{
int ss;
ss = Math.Abs(((Fang)Snake[snakeLen - 1]).X - food.X) +
Math.Abs(((Fang)Snake[snakeLen - 1]).Y - food.Y);
if (ss == 1) return true;
else return false;
}
void timer1_Tick(object sender, System.EventArgs e)
{
Fang one = new Fang();
one.X = ((Fang)Snake[0]).X;
one.Y = ((Fang)Snake[0]).Y;
sign = Sign();
if (sign == false)
{
Forward(SnkDrt);
}
else
{
if (Eated()==false) Forward(SnkDrt);
else
{
Fang body = new Fang();
body.X = food.X;
body.Y = food.Y;
snakeLen++;
Snake.Add(body);
this.panel1.Controls.Add((Fang)Snake[snakeLen - 1]);
this.panel1.Controls.Remove(food);
Food();
}
}
if (Dead())
{
this.panel1.Controls.Add(one);
this.timer1.Enabled = false;
MessageBox.Show("游戏结束 ",":(",MessageBoxButtons.OK,MessageBoxIcon.Information);
}
}
//行走
public void Forward(int drc)
{
Point pt=new Point();
pt.X=((Fang)Snake[snakeLen-1]).X;
pt.Y=((Fang)Snake[snakeLen-1]).Y;
for (int i = 0; i < snakeLen-1; i++)
{
((Fang)Snake[i]).X = ((Fang)Snake[i + 1]).X;
((Fang)Snake[i]).Y = ((Fang)Snake[i + 1]).Y;
}
switch (drc)
{
case 6:
{
((Fang)Snake[snakeLen - 1]).X = pt.X + 1;
((Fang)Snake[snakeLen - 1]).Y = pt.Y;
break;
}
case 8:
{
((Fang)Snake[snakeLen - 1]).X = pt.X;
((Fang)Snake[snakeLen - 1]).Y = pt.Y - 1;
break;
}
case 5:
{
((Fang)Snake[snakeLen - 1]).X = pt.X;
((Fang)Snake[snakeLen - 1]).Y = pt.Y + 1;
break;
}
case 4:
{
((Fang)Snake[snakeLen - 1]).X = pt.X - 1;
((Fang)Snake[snakeLen - 1]).Y = pt.Y;
break;
}
}
}
void Form1_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
{
switch (e.KeyChar)
{
case '6':
{
if (SnkDrt != 4)
SnkDrt = 6;
break;
}
case '8':
{
if (SnkDrt != 5)
SnkDrt = 8;
break;
}
case '5':
{
if (SnkDrt != 8)
SnkDrt = 5;
break;
}
case '4':
{
if (SnkDrt != 6)
SnkDrt = 4;
break;
}
}
}
public bool Eated()
{
Fang body = new Fang();
body.X = food.X;
body.Y = food.Y;
switch (SnkDrt)
{
case 6:
{
if ((((Fang)Snake[snakeLen - 1]).X + 1) == body.X)
return true;
else return false;
}
case 8:
{
if ((((Fang)Snake[snakeLen - 1]).Y - 1) == body.Y)
return true;
else return false;
}
case 5:
{
if ((((Fang)Snake[snakeLen - 1]).Y + 1) == body.Y)
return true;
else return false;
}
case 4:
{
if ((((Fang)Snake[snakeLen - 1]).X - 1) == body.X)
return true;
else return false;
}
default: return false;
}
}
//Dead
public bool Dead()
{
for (int i = 0; i < snakeLen - 1; i++)
{
if (((Fang)Snake[snakeLen - 1]).X == ((Fang)Snake[i]).X &&
((Fang)Snake[snakeLen - 1]).Y == ((Fang)Snake[i]).Y)
return true;
}
switch (SnkDrt)
{
case 6:
{
if (((Fang)Snake[snakeLen - 1]).X == 20)
return true;
else return false;
}
case 8:
{
if (((Fang)Snake[snakeLen - 1]).Y ==-1)
return true;
else return false;
}
case 5:
{
if (((Fang)Snake[snakeLen - 1]).Y ==13 )
return true;
else return false;
}
case 4:
{
if (((Fang)Snake[snakeLen - 1]).X == -1)
return true;
else return false;
}
default: return false;
}
}
#region 难度选择
private void menuItem8_Click(object sender, EventArgs e)
{
this.timer1.Interval = 400;
}
private void menuItem9_Click(object sender, EventArgs e)
{
timer1.Interval = 200;
}
private void menuItem10_Click(object sender, EventArgs e)
{
timer1.Interval = 100;
}
#endregion
private void menuItem12_Click(object sender, EventArgs e)
{
MessageBox.Show("by p6 ", "作者", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
}
}
}
(这个文件主要是一些方法)
第3个文件是Form1.designer.cs,窗体设计代码,大多是VS自动生成的,代码很长就不帖出来了。