C#贪吃蛇游戏之--逻辑层(三)

C++游戏开发实战:从零构建2D游戏框架与核心模块 游戏开发的核心在于理解底层运行机制,其中游戏循环(Game Loop)是实现实时交互的基础架构,它驱动着每一帧的事件处理、状态更新与画面渲染。通过面向对象编程思想,开发者可以将游戏实体抽象为类与对象,利用C++的内存管理、多态和STL等特性构建模块化系统。这种从原理到实践的学习路径,不仅深化了对编程语言的理解,更能培养解决实际工程问题的能力。在2D游戏开发中,碰撞检测、资源管理与状态机等关键技术,为后续学习Unreal Engine等大型引擎奠定了坚实基础。本文以SFML轻量级库为例,手把手教你搭建开发环境 阅读详情

到了逻辑层了,我们要分析游戏的规则:是否蛇可以爬行、是否吃掉食物、是否产生新食物、是否游戏结束、积分规则等。

    蛇死亡目前有两种形式:撞到墙壁;咬到自己 :(

    产生新食物前提:蛇吃掉食物,随机产生新坐标食物(新坐标!=蛇身[n])。

GameLogic.cs

  1. public class GameLogic  
  2.     {  
  3.         /// <summary>  
  4.         /// SNAKE_INIT_LENGH:蛇缺省长度  
  5.         /// SNAKE_INIT_DIRECTION:蛇缺省爬行方向  
  6.         /// </summary>  
  7.         public const int SNAKE_INIT_LENGH = 3;  
  8.         public const SnakeDirection SNAKE_INIT_DIRECTION = SnakeDirection.Right;  
  9.         private Snake snake;  
  10.         private Food food;  
  11.         //游戏场景  
  12.         private System.Windows.Forms.Panel panel;  
  13.         private Graphics g;  
  14.         private SolidBrush backBrush;  
  15.         private bool gameOver = false;  
  16.         public int BackWidth;  
  17.         public int BackHeight;  
  18.   
  19.         private Point ObjFoodPoint  
  20.         {  
  21.             get { return food.Point; }  
  22.             set { food.Point = value; }  
  23.         }  
  24.         private Point NewSnakeHead  
  25.         {  
  26.             get { return snake.Point; }  
  27.             set { snake.Point = value; }  
  28.         }  
  29.         public SnakeDirection SnakeDirection  
  30.         {  
  31.             get { return snake.SnakeDirection; }  
  32.             set { snake.SnakeDirection = value; }  
  33.         }  
  34.         public bool GameOver  
  35.         {  
  36.             get { return gameOver; }  
  37.         }  
  38.   
  39.         //构造函数,实例化对象  
  40.         public GameLogic(System.Windows.Forms.Panel p, int w, int h)  
  41.         {  
  42.             this.panel = p;  
  43.             BackWidth = w;  
  44.             BackHeight = h;  
  45.             snake = new Snake(SNAKE_INIT_LENGH, SNAKE_INIT_DIRECTION, BackWidth, BackHeight);  
  46.             food = new Food();  
  47.         }  
  48.   
  49.         //初始游戏画面  
  50.         public void InitGame()  
  51.         {  
  52.             g = panel.CreateGraphics();  
  53.             backBrush = new SolidBrush(panel.BackColor);  
  54.             snake.DrawSnake(g);  
  55.             CreateFood();  
  56.         }  
  57.   
  58.         //清除游戏画面  
  59.         public void CrearAll()  
  60.         {  
  61.             foreach (Point point in snake.SnakePoints)  
  62.                 snake.Crear(g, backBrush, point);  
  63.             food.Crear(g, backBrush, ObjFoodPoint);  
  64.         }  
  65.   
  66.         //蛇运动  
  67.         public void SnakeMove()  
  68.         {  
  69.             Point newPoint = new Point();  
  70.             if (snake.IsCanMove(ref newPoint))  
  71.             {  
  72.                 NewSnakeHead = newPoint;  
  73.                 snake.DrawHead(g);  
  74.                 if (IsEatFood(ObjFoodPoint))  
  75.                 {  
  76.                     CreateFood();  
  77.                 }  
  78.                 else  
  79.                 {  
  80.                     snake.Crear(g, backBrush, snake.SnakePoints[snake.SnakePoints.Count - 1]);  
  81.                     snake.SnakePoints.Remove(snake.SnakePoints[snake.SnakePoints.Count - 1]);  
  82.                 }  
  83.             }  
  84.             else  
  85.             {  
  86.                 gameOver = true;  
  87.             }  
  88.             if (IsHitOneself())  
  89.                 gameOver = true;  
  90.         }  
  91.   
  92.         //蛇吃食物  
  93.         public bool IsEatFood(Point point)  
  94.         {  
  95.             if (point == snake.SnakePoints[0])  
  96.             {  
  97.                 return true;  
  98.             }  
  99.             return false;  
  100.         }  
  101.   
  102.         //当食物被吃掉时,产生随机坐标的食物  
  103.         public void CreateFood()  
  104.         {  
  105.             Random objRandom = new Random();  
  106.             Point objPoint;  
  107.             int tempX, tempY;  
  108.             for (int i = 0; ; i++)  
  109.             {  
  110.                 tempX = objRandom.Next(BackWidth) % (BackWidth / 11);  
  111.                 tempY = objRandom.Next(BackHeight) % (BackHeight /11);  
  112.                 if (tempX == 0 || tempY == 0)  
  113.                 {  
  114.                     continue;  
  115.                 }  
  116.                 else  
  117.                 {  
  118.                     objPoint = new Point(tempX, tempY);  
  119.   
  120.                     if (snake.SnakePoints.Contains(objPoint))  
  121.                     {  
  122.                         continue;  
  123.                     }  
  124.                     else  
  125.                     {  
  126.                         ObjFoodPoint = objPoint;  
  127.                         break;  
  128.                     }  
  129.                 }  
  130.             }  
  131.             food.DrawFood(g);  
  132.         }  
  133.   
  134.         //蛇头撞上蛇身  
  135.         public bool IsHitOneself()  
  136.         {  
  137.             for (int i = 1; i < snake.SnakePoints.Count; i++)  
  138.             {  
  139.                 if (snake.SnakePoints[0] == snake.SnakePoints[i])  
  140.                     return true;  
  141.             }  
  142.             return false;  
  143.         }  
  144.   
  145.         //积分累加  
  146.         public string GetFenShu()  
  147.         {  
  148.             return ((snake.SnakePoints.Count - SNAKE_INIT_LENGH) * 15).ToString();  
  149.         }  
  150.     }  
 

    上面代码注释的比较多,应该不难理解,大家看下有哪里需要改进的提下意见!:)

Unity 2D Roguelike游戏开发:随机地牢、道具系统与数据持久化实战 游戏开发中,系统架构与数据管理是构建可维护、可扩展项目的核心基础。其原理在于通过分层设计(如数据层、逻辑层、表现层)实现关注点分离,利用组件化和数据驱动提升开发效率。这种架构的技术价值在于能有效管理复杂游戏状态,支持快速迭代与内容扩展,尤其适合需要大量内容配置和状态保存的游戏类型。在应用场景上,它广泛应用于独立游戏、策略游戏以及需要高重复可玩性的项目中,例如Roguelike地牢探险游戏。本文聚焦于Unity引擎,详细阐述了如何基于ScriptableObject构建数据驱动的道具系统,并实现可靠的JSON 阅读详情

相关推荐

用纯文本和Prompt工程在ChatGPT中运行Flappy Bird

文本游戏是人机交互的基础范式之一,其核心在于状态机建模与确定性规则推演,而非图形渲染。大语言模型虽无原生事件循环或内存状态,但通过显式状态注入、整数化物理参数、强格式约束输出及ASCII行号定位等prompt工程手段,可稳定实现输入-反馈-状态更新的实时闭环。该方案凸显LLM作为‘文本协议处理器’的技术本质,在教育、无障碍交互、合规系统等低依赖、高可控场景中具备显著工程价值。Flappy Bird在此成为验证状态同步、指令约束与文本可视化边界的理想载体。

425

C#控制台贪吃蛇

C#控制台贪吃蛇 食物的位置与蛇的身体或者障碍物冲突了,那么一直重新生成食物,直到生成不冲突的食物。// 第一次生成食物位置 // 随机生成一个食物的位置。// 第一个是判断蛇是否碰到了自己的身体,第二是判断蛇是否碰到了障碍物。// 食物生成完成后判断食物生成的位置与现在的蛇的身体或者障碍物有冲突。// 蛇的身长的队列,如果吃了食物直接加一个进来,初始的蛇身长是6个*// 如果进了这个判断,那么游戏结束,程序退出。

ai 825

C++函数设计实战:从语法到工程化程序设计

函数是程序设计的基本逻辑单元,其本质是封装可复用、可测试、职责单一的计算行为。理解参数传递机制(值/引用/const引用)、返回值语义(void/值/引用)与异常分类(logic_error/runtime_error),是构建健壮C++系统的前提。现代C++函数设计强调接口契约、跨平台可移植性与RAII资源管理,直接支撑排序算法实现、回调机制演进及模块化架构落地。本文聚焦C++实验1级真实训练场景,覆盖VSCode环境配置、Catch2单元测试、常见悬垂指针与未初始化变量排查,帮助初学者跨越‘能跑通’到‘

weixin_34377919的博客 486

C#开发Unity游戏教程之游戏对象的行为逻辑方法

C#开发Unity游戏教程之游戏对象的行为逻辑方法

大学霸__IT达人 1896

C#游戏编程源码实战:从WinForms游戏循环到.NET迁移

游戏循环与碰撞检测是2D游戏开发中最基础也最核心的机制。理解其原理,就能明白现代游戏引擎中Update与Collider背后的实现逻辑。通过解析经典C#源码中的Timer驱动主循环、Graphics.DrawImage位图绘制和Rectangle.IntersectsWith碰撞判定,开发者可以掌握不依赖引擎的手写游戏逻辑与WinForms桌面应用技能。这种工程实践在课程设计、轻量级小游戏以及老项目迁移到.NET 6/8时极具参考价值。经典源码虽然年代久远,却恰好能帮助初学者在Visual Studio 2

weixin_31130435的博客 309

Unity寻宝游戏完整交付包:源码+exe+视频+文档

Unity游戏开发中,‘可交付’远不止于能运行的exe——它涵盖开发环境一致性、代码可维护性、跨设备部署能力与协作认知对齐。ScriptableObject数据驱动、URP渲染管线适配、InputSystem事件解耦等关键技术,共同支撑起一个最小可行游戏产品包的工程闭环。本文以落笔洞寻宝项目为例,详解如何通过源文件结构化设计、独立exe防错构建、行为级视频验证及显性化文档沉淀,解决新手调试难、外包交付信、教学复现卡等高频痛点,为Unity项目标准化交付提供可复用的技术范式。

weixin_30542979的博客 220

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

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

sinsted的博客 1万+

c#贪吃蛇小游戏源代码

通过开发一款贪吃蛇游戏程序,熟练掌握C#编程语言、和面向对象程序设计方法,独立完成一个游戏程序的开发。贪吃蛇的主要三个元素是棋盘地图、蛇身、奖励豆,蛇身只能在棋盘地图内进行移动,吃到奖励豆,自身长度增加一格,蛇身碰到自己的身体则Game Over。 在C#中设计贪吃蛇实验,可以通过控制台应用程序实现。以下是设计流程和示例代码: 设计游戏区域:使用二维数组表示游戏区域,其中贪吃蛇、食物和墙壁用不同的字符表示。 控制蛇的移动:通过键盘输入控制蛇的移动方向。 蛇的行动逻辑:根据输入的方向移动蛇的头部位置,并在移动后判断是否吃到食物。 食物随机生成:在游戏区域内随机生成食物的位置。 蛇吃食物:当蛇吃掉食物时,增加蛇的长度并在原位置生成新的食物。 游戏结束条件:蛇碰到墙壁或者自己时游戏结束。

用C#实现贪吃蛇游戏

先说了,如果不会GDI+,类的定义这些基础东西的,请先搜索相关贴子学习。 这次教大家用C#做一个简单的贪吃蛇游戏。先介绍用到的技术:GDI+定义类枚举 因为C#是一门面向对象的语言,我们不用把所有代码都写在一个窗体上,应该有一个分层思想(界面还界面,数据处理还数据处理),如果还要网上对战的话,搞个三层吧(界面层,数据处理或逻辑层,Socket层),这样不仅方便维护,

lijt1987的专栏 1万+

贪吃蛇(c#完美版 界面与逻辑分离)

本人在学习面向对象的过程中,写的一个贪吃蛇。界面与游戏逻辑完全分离。

C#贪吃蛇(非常强悍的C#贪吃蛇游戏,你一定不会后悔的)

有C#写的一个非常强大的贪吃蛇游戏,共分5关,可以选择关数,可以选择速度,有暂停,开始,帮助。。等按钮,,,一个很完善,很强大的小例子。。。。

C#贪吃蛇游戏之--界面层(五)

界面层调用逻辑层定义好的方法即可,相对比较简单,直接帖代码就好了!     界面暂且设计成上面的样子,不怎么美观,根据个人爱好设置了! MySnakeUI.cs public partial class MySnakeUI : Form   {       //游戏逻辑类       GameLogic gameLogic;       //游

fa6507的专栏 2691

代谢组学数据分析实战:用R语言从PCA、PLS-DA到OPLS-DA一步步搞定(附代码)

本文详细介绍了使用R语言进行代谢组学数据分析的全流程,从数据预处理到PCA、PLS-DA和OPLS-DA模型构建与验证。通过实际案例和代码示例,帮助研究者掌握关键分析技术,提升数据解读能力,特别适合生命科学领域的研究人员。

weixin_28689507的博客 133

C# WinForms贪吃蛇游戏开发:从零实现游戏循环与碰撞检测

游戏循环与碰撞检测是游戏开发中的核心概念。游戏循环通过定时器或线程周期性地更新游戏状态和渲染画面,构成了游戏运行的基本骨架。碰撞检测则通过算法判断游戏对象间的交互,是游戏逻辑的关键。在桌面应用开发中,利用C# WinForms的事件驱动模型,可以高效实现这些机制,其即时反馈特性非常适合技术学习和原型验证。本文以经典的贪吃蛇游戏为例,详细拆解了如何运用链表数据结构管理蛇身移动,并通过分离游戏引擎、渲染器和窗体控制器的架构设计,清晰展示了事件驱动、状态管理与双缓冲绘图等工程实践。该案例不仅帮助开发者巩固面向对象

weixin_34242331的博客 315

图像调整亮度饱和度 c语言,【C#/WPF】调节图像的HSL(色相、饱和度、明亮度)...

先说概念:HSL是一种描述颜色的方式(其他颜色描述方式还有大家熟悉的RGB值)。HSL三个字母分别表示图像的Hue色相、Saturation饱和度、Lightness明亮度。需求:制作一个面板,包含三个滑动条,拖动滑动条可以修改目标图片的HSL值。即模仿PS中类似的功能,如下图:方案一:遍历所有像素点,修改每个点的HSL值。前台界面:一个Image控件显示目标图片,一个Button按钮点击一下降低...

weixin_39935777的博客 1155

CentOS 7 离线升级 OpenSSH 9.9p2 保姆级教程(含依赖包下载与常见报错解决)

本文提供了一份详尽的CentOS 7系统离线升级OpenSSH至9.9p2版本的完整教程。针对无外网环境,重点讲解了依赖包(尤其是OpenSSL 3.x)的离线下载与编译部署,并深入解决了编译过程中常见的“libcrypto.so缺失”等动态库链接错误。教程涵盖从环境准备、源码编译、服务配置到系统集成的全流程,最后还提供了关键的回滚方案与应急预案,是运维人员在内网环境中进行安全加固的实用指南。

weixin_29248313的博客 325

C#与GDI+实战:从零构建WinForms贪吃蛇游戏

在桌面应用开发中,图形用户界面(GUI)的流畅绘制与事件驱动模型是核心技术基础。GDI+作为Windows平台原生的2D图形接口,通过直接控制像素绘制,让开发者深入理解双缓冲、帧更新等底层图形原理,这对于构建高性能、无闪烁的动画应用至关重要。其技术价值在于平衡了开发效率与控制粒度,尤其适合需要精细图形处理的教育项目和小型游戏。在应用场景上,经典游戏如贪吃蛇成为绝佳的练手项目,能系统串联面向对象设计、游戏循环与状态管理。本文以贪吃蛇为例,详细展示了如何利用C#和GDI+实现流畅动画与精确控制,涵盖双缓冲消除闪

weixin_30621711的博客 357

神领物流-day01-项目概述

公司从2019年开始业务快速扩张,网点数量从138家扩展至540家,车辆从170台增长到800台。同时,原有的系统非常简单,比如车辆的调度靠人工操作、所有的货物分拣依靠人员,核心订单数据手动录入,人效非常低。随着业务不断演进,技术的不断提升,原有运输管理系统已无法满足现有快速扩展下的业务需求,但针对现有系统评估后发现,系统升级成本远高于重新研发。因此,公司决定基于现有业务体系进行重新构建,打造一套新的TMS运输系统,直接更替原有系统。

心飞为你飞 2255

Unity贪吃蛇进阶:MVC架构、网格移动与对象池优化实战

游戏开发的核心在于理解游戏循环、输入控制与对象管理等基础概念。这些原理构成了任何游戏项目的骨架,其技术价值在于构建可维护、可扩展的代码架构。在2D游戏开发中,采用MVC(Model-View-Controller)设计模式能有效分离数据、表现与控制逻辑,提升代码的清晰度和可测试性。对象池技术则是优化性能、减少垃圾回收的关键实践,尤其适用于需要频繁创建销毁游戏对象的场景。本文以经典的贪吃蛇游戏为具体案例,深入剖析如何运用MVC架构和对象池,实现一个逻辑清晰、性能高效且易于扩展的Unity项目,为开发更复杂的2

weixin_33843409的博客 570

RTT Studio和Cubemx联合开发

1. RTT studio创建工程 创建工程 ## 创建完成以后的目录结构 2. 配置CubuMx 双击cubumx的图标打开CubeMx 配置时钟 生成代码 构建后的代码结构 编译代码满屏错误:不要慌 3. 新增脚本 新建scons脚本文件 SConscript 脚本内容如下 import os from building import * cwd = GetCurrentDir() src = Glob('*.c') # add cubemx drivers src = Split('''

Car12 1565

SAP 系统间信任关系配置全攻略:从 SM59 到 SMT1 的实践与风险控制

本文介绍了在SAP系统间配置信任关系的详细流程与最佳实践。文章以SAP Gateway与后端系统架构为场景,从SM59创建RFC目的地开始,到SMT1建立信任关系,再到授权对象S_RFCACL的配置,提供了完整的操作指南。重点包括:使用标准命名规范创建专用RFC连接、通过向导完成系统间信任登记、严格控制S_RFCACL授权范围等。文中还分享了真实项目案例、可复用的检查清单以及常见问题的排查思路,帮助用户实现稳定可靠的跨系统无密码调用,同时确保安全性。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 324

DGGame序-回归Blog重构自我

1.时间代码    春温秋肃,时光匆匆,距离在优快云发表最后一遍Blog约莫两年时光,这两年经历的事大大小小,码过的代码多多少少,两年的时光里,完成了从校园到职场的转变,曾经壮志赤忱,熟悉了MFC,了解了C++,可是没想到,随着中国手游市场的火热,这片蓝海成为了我踏足的第一份领域,居然用unity和c#坚守了两年,这两年疲于开发,优快云变成一块荒地,慢慢的当开发节奏停滞下来,我开始决定重构两

runner2012的专栏 2656

Android 14.0 开机广播接收慢广播延迟问题分析

在14.0的系统rom定制化开发中,在某些时候在接收开机广播的时候发现,过了一分钟才收到开机广播,接下来就需要分析下 开机广播的相关分发机制,来处理下相关问题

安卓兼职framework和app工程师的博客 631

8年,从2D到3D,我的学习之路

Mickey 写了一篇 《一个本科毕业生创业两年的感悟》,从他的视角,总结了我们合作的两年经历。 我也来写一篇,介绍我的学习之路,希望对大家有所帮助,谢谢大家~ 我的学习方法 1.直接从0开始做项目,边做边学习,在做的过程中不断思考和反思当前的设计和实现,不断地修正,不断地迭代。 2.做完一个项目后,沉淀和升华: a)根据做项目中遇到的问题,针对性地看一些经典书籍和学习资料 b)写一些文章,分享自...

weixin_30751947的博客 174

Cesium初级开发教程之三十:Primitive集合

教程示例网站:https://thomaz529.github.io。

484

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

三层架构的是与非

我们的系列还在继续,因为我们的项目还没有完成。在上篇文章《目标模型和现实模型》中我们的小组解决的是需求问题,我们的系统要满足的是目标模型,对目标模型的描述就是我们的需求定义。接下来我们需要考虑的是系统的实现。在讨论之前,我们先回顾一下我们这个Team的几个角色: 项目经理:王涛 系统架构师:李帅 高级开发工程师:赵构 开发工程师:若干(我们在后面的章节中将逐步介绍)   系统设计或者架...

weixin_33775582的博客 97

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

上一篇: C#贪吃蛇游戏之--实体对象层(二)
下一篇: C#贪吃蛇游戏之--游戏信息存取(四)
fa6507
博客等级 码龄16年 84粉丝 1原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值