C#實(shí)現(xiàn)貪吃蛇小游戲
本文實(shí)例為大家分享了C#實(shí)現(xiàn)貪吃蛇小游戲的具體代碼,供大家參考,具體內(nèi)容如下
之前一直想寫(xiě)一個(gè)貪吃蛇小游戲,上個(gè)周末終于有時(shí)間做了一個(gè),現(xiàn)在和大家分享。
界面
界面比較簡(jiǎn)單,一個(gè)按鈕和一個(gè)積分器組成。
基本邏輯:每五個(gè)食物出現(xiàn)一次大食物,小食物1分,大食物5分。
控制:撞墻和纏繞時(shí),游戲暫停。
代碼詳解
詳細(xì)介紹下代碼
一、代碼分詳解
1.界面是在pc上,所以移動(dòng)以上下左右鍵來(lái)控制移動(dòng),為了及時(shí)響應(yīng),所以增加如下代碼
protected override bool ProcessDialogKey(Keys keyData) ? ? ? ? { ? ? ? ? ? ? //遇到上下左右鍵 就自定義處理 ? ? ? ? ? ? if (keyData == Keys.Up || keyData == Keys.Down || ? ? ? ? ? ? keyData == Keys.Left || keyData == Keys.Right) ? ? ? ? ? ? ? ? return false; ? ? ? ? ? ? else ? ? ? ? ? ? ? ? return base.ProcessDialogKey(keyData); ? ? ? ? }
2.做個(gè)枚舉,來(lái)標(biāo)記某個(gè)時(shí)間狀態(tài)下蛇的移動(dòng)方向,配合鍵盤(pán)按鍵
/// <summary> /// 方向枚舉 /// </summary> ? ? public enum SnakeDirection ? ? { ? ? ? ? Left, ? ? ? ? Right, ? ? ? ? Down, ? ? ? ? Up ? ? } ? ? ? ? ? ? /// <summary> ? ? ? ? /// 鍵盤(pán)和鼠標(biāo)按下時(shí) 處理 但必須有控件 ? ? ? ? /// </summary> ? ? ? ? /// <param name="sender"></param> ? ? ? ? /// <param name="e"></param> ? ? ? ? private void SnakeForm_KeyDown(object sender, KeyEventArgs e) ? ? ? ? { ? ? ? ? ? ? if (e.KeyCode == Keys.Up) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? Snake.Sd = SnakeDirection.Up; ? ? ? ? ? ? } ? ? ? ? ? ? else if (e.KeyCode == Keys.Down) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? Snake.Sd = SnakeDirection.Down; ? ? ? ? ? ? } ? ? ? ? ? ? else if (e.KeyCode == Keys.Left) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? Snake.Sd = SnakeDirection.Left; ? ? ? ? ? ? } ? ? ? ? ? ? else if (e.KeyCode == Keys.Right) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? Snake.Sd = SnakeDirection.Right; ? ? ? ? ? ? } ? ? ? ? }
3.聲明一個(gè)蛇的類(lèi),存儲(chǔ)所有蛇的相關(guān)信息,如所有蛇身體的節(jié)點(diǎn)位置
public class Snake
主要變量如下
public static SnakeDirection Sd;//蛇進(jìn)行的方向 上下左右四個(gè)方向 public int Location_X;//0為x,1為y 蛇的初始位置 public int Location_Y; public static List<Snake> Snakebody = new List<Snake>();//蛇身子的具體位置,每次位移都刷新一次 整個(gè)蛇身子的所有位置 ?最后一位是蛇頭? public static int width = 10, height = 10; public static int CurScore = 1;//當(dāng)前食物的分?jǐn)?shù) public static int AllScore = -1;//總分?jǐn)?shù) public static int MaxScore = 5;//大分出現(xiàn)頻次
4.聲明一個(gè)食物的類(lèi),同時(shí)增加一個(gè)方法,隨機(jī)在界面上的一個(gè)位置顯示食物
public class Food ? ? { ? ? ? ? public int Food_Location_X; ? ? ? ? public int Food_Location_Y; ? ? ? ? public Food() ? ? ? ? { ? ? ? ? ? ? Random x = new Random(); ? ? ? ? ? ? Random y = new Random(); ? ? ? ? ? ? Food_Location_X = x.Next(0, 49) * 10;//隨機(jī)點(diǎn)出現(xiàn)食物 ? ? ? ? ? ? Food_Location_Y = y.Next(0, 49) * 10;//隨機(jī)點(diǎn)出現(xiàn)食物 ? ? ? ? } ? ? }
5.點(diǎn)擊開(kāi)始按鈕,觸發(fā)開(kāi)始相關(guān)方法,主要是啟動(dòng)刷新的時(shí)間器,初始化食物位置,初始化積分等
public ?void refreshScore() ? ? ? ? { ? ? ? ? ? ? Snake.AllScore = Snake.AllScore+ Snake.CurScore; ? ? ? ? ? ?this.SnakeScore.Text = Convert.ToString(Snake.AllScore); ? ? ? ? } ? ? ? ? private int FoodX = 0;//食物X軸 ? ? ? ? private int FoodY = 0;//食物Y軸 ? ? ? ? private void BeginBtn_Click(object sender, EventArgs e) ? ? ? ? { ? ? ? ? ? ? Snake.Start();//創(chuàng)建蛇 ? ? ? ? ? ? CreateNewFood(); ? ? ? ? ? ? StartTimer.Start(); ? ? ? ? ? ? StartTimer.Interval = 100;//毫秒刷新一次 ? ? ? ? }
6.定時(shí)器啟動(dòng)后,定時(shí)刷新,我這邊設(shè)置的是100毫秒,也可以做一個(gè)前端設(shè)置按鈕,增加游戲趣味性,同時(shí)也可以設(shè)置根據(jù)不同的積分處理此設(shè)置
定時(shí)器中有畫(huà)蛇身體的方法、隨機(jī)一個(gè)食物位置的方法、蛇移動(dòng)的方法、蛇是否吃到食物的方法、游戲有沒(méi)有結(jié)束的方法
/// <summary> /// 開(kāi)始的定時(shí)器 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> ? ? ? ? private void StartTimer_Tick(object sender, EventArgs e) ? ? ? ? { ? ? ? ? ? ? DrawSnake(); ? ? ? ? ? ? DrawFood(); ? ? ? ? ? ? Snake.Move(Snake.Sd);//蛇移動(dòng) 移動(dòng)的方向鍵盤(pán)控制 ? ? ? ? ? ? EatFood(); ? ? ? ? ? ? IsOrNotGameOver(); ? ? ? ? ? ? ? ? ? ? }
7.畫(huà)蛇的方法如下
/// <summary> /// 畫(huà)蛇 /// </summary> ? ? ? ? public void DrawSnake() ? ? ? ? { ? ? ? ? ? ? RectangleF[] rectangles = new RectangleF[Snake.Snakebody.Count]; ? ? ? ? ? ? int num; ? ? ? ? ? ? for (num = 0; num < Snake.Snakebody.Count; num++) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? rectangles[num] = new RectangleF(Snake.Snakebody[num].Location_X, ? ? ? ? ? ? ? ? ? ? Snake.Snakebody[num].Location_Y, Snake.width, Snake.height); ? ? ? ? ? ? } ? ? ? ? ? ? this.Refresh(); ? ? ? ? ? ? Graphics g = this.Snake_Panel.CreateGraphics(); ? ? ? ? ? ? SolidBrush myBrush = new SolidBrush(Color.Black); ? ? ? ? ? ? g.FillRectangles(myBrush, rectangles); ? ? ? ? }
8.食物顯示的方法如下,其中MaxScore表示小食物出現(xiàn)的次數(shù),每出現(xiàn)一次此值減一,當(dāng)為0時(shí),食物變?yōu)榇笫澄铩?/p>
/// <summary> /// 食物的位置 /// </summary> ? ? ? ? public void DrawFood() ? ? ? ? { ? ? ? ? ? ? Graphics f = this.Snake_Panel.CreateGraphics(); ? ? ? ? ? ? SolidBrush mybrush = new SolidBrush(Color.Red); ? ? ? ? ?? ? ? ? ? ? ? if (Snake.MaxScore==0) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? f.FillRectangle(mybrush, FoodX, FoodY, 20, 20);//隨機(jī)了食物的位置 ? ? ? ? ? ? } ? ? ? ? ? ? else ? ? ? ? ? ? { ? ? ? ? ? ? ? ? f.FillRectangle(mybrush, FoodX, FoodY, 10, 10);//隨機(jī)了食物的位置 ? ? ? ? ? ? } ? ? ? ? }
9.當(dāng)每次刷新時(shí),蛇都會(huì)移動(dòng),相應(yīng)的蛇整體的位置也會(huì)發(fā)生變化,但蛇身有痕跡,所以使用如下方式進(jìn)行蛇體變化
//蛇的移動(dòng)操作 每次移動(dòng) 都需要改變蛇身體 public static void Move(SnakeDirection Sd) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? int i = Snakebody.Count - 1;//根據(jù)不同的移動(dòng)方向 需要對(duì)相對(duì)位置發(fā)生變化,這個(gè)操作保證蛇身按照蛇頭的軌跡運(yùn)轉(zhuǎn) ? ? ? ? ? ? ? ? switch (Sd) ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? case SnakeDirection.Up: ? ? ? ? ? ? ? ? ? ? ? ? ChangeSnakeLine(); ? ? ? ? ? ? ? ? ? ? ? ? Snakebody[i].Location_Y -= 10; ? ? ? ? ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? ? ? ? ? case SnakeDirection.Left: ? ? ? ? ? ? ? ? ? ? ? ? ChangeSnakeLine(); ? ? ? ? ? ? ? ? ? ? ? ? Snakebody[i].Location_X -= 10; ? ? ? ? ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? ? ? ? ? case SnakeDirection.Down: ? ? ? ? ? ? ? ? ? ? ? ? ChangeSnakeLine(); ? ? ? ? ? ? ? ? ? ? ? ? Snakebody[i].Location_Y += 10; ? ? ? ? ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? ? ? ? ? case SnakeDirection.Right: ? ? ? ? ? ? ? ? ? ? ? ? ChangeSnakeLine(); ? ? ? ? ? ? ? ? ? ? ? ? Snakebody[i].Location_X += 10; ? ? ? ? ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } ? ? ? ? ? ? /// <summary> ? ? ? ? ? ? /// 每次移動(dòng)一次 改變蛇身體的相對(duì)位置 ? ? ? ? ? ? /// </summary> ? ? ? ? ? ? public static void ChangeSnakeLine() ? ? ? ? ? ? { ? ? ? ? ? ? ? ? int j = 0; ? ? ? ? ? ? ? ? int x, y; ? ? ? ? ? ? ? ? int i = Snakebody.Count - 1; ? ? ? ? ? ? ? ? for (j = 0; j < i; j++)//蛇 1位置變?yōu)樯? ?2=》1 ?3=》2 ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? x = Snakebody[j + 1].Location_X; ? ? ? ? ? ? ? ? ? ? y = Snakebody[j + 1].Location_Y; ? ? ? ? ? ? ? ? ? ? Snakebody[j].Location_Y = y; ? ? ? ? ? ? ? ? ? ? Snakebody[j].Location_X = x; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? }
10.刷新蛇身體后,要判斷食物位置是否和蛇頭碰撞,當(dāng)發(fā)生碰撞時(shí),表示蛇吃掉了食物,食物刷新,蛇身體增長(zhǎng)
/// <summary> /// 吃掉食物 判斷蛇頭位置和食物位置相同時(shí),食物重新刷新 /// </summary> ? ? ? ? public void EatFood() ? ? ? ? { ? ? ? ? ? ? if (Snake.Snakebody[Snake.Snakebody.Count - 1].Location_X == FoodX ? ? ? ? ? ? ? ? && Snake.Snakebody[Snake.Snakebody.Count - 1].Location_Y == FoodY) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? Snake.AddBody();//增加 蛇身增加 ? ? ? ? ? ? ? ? //吃掉食物之后 隨機(jī)創(chuàng)建一個(gè)新的食物 ? ? ? ? ? ? ? ? CreateNewFood(); ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? ? ? ? ? ? ? //吃一個(gè)節(jié)點(diǎn) 變?yōu)樾碌纳哳^ ? ? ? ? ? ? public static void AddBody() ? ? ? ? ? ? { ? ? ? ? ? ? ? ? Snake S_eat = new Snake(); ? ? ? ? ? ? ? ? int xx = Snakebody[Snakebody.Count - 1].Location_X; ? ? ? ? ? ? ? ? int yy = Snakebody[Snakebody.Count - 1].Location_Y; ? ? ? ? ? ? ? ? switch (Sd) ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? case SnakeDirection.Up: ? ? ? ? ? ? ? ? ? ? ? ? S_eat.Location_Y = yy - 10; ? ? ? ? ? ? ? ? ? ? ? ? S_eat.Location_X = xx; ? ? ? ? ? ? ? ? ? ? ? ? Snakebody.Add(S_eat); ? ? ? ? ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? ? ? ? ? case SnakeDirection.Left: ? ? ? ? ? ? ? ? ? ? ? ? S_eat.Location_X = xx - 10; ? ? ? ? ? ? ? ? ? ? ? ? S_eat.Location_Y = yy; ? ? ? ? ? ? ? ? ? ? ? ? Snakebody.Add(S_eat); ? ? ? ? ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? ? ? ? ? case SnakeDirection.Down: ? ? ? ? ? ? ? ? ? ? ? ? S_eat.Location_Y = yy + 10; ? ? ? ? ? ? ? ? ? ? ? ? S_eat.Location_X = xx; ? ? ? ? ? ? ? ? ? ? ? ? Snakebody.Add(S_eat); ? ? ? ? ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? ? ? ? ? case SnakeDirection.Right: ? ? ? ? ? ? ? ? ? ? ? ? S_eat.Location_Y = yy; ? ? ? ? ? ? ? ? ? ? ? ? S_eat.Location_X = xx + 10; ? ? ? ? ? ? ? ? ? ? ? ? Snakebody.Add(S_eat); ? ? ? ? ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? }
11.食物被吃掉后,食物刷新,同時(shí)判斷小食物出現(xiàn)的次數(shù)
/// </summary> public void CreateNewFood() ? ? ? ? { ? ? ? ? ? ? refreshScore(); ? ? ? ? ? ? bool IsCreate = false; ? ? ? ? ? ? while (!IsCreate)//是否創(chuàng)建成功 ? ? ? ? ? ? { ? ? ? ? ? ? ? ? Food NewFood = new Food(); ? ? ? ? ? ? ? ? FoodX = NewFood.Food_Location_X; ? ? ? ? ? ? ? ? FoodY = NewFood.Food_Location_Y; ? ? ? ? ? ? ? ? //判斷這個(gè)不會(huì)出現(xiàn)在蛇身上 ? ? ? ? ? ? ? ? IsCreate = true;//創(chuàng)建成功 ? ? ? ? ? ? ? ? for (int i = 0; i < Snake.Snakebody.Count; i++) ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? if (Snake.Snakebody[i].Location_X == FoodX && Snake.Snakebody[i].Location_Y == FoodY)//當(dāng)坐標(biāo)相同 終止for 未創(chuàng)建成功 ? ? ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? IsCreate = false; ? ? ? ? ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? if (IsCreate) ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? if (!(FoodX <= this.Snake_Panel.Width-10 && FoodX >= 10 && FoodY <= this.Snake_Panel.Height-10 && FoodY >= 10))//食物不在范圍內(nèi) 重新刷新 ? ? ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? IsCreate = false; ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? if (IsCreate) ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? if (Snake.Snakebody.Count != 4) ? ? ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? Snake.MaxScore--;//不是第一次創(chuàng)建食物時(shí) ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ? ? Snake.CurScore = 1;//當(dāng)前小節(jié)點(diǎn)的分?jǐn)?shù) ? ? ? ? ? ? ? ? ? ? if (Snake.MaxScore == 0) ? ? ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? Snake.CurScore = 5;//當(dāng)前小節(jié)點(diǎn)的分?jǐn)?shù) ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ? ? else if (Snake.MaxScore<0) ? ? ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? Snake.MaxScore = 5;//初始化次數(shù) ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ?? ? ? ? ? ? ? } ? ? ? ? }
12.每次定時(shí)器刷新,蛇身會(huì)發(fā)生變化,同時(shí)就需要判斷蛇是否觸發(fā)終止規(guī)則
蛇身體纏繞,蛇頭碰壁表示游戲終止
/// <summary> ///? /// </summary> public void IsOrNotGameOver() ? ? ? ? { ? ? ? ? ? ? int x = Snake.Snakebody[Snake.Snakebody.Count - 1].Location_X; ? ? ? ? ? ? int y = Snake.Snakebody[Snake.Snakebody.Count - 1].Location_Y; ? ? ? ? ? ? bool IsGameOver = false; ? ? ? ? ? ? if (!(x <= this.Snake_Panel.Width && x >= 0 && y <= this.Snake_Panel.Height && y >= 0))//蛇頭碰觸到邊框 ? ? ? ? ? ? { ? ? ? ? ? ? ? ? IsGameOver = true; ? ? ? ? ? ? } ? ? ? ? ? ? //蛇頭碰到自己蛇身 ? ? ? ? ? ? for(int i=0;i< Snake.Snakebody.Count - 2; i++) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? if(Snake.Snakebody[i].Location_X==x&& Snake.Snakebody[i].Location_Y == y) ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? IsGameOver = true; ? ? ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } ? ? ? ? ? ? if (IsGameOver) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? GameOver(); ? ? ? ? ? ? ? ? StartTimer.Stop(); ? ? ? ? ? ? } ? ? ? ? }
以上就是整個(gè)蛇運(yùn)行的邏輯
二、完整代碼
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; namespace Project_Snake { ? ? public partial class SnakeForm : Form ? ? { ? ? ? ? public SnakeForm() ? ? ? ? { ? ? ? ? ? ? InitializeComponent(); ? ? ? ? } ? ? ? ? //為了上下左右鍵起作用 需要重寫(xiě)這個(gè)操作 ? ? ? ? protected override bool ProcessDialogKey(Keys keyData) ? ? ? ? { ? ? ? ? ? ? //遇到上下左右鍵 就自定義處理 ? ? ? ? ? ? if (keyData == Keys.Up || keyData == Keys.Down || ? ? ? ? ? ? keyData == Keys.Left || keyData == Keys.Right) ? ? ? ? ? ? ? ? return false; ? ? ? ? ? ? else ? ? ? ? ? ? ? ? return base.ProcessDialogKey(keyData); ? ? ? ? } ? ? ? ? /// <summary> ? ? ? ? /// 鍵盤(pán)和鼠標(biāo)按下時(shí) 處理 但必須有控件 ? ? ? ? /// </summary> ? ? ? ? /// <param name="sender"></param> ? ? ? ? /// <param name="e"></param> ? ? ? ? private void SnakeForm_KeyDown(object sender, KeyEventArgs e) ? ? ? ? { ? ? ? ? ? ? if (e.KeyCode == Keys.Up) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? Snake.Sd = SnakeDirection.Up; ? ? ? ? ? ? } ? ? ? ? ? ? else if (e.KeyCode == Keys.Down) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? Snake.Sd = SnakeDirection.Down; ? ? ? ? ? ? } ? ? ? ? ? ? else if (e.KeyCode == Keys.Left) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? Snake.Sd = SnakeDirection.Left; ? ? ? ? ? ? } ? ? ? ? ? ? else if (e.KeyCode == Keys.Right) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? Snake.Sd = SnakeDirection.Right; ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? /// <summary> ? ? ? ? /// 蛇的控件 記錄蛇的基本方法 ? ? ? ? /// </summary> ? ? ? ? public class Snake ? ? ? ? { ? ? ? ? ? ? public static SnakeDirection Sd;//蛇進(jìn)行的方向 上下左右四個(gè)方向 ? ? ? ? ? ? public int Location_X;//0為x,1為y 蛇的初始位置 ? ? ? ? ? ? public int Location_Y; ? ? ? ? ? ? public static List<Snake> Snakebody = new List<Snake>();//蛇身子的具體位置,每次位移都刷新一次 整個(gè)蛇身子的所有位置 ?最后一位是蛇頭? ? ? ? ? ? ? public static int width = 10, height = 10; ? ? ? ? ? ? public static int CurScore = 1;//當(dāng)前食物的分?jǐn)?shù) ? ? ? ? ? ? public static int AllScore = -1;//總分?jǐn)?shù) ? ? ? ? ? ? public static int MaxScore = 5;//大分出現(xiàn)頻次 ? ? ? ? ? ? //當(dāng)前方向 ? ? ? ? ? ? public Snake() ? ? ? ? ? ? { ? ? ? ? ? ? ? ? Location_X = 300; ? ? ? ? ? ? ? ? Location_Y = 300; ? ? ? ? ? ? } ? ? ? ? ? ? /// <summary> ? ? ? ? ? ? /// 蛇初始化 朝向 初始長(zhǎng)度等 ? ? ? ? ? ? /// </summary> ? ? ? ? ? ? public static void Start() ? ? ? ? ? ? { ? ? ? ? ? ? ? ? MaxScore = 5; ? ? ? ? ? ? ? ? AllScore = -1; ? ? ? ? ? ? ? ? CurScore = 1; ? ? ? ? ? ? ? ? Sd = SnakeDirection.Left;//默認(rèn)往左跑 ? ? ? ? ? ? ? ? Snakebody.Clear();//每次操作舍身重置 ? ? ? ? ? ? ? ? //添加初始化的小蛇位置 ? ? ? ? ? ? ? ? Snake s0 = new Snake();//蛇1 ? ? ? ? ? ? ? ? Snake s1 = new Snake();//蛇2 ? ? ? ? ? ? ? ? Snake s2 = new Snake(); ? ? ? ? ? ? ? ? Snake s3 = new Snake(); ? ? ? ? ? ? ? ? //默認(rèn)四個(gè)長(zhǎng)度 蛇的位置 ? ? ? ? ? ? ? ? Snakebody.Add(s0);//默認(rèn)蛇1位置 ? Snakebody[0]是蛇頭 ? ? ? ? ? ? ? ? s1.Location_X = s0.Location_X - 10; ? ? ? ? ? ? ? ? Snakebody.Add(s1); ? ? ? ? ? ? ? ? s2.Location_X = s1.Location_X - 10; ? ? ? ? ? ? ? ? Snakebody.Add(s2); ? ? ? ? ? ? ? ? s3.Location_X = s2.Location_X - 10; ? ? ? ? ? ? ? ? Snakebody.Add(s3); ? ? ? ? ? ? } ? ? ? ? ? ? //蛇的移動(dòng)操作 每次移動(dòng) 都需要改變蛇身體 ? ? ? ? ? ? public static void Move(SnakeDirection Sd) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? int i = Snakebody.Count - 1;//根據(jù)不同的移動(dòng)方向 需要對(duì)相對(duì)位置發(fā)生變化,這個(gè)操作保證蛇身按照蛇頭的軌跡運(yùn)轉(zhuǎn) ? ? ? ? ? ? ? ? switch (Sd) ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? case SnakeDirection.Up: ? ? ? ? ? ? ? ? ? ? ? ? ChangeSnakeLine(); ? ? ? ? ? ? ? ? ? ? ? ? Snakebody[i].Location_Y -= 10; ? ? ? ? ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? ? ? ? ? case SnakeDirection.Left: ? ? ? ? ? ? ? ? ? ? ? ? ChangeSnakeLine(); ? ? ? ? ? ? ? ? ? ? ? ? Snakebody[i].Location_X -= 10; ? ? ? ? ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? ? ? ? ? case SnakeDirection.Down: ? ? ? ? ? ? ? ? ? ? ? ? ChangeSnakeLine(); ? ? ? ? ? ? ? ? ? ? ? ? Snakebody[i].Location_Y += 10; ? ? ? ? ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? ? ? ? ? case SnakeDirection.Right: ? ? ? ? ? ? ? ? ? ? ? ? ChangeSnakeLine(); ? ? ? ? ? ? ? ? ? ? ? ? Snakebody[i].Location_X += 10; ? ? ? ? ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } ? ? ? ? ? ? /// <summary> ? ? ? ? ? ? /// 每次移動(dòng)一次 改變蛇身體的相對(duì)位置 ? ? ? ? ? ? /// </summary> ? ? ? ? ? ? public static void ChangeSnakeLine() ? ? ? ? ? ? { ? ? ? ? ? ? ? ? int j = 0; ? ? ? ? ? ? ? ? int x, y; ? ? ? ? ? ? ? ? int i = Snakebody.Count - 1; ? ? ? ? ? ? ? ? for (j = 0; j < i; j++)//蛇 1位置變?yōu)樯? ?2=》1 ?3=》2 ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? x = Snakebody[j + 1].Location_X; ? ? ? ? ? ? ? ? ? ? y = Snakebody[j + 1].Location_Y; ? ? ? ? ? ? ? ? ? ? Snakebody[j].Location_Y = y; ? ? ? ? ? ? ? ? ? ? Snakebody[j].Location_X = x; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } ? ? ? ? ? ? //吃一個(gè)節(jié)點(diǎn) 變?yōu)樾碌纳哳^ ? ? ? ? ? ? public static void AddBody() ? ? ? ? ? ? { ? ? ? ? ? ? ? ? Snake S_eat = new Snake(); ? ? ? ? ? ? ? ? int xx = Snakebody[Snakebody.Count - 1].Location_X; ? ? ? ? ? ? ? ? int yy = Snakebody[Snakebody.Count - 1].Location_Y; ? ? ? ? ? ? ? ? switch (Sd) ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? case SnakeDirection.Up: ? ? ? ? ? ? ? ? ? ? ? ? S_eat.Location_Y = yy - 10; ? ? ? ? ? ? ? ? ? ? ? ? S_eat.Location_X = xx; ? ? ? ? ? ? ? ? ? ? ? ? Snakebody.Add(S_eat); ? ? ? ? ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? ? ? ? ? case SnakeDirection.Left: ? ? ? ? ? ? ? ? ? ? ? ? S_eat.Location_X = xx - 10; ? ? ? ? ? ? ? ? ? ? ? ? S_eat.Location_Y = yy; ? ? ? ? ? ? ? ? ? ? ? ? Snakebody.Add(S_eat); ? ? ? ? ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? ? ? ? ? case SnakeDirection.Down: ? ? ? ? ? ? ? ? ? ? ? ? S_eat.Location_Y = yy + 10; ? ? ? ? ? ? ? ? ? ? ? ? S_eat.Location_X = xx; ? ? ? ? ? ? ? ? ? ? ? ? Snakebody.Add(S_eat); ? ? ? ? ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? ? ? ? ? case SnakeDirection.Right: ? ? ? ? ? ? ? ? ? ? ? ? S_eat.Location_Y = yy; ? ? ? ? ? ? ? ? ? ? ? ? S_eat.Location_X = xx + 10; ? ? ? ? ? ? ? ? ? ? ? ? Snakebody.Add(S_eat); ? ? ? ? ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } ? ? ? ? ? ?? ? ? ? ? } ? ? ? ? public ?void refreshScore() ? ? ? ? { ? ? ? ? ? ? Snake.AllScore = Snake.AllScore+ Snake.CurScore; ? ? ? ? ? ?this.SnakeScore.Text = Convert.ToString(Snake.AllScore); ? ? ? ? } ? ? ? ? private int FoodX = 0;//食物X軸 ? ? ? ? private int FoodY = 0;//食物Y軸 ? ? ? ? private void BeginBtn_Click(object sender, EventArgs e) ? ? ? ? { ? ? ? ? ? ? Snake.Start();//創(chuàng)建蛇 ? ? ? ? ? ? CreateNewFood(); ? ? ? ? ? ? StartTimer.Start(); ? ? ? ? ? ? StartTimer.Interval = 100;//毫秒刷新一次 ? ? ? ? } ? ? ? ? /// <summary> ? ? ? ? /// 開(kāi)始的定時(shí)器 ? ? ? ? /// </summary> ? ? ? ? /// <param name="sender"></param> ? ? ? ? /// <param name="e"></param> ? ? ? ? private void StartTimer_Tick(object sender, EventArgs e) ? ? ? ? { ? ? ? ? ? ? DrawSnake(); ? ? ? ? ? ? DrawFood(); ? ? ? ? ? ? Snake.Move(Snake.Sd);//蛇移動(dòng) 移動(dòng)的方向鍵盤(pán)控制 ? ? ? ? ? ? EatFood(); ? ? ? ? ? ? IsOrNotGameOver(); ? ? ? ? ? ? ? ? ? ? } ? ? ? ? /// <summary> ? ? ? ? /// 畫(huà)蛇 ? ? ? ? /// </summary> ? ? ? ? public void DrawSnake() ? ? ? ? { ? ? ? ? ? ? RectangleF[] rectangles = new RectangleF[Snake.Snakebody.Count]; ? ? ? ? ? ? int num; ? ? ? ? ? ? for (num = 0; num < Snake.Snakebody.Count; num++) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? rectangles[num] = new RectangleF(Snake.Snakebody[num].Location_X, ? ? ? ? ? ? ? ? ? ? Snake.Snakebody[num].Location_Y, Snake.width, Snake.height); ? ? ? ? ? ? } ? ? ? ? ? ? this.Refresh(); ? ? ? ? ? ? Graphics g = this.Snake_Panel.CreateGraphics(); ? ? ? ? ? ? SolidBrush myBrush = new SolidBrush(Color.Black); ? ? ? ? ? ? g.FillRectangles(myBrush, rectangles); ? ? ? ? } ? ? ? ? /// <summary> ? ? ? ? /// 創(chuàng)建一個(gè)新的食物,也就是一個(gè)小點(diǎn),紅色 ? ? ? ? /// </summary> ? ? ? ? public void CreateNewFood() ? ? ? ? { ? ? ? ? ? ? refreshScore(); ? ? ? ? ? ? bool IsCreate = false; ? ? ? ? ? ? while (!IsCreate)//是否創(chuàng)建成功 ? ? ? ? ? ? { ? ? ? ? ? ? ? ? Food NewFood = new Food(); ? ? ? ? ? ? ? ? FoodX = NewFood.Food_Location_X; ? ? ? ? ? ? ? ? FoodY = NewFood.Food_Location_Y; ? ? ? ? ? ? ? ? //判斷這個(gè)不會(huì)出現(xiàn)在蛇身上 ? ? ? ? ? ? ? ? IsCreate = true;//創(chuàng)建成功 ? ? ? ? ? ? ? ? for (int i = 0; i < Snake.Snakebody.Count; i++) ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? if (Snake.Snakebody[i].Location_X == FoodX && Snake.Snakebody[i].Location_Y == FoodY)//當(dāng)坐標(biāo)相同 終止for 未創(chuàng)建成功 ? ? ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? IsCreate = false; ? ? ? ? ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? if (IsCreate) ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? if (!(FoodX <= this.Snake_Panel.Width-10 && FoodX >= 10 && FoodY <= this.Snake_Panel.Height-10 && FoodY >= 10))//食物不在范圍內(nèi) 重新刷新 ? ? ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? IsCreate = false; ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? if (IsCreate) ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? if (Snake.Snakebody.Count != 4) ? ? ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? Snake.MaxScore--;//不是第一次創(chuàng)建食物時(shí) ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ? ? Snake.CurScore = 1;//當(dāng)前小節(jié)點(diǎn)的分?jǐn)?shù) ? ? ? ? ? ? ? ? ? ? if (Snake.MaxScore == 0) ? ? ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? Snake.CurScore = 5;//當(dāng)前小節(jié)點(diǎn)的分?jǐn)?shù) ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ? ? else if (Snake.MaxScore<0) ? ? ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? Snake.MaxScore = 5;//初始化次數(shù) ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ?? ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? /// <summary> ? ? ? ? /// 食物的位置 ? ? ? ? /// </summary> ? ? ? ? public void DrawFood() ? ? ? ? { ? ? ? ? ? ? Graphics f = this.Snake_Panel.CreateGraphics(); ? ? ? ? ? ? SolidBrush mybrush = new SolidBrush(Color.Red); ? ? ? ? ?? ? ? ? ? ? ? if (Snake.MaxScore==0) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? f.FillRectangle(mybrush, FoodX, FoodY, 20, 20);//隨機(jī)了食物的位置 ? ? ? ? ? ? } ? ? ? ? ? ? else ? ? ? ? ? ? { ? ? ? ? ? ? ? ? f.FillRectangle(mybrush, FoodX, FoodY, 10, 10);//隨機(jī)了食物的位置 ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? /// <summary> ? ? ? ? /// 吃掉食物 判斷蛇頭位置和食物位置相同時(shí),食物重新刷新 ? ? ? ? /// </summary> ? ? ? ? public void EatFood() ? ? ? ? { ? ? ? ? ? ? if (Snake.Snakebody[Snake.Snakebody.Count - 1].Location_X == FoodX ? ? ? ? ? ? ? ? && Snake.Snakebody[Snake.Snakebody.Count - 1].Location_Y == FoodY) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? Snake.AddBody();//增加 蛇身增加 ? ? ? ? ? ? ? ? //吃掉食物之后 隨機(jī)創(chuàng)建一個(gè)新的食物 ? ? ? ? ? ? ? ? CreateNewFood(); ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? /// <summary> ? ? ? ? ///? ? ? ? ? /// </summary> ? ? ? ? public void IsOrNotGameOver() ? ? ? ? { ? ? ? ? ? ? int x = Snake.Snakebody[Snake.Snakebody.Count - 1].Location_X; ? ? ? ? ? ? int y = Snake.Snakebody[Snake.Snakebody.Count - 1].Location_Y; ? ? ? ? ? ? bool IsGameOver = false; ? ? ? ? ? ? if (!(x <= this.Snake_Panel.Width && x >= 0 && y <= this.Snake_Panel.Height && y >= 0))//蛇頭碰觸到邊框 ? ? ? ? ? ? { ? ? ? ? ? ? ? ? IsGameOver = true; ? ? ? ? ? ? } ? ? ? ? ? ? //蛇頭碰到自己蛇身 ? ? ? ? ? ? for(int i=0;i< Snake.Snakebody.Count - 2; i++) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? if(Snake.Snakebody[i].Location_X==x&& Snake.Snakebody[i].Location_Y == y) ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? IsGameOver = true; ? ? ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } ? ? ? ? ? ? if (IsGameOver) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? GameOver(); ? ? ? ? ? ? ? ? StartTimer.Stop(); ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? /// <summary> ? ? ? ? /// 游戲結(jié)束 ? ? ? ? /// </summary> ? ? ? ? public void GameOver() ? ? ? ? { ? ? ? ? } ? ? } ? ? /// <summary> ? ? /// 方向枚舉 ? ? /// </summary> ? ? public enum SnakeDirection ? ? { ? ? ? ? Left, ? ? ? ? Right, ? ? ? ? Down, ? ? ? ? Up ? ? } ? ? //食物類(lèi) 食物的縱軸橫軸 ? ? public class Food ? ? { ? ? ? ? public int Food_Location_X; ? ? ? ? public int Food_Location_Y; ? ? ? ? public Food() ? ? ? ? { ? ? ? ? ? ? Random x = new Random(); ? ? ? ? ? ? Random y = new Random(); ? ? ? ? ? ? Food_Location_X = x.Next(0, 49) * 10;//隨機(jī)點(diǎn)出現(xiàn)食物 ? ? ? ? ? ? Food_Location_Y = y.Next(0, 49) * 10;//隨機(jī)點(diǎn)出現(xiàn)食物 ? ? ? ? } ? ? } }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Enterprise Library for .NET Framework 2.0緩存使用實(shí)例
這篇文章主要介紹了Enterprise Library for .NET Framework 2.0緩存使用實(shí)例,是進(jìn)行項(xiàng)目開(kāi)發(fā)時(shí)非常有用的功能,需要的朋友可以參考下2014-08-08C# LINQ查詢(xún)表達(dá)式及對(duì)應(yīng)LAMBDA表達(dá)式的用法
這篇文章主要介紹了C# LINQ查詢(xún)表達(dá)式及對(duì)應(yīng)LAMBDA表達(dá)式的用法,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下2021-04-04C#如何將查詢(xún)到的數(shù)據(jù)庫(kù)里面的數(shù)據(jù)輸出到textbox控件
這篇文章主要介紹了C#如何將查詢(xún)到的數(shù)據(jù)庫(kù)里面的數(shù)據(jù)輸出到textbox控件問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07C#如何將Access中以時(shí)間段條件查詢(xún)的數(shù)據(jù)添加到ListView中
這篇文章主要介紹了C# 將Access中以時(shí)間段條件查詢(xún)的數(shù)據(jù)添加到ListView中,需要的朋友可以參考下2017-07-07