欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#實(shí)現(xiàn)貪吃蛇小游戲

 更新時(shí)間:2022年01月31日 13:21:28   作者:筆下無(wú)書(shū)生  
這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)貪吃蛇小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(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)文章

最新評(píng)論