C#贪吃蛇小游戏源码

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;

namespace 贪吃蛇游戏
{
    
    public partial class Start : Form
    {
        private Floor f1;
        //Bean b1;
        //Block block;
        Snake s1;
        public Start()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            // b1 = new Bean();
            //b1.Origin = new Point(50, 50);
            //b1.Display(this.CreateGraphics());

            //block = new Block();
            //block.IsHead = false;
            //block.Origin = new Point(100, 100);
            //block.Display(this.CreateGraphics());

            Point p1 = new Point(50, 50);
            s1 = new Snake(p1, 10);
            //s1.Display(this.CreateGraphics());
            timer1.Enabled=true;
            button1.Enabled = false;
            button2.Enabled = false;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            
            s1.UnDisplay(this.CreateGraphics());
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            f1.Display(this.CreateGraphics());
            lblScore.Text = f1.score.ToString();
            if (f1.score >= 100 && f1.score < 200)
            { 
            入门ToolStripMenuItem_Click(sender, e);
            }
           else if (f1.score >= 200 && f1.score < 300)
            {
                高手ToolStripMenuItem_Click( sender, e);
            }
            else if (f1.score >=300)
            {
                大神ToolStripMenuItem_Click(sender, e);
            }
            if (f1.score >= 550)
            {
                this.timer1.Enabled = false;//结束游戏
                MessageBox.Show("恭喜你通关了");
            }
            if (f1.CheckSnake())
            {
                timer1.Enabled = false;
                MessageBox.Show("GameOver");
            }
        }

        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            f1.Display(this.CreateGraphics());
            if (f1.CheckSnake())
            {
                timer1.Enabled = false;
                MessageBox.Show("游戏已经结束");
            }
            int k, d = 0;
            k = e.KeyValue;
            if (k == 37)
                d = 3;
            else if (k == 40)
                d = 2;
            else if (k == 38)
                d = 0;
            else if (k == 39)
                d = 1;
            f1.S.TurnDirection(d);
           
        }

        private void 暂停F2ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (menuPause.Text == "暂停")
            {
                timer1.Enabled = false;
                menuPause.Text = "继续";
            }
            else
            {
                timer1.Enabled = true;
                menuPause.Text = "暂停";
            }
        }

        private void Start_Load(object sender, EventArgs e)
        {
            this.BackColor = Color.Silver;
            f1 = new Floor(new Point(80, 60));//用坐标点实例化运动场
            菜鸟ToolStripMenuItem_Click(sender, e);
            lblScore.Text = "0分";
        }

        private void 菜鸟ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            timer1.Interval = 500;//设置等级速度
            lblGrade.Text = "菜鸟";
        }

        private void 开始F1ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            timer1.Enabled = true;
            if (menuStart.Text == "开始")
            {
                menuStart.Text = "重新开始";
            }
            else
            {
                f1.ReSet(this.CreateGraphics());
                f1.score = 0;
            }
            menuPause.Enabled = true;
        }

        private void 退出ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

        private void 入门ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            timer1.Interval = 400;//设置等级速度
            lblGrade.Text = "入门";
        }

        private void 高手ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            timer1.Interval = 300;//设置等级速度
            lblGrade.Text = "高手";
        }

        private void 大神ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            timer1.Interval = 200;//设置等级速度
            lblGrade.Text = "大神";
        }

        private void 帮助ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            timer1.Enabled = false;
            MessageBox.Show("F1开始/重新开始" + "\n" + "F2暂停/继续\n" + "上、下、左、右键为控制蛇的方向键");

            timer1.Enabled = true;
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Drawing;

namespace 贪吃蛇游戏
{
    class Floor
    {
        
        private static int unit = 10;//定义静态单位长度
        private int lenth = 60 * unit;//运动场长度,并排60个蛇块儿的长度
        private int width = 30 * unit;//运动场宽度,并排30个蛇块儿的长度
        private Point dot;//运动场左上角位置
        public int score;//游戏分数
        private Snake s;//蛇对象字段
        private Bean bean;//食物对象字段
        public Snake S
        {
            get { return s; }
        }
        public Floor(Point d)//构造函数,参数为运动场左上角位置
        {
            dot = d;
            s = new Snake(d, 5);
            bean = new Bean();
            bean.Origin = new Point(d.X + 30, d.Y + 30);//实例化食物位置
        }
        public void ReSet(Graphics g)//重新设置蛇的方法
        {
            s.UnDisplay(g);//消除以前的蛇
            s = new Snake(dot, 5);
            bean.UnDisplay(g);//消除以前的食物
            bean.Origin = new Point(dot.X + 30, dot.Y + 30);
        }
        public void Display(Graphics g)//显示运动场方法,参数为一图形对象
        {
            Pen p = new Pen(Color.Red);//创建笔并用红色实例化
            //用创建的笔画一个位置为dot,长、宽分别为length和width的矩形
            g.DrawRectangle(p, dot.X, dot.Y, lenth, width);
            bean.Display(g);//显示食物
            //检查食物是否被吃
            if (bean.Origin.Equals(s.HeadPoint))//判断食物的位置是否与蛇头相同
            {
                score = score + 10;//分数加10
                bean.UnDisplay(g);//消除原来的食物
                Random random = new Random();//创建伪随机数对象并实例化
                int x = random.Next(1, lenth / unit);
                int y = random.Next(1, width / unit);
                //由运动场位置和x,y随机整数实例化点对象
                Point d = new Point(dot.X + x * 10, dot.Y + y * 10);
                bean.Origin = d;//点赋给新食物位置属性
                bean.Display(g);
                s.SnakeGrowth();//蛇自动增长
            }
            else
            {
                s.Go(g);
            }
            s.Display(g);//显示蛇
        }
        //检查蛇是否撞墙
        public bool CheckSnake()
        {
            if ((dot.X < s.HeadPoint.X && s.HeadPoint.X < (dot.X + lenth) - 10) && (dot.Y < s.HeadPoint.Y && s.HeadPoint.Y < (dot.Y + width) - 10) && !s.getHitSelf)
            {
                return false;
            }
            else
            {
                return true;
            }
        }
    }
}

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;
using System.Drawing;

namespace 贪吃蛇游戏
{
    class Snake
    {
        private ArrayList blockList;//组成蛇的所有块儿
        private int headNumber;//蛇的长度
        private Point headPoint;//蛇头的位置
        private int direction = 1;//默认是右0,1,2,3分别代表上,右,下,左

        public Point HeadPoint
        {
            get { return headPoint; }
        }
        //蛇的运行方向属性
        public int Direction
        {
            get { return direction; }
            set { direction = value; }
        }
        public bool getHitSelf//蛇是否碰到墙
        {
            get
            {
                foreach (Block b in blockList)
                {
                    if (b.Number != headNumber && b.Origin.Equals(headPoint))
                    {
                        return true;
                    }
                }
                return false;
            }
        }

        public Snake(Point vertex,int count)
        {
            Block bb;          
            Point p = new Point(vertex.X + 40, vertex.Y + 40);//定义蛇尾起始位置
            blockList = new ArrayList(count);//初始数组长度为count
            for (int i = 0; i < count; i++)//通过循环填充blockList
            {
                bb = new Block();//实例化新块
                bb.Origin = p;//块的位置
                bb.Number = i+1 ;               
                blockList.Add(bb);
                if (i == count-1 )//如果是蛇头,就把位置(顶点)赋给headPoint
                {
                    headPoint = bb.Origin;
                    bb.IsHead = true;
                }
                p.X = p.X + 10;
            }
            headNumber = count;
        }
        public void TurnDirection(int pDirection)//0,1,2,3上,右,下,左蛇的转向方法,参数为蛇妖改变方向
        {
            switch (direction)//1
            {
                case 0:
                    if (pDirection == 3)
                        direction = 3;
                    else if (pDirection == 1)
                        direction = 1;
                    break;
                case 1:
                    if (pDirection == 2)
                        direction = 2;
                    else if (pDirection == 0)
                        direction = 0;
                    break;
                case 2:
                    if (pDirection == 3)
                        direction = 3;
                    else if (pDirection == 1)
                        direction = 1;
                    break;

                case 3:
                    if (pDirection == 2)
                        direction = 2;
                    else if (pDirection == 0)
                        direction = 0;
                    break;
            }
        }
        public void SnakeGrowth()
        {
            Block b = (Block)blockList[blockList.Count - 1];//蛇头那一块
            
            int x = b.Origin.X;
            int y = b.Origin.Y;
            if (direction == 0)
            {
                y = y - 10;
            }
            else if (direction == 1)
            {
                x = x + 10;
            }
            else if (direction == 2)
            {
                y = y + 10;
            }
            else if (direction == 3)
            {
                x = x - 10;
            }
            b.IsHead = false;
            Block newBlock = new Block();
            Point headP = new Point(x, y);//由坐标构造头位置点
            newBlock.Origin = headP;//把点赋给新块的位置属性
            newBlock.IsHead = true;
            //当前块儿的序数加1并赋给新块的序数属性
            newBlock.Number = b.Number + 1;
            blockList.Add(newBlock);//把新块添加到blockList中
            headNumber++;
            headPoint = headP;
        }
        public void Go(Graphics g)//显示蛇方法,参数为图形对象
        {
            Block b1 = (Block)blockList[0];//蛇尾那一块
            b1.UnDisplay(g);
            blockList.RemoveAt(0);
            foreach (Block b in blockList)
            {
                b.Number--;
            }
            headNumber--;
            SnakeGrowth();
            Display(g);
        }
        public void Display(Graphics g)//显示的方法
        {
            foreach (Block b in blockList)
            {
                b.Display(g);//显示当前块
            }
        }
        public void UnDisplay(Graphics g)//消除显示的方法
        {
            foreach (Block b in blockList)
            {
                b.UnDisplay(g);//消除当前块
            }
        }
       
        }
  
    }

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 贪吃蛇游戏
{
    public class Block
    {
        private int number;//蛇块的编号

        private Point origin;//蛇块的左上角位置

        private bool isHead;//是否为蛇头
        public int Number
        {
            get { return number; }
            set { number = value; }
        }
        public Point Origin
        {
            get { return origin; }
            set { origin = value; }
        }
        public bool IsHead
        {
            get { return isHead; }
            set { isHead = value; }
        }
        //显示蛇块
        public void Display(Graphics g)
        {
            SolidBrush sb;
            if (isHead==true)
            {
                //蛇头
                sb = new SolidBrush(Color.Red);
            }
            else
            {
                sb = new SolidBrush(Color.Blue);
            }
            g.FillEllipse(sb, origin.X, origin.Y,10,10);
        }
        //隐藏蛇块
        public void UnDisplay(Graphics g)
        {
            SolidBrush sb = new SolidBrush(Color.Silver);
            g.FillEllipse(sb, origin.X, origin.Y, 10, 10);
        }
    }
}
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 贪吃蛇游戏
{
  public  class Bean
    {
        public Point origin;//画食物左顶点坐标
      //属性
        public Point Origin
        {
            get { return origin; }
            set { origin = value; }
        }
      //产生食物
        public void Display(Graphics g)
        {
            //定义红色的画笔
            SolidBrush sb = new SolidBrush(Color.Red);
            //画实心矩形表示食物
            g.FillRectangle(sb,origin.X, origin.Y, 10, 10);

        }
      //隐藏食物
        public void UnDisplay(Graphics g)
        {
            //定义系统背景颜色的画笔
            SolidBrush sb = new SolidBrush(Color.Silver);
            //画实心矩形,颜色为系统背景颜色,相当于食物被吃掉了
            g.FillRectangle(sb, origin.X, origin.Y, 10, 10);
        }
    }
}

 

 

 

 

  • 8
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于C#.NET编程的游戏,本游戏实现了贪吃蛇的基本功能,需要要完善之处,望IT好友修正之。 程序功能 1)游戏选项:主要实现游戏的开始、暂停、退出,分别可以使用快捷键F2、空格键、F4。 2)设置: a)游戏难度等级设置:初级、中级、高级三个难度等级,每个难度等级又实现了三级加速,主要包括一级加速、二级加速、三级加速; b)蛇体颜色设置:绿色、红色、蓝色、黑色四种颜色可以选择; c) 蛇体宽度设置:初始大小、放大两倍、放大三倍三种选择; d)食物颜色设置:橙色、黄色、紫色三种颜色可以选择。 3)帮助:游戏操作说明,可以使用快捷键F3打开,主要介绍游戏的操作方法、以及版本信息、制作时间。 3.2设计思想 1)贪吃蛇的游戏规则:蛇头不能反向移动,若反向则保持原来的运动方向不变;不能碰到场地四周和自身,若碰到到四周墙壁或者自身,则游戏结束;当吃到食物后,应在随机生成一个新的坐标产生食物,并且食物不能再蛇身内生成;选择相应的游戏难度等级,当分数累加到一定程度以后,速度增加,每个等级有分为三个加速阶段。 2)游戏场地的绘制:将panel控件设计为游戏的背景,场地、贪吃蛇以及食物都是在panel控件中完成绘制。 3)蛇身和食物的绘制:本实验主要使用Graphics类在panel控件中绘制游戏的场地以及贪吃蛇、食物,食物模块、蛇身各模块的绘制是在单元格中进行绘制的,这样蛇身移动和食物生成过程中不需要重新绘制背景;根据蛇身模块宽度,可以改变蛇体的大小和场地坐标图方格的大小;根据食物类和蛇类各自的颜色变量,再通过菜单来改变其相应的颜色。 4)游戏的动态刷新控制:使用Timer组件来实现贪吃蛇的移动,通过设置该组件的Interval属性大小来控制移动的速度。 5)蛇身移动的实现:蛇身的移动主要是用ArrList类来实现的,该类的主要功能是使用大小可以根据需要动态增加数组,即建立动态数组来存储蛇身,本实验主要使用ArrList类的Insert方法和RemoveAt方法实现蛇模块的增加、蛇体移动的清除移动尾部。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值