csdn_export_md


**```cs`h`arp@[TOC](贪吃蛇游戏的实现)## 

namespace WindowsForms贪吃蛇游戏的实现
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
List<List> maplist = new List<List>();
Map map;
Serpent serpent;
Graphics g;
int level = 1;
///
/// 运行线程
///
Thread Work_Thread = null;
///
/// 运行线程监控值
///
bool IsWork = false;
int sleepTime = 1000;
int thissleeptime;

    private void Form1_Load(object sender, EventArgs e)
    {
        g = this.panel1.CreateGraphics();
        map = new Map(40, 30, this.panel1);//这里可以对画布进行下大小设置 此处偷懒省略 
        LoadMapList();//加载障碍物列表 
    }
    /// <summary>
    /// 默认将地图设置为30*40
    /// </summary>
    private void SetMap()
    {
        map.ResetMap();
        g.Clear(map.BgColor);
        map.SetBorder();//设置边界
        List<Node> hiderList = GetHider();//获取障碍物列表
        map.SetHinder(hiderList);//设置障碍物
        SetSerpent();//初始化蛇 
    }

    /// <summary>
    /// 设置蛇
    /// </summary>
    private void SetSerpent()
    {
        serpent = new Serpent(15, 5, this.panel1);
        serpent.InitializeSerpent();//初始化蛇
    }

    /// <summary>
    /// 获取地图障碍物列表 以增加不同级别难度
    /// </summary>
    private void LoadMapList()
    {
        //目前分为5个级别
        //第一级别
        List<Node> hiderList1 = new List<Node>();
        for (int i = 15; i < 25; i++)
        {
            hiderList1.Add(map.GetNode(i, 15));
            hiderList1.Add(map.GetNode(15, i));
        }
        maplist.Add(hiderList1);

        //第二级别
        List<Node> hiderList2 = new List<Node>();
        for (int i = 7; i < 25; i++)
        {
            hiderList2.Add(map.GetNode(i, 15));
            hiderList2.Add(map.GetNode(15, i));
        }
        maplist.Add(hiderList2);

        //第三级别
        List<Node> hiderList3 = new List<Node>();
        for (int i = 7; i < 25; i++)
        {
            hiderList3.Add(map.GetNode(i, 15));
            hiderList3.Add(map.GetNode(15, i));
            hiderList3.Add(map.GetNode(i, 25));
        }
        maplist.Add(hiderList3);

        //第四级别
        List<Node> hiderList4 = new List<Node>();
        for (int i = 7; i < 25; i++)
        {
            hiderList4.Add(map.GetNode(i, 25));
            hiderList4.Add(map.GetNode(i, 15));
            hiderList4.Add(map.GetNode(15, i));
            hiderList4.Add(map.GetNode(i, 7));
        }
        maplist.Add(hiderList4);

        //第五级别
        List<Node> hiderList5 = new List<Node>();
        for (int i = 7; i < 25; i++)
        {
            hiderList5.Add(map.GetNode(i, 25));
            hiderList5.Add(map.GetNode(i, 15));
            hiderList5.Add(map.GetNode(15, i));
            hiderList5.Add(map.GetNode(i, 7));
            hiderList5.Add(map.GetNode(i, 35));
        }
        for (int i = 12; i < 20; i++)
        {
            hiderList5.Add(map.GetNode(7, i));
            hiderList5.Add(map.GetNode(25, i));
        }
        maplist.Add(hiderList5);
    }

    /// <summary>
    /// 获取障碍物列表
    /// </summary>
    /// <returns></returns>
    private List<Node> GetHider()
    {
        //这里可以添加多个地图,当级别改变时需要重新加载
        return maplist[level - 1];
    }
    /// <summary>
    /// 重置地图
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void btnResetMap_Click(object sender, EventArgs e)
    {
        IsWork = false;
        btnStop.Enabled = false;
        button3.Enabled = false;
        button2.Enabled = true;
        map.ResetMap();
        SetMap();
    }

    /// <summary>
    /// 运行
    /// </summary>
    private void Work()
    {
        map.SetFood();//设置食物
        while (IsWork)
        {
            Node node_index;
            Node serpentHead = serpent.GetSerpentHead();
            switch (serpent.Direction)
            {
                case Direction.Left:
                    node_index = map.GetNode(serpentHead.X - 1, serpentHead.Y);
                    break;
                case Direction.Right:
                    node_index = map.GetNode(serpentHead.X + 1, serpentHead.Y);
                    break;
                case Direction.Up:
                    node_index = map.GetNode(serpentHead.X, serpentHead.Y - 1); break;
                default:
                    node_index = map.GetNode(serpentHead.X, serpentHead.Y + 1);
                    break;
            }
            SerpentState index_move = SerpentMove(node_index);
            if (index_move == SerpentState.Error)//游戏结束
            {
                IsWork = false;
                map.ResetMap();
                MessageBox.Show("游戏结束!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                sleepTime = 1000;
                level = 1;
                thissleeptime = sleepTime;
                lblLevel.BeginInvoke(new MethodInvoker(delegate ()
                {
                    btnStop.Enabled = false;
                    button3.Enabled = true;
                    button2.Enabled = true;
                    lblLevel.Text = "1";
                    lblCount.Text = "5";
                }));
            }
            else if (index_move == SerpentState.NextLevel)
            {
                IsWork = false;
                this.lblCount.BeginInvoke(new MethodInvoker(delegate ()
                {
                    level += 1;
                    lblLevel.Text = level.ToString();
                    lblCount.Text = "5";
                }));
                sleepTime = sleepTime / 2;
                thissleeptime = sleepTime;
                SetMap();//重置地图
            }
            else
            {

                Thread.Sleep(thissleeptime);
            }
        }
        map.ResetMap();
    }
    /// <summary>
    /// 开始
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void button2_Click(object sender, EventArgs e)
    {
        IsWork = false;
        btnStop.Enabled = false;
        button3.Enabled = false;
        button2.Enabled = true;
        map.ResetMap();
        SetMap();
        thissleeptime = sleepTime;
        this.panel1.Focus();
        IsWork = true;
        this.btnStop.Enabled = true;
        this.button3.Enabled = true;
        button2.Enabled = false;
        Work_Thread = new Thread(new ThreadStart(Work));
        Work_Thread.IsBackground = true;
        Work_Thread.Start();
    }

    private void Form1_KeyDown(object sender, KeyEventArgs e)
    {

        if (e.KeyCode == Keys.Right)
        {
            if (serpent.Direction != Direction.Left)
                serpent.Direction = Direction.Right;
        }
        else if (e.KeyCode == Keys.Left)
        {
            if (serpent.Direction != Direction.Right)
                serpent.Direction = Direction.Left;
        }
        else if (e.KeyCode == Keys.Up)
        {
            if (serpent.Direction != Direction.Down)
                serpent.Direction = Direction.Up;
        }
        else if (e.KeyCode == Keys.Down)
        {
            if (serpent.Direction != Direction.Up)
                serpent.Direction = Direction.Down;
        }
        else if (e.KeyCode == Keys.Space)
        {
            thissleeptime = sleepTime / 2;
        }
        else if (e.KeyCode == Keys.Escape)
        {
            if (IsWork)
            {
                this.btnStop.Text = "继续";
                IsWork = false;
            }

        }
    }
    /// <summary>
    /// 暂停
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void button3_Click(object sender, EventArgs e)
    {
        if (!IsWork)
        {
            this.btnStop.Text = "暂停";
            IsWork = true;
            Work_Thread = new Thread(new ThreadStart(Work));
            Work_Thread.IsBackground = true;
            Work_Thread.Start();
        }
        else
        {
            this.btnStop.Text = "继续";
            IsWork = false;
        }
    }
    /// <summary>
    /// 退出
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void button4_Click(object sender, EventArgs e)
    {
        this.Close();
    }

    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        IsWork = false;
        Application.Exit();
        System.Diagnostics.Process.GetCurrentProcess().Kill();
    }

    private void btnStop_Click(object sender, EventArgs e)
    {
        // map.ResetMap();
        btnStop.Enabled = false;
        button3.Enabled = false;
        button3.Enabled = true;
        IsWork = false;
        Work_Thread.Abort();
        SetMap();
    }
    /// <summary>
    /// 移动
    /// </summary>
    /// <param name="node">将要移动到的节点</param>
    /// <returns>返回状态</returns>
    private SerpentState SerpentMove(Node node)
    {
        if (!node.IsPass)
        {
            return SerpentState.Error;
        }
        serpent.InsertNode(node);
        if (!node.IsFood)
        {
            //不是食物,则移除最后一个节点
            serpent.RemoveNode();
        }
        else
        {
            lblCount.BeginInvoke(new MethodInvoker(delegate ()
            {
                this.lblCount.Text = (Convert.ToInt32(this.lblCount.Text.Trim()) + 1).ToString();
            }));
            map.SetFood();//设置食物
        }

        if (serpent.IsMax())
        {
            return SerpentState.NextLevel;
        }
        return SerpentState.Moving;
    }

    private void Form1_KeyUp(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Space)
        {
            thissleeptime = sleepTime;
        }
    }

    private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        int index = 1;
        int index_count = Convert.ToInt32(comboBox1.Text);
        for (int i = 1; i < index_count; i++)
        {
            index = index * 2;
        }
        level = index_count;
        sleepTime = 1000 / index;
        thissleeptime = sleepTime;
        btnStop.Enabled = false;
        button3.Enabled = false;
        button3.Enabled = true;
        IsWork = false;

        SetMap();
        lblCount.Text = "5";
        lblLevel.Text = index_count.ToString();
        serpent.Direction = Direction.Right;

    }

    private void checkBox1_Click(object sender, EventArgs e)
    {
        comboBox1.Enabled = this.checkBox1.Checked;
    }

}
public enum SerpentState
{
    Moving,
    NextLevel,
    Error
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值