C#實(shí)現(xiàn)貪吃蛇小游戲
本文實(shí)例為大家分享了C#實(shí)現(xiàn)貪吃蛇小游戲的具體代碼,供大家參考,具體內(nèi)容如下
之前一直想寫一個貪吃蛇小游戲,上個周末終于有時間做了一個,現(xiàn)在和大家分享。
界面
界面比較簡單,一個按鈕和一個積分器組成。
基本邏輯:每五個食物出現(xiàn)一次大食物,小食物1分,大食物5分。
控制:撞墻和纏繞時,游戲暫停。
代碼詳解
詳細(xì)介紹下代碼
一、代碼分詳解
1.界面是在pc上,所以移動以上下左右鍵來控制移動,為了及時響應(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.做個枚舉,來標(biāo)記某個時間狀態(tài)下蛇的移動方向,配合鍵盤按鍵
/// <summary> /// 方向枚舉 /// </summary> ? ? public enum SnakeDirection ? ? { ? ? ? ? Left, ? ? ? ? Right, ? ? ? ? Down, ? ? ? ? Up ? ? } ? ? ? ? ? ? /// <summary> ? ? ? ? /// 鍵盤和鼠標(biāo)按下時 處理 但必須有控件 ? ? ? ? /// </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.聲明一個蛇的類,存儲所有蛇的相關(guān)信息,如所有蛇身體的節(jié)點(diǎn)位置
public class Snake
主要變量如下
public static SnakeDirection Sd;//蛇進(jìn)行的方向 上下左右四個方向 public int Location_X;//0為x,1為y 蛇的初始位置 public int Location_Y; public static List<Snake> Snakebody = new List<Snake>();//蛇身子的具體位置,每次位移都刷新一次 整個蛇身子的所有位置 ?最后一位是蛇頭? 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.聲明一個食物的類,同時增加一個方法,隨機(jī)在界面上的一個位置顯示食物
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)擊開始按鈕,觸發(fā)開始相關(guān)方法,主要是啟動刷新的時間器,初始化食物位置,初始化積分等
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è)置的是100毫秒,也可以做一個前端設(shè)置按鈕,增加游戲趣味性,同時也可以設(shè)置根據(jù)不同的積分處理此設(shè)置
定時器中有畫蛇身體的方法、隨機(jī)一個食物位置的方法、蛇移動的方法、蛇是否吃到食物的方法、游戲有沒有結(jié)束的方法
/// <summary> /// 開始的定時器 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> ? ? ? ? private void StartTimer_Tick(object sender, EventArgs e) ? ? ? ? { ? ? ? ? ? ? DrawSnake(); ? ? ? ? ? ? DrawFood(); ? ? ? ? ? ? Snake.Move(Snake.Sd);//蛇移動 移動的方向鍵盤控制 ? ? ? ? ? ? EatFood(); ? ? ? ? ? ? IsOrNotGameOver(); ? ? ? ? ? ? ? ? ? ? }
7.畫蛇的方法如下
/// <summary> /// 畫蛇 /// </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時,食物變?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)每次刷新時,蛇都會移動,相應(yīng)的蛇整體的位置也會發(fā)生變化,但蛇身有痕跡,所以使用如下方式進(jìn)行蛇體變化
//蛇的移動操作 每次移動 都需要改變蛇身體 public static void Move(SnakeDirection Sd) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? int i = Snakebody.Count - 1;//根據(jù)不同的移動方向 需要對相對位置發(fā)生變化,這個操作保證蛇身按照蛇頭的軌跡運(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> ? ? ? ? ? ? /// 每次移動一次 改變蛇身體的相對位置 ? ? ? ? ? ? /// </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ā)生碰撞時,表示蛇吃掉了食物,食物刷新,蛇身體增長
/// <summary> /// 吃掉食物 判斷蛇頭位置和食物位置相同時,食物重新刷新 /// </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)建一個新的食物 ? ? ? ? ? ? ? ? CreateNewFood(); ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? ? ? ? ? ? ? //吃一個節(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.食物被吃掉后,食物刷新,同時判斷小食物出現(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; ? ? ? ? ? ? ? ? //判斷這個不會出現(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)建食物時 ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ? ? 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.每次定時器刷新,蛇身會發(fā)生變化,同時就需要判斷蛇是否觸發(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(); ? ? ? ? ? ? } ? ? ? ? }
以上就是整個蛇運(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(); ? ? ? ? } ? ? ? ? //為了上下左右鍵起作用 需要重寫這個操作 ? ? ? ? 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> ? ? ? ? /// 鍵盤和鼠標(biāo)按下時 處理 但必須有控件 ? ? ? ? /// </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)行的方向 上下左右四個方向 ? ? ? ? ? ? public int Location_X;//0為x,1為y 蛇的初始位置 ? ? ? ? ? ? public int Location_Y; ? ? ? ? ? ? public static List<Snake> Snakebody = new List<Snake>();//蛇身子的具體位置,每次位移都刷新一次 整個蛇身子的所有位置 ?最后一位是蛇頭? ? ? ? ? ? ? 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> ? ? ? ? ? ? /// 蛇初始化 朝向 初始長度等 ? ? ? ? ? ? /// </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)四個長度 蛇的位置 ? ? ? ? ? ? ? ? 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); ? ? ? ? ? ? } ? ? ? ? ? ? //蛇的移動操作 每次移動 都需要改變蛇身體 ? ? ? ? ? ? public static void Move(SnakeDirection Sd) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? int i = Snakebody.Count - 1;//根據(jù)不同的移動方向 需要對相對位置發(fā)生變化,這個操作保證蛇身按照蛇頭的軌跡運(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> ? ? ? ? ? ? /// 每次移動一次 改變蛇身體的相對位置 ? ? ? ? ? ? /// </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; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } ? ? ? ? ? ? //吃一個節(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> ? ? ? ? /// 開始的定時器 ? ? ? ? /// </summary> ? ? ? ? /// <param name="sender"></param> ? ? ? ? /// <param name="e"></param> ? ? ? ? private void StartTimer_Tick(object sender, EventArgs e) ? ? ? ? { ? ? ? ? ? ? DrawSnake(); ? ? ? ? ? ? DrawFood(); ? ? ? ? ? ? Snake.Move(Snake.Sd);//蛇移動 移動的方向鍵盤控制 ? ? ? ? ? ? EatFood(); ? ? ? ? ? ? IsOrNotGameOver(); ? ? ? ? ? ? ? ? ? ? } ? ? ? ? /// <summary> ? ? ? ? /// 畫蛇 ? ? ? ? /// </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)建一個新的食物,也就是一個小點(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; ? ? ? ? ? ? ? ? //判斷這個不會出現(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)建食物時 ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ? ? 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> ? ? ? ? /// 吃掉食物 判斷蛇頭位置和食物位置相同時,食物重新刷新 ? ? ? ? /// </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)建一個新的食物 ? ? ? ? ? ? ? ? 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 ? ? } ? ? //食物類 食物的縱軸橫軸 ? ? 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)食物 ? ? ? ? } ? ? } }
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Enterprise Library for .NET Framework 2.0緩存使用實(shí)例
這篇文章主要介紹了Enterprise Library for .NET Framework 2.0緩存使用實(shí)例,是進(jìn)行項(xiàng)目開發(fā)時非常有用的功能,需要的朋友可以參考下2014-08-08C# LINQ查詢表達(dá)式及對應(yīng)LAMBDA表達(dá)式的用法
這篇文章主要介紹了C# LINQ查詢表達(dá)式及對應(yīng)LAMBDA表達(dá)式的用法,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下2021-04-04C#如何將查詢到的數(shù)據(jù)庫里面的數(shù)據(jù)輸出到textbox控件
這篇文章主要介紹了C#如何將查詢到的數(shù)據(jù)庫里面的數(shù)據(jù)輸出到textbox控件問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07C#如何將Access中以時間段條件查詢的數(shù)據(jù)添加到ListView中
這篇文章主要介紹了C# 將Access中以時間段條件查詢的數(shù)據(jù)添加到ListView中,需要的朋友可以參考下2017-07-07