C#简单的贪吃蛇

完整代码:https://download.csdn.net/download/weixin_41516902/13510086

//贪吃蛇窗口代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Timers;
using System.Threading;
namespace CSharp_Snake
{
    public partial class SnakeObj : Form
    {

        #region
    
        const int RECT_COLUMES = 20;
        const int RECT_ROWS = 20;
        const int RECT_WIDTH = 20;
        const int RECT_HEIGHT = 20;

       
        List<Point> m_snake = new List<Point>();
        Point m_food = new Point(0, 0);

        enum DIRECTION
        {
            UP = 0,
            DOWN,
            LEFT,
            RIGHT
        };
        DIRECTION m_dir = DIRECTION.RIGHT;
        System.Timers.Timer m_timer = new System.Timers.Timer();//定时器

        bool isStarted = false;


        #endregion

        public SnakeObj()
        {
            InitializeComponent();
            m_snake.Add(new Point(10, 10));
            m_snake.Add(new Point(10, 9));
            m_snake.Add(new Point(10, 8));
            NewFood();
        }
        public void StartGame()
        {
            isStarted = true;
            m_timer.Elapsed += m_timer_Elapsed;//向定时器里注册事件
            m_timer.Interval = 800;
            m_timer.Start();
            
        }
   
        void m_timer_Elapsed(object sender, ElapsedEventArgs e)
        {

            MoveSnake();
           this.Invalidate();//触发绘制事件
           
            //throw new NotImplementedException();
        }
        public void NewFood()
        {
            Random rd = new Random();
            int x = rd.Next(0, 20);
            int y = rd.Next(0, 20);
            m_food.X = x;
            m_food.Y = y;
        }

        public void EndGame()
        {
            isStarted = false;
            m_timer.Close();
        }

        protected override void OnPaint(PaintEventArgs e)
        {
            Graphics m_gp = this.CreateGraphics();
            Pen m_p = new Pen(Color.Black);

           if (!isStarted) return;

            foreach(var point in m_snake)
            {
                Rectangle rect=new Rectangle(point.X*RECT_WIDTH,point.Y*RECT_HEIGHT,RECT_WIDTH,RECT_HEIGHT);
                m_gp.DrawRectangle(m_p, rect);

            }

            Rectangle rectFood = new Rectangle(m_food.X * RECT_WIDTH, m_food.Y * RECT_HEIGHT, RECT_WIDTH, RECT_HEIGHT);
            m_gp.DrawRectangle(m_p, rectFood);

        }

        private void MoveSnake()
        {
            Point pt = m_snake.First<Point>();
            switch(m_dir)
            {
                case DIRECTION.UP:
                    pt.Y = pt.Y - 1;
                    break;
                case DIRECTION.DOWN:
                    pt.Y = pt.Y + 1;
                    break;
                case DIRECTION.LEFT:
                    pt.X = pt.X- 1;
                    break;
                case DIRECTION.RIGHT:
                    pt.X = pt.X+ 1;
                    break;
            }
            m_snake.Insert(0, pt);

            if (SnakeHitSide())
            {
                EndGame();
                MessageBox.Show("Game Over");
                return;
            }

            if (SnakeHitFood())
            {
                NewFood();
                return;
            }

            m_snake.RemoveAt(m_snake.Count-1);
        }

        private bool  SnakeHitSide()
        {
             Point pt = m_snake.First<Point>();
             if (pt.X <= 0 || pt.X>=20)
                 return true;
             if (pt.Y <=0 || pt.Y >=20)
                 return true;
            
             for(int i=1;i<m_snake.Count;i++)
             {
                 if (pt == m_snake[i])
                     return true;
             }
             return false;
        }

        private bool SnakeHitFood()
        {
            foreach(var pt in m_snake)
            {
                if (m_food == pt)
                    return true;
            }
            return false;
        }
        /// <summary>
        /// 键盘事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void SnakeObj_KeyPress(object sender, KeyPressEventArgs e)
        {
        
            if (e.KeyChar == 'w' || e.KeyChar == 'W')
            {
                if (m_dir == DIRECTION.LEFT || m_dir == DIRECTION.RIGHT)
                    m_dir = DIRECTION.UP;
            }
            else if (e.KeyChar == 'a' || e.KeyChar == 'A')
            {
                if (m_dir == DIRECTION.UP || m_dir == DIRECTION.DOWN)
                    m_dir = DIRECTION.LEFT;
            }
            else if (e.KeyChar == 's' || e.KeyChar == 'S')
            {
                if (m_dir == DIRECTION.LEFT || m_dir == DIRECTION.RIGHT)
                    m_dir = DIRECTION.DOWN;
            }
            else if (e.KeyChar == 'd' || e.KeyChar == 'D')
            {
                if (m_dir == DIRECTION.UP || m_dir == DIRECTION.DOWN)
                    m_dir = DIRECTION.RIGHT;
            }
            
        }


      
    }
}

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值