C#-測試貪喫蛇

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;

namespace Snake
{
    public partial class Snake : Form
    {
        enum E_SnakeDir
        {
            UpDir,
            DownDir,
            LeftDir,
            RightDir,
            NoneDir
        }
        struct Stu_SnakeSportParam
        {
            int i_UpBorder;
            int i_DownBorder;
            int i_LeftBorder;
            int i_RightBorder;
        }
        struct Stu_SnakeBody
        {
            public int i_SnakeBodyWidth;
            public int i_SnakeBodyHigh;
            public int i_SnakeBodyX;
            public int i_SnakeBodyY;

        }
        class PaintSnake
        {
            public Stu_SnakeSportParam s_ssp;
            public List<Stu_SnakeBody> l_ssbNew;
            public List<Stu_SnakeBody> l_ssbOld;
            public E_SnakeDir e_sd;
            public PaintSnake()
            {
                s_ssp = new Stu_SnakeSportParam();
                l_ssbNew = new List<Stu_SnakeBody>();
                l_ssbOld = new List<Stu_SnakeBody>();
                e_sd = new E_SnakeDir();
                e_sd = E_SnakeDir.RightDir;

            }

        }


        public Snake()
        {
            InitializeComponent();
        }
        Graphics paint;
        Pen p;
        PaintSnake c_ps;
        Stu_SnakeBody s_sb;
        bool b_FristFlag = true;
        bool b_SnakeEatFoodFlag = true;
        int i_FristX = 0;
        int i_FristY = 0;
        int i_FoodX = 0;
        int i_FoodY = 0;
        Random rdm = new Random();

        private void timerUpdateSnake_Tick(object sender, EventArgs e)
        {
            this.Refresh();
            if (b_SnakeEatFoodFlag == true)
            {
                b_SnakeEatFoodFlag = false;
                i_FoodX = ((rdm.Next(this.Width - 5))/5)*5;
                i_FoodY = ((rdm.Next(this.Height - this.toolStrip1.Height - this.statusStrip1.Height - 5)) / 5) * 5;
            }
            paint.DrawRectangle(p, i_FoodX, i_FoodY, 5, 5);

            this.label1.Text = c_ps.l_ssbOld[0].i_SnakeBodyX.ToString();
            bool bFlag = false;
            foreach (Stu_SnakeBody i in c_ps.l_ssbNew)
            {
                paint.DrawRectangle(p, i.i_SnakeBodyX, i.i_SnakeBodyY,i.i_SnakeBodyWidth,i.i_SnakeBodyHigh);
            }
            if (c_ps.e_sd == E_SnakeDir.UpDir)
            {
                if (b_FristFlag)
                {
                    b_FristFlag = false;
                    i_FristX = c_ps.l_ssbOld[0].i_SnakeBodyX;

                }
                s_sb.i_SnakeBodyX = i_FristX;
                s_sb.i_SnakeBodyY = c_ps.l_ssbOld[0].i_SnakeBodyY - 5;
                bFlag = true;
            }
            else if (c_ps.e_sd == E_SnakeDir.DownDir)
            {
                if (b_FristFlag)
                {
                    b_FristFlag = false;
                    i_FristX = c_ps.l_ssbOld[0].i_SnakeBodyX;

                }
                s_sb.i_SnakeBodyX = i_FristX;
                s_sb.i_SnakeBodyY = c_ps.l_ssbOld[0].i_SnakeBodyY + 5;
                bFlag = true;
            }
            else if (c_ps.e_sd == E_SnakeDir.LeftDir)
            {
                if (b_FristFlag)
                {
                    b_FristFlag = false;
                    i_FristY = c_ps.l_ssbOld[0].i_SnakeBodyY;

                }
                s_sb.i_SnakeBodyY = i_FristY;
                s_sb.i_SnakeBodyX = c_ps.l_ssbOld[0].i_SnakeBodyX -5;
                bFlag = true;

            }
            else if (c_ps.e_sd == E_SnakeDir.RightDir)
            {
                if (b_FristFlag)
                {
                    b_FristFlag = false;
                    i_FristY = c_ps.l_ssbOld[0].i_SnakeBodyY;

                }
                s_sb.i_SnakeBodyY = i_FristY;
                s_sb.i_SnakeBodyX = c_ps.l_ssbOld[0].i_SnakeBodyX + 5;
                bFlag = true;
            }
            else
            {

                //return ;
            }
            //if (c_ps.l_ssbOld[0].i_SnakeBodyX > this.Width - 5)
            //{
            //    s_sb.i_SnakeBodyX = 5;
            //}
            //else if (c_ps.l_ssbOld[0].i_SnakeBodyX < 5)
            //{
            //    s_sb.i_SnakeBodyX = this.Width - 5;
            //}
            //else if (c_ps.l_ssbOld[0].i_SnakeBodyY > this.Height - this.toolStrip1.Height - this.statusStrip1.Height-5)
            //{
            //    s_sb.i_SnakeBodyY = this.Height - this.toolStrip1.Height+5;
            //}
            //else if (c_ps.l_ssbOld[0].i_SnakeBodyY < this.Height - this.toolStrip1.Height-5)
            //{
            //    s_sb.i_SnakeBodyY = this.Height - this.toolStrip1.Height - this.statusStrip1.Height-5;
            //}
            //else
            //{

            //}
            if (bFlag == true)
            {
                c_ps.l_ssbNew.Clear();
                c_ps.l_ssbNew.Add(s_sb);
                for (int i = 0; i < c_ps.l_ssbOld.Count - 1; i++)
                {
                    s_sb.i_SnakeBodyX = c_ps.l_ssbOld[i].i_SnakeBodyX;
                    s_sb.i_SnakeBodyY = c_ps.l_ssbOld[i].i_SnakeBodyY;

                    c_ps.l_ssbNew.Add(s_sb);
                }

                c_ps.l_ssbOld.Clear();
                foreach (Stu_SnakeBody i in c_ps.l_ssbNew)
                {
                    c_ps.l_ssbOld.Add(i);
                }
                if(c_ps.l_ssbOld[0].i_SnakeBodyX==i_FoodX&&c_ps.l_ssbOld[0].i_SnakeBodyY==i_FoodY)
                {
                    b_SnakeEatFoodFlag = true;
                    s_sb.i_SnakeBodyX=i_FoodX;
                    s_sb.i_SnakeBodyY=i_FoodY;
                    c_ps.l_ssbOld.Insert(0, s_sb);

                }
            }

        }

        private void Snake_Load(object sender, EventArgs e)
        {
            paint = this.CreateGraphics();
            p = new Pen(Color.Black);
            c_ps= new PaintSnake();
            s_sb = new Stu_SnakeBody();
            s_sb.i_SnakeBodyX = 100;
            s_sb.i_SnakeBodyY = 100;
            s_sb.i_SnakeBodyWidth = 5;
            s_sb.i_SnakeBodyHigh = 5;
            for (int i = 0; i < 5;i++ )
            {
                s_sb.i_SnakeBodyX += 5;

                c_ps.l_ssbNew.Add(s_sb);
            }
            foreach (Stu_SnakeBody ii in c_ps.l_ssbNew)
            {
                c_ps.l_ssbOld.Add(ii);
            }
            this.timer1.Interval = 100;
            this.timer1.Start();
        }

        private void Snake_KeyDown(object sender, KeyEventArgs e)
        {
            if(e.KeyCode==Keys.Up)
            {
                if (c_ps.e_sd == E_SnakeDir.LeftDir || c_ps.e_sd == E_SnakeDir.RightDir || c_ps.e_sd == E_SnakeDir.NoneDir)
                {
                    c_ps.e_sd = E_SnakeDir.UpDir;
                    b_FristFlag = true;
                }
            }
            else if (e.KeyCode == Keys.Down)
            {
                if (c_ps.e_sd == E_SnakeDir.LeftDir || c_ps.e_sd == E_SnakeDir.RightDir || c_ps.e_sd == E_SnakeDir.NoneDir)
                {
                    c_ps.e_sd = E_SnakeDir.DownDir;
                    b_FristFlag = true;
                }
            }
            else if (e.KeyCode == Keys.Left)
            {
                if (c_ps.e_sd == E_SnakeDir.UpDir || c_ps.e_sd == E_SnakeDir.DownDir || c_ps.e_sd == E_SnakeDir.NoneDir)
                {
                    c_ps.e_sd = E_SnakeDir.LeftDir;
                    b_FristFlag = true;
                }
            }
            else if (e.KeyCode == Keys.Right)
            {
                if (c_ps.e_sd == E_SnakeDir.UpDir || c_ps.e_sd == E_SnakeDir.DownDir || c_ps.e_sd == E_SnakeDir.NoneDir)
                {
                    c_ps.e_sd = E_SnakeDir.RightDir;
                    b_FristFlag = true;
                }
            }
        }

    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章