C#核心实践小项目--贪吃蛇(跟着老师实现)

贪吃蛇

本篇笔记是跟着老师一起实现的贪吃蛇小游戏,可以和自己做的贪吃蛇比较一下,总结出不足的地方!

项目展示:

方向控制:WSAD

确定键:J

C#核心实践小项目--贪吃蛇(跟着老师实现)_第1张图片

一.需求分析 -- 就是UML类图

C#核心实践小项目--贪吃蛇(跟着老师实现)_第2张图片

二.游戏对象和场景更新接口

1.游戏类 ---- Game 

场景类型枚举 ---- E_SceneType

C#核心实践小项目--贪吃蛇(跟着老师实现)_第3张图片

2.场景更新接口 ---- ISceneUpdate

C#核心实践小项目--贪吃蛇(跟着老师实现)_第4张图片

三、实现多场景切换

1.游戏场景类

C#核心实践小项目--贪吃蛇(跟着老师实现)_第5张图片

2.开始和结束场景基类

3.开始场景

C#核心实践小项目--贪吃蛇(跟着老师实现)_第6张图片

将Game类中的nowScene 改为静态的

C#核心实践小项目--贪吃蛇(跟着老师实现)_第7张图片

将Game类中的场景切换方法也改静态的

4.结束场景

Game中的调用也改

C#核心实践小项目--贪吃蛇(跟着老师实现)_第8张图片

四、游戏场景逻辑实现

1.游戏对象基类的实现

绘制接口

C#核心实践小项目--贪吃蛇(跟着老师实现)_第9张图片

游戏对象类

C#核心实践小项目--贪吃蛇(跟着老师实现)_第10张图片

位置结构体

C#核心实践小项目--贪吃蛇(跟着老师实现)_第11张图片

2.继承游戏对象基类的对象

地图墙壁类

C#核心实践小项目--贪吃蛇(跟着老师实现)_第12张图片

食物类

C#核心实践小项目--贪吃蛇(跟着老师实现)_第13张图片

蛇身子类

C#核心实践小项目--贪吃蛇(跟着老师实现)_第14张图片

3.地图对象

C#核心实践小项目--贪吃蛇(跟着老师实现)_第15张图片

在GameScene实现Map中的方法

C#核心实践小项目--贪吃蛇(跟着老师实现)_第16张图片

到这里可以实现的功能有:三个场景

C#核心实践小项目--贪吃蛇(跟着老师实现)_第17张图片

C#核心实践小项目--贪吃蛇(跟着老师实现)_第18张图片

C#核心实践小项目--贪吃蛇(跟着老师实现)_第19张图片

4.蛇对象

C#核心实践小项目--贪吃蛇(跟着老师实现)_第20张图片

C#核心实践小项目--贪吃蛇(跟着老师实现)_第21张图片

5.蛇对象移动 -- (Lesson7 部分)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using 贪吃蛇.Lesson3;
using 贪吃蛇.Lesson4;
 
namespace 贪吃蛇.Lesson6
{
    /// 
    /// 蛇的移动方向
    /// 
    enum E_MoveDir
    {
        Up,
        Down,
        Left,
        Right,
    }
 
    class Snake : IDraw
    {
        SnakeBody[] bodys;
        //记录当前蛇的长度
        int nowNum;
        //当前移动方向
        E_MoveDir dir;
 
        public Snake(int x, int y)
        {
            //粗暴的方法 直接申明200个空间 来装蛇身体的数组
            bodys = new SnakeBody[200];
 
            bodys[0] = new SnakeBody(E_SnakeBody_Type.Head, x, y);
            nowNum = 1;
 
            dir = E_MoveDir.Down;
        }
 
        public void Draw()
        {
            //画一节一节的身子
            for (int i = 0; i < nowNum; i++)
            {
                bodys[i].Draw();
            }
        }
 
        #region Lesson7 蛇的移动
        public void Move()
        {
            //移动前
            //擦除最后一个位置
            Console.SetCursorPosition(bodys[nowNum - 1].pos.x, bodys[nowNum - 1].pos.y);
            Console.WriteLine("  ");
 
            //再移动
            switch (dir)
            {
                case E_MoveDir.Up:
                    --bodys[0].pos.y;
                    break;
                case E_MoveDir.Down:
                    ++bodys[0].pos.y;
                    break;
                case E_MoveDir.Left:
                    bodys[0].pos.x -= 2;
                    break;
                case E_MoveDir.Right:
                    bodys[0].pos.x += 2;
                    break;
                default:
                    break;
            }
 
        }
 
        #endregion
 
    }
}

C#核心实践小项目--贪吃蛇(跟着老师实现)_第22张图片

6.蛇对象改变移动方向(Lesson8 部分)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using 贪吃蛇.Lesson3;
using 贪吃蛇.Lesson4;
 
namespace 贪吃蛇.Lesson6
{
    /// 
    /// 蛇的移动方向
    /// 
    enum E_MoveDir
    {
        Up,
        Down,
        Left,
        Right,
    }
 
    class Snake : IDraw
    {
        SnakeBody[] bodys;
        //记录当前蛇的长度
        int nowNum;
        //当前移动方向
        E_MoveDir dir;
 
        public Snake(int x, int y)
        {
            //粗暴的方法 直接申明200个空间 来装蛇身体的数组
            bodys = new SnakeBody[200];
 
            bodys[0] = new SnakeBody(E_SnakeBody_Type.Head, x, y);
            nowNum = 1;
 
            dir = E_MoveDir.Down;
        }
 
        public void Draw()
        {
            //画一节一节的身子
            for (int i = 0; i < nowNum; i++)
            {
                bodys[i].Draw();
            }
        }
 
        #region Lesson7 蛇的移动
        public void Move()
        {
            //移动前
            //擦除最后一个位置
            Console.SetCursorPosition(bodys[nowNum - 1].pos.x, bodys[nowNum - 1].pos.y);
            Console.WriteLine("  ");
 
            //再移动
            switch (dir)
            {
                case E_MoveDir.Up:
                    --bodys[0].pos.y;
                    break;
                case E_MoveDir.Down:
                    ++bodys[0].pos.y;
                    break;
                case E_MoveDir.Left:
                    bodys[0].pos.x -= 2;
                    break;
                case E_MoveDir.Right:
                    bodys[0].pos.x += 2;
                    break;
                default:
                    break;
            }
 
        }
 
        #endregion
 
        #region Lesson8 改变方向
        public void ChangeDir(E_MoveDir dir)
        {
            //只有头部的时候 可以直接左转右 右转左 上转下 下转上
            //有身体时 这些情况就不能直接转
            if (this.dir == dir || 
                nowNum > 1 && 
                (this.dir == E_MoveDir.Up && dir == E_MoveDir.Down || 
                this.dir == E_MoveDir.Down && dir == E_MoveDir.Up || 
                this.dir == E_MoveDir.Left && dir == E_MoveDir.Right || 
                this.dir == E_MoveDir.Right && dir == E_MoveDir.Left))
            {
                return;
            }
 
            //只要没有 return 就记录外面传入的方向 之后就会按照这个方向去移动
            this.dir = dir;
        }
        #endregion
 
    }
}

在GameScene里面实现调用

C#核心实践小项目--贪吃蛇(跟着老师实现)_第23张图片

7.撞墙撞身体结束游戏 -- (Lesson9 部分)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using 贪吃蛇.Lesson3;
using 贪吃蛇.Lesson4;
using 贪吃蛇.Lesson5;
 
namespace 贪吃蛇.Lesson6
{
    /// 
    /// 蛇的移动方向
    /// 
    enum E_MoveDir
    {
        Up,
        Down,
        Left,
        Right,
    }
 
    class Snake : IDraw
    {
        SnakeBody[] bodys;
        //记录当前蛇的长度
        int nowNum;
        //当前移动方向
        E_MoveDir dir;
 
        public Snake(int x, int y)
        {
            //粗暴的方法 直接申明200个空间 来装蛇身体的数组
            bodys = new SnakeBody[200];
 
            bodys[0] = new SnakeBody(E_SnakeBody_Type.Head, x, y);
            nowNum = 1;
 
            dir = E_MoveDir.Down;
        }
 
        public void Draw()
        {
            //画一节一节的身子
            for (int i = 0; i < nowNum; i++)
            {
                bodys[i].Draw();
            }
        }
 
        #region Lesson7 蛇的移动
        public void Move()
        {
            //移动前
            //擦除最后一个位置
            Console.SetCursorPosition(bodys[nowNum - 1].pos.x, bodys[nowNum - 1].pos.y);
            Console.WriteLine("  ");
 
            //再移动
            switch (dir)
            {
                case E_MoveDir.Up:
                    --bodys[0].pos.y;
                    break;
                case E_MoveDir.Down:
                    ++bodys[0].pos.y;
                    break;
                case E_MoveDir.Left:
                    bodys[0].pos.x -= 2;
                    break;
                case E_MoveDir.Right:
                    bodys[0].pos.x += 2;
                    break;
                default:
                    break;
            }
 
        }
 
        #endregion
 
        #region Lesson8 改变方向
        public void ChangeDir(E_MoveDir dir)
        {
            //只有头部的时候 可以直接左转右 右转左 上转下 下转上
            //有身体时 这些情况就不能直接转
            if (this.dir == dir || 
                nowNum > 1 && 
                (this.dir == E_MoveDir.Up && dir == E_MoveDir.Down || 
                this.dir == E_MoveDir.Down && dir == E_MoveDir.Up || 
                this.dir == E_MoveDir.Left && dir == E_MoveDir.Right || 
                this.dir == E_MoveDir.Right && dir == E_MoveDir.Left))
            {
                return;
            }
 
            //只要没有 return 就记录外面传入的方向 之后就会按照这个方向去移动
            this.dir = dir;
        }
        #endregion
 
        #region Lesson9 撞墙撞身体结束逻辑
        public bool CheckEnd(Map map)
        {
            for (int i = 0; i < map.walls.Length; i++)
            {
                if (bodys[0].pos == map.walls[i].pos)
                {
                    return true;
                }
            }
 
            for (int i = 1; i < nowNum; i++)
            {
                if (bodys[0].pos == bodys[i].pos)
                {
                    return true;
                }
            }
 
            return false;
        }
        #endregion
 
    }
}

GameScene中调用

C#核心实践小项目--贪吃蛇(跟着老师实现)_第24张图片

8.蛇吃食物

C#核心实践小项目--贪吃蛇(跟着老师实现)_第25张图片

Snake类里面添加的相关方法 -- (Lesson10 部分)

C#核心实践小项目--贪吃蛇(跟着老师实现)_第26张图片

GameScene类中调用

C#核心实践小项目--贪吃蛇(跟着老师实现)_第27张图片

9.蛇长身体

Snake类中添加方法

(加了Lesson11--长身体AddBody方法,在Lesson10吃食物方法里面调用了AddBody方法,然后在Lesson7中添加了蛇尾跟着蛇头移动的逻辑处理)

C#核心实践小项目--贪吃蛇(跟着老师实现)_第28张图片

至此跟着老师进行的制作的功能都已实现

视频展示

C#核心实践--贪吃蛇(老师实现的)

完整代码在资源里

总结一下下

还是得多敲多练,多想想怎么让代码更精简,逻辑怎么更清晰!

多挤些时间啊!

你可能感兴趣的:(c#,开发语言)