using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Collections;
namespace snack
{
public class Snake
{
ArrayList blockList;//字段
private int headNumber;//蛇头序数或蛇的长度
private Point headPoint;//蛇头位置(左上角坐标)
private int direction = 1;//0,1,2,3分别代表上、右、下、左
public Snake() { }//不带参数的构造函数
public Point getHeadPoint
{
get{return headPoint;}
}
public bool getHitself //只读蛇是否到墙或碰到自身属性
{
get
{
IEnumerator myEnumerator=blockList.GetEnumerator();//定义并实例化枚举接口
try
{
while (myEnumerator.MoveNext())//通过循环遍历蛇的各个块
{
Block b=(Block)myEnumerator.Current;//读取当前块
//当前不是蛇头且与蛇头位置相同
if(b.Number!=headNumber&&b.Origin.Equals(headPoint))
return true ;//返回true
}
}
catch (Exception e)
{
System.Console.WriteLine(e.ToString());
}
return false;//返回false
}
}
public int Direction //蛇的运行方向属性
{
get{return direction;}
set{direction=value;}
}
public void TurnDirection(int pDirection)//蛇转向,参数为蛇改变的方向
{
switch (direction)
{
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 Groth() //蛇增长方法
{
Block bb=new Block();//定义并实例化新块
while (myEnumerator.MoveNext())//通过循环遍历蛇的各个块
{
Block b=(Block)myEnumerator.Current;//读取当前块
if(b.Number==headNumber) //如果当前块是蛇头
{
int x=b.Origin.X;//读取当前块即蛇头的位置坐标
int y=b.Origin.X;
switch (direction) //根据当前运动方向设置新块坐标
{
case 0:y=y-5;break;//向上y坐标减
case 1:x=x+5;break;
case 2:y=y+5;break;
case 3:x=x-5;break;
}
Point headP=new Point (x,y);//由坐标构造头位置点
bb.Origin=headP; //把点赋值给新块的位置属性
bb.Number=b.Number+1;//当前块的序数+1赋值给新块的序数属性
blockList.Add(bb);//把新块添加到blockList中
headNumber ++;//头块的序数(蛇的长度)增加
headPoint=headP;//给头位置赋新值
}
}
}
public void Display(Graphics g) //显示蛇,参数为图形对象
{
try
{
Block b=new Block();//定义并初始化新块b
b=(Block)blockList[0];//取出blockList的第一个元素b
b.UnDisplay(g);//消除b块显示
blockList.RemoveAt(0);//从blockList中移出第一个块
Block bb=new Block();//定义新块并初始化
IEnumerator mynumerator=blockList.GetEnumerator();//定义枚举接口并初始化
while(mynumerator.MoveNext()) //通过循环体遍历数组
{
b=(Block)mynumerator.Current;//读取当前块并给b
b.Number--; //当前块的序数属性值减
if(b.Number==(headNumber-1))//如果是最后一块,前面增加一块
{
int x=b.Origin.X;
int y=b.Origin.Y;
switch (direction)//根据蛇运行的方向,确定增加块的位置
{
case 0:y=y-5;break;//向上y坐标减
case 1:x=x+5;break;
case 2:y=y+5;break;
case 3:x=x-5;break;
}
Point headP=new Point(x,y);
bb.Origin=headP;
bb.Number=headNumber;
bb.Display(g);
headPoint=bb.Origin;//重新指定蛇头的点
}
b.Display(g);
}
blockList.Add(bb);
}
catch(Exception e)
{
System.Console.WriteLine(e.ToString());
}
}
public void UnDisplay(Graphics g)//消除蛇方法
{
try
{
Block bb=new Block(); //定义实例化新块
//定义枚举接口变量并实例化
IEnumerator myEnumerator=blockList.GetEnumerator();
while (myEnumerator.MoveNext()) //通过循环遍历数组
{
Block b=(Block)myEnumerator.Current;// 读取当前块
b.UnDisplay(g);//消除当前块
}
}
catch (Exception e)
{
System.Console.WriteLine(e.ToString());
}
}
public void Reset(Point dian, int count) //重新构造蛇
{
Block bb;
Point p = new Point(vertex.X + 25, vertex.Y + 25);//定义开始位置
blockList = new ArrayList(count);//初始数组长度为count
for (int i = 0; i < count; i++) //通过循环填充blockList
{
p.X = p.X + 5;//x坐标加
bb = new Block();//实例化新块
bb.Origin = p;//块的位置赋值
bb.Number = i + 1;//蛇中块序数从1开始
blockList.Add(bb);//把块添加到blockList中
//如果是蛇头就把位置(顶点)赋值给headPoint
if (i == count - 1) headPoint = bb.Origin;//给蛇的头位置赋值
}
headNumber = count;//给蛇头序数(蛇长度)赋值
}
public Snake(Point vertex,int count)
{Reset(Point vertex,int count);}
}
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Collections;
namespace snack
{
public class Snake
{
ArrayList blockList;//字段
private int headNumber;//蛇头序数或蛇的长度
private Point headPoint;//蛇头位置(左上角坐标)
private int direction = 1;//0,1,2,3分别代表上、右、下、左
public Snake() { }//不带参数的构造函数
public Point getHeadPoint
{
get{return headPoint;}
}
public bool getHitself //只读蛇是否到墙或碰到自身属性
{
get
{
IEnumerator myEnumerator=blockList.GetEnumerator();//定义并实例化枚举接口
try
{
while (myEnumerator.MoveNext())//通过循环遍历蛇的各个块
{
Block b=(Block)myEnumerator.Current;//读取当前块
//当前不是蛇头且与蛇头位置相同
if(b.Number!=headNumber&&b.Origin.Equals(headPoint))
return true ;//返回true
}
}
catch (Exception e)
{
System.Console.WriteLine(e.ToString());
}
return false;//返回false
}
}
public int Direction //蛇的运行方向属性
{
get{return direction;}
set{direction=value;}
}
public void TurnDirection(int pDirection)//蛇转向,参数为蛇改变的方向
{
switch (direction)
{
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 Groth() //蛇增长方法
{
Block bb=new Block();//定义并实例化新块
while (myEnumerator.MoveNext())//通过循环遍历蛇的各个块
{
Block b=(Block)myEnumerator.Current;//读取当前块
if(b.Number==headNumber) //如果当前块是蛇头
{
int x=b.Origin.X;//读取当前块即蛇头的位置坐标
int y=b.Origin.X;
switch (direction) //根据当前运动方向设置新块坐标
{
case 0:y=y-5;break;//向上y坐标减
case 1:x=x+5;break;
case 2:y=y+5;break;
case 3:x=x-5;break;
}
Point headP=new Point (x,y);//由坐标构造头位置点
bb.Origin=headP; //把点赋值给新块的位置属性
bb.Number=b.Number+1;//当前块的序数+1赋值给新块的序数属性
blockList.Add(bb);//把新块添加到blockList中
headNumber ++;//头块的序数(蛇的长度)增加
headPoint=headP;//给头位置赋新值
}
}
}
public void Display(Graphics g) //显示蛇,参数为图形对象
{
try
{
Block b=new Block();//定义并初始化新块b
b=(Block)blockList[0];//取出blockList的第一个元素b
b.UnDisplay(g);//消除b块显示
blockList.RemoveAt(0);//从blockList中移出第一个块
Block bb=new Block();//定义新块并初始化
IEnumerator mynumerator=blockList.GetEnumerator();//定义枚举接口并初始化
while(mynumerator.MoveNext()) //通过循环体遍历数组
{
b=(Block)mynumerator.Current;//读取当前块并给b
b.Number--; //当前块的序数属性值减
if(b.Number==(headNumber-1))//如果是最后一块,前面增加一块
{
int x=b.Origin.X;
int y=b.Origin.Y;
switch (direction)//根据蛇运行的方向,确定增加块的位置
{
case 0:y=y-5;break;//向上y坐标减
case 1:x=x+5;break;
case 2:y=y+5;break;
case 3:x=x-5;break;
}
Point headP=new Point(x,y);
bb.Origin=headP;
bb.Number=headNumber;
bb.Display(g);
headPoint=bb.Origin;//重新指定蛇头的点
}
b.Display(g);
}
blockList.Add(bb);
}
catch(Exception e)
{
System.Console.WriteLine(e.ToString());
}
}
public void UnDisplay(Graphics g)//消除蛇方法
{
try
{
Block bb=new Block(); //定义实例化新块
//定义枚举接口变量并实例化
IEnumerator myEnumerator=blockList.GetEnumerator();
while (myEnumerator.MoveNext()) //通过循环遍历数组
{
Block b=(Block)myEnumerator.Current;// 读取当前块
b.UnDisplay(g);//消除当前块
}
}
catch (Exception e)
{
System.Console.WriteLine(e.ToString());
}
}
public void Reset(Point dian, int count) //重新构造蛇
{
Block bb;
Point p = new Point(vertex.X + 25, vertex.Y + 25);//定义开始位置
blockList = new ArrayList(count);//初始数组长度为count
for (int i = 0; i < count; i++) //通过循环填充blockList
{
p.X = p.X + 5;//x坐标加
bb = new Block();//实例化新块
bb.Origin = p;//块的位置赋值
bb.Number = i + 1;//蛇中块序数从1开始
blockList.Add(bb);//把块添加到blockList中
//如果是蛇头就把位置(顶点)赋值给headPoint
if (i == count - 1) headPoint = bb.Origin;//给蛇的头位置赋值
}
headNumber = count;//给蛇头序数(蛇长度)赋值
}
public Snake(Point vertex,int count)
{Reset(Point vertex,int count);}
}