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

C#贪吃蛇实战:从零构建桌面游戏,掌握WinForms核心开发 面向对象编程是软件开发的基石,其核心思想是通过封装、继承和多态来组织代码,提升可维护性和复用性。在桌面应用开发领域,事件驱动模型是实现用户交互的关键机制,它通过响应系统消息来驱动程序流程。结合图形设备接口(GDI+)技术,开发者能够在Windows Forms等框架下高效绘制自定义界面。这些技术共同构成了经典游戏如贪吃蛇的实现基础,通过清晰的游戏循环、状态管理和碰撞检测逻辑,将离散的编程知识串联成完整的项目实践。对于C#初学者而言,从零实现贪吃蛇不仅能巩固语法基础,更能深入理解窗体绘制、事件处理与面向对象设 阅读详情
AI摘要

本文详细描述了一名开发者跟随教程实现贪吃蛇游戏的过程,涉及类设计、场景管理、多场景切换、游戏对象移动、碰撞检测和食物吃掉后的成长机制。作者强调了编码实践中的优化和逻辑清晰的重要性。

注:要源码的私信我,官方也真是的,下个源码包都要VIP,服了!!!

贪吃蛇

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

项目展示:

方向控制:WSAD

确定键:J

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

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

1.游戏类 ---- Game 

场景类型枚举 ---- E_SceneType

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

三、实现多场景切换

1.游戏场景类

2.开始和结束场景基类

3.开始场景

将Game类中的nowScene 改为静态的

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

4.结束场景

Game中的调用也改

四、游戏场景逻辑实现

1.游戏对象基类的实现

绘制接口

游戏对象类

位置结构体

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

地图墙壁类

食物类

蛇身子类

3.地图对象

在GameScene实现Map中的方法

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

4.蛇对象

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using 贪吃蛇.Lesson3;
using 贪吃蛇.Lesson4;
 
namespace 贪吃蛇.Lesson6
{
    /// <summary>
    /// 蛇的移动方向
    /// </summary>
    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
 
    }
}

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using 贪吃蛇.Lesson3;
using 贪吃蛇.Lesson4;
 
namespace 贪吃蛇.Lesson6
{
    /// <summary>
    /// 蛇的移动方向
    /// </summary>
    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里面实现调用

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
{
    /// <summary>
    /// 蛇的移动方向
    /// </summary>
    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中调用

8.蛇吃食物

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

GameScene类中调用

9.蛇长身体

Snake类中添加方法

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

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

视频展示

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

完整代码在资源里

总结一下下

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

多挤些时间啊!

C# 贪吃蛇大作战 作为一个一款儿时常玩的经典小游戏,贪吃蛇的设计简单,实用和娱乐性高,提玩法早已人尽皆知。为了重温这一小游戏,本组对贪吃蛇进行了复原一级相应的优化,吃的食物,蛇的身体会增加长度,同时,关卡不相同,蛇的移动速度也会不同。... 阅读详情

相关推荐

C#核心实践:从零构建贪吃蛇游戏(UML类图解析与实现)

本文详细介绍了如何使用C#从零构建贪吃蛇游戏,重点解析UML类图设计并实现核心功能。通过状态模式、模板方法模式等设计模式的应用,展示了面向对象编程的精髓。文章包含游戏主框架搭建、蛇的运动逻辑优化、食物生成算法改进等核心代码实现,适合开发者学习C#核心实践和小项目开发。

weixin_29001683的博客 405

c#用控制台实现贪吃蛇小游戏

写在前面: 有一天突发奇想,如果我只用算法实现基本逻辑,让控制台输出图像,不用任何组件,只用一门编程语言,能否实现一个可以人机交互的小游戏,抱着试一试的想法,博主用c#控制台程序复原了贪吃蛇玩法的小游戏。 目录 一、可视化界面 二、贪吃蛇基本逻辑 1.游戏玩法 一、可视化界面 众所周知,控制台程序通常没有可视化的界面,只是通过字符串来显示或者监控程序,在使用控制台写程序时,我们只关心数据,不在乎界面。但是,如果我们偏偏反其道而行之,用控制台可视化形式将游戏界面...

sinsted的博客 1万+

C#实现贪吃蛇游戏

定义数据结构:创建一个类来表示贪吃蛇的每个部分(通常是一个具有X和Y坐标的结构体或类)。定义游戏状态:包括蛇的位置、方向、长度以及食物的位置。处理键盘输入:重写窗体的键盘事件处理函数,以便玩家可以使用键盘控制蛇的移动方向。更新游戏状态:在每个游戏循环中,更新蛇的位置(根据当前方向和移动速度),并检查是否吃到食物、撞到墙壁或自己。绘制游戏画面:在窗体的Paint事件中,根据当前的游戏状态绘制蛇和食物。// 游戏区域大小// 蛇的方向// 蛇的初始位置// 食物的位置。

赵玉的专栏 1391

C#贪吃蛇-小游戏实战总结分享

贪吃蛇游戏实战

欢迎来到小曾曾的博客 3219

用C#编写的经典贪吃蛇游戏

打开您喜欢的集成开发环境(IDE),如Visual Studio,并创建一个新的C#控制台项目。在C#中,我们可以使用一个列表来表示蛇的身体,其中每个元素都代表蛇的一个部分。贪吃蛇是一款经典的街机游戏,它的目标是控制一条蛇,使其吃到食物并不断增长长度,同时避免碰到墙壁或自己的身体。您将能够使用键盘的方向键来控制蛇的移动,并尽量避免碰到墙壁或自己的身体。每当蛇吃到食物时,它的长度会增加,游戏的难度也会逐渐增加。最后,在程序的入口点Main()中,我们创建一个Game对象并调用其Run()方法来启动游戏。

学习使你进步。 547

C#核心--实践小项目(贪吃蛇)

加了Lesson11--长身体AddBody方法,在Lesson10吃食物方法里面调用了AddBody方法,然后在Lesson7中添加了蛇尾跟着蛇头移动的逻辑处理。 还是得多敲多练,多想想怎么让代码更精简,逻辑怎么更清晰!

SunsetSunup的博客 1877

视频教程-WPF贪吃蛇游戏开发详解-.NET

WPF贪吃蛇游戏开发详解 成都理工大学优秀讲师,教授,二十年开发经验,和十六...

weixin_33214312的博客 449

C#核心实践小项目--贪吃蛇(自己实现)

本篇文章是先不看老师教程的情况下,自己独立来完成的,顺便记录一下实现的过程。

SunsetSunup的博客 3916

C#贪吃蛇最简实现:命令行状态机教学版

贪吃蛇是理解状态机、坐标控制与游戏循环的经典入门项目。其本质是二维网格中的状态迁移问题:蛇身由有序坐标点构成,移动即批量偏移,碰撞即布尔判定,帧率由休眠时间精确控制。这种基于Console的纯逻辑实现,规避了GUI框架干扰,特别适合C#初学者建立‘数据-行为-反馈’的工程直觉。文中围绕Point结构体、Direction枚举和List<T>蛇身管理三大核心热词,构建可调试、可演进、零依赖的最小可行系统,覆盖从Hello World到课堂演示的完整学习路径。

weixin_32479897的博客 164

C#控制台贪吃蛇

系统学习了封装继承多态和面向对象的七大原则,自己试着画了UML图,我靠我玩unity一年半了才画了第一张UML图。早期跟着唐老师写的C#核心实践项目。

qq_22471137的博客 265

C#小游戏源码实战:从贪吃蛇到五子棋的工程化学习路径

在C#学习过程中,掌握面向对象编程和事件驱动模型是核心基础。通过定时器、二维数组和碰撞检测等机制,游戏循环实现了状态管理与实时交互。这些技术不仅帮助理解窗体应用开发,还能提升代码复用与调试能力。典型应用场景包括贪吃蛇、俄罗斯方块和五子棋等桌面游戏,它们覆盖了从数据结构到算法判定的关键技能。本文以七份可运行的C#小游戏源码为例,详细解析如何通过阅读和改造源码,建立工程思维并避开常见陷阱。

weixin_32479897的博客 253

C++控制台小游戏实战:贪吃蛇、扫雷、2048从环境配置到完整实现

编程语言的学习离不开动手实践,而控制台小游戏正是将C++语法与真实应用场景衔接的绝佳载体。通过开发贪吃蛇、扫雷、2048等经典项目,学习者能够深入理解二维数组、递归算法、状态管理、内存布局等核心编程概念,掌握从需求分析到代码落地的完整流程。这些游戏看似简单,却覆盖了输入输出、循环控制、随机数生成、碰撞检测、矩阵变换等高频技术点,同时还能帮助排查环境配置、编码乱码、逻辑死循环等工程实践中的常见问题。对于刚学完C++语法却不知如何练手的新手,或是需要一套成熟案例进行教学的老师,控制台小游戏都是性价比极高的实践路

weixin_33755649的博客 362

Unity VR贪吃蛇完整工程:含场景、交互脚本与即跑环境配置

一套开箱即用的Unity VR贪吃蛇游戏源码,已预设VR运行环境,无需额外导入SDK,插上头显就能测试核心玩法。包含完整可运行场景(Scenes)、蛇体控制逻辑(生长、转向、碰撞检测)、食物随机生成系统、第一人称视角跟随机制,以及基于TextMesh Pro的UI文本渲染方案。脚本全部集中存放在Assets/Scripts目录下,结构清晰,C#代码注释完整;Resources文件夹管理预制体与配置资源,Plugins目录集成必要基础支持模块。项目遵循标准Unity工程规范,ProjectSettings中已

alpha的博客 193

Unity2D跑酷对战工程化实践:C#状态机与数据驱动设计

2D跑酷游戏是Unity教学中高频实践场景,其核心涉及物理模拟、输入响应、碰撞检测与状态管理等基础引擎能力。基于C#的强类型特性与协程机制,可构建高确定性、易调试的游戏逻辑;结合有限状态机(FSM)与JSON数据驱动,能解耦关卡设计与程序实现,支撑快速迭代与答辩演示。该方案规避了UnityScript废弃风险与Rigidbody2D物理失配问题,通过射线分层检测、Addressables热加载、事件总线解耦等工业级实践,在保证60FPS稳定帧率的同时,显著提升代码可维护性与教学成果表达力。适用于高校课程设计

weixin_30367169的博客 249

C# WinForms 游戏开发实战:六个经典小游戏源码解析与练习

WinForms 是 .NET 桌面开发的基础框架,通过 Timer 定时器驱动游戏循环,结合 GDI+ 绘图和键盘事件处理,即可实现经典小游戏。其技术价值在于帮助初学者理解事件驱动编程、状态管理和基础算法。典型应用场景包括飞机大战的碰撞检测、贪吃蛇的队列管理、俄罗斯方块的二维数组操作等。本文以六个 C# 小游戏源码为例,详细拆解游戏循环、键盘输入缓冲、路径搜索和胜负判定等核心实现,并提供编译运行与避坑指南,适合刚学完 C# 语法、需要项目练手的开发者。

weixin_29504571的博客 258

精品源码C# 20个经典小游戏集合

小游戏源码目录如下: 01、21点小游戏 02、百变方块小游戏 03、打字小游戏 04、单机坦克小游戏 05、对对碰小游戏 06、俄罗斯方块小游戏 07、拱猪小游戏 08、汉诺塔小游戏 09、黑白棋小游戏 10、华容道小游戏 11、计算器小游戏 12、连连看小游戏 13、七巧板小游戏 14、人物拼图小游戏高级版 15、人物拼图小游戏简单版 16、扫雷小游戏 17、贪吃蛇小游戏 18、坦克大战小游戏 19、停车场小游戏 20、涂鸦小游戏 21、推箱子小游戏 22、网络军棋小游戏 23、网络中国象棋小游戏 24、智力问答小游戏 小游戏源码目录如下: 01、21点小游戏 02、百变方块小游戏 03、打字小游戏 04、单机坦克小游戏 05、对对碰小游戏 06、俄罗斯方块小游戏 07、拱猪小游戏 08、汉诺塔小游戏 09、黑白棋小游戏 10、华容道小游戏 11、计算器小游戏 12、连连看小游戏 13、七巧板小游戏 14、人物拼图小游戏高级版 15、人物拼图小游戏简单版 16、扫雷小游戏 17、贪吃蛇小游戏 18、坦克大战小游戏 19、停车场小游戏 20、涂鸦小游戏 21、推箱子小游戏 22、网络

Unity贪吃蛇进阶:三层架构与确定性游戏循环实战

贪吃蛇作为经典游戏范式,本质是理解游戏开发中‘确定性逻辑’与‘表现分离’的核心入口。其原理在于将输入响应、状态演进和视觉呈现解耦,依托FixedUpdate构建帧率无关的游戏循环,并通过Vector2Int等整数坐标系统规避浮点误差,保障碰撞判定与网格移动的精确性。这种设计不仅提升性能与可测试性,更直接支撑AI集成、网络同步及跨平台部署等工程需求。本文聚焦Unity引擎约束下的稳健实现,涵盖环形缓冲区优化蛇身管理、空闲坐标池保障食物生成可靠性、查表式O(1)碰撞检测等关键技术细节,为从Demo迈向真实项目提

weixin_33793620的博客 133

贪吃蛇_C#_

c#贪吃蛇,代码中设置了蛇身设置骨节的大孝设置移动方向、设置食物的所在点、记录绘制贪吃蛇的控件、设置贪吃蛇身体的颜色、初始化场地及贪吃蛇的信息

上一篇: C#核心实践小项目--贪吃蛇(自己实现)
下一篇: C#中各变量类型占多少个字节,容量又是多少呢?
@Sunset...
博客等级 码龄5年 553粉丝 84原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值