給妳源代碼
使用系統;
使用系統。收藏;
使用系統。繪圖;
使用系統。Windows . Forms
使用系統。計時器;
命名空間GreedySnake
{
#地區蛇蛇
///
///蛇的描述。
///
公共類蛇
{
私有控件dcControl
private static int imove direction = 0x 1000;//蛇的移動方向初始化為右-0x1000。
private int iCount//關節的總數
私人int iRadius//關節的半徑
私有靜態int iCurrentHeadX//當前蛇頭的中心坐標x。
私有靜態int iCurrentHeadY//當前蛇頭的中心坐標y。
私有靜態int iCurrentTrailX//當前蛇尾的中心坐標x。
私有靜態int iCurrentTrailY//當前蛇尾的中心坐標y。
iNextHeadX中的私有靜態int//下壹刻蛇頭的中心坐標x
iNextHeadY中的私有靜態int//下壹刻黑魚的中心坐標y
private static int iPreTrailX//前壹時刻蛇尾的中心坐標x。
私有靜態int iPreTrailY//前壹時刻蛇尾的中心坐標y。
私有靜態數組列表alSnake//存儲整條蛇。
private bool bDisposing = true
private bool bIsEatself = false//自己吃嗎?
private bool bIsOutOfRange = false;//是否超出許可活動範圍?
公共控制數據控制
{
設置{ dcControl = value}
get { return dcControl}
}
公共int移動方向
{
set { iMoveDirection = value}
get { return iMoveDirection}
}
公共int計數
{
設置{ iCount = value}
get { return iCount}
}
公共int半徑
{
set { iRadius = value}
get { return iRadius}
}
公共int CurrentHeadX
{
set { iCurrentHeadX = value}
get { return iCurrentHeadX}
}
公共int CurrentHeadY
{
set { iCurrentHeadY = value}
get { return iCurrentHeadY}
}
公共int CurrentTrailX
{
set { iCurrentTrailX = value}
get { return iCurrentTrailX}
}
公共int當前鐵路
{
set { iCurrentTrailY = value}
get { return iCurrentTrailY}
}
public int NextHeadX
{
set { iNextHeadX = value}
get { return iNextHeadX}
}
public int NextHeadY
{
set { iNextHeadY = value}
get { return iNextHeadY}
}
公共int PreTrailX
{
設置{ iPreTrailX = value}
get { return iPreTrailX}
}
公共int審前
{
設置{ iPreTrailY = value}
get { return iPreTrailY}
}
公共圖書館本身
{
設置{ bIsEatself = value}
get { return bIsEatself}
}
公共圖書館是獨立的
{
set { bIsOutOfRange = value}
get { return bIsOutOfRange}
}
public Snake() : this(null,20,5)
{
//
// TODO:在此添加構造函數邏輯。
//
}
公共蛇(控制控制,int iCount,int iRadius)
{
DcControl =控制;
Count = iCount
半徑= iRadius
current adex = current tralx = pre tralx = 5;
current heady = current traily = pre traily = 5;
initialize();
}
~蛇()
{
Dispose(假);
}
//初始化蛇
私有void初始化()
{
alSnake = new ArrayList();
for(int I = 0;我{
阿爾斯納克。Insert(0,new SnakeNode(DcControl,CurrentHeadX,CurrentHeadY,Radius));
current adex+= 2 *半徑;
}
current adex-= 2 *半徑;
next headx = current headx+2 * Radius;
NextHeadY = CurrentHeadY
}
公共void Dispose()
{
Dispose(真);
GC。suppress finalize(this);
}
公共void Dispose( bool bDisposing)
{
if (bDisposing)
{
//調用Dispose來處理受控資源中的字段。
move direction = 0x 1000;
current headx = current heady = next headx = next heady = 5;
阿爾斯納克。clear();
}
//清除不受控制的資源
}
//澆頭
公共void AddHead()
{
阿爾斯納克。Insert(0,new SnakeNode(DcControl,NextHeadX,NextHeadY,Radius));
CurrentHeadX = NextHeadX
CurrentHeadY = NextHeadY
count++;
}
//拖尾
公共void AddTrail()
{
阿爾斯納克。Add(new SnakeNode(DcControl,PreTrailX,PreTrailY,Radius));
count++;
((snake node)alSnake[Count-1])。draw();
}
//尾部移除
公共void RemoveTrail()
{
如果(alSnake。Count & gt1)
{
pretraillx =((snake node)alSnake[Count-1])。CenterX
pre trayly =((snake node)alSnake[Count-1])。CenterY
阿爾斯納克。RemoveAt(alSnake。count-1);
count-;
currenttralx =((snake node)alSnake[Count-1])。CenterX
current traily =((snake node)alSnake[Count-1])。CenterY
}
}
//移動到下壹個位置
公共void MoveNext()
{
//澆頭
AddHead();
//繪畫頭
((SnakeNode)alSnake[0])。draw();
//清除尾部(用背景色填充蛇尾)
((snake node)alSnake[Count-1])。clear();
//尾部移除(從ArrayList中移除蛇尾)
remove trail();
}
//畫出整條蛇
公共void Draw()
{
for(int I = 0;我{
((SnakeNode)alSnake[i])。draw();
}
}
//去掉整條蛇。
公共void清除()
{
for(int I = 0;我{
((SnakeNode)alSnake[i])。clear();
}
}
//重置運動方向
public void ResetMoveDirection(字符串strKeyData)
{
//獲取鍵盤輸入
int iKeyDirection
開關(strKeyData)
{
案例“W”:
案例“向上”:
ikey direction = 0x 0001;
打破;
案例“S”:
案例“向下”:
ikey direction = 0x 0010;
打破;
案例“A”:
案例“左”:
ikey direction = 0x 0100;
打破;
案例“D”:
案例“正確”:
ikey direction = 0x 1000;
打破;
默認值:
ikey direction = 0x 0010;
打破;
}
//重置蛇的移動方向(考慮關鍵點方向和當前蛇的移動方向)
int I direction = ikey direction | move direction;
if(I direction = = 0x 0011 | | I direction = = 0x 1100)
MoveDirection = MoveDirection//運動方向保持不變。
其他
MoveDirection = iKeyDirection//移動方向等於按鍵方向。
}
//是否超出範圍?
公共作廢支票()
{
GetNextHeadXY();
//檢查是否自己吃。
foreach(alSnake中的SnakeNode序列號)
{
如果(sn。CenterX = = NextHeadX & amp& ampsn。CenterY == NextHeadY)
{
IsEatself = true
打破;
}
}
//檢查是否超出允許的活動範圍。
IsOutOfRange = NextHeadX & lt0 | | NextHeadX & gtDcControl。Width | | NextHeadY & lt0 | | NextHeadY & gtDcControl。身高;
}
//預先計算下壹個位置的坐標
私有void GetNextHeadXY()
{
開關(移動方向)
{
案例0x0001:
NextHeadX = CurrentHeadX
next heady = current heady-2 * Radius;
打破;
案例0x0010:
NextHeadX = CurrentHeadX
next heady = current heady+2 * Radius;
打破;
案例0x0100:
NextHeadX = CurrentHeadX-2 * Radius;
NextHeadY = CurrentHeadY
打破;
案例0x1000:
next headx = current headx+2 * Radius;
NextHeadY = CurrentHeadY
打破;
默認值:
打破;
}
}
}
#結束區域
#區域蛇結蛇的關節
///
///蛇註
///蛇的關節
///
公共類SnakeNode
{
私有控件dcControl//用於繪制的控件。
private int iCenterX//中心坐標x
私人國際中心;//中心坐標y
私人int iRadius//半徑
私有顏色colorNode//顏色
公共控制數據控制
{
設置{ dcControl = value}
get { return dcControl}
}
公共集成中心x
{
set { iCenterX = value}
get { return iCenterX}
}
公共娛樂中心
{
set { iCenterY = value}
get { return iCenterY}
}
公共int半徑
{
set { iRadius = value}
get { return iRadius}
}
公共顏色節點
{
設置{ colorNode = value}
get { return colorNode}
}
private bool bDisposing = true
public SnakeNode() : this(null,0,0,5)
{
}
public SnakeNode(Control control,int iX,int iY,int iR)
{
DcControl =控制;
CenterX = iX
CenterY = iY
半徑= iR
}
~SnakeNode()
{
Dispose(假);
}
公共void Dispose()
{
Dispose(真);
GC。suppress finalize(this);
}
公共void Dispose( bool bDisposing)
{
if (bDisposing)
{
//調用Dispose來處理受控資源中的字段。
centex = CenterY = 0;
半徑= 5;
}
//清除不受控制的資源
}
//自己畫
公共void Draw()
{
繪制(顏色。藍色);
}
公共空白繪制(顏色顏色)
{
//用指定的顏色畫壹個圓。
ColorNode = color
draw circle(ColorNode);
}
//清除
公共void清除()
{
//用控件的背景色畫壹個圓。
繪制圓形(DcControl。背景色);
}
//以關節為圓心畫壹個圓。
公共空心畫圈(顏色顏色)
{
使用(圖形dc = DcControl。CreateGraphics())
{
//創建實心畫筆
solid brush sb brush = new solid brush(color);
//創建圓的範圍。
float x = CenterX-Radius;
float y =中心半徑;
浮動寬度= 2 *半徑;
浮動高度= 2 *半徑;
//創建開始和掃描的弧度。
float fStartAngle = 0.0F
float fSweepAngle = 360.0F
//畫壹個圓
華盛頓。FillPie(sbBrush,x,y,width,height,fStartAngle,fSweepAngle);
}
}
}
#結束區域
#地區蛇食蛇食
///
///蛇食的描述。
///
公共類蛇食
{
私有控件dcControl
private int iMaxCount//剩余食物的最大數量。
private int iCurrentCount//目前剩余的食物總量
私人int iRadius//關節的半徑
private Color[]acolor = new Color[]{ Color。紅色,彩色。綠色,彩色。黃色};//新點的顏色範圍
私有靜態數組列表alSnakeFood//蛇食
private bool bDisposing = true
公共控制數據控制
{
設置{ dcControl = value}
get { return dcControl}
}
public int MaxCount
{
set { iMaxCount = value}
get { return iMaxCount}
}
公共國際貨幣賬戶
{
set { iCurrentCount = value}
get { return iCurrentCount}
}
公共int半徑
{
set { iRadius = value}
get { return iRadius}
}
public SnakeNode this[int index]
{
得到
{
if(index & lt;0 | | index & gt=當前計數)
{
拋出新的IndexOutOfRangeException();
}
return(snake node)alSnakeFood[index];
}
}
public SnakeFood() : this(null,5,5)
{
}
公共蛇食(控制控制,int iMaxCount,int iRadius)
{
DcControl =控制;
MaxCount = iMaxCount
current count = 0;
半徑= iRadius
alSnakeFood = new ArrayList();
}
~蛇食()
{
Dispose(假);
}
公共void Dispose()
{
Dispose(真);
GC。suppress finalize(this);
}
公共void Dispose( bool bDisposing)
{
if (bDisposing)
{
//調用Dispose來處理受控資源中的字段。
current count = 0;
alSnakeFood。clear();
}
//清除不受控制的資源
}
//添加食物
public void AddFood()
{
Random Random = new Random();
int iStep = Radius+Radius;
int iX = Radius + iStep * random。下壹個(0,DcControl。width/iStep);
int iY = Radius + iStep * random。下壹個(0,DcControl。height/iStep);
snake node sn = new snake node(DC control,iX,iY,iRadius);
Random Random index = new Random();
Color color = acolor[randomIndex。下壹個(0,acolor。長度)];
顏色=色彩。綠色;
sn。繪制(顏色);
alSnakeFood。添加(序列號);
//目前剩余的食物總量加上1。
current count++;
}
//刪除吃過的食物。
公共void remove food(int index)
{
if(current count & gt;0)
{
alSnakeFood。remove at(iIndex);
//目前剩余食物總量減少1。
當前計數-;
}
}
//畫出所有的食物
公共void Draw()
{
foreach(alSnakeFood中的SnakeNode序列號)
{
sn。draw();
}
}
//取出所有食物。
公共void清除()
{
foreach(alSnakeFood中的SnakeNode序列號)
{
sn。clear();
}
}
}
#結束區域
}