当前位置: 首页 > article >正文

C#面向对象实践项目--贪吃蛇

目录

一、项目整体架构与核心逻辑

二、关键类的功能与关系

1. 游戏核心管理类:Game

2. 场景接口与基类

3. 具体场景类

4. 游戏元素类

5. 基础结构体与接口

三.类图

四、核心流程解析

五、项目可优化部分


一、项目整体架构与核心逻辑

该项目运用场景管理模式接口驱动设计,将游戏划分为开始、进行中、结束这三个场景,借助接口实现不同模块间的交互,同时通过继承来复用代码。其核心逻辑如下:

  1. 场景切换机制:游戏以场景为单位进行管理,各个场景需实现ISceneUpdate接口的Update方法,以此完成场景内的逻辑更新与画面渲染。
  2. 对象绘制体系:游戏中的物体(例如墙壁、蛇身、食物)实现IDraw接口的Draw方法,从而实现统一的绘制操作。
  3. 输入处理方式:开始场景和结束场景共用一套输入逻辑(利用W/S键选择选项,J键确认),这部分逻辑在基类中实现。

项目源代码:

using System;
using System.Collections.Generic;
using System.Text;namespace 贪吃蛇
{enum E_SceneType{Begin,Game,End,}class Game{//要想得到控制台的数值,就要把Game类中的成员用const修饰为常量,方便其他类使用public const int w = 80;public const int h = 30;public static ISceneUpdate nowScene;public Game (){//隐藏光标Console.CursorVisible = false;//设置游戏窗口大小Console.SetWindowSize(w, h);//设置缓冲区Console.SetBufferSize(w, h);ChangeScene(E_SceneType.Begin);}public void StartGame(){while(true){if(nowScene !=null){nowScene.Update();}}}public static void ChangeScene(E_SceneType type){//切换场景之前先清理之前场景内容Console.Clear();switch (type){case E_SceneType.Begin:nowScene = new BeginScene();break;case E_SceneType.Game:nowScene = new GameScene();break;case E_SceneType.End:nowScene = new EndScene();break;}}}
}
using System;
using System.Collections.Generic;
using System.Text;namespace 贪吃蛇
{interface ISceneUpdate{void Update();}
}
using System;
using System.Collections.Generic;
using System.Text;namespace 贪吃蛇
{abstract class BeginOrEndBaseScene:ISceneUpdate{protected int selIndex = 0;protected string strTilte;protected string strOne;public abstract void EnterJDoing();public void Update(){//开始和结束场景的游戏逻辑//选择当前的选项,然后监听键盘输入wsj//后续在控制台输出的文本都会显示为白色,直至再次对ForegroundColor属性进行修改Console.ForegroundColor = ConsoleColor.White;//显示标题Console.SetCursorPosition(Game.w / 2 - strTilte.Length, 5);Console.Write(strTilte);//显示下方的选项Console.SetCursorPosition(Game.w / 2 - strOne.Length, 8);Console.ForegroundColor = selIndex == 0 ? ConsoleColor.Red : ConsoleColor.White;Console.Write(strOne);Console.SetCursorPosition(Game.w / 2 - 4, 10);Console.ForegroundColor = selIndex == 1 ? ConsoleColor.Red : ConsoleColor.White;Console.Write("结束游戏");//检测输入switch (Console.ReadKey(true).Key){case ConsoleKey.W:--selIndex;if (selIndex < 0)selIndex = 0;break;case ConsoleKey.S:++selIndex;if (selIndex > 1)selIndex = 1;break;case ConsoleKey.J:EnterJDoing();break;}}}
}
using System;
using System.Collections.Generic;
using System.Text;namespace 贪吃蛇
{class BeginScene : BeginOrEndBaseScene{public BeginScene (){strTilte = "贪吃蛇";strOne = "开始游戏";}public override void EnterJDoing(){if(selIndex ==0){Game.ChangeScene(E_SceneType.Game);}else{Environment.Exit(0);}}}
}
using System;
using System.Collections.Generic;
using System.Text;namespace 贪吃蛇
{class EndScene : BeginOrEndBaseScene{public EndScene(){strTilte = "游戏结束";strOne = "回到开始界面";}public override void EnterJDoing(){if(selIndex ==0){Game.ChangeScene(E_SceneType.Begin);}else{Environment.Exit(0);}}}
}
using System;
using System.Collections.Generic;
using System.Text;namespace 贪吃蛇
{class GameScene : ISceneUpdate{Map map;Snake snake;Food food;int upDateInded = 0;public GameScene (){map = new Map();snake = new Snake(40, 10);food = new Food(snake);}public void Update(){if(upDateInded %10000==0){map.Draw();food.Draw();snake.Move();snake.Draw();//检测是否死亡if(snake .CheakEnd (map)){//结束逻辑Game.ChangeScene(E_SceneType.End);}snake.CheakEatFood(food);upDateInded = 0;}++upDateInded;//在控制台中检测玩家输入,不被卡住的解决方案if (Console.KeyAvailable){switch (Console .ReadKey (true).Key){case ConsoleKey.W:snake.ChangDir(E_MoveDir.Up);break;case ConsoleKey.A:snake.ChangDir(E_MoveDir.Left);break;case ConsoleKey.S:snake.ChangDir(E_MoveDir.Down);break;case ConsoleKey.D:snake.ChangDir(E_MoveDir.Right);break;}}}}
}
using System;
using System.Collections.Generic;
using System.Text;namespace 贪吃蛇
{interface IDraw{void Draw();}
}
using System;
using System.Collections.Generic;
using System.Text;namespace 贪吃蛇
{struct Position{public int x;public int y;public Position (int x,int y){this.x = x;this.y = y;}public static bool operator ==(Position p1,Position p2){if (p1.x == p2.x && p1.y == p2.y)return true;return false;}public static bool operator !=(Position p1, Position p2){if (p1.x == p2.x && p1.y == p2.y)return false;return true;}}
}
using System;
using System.Collections.Generic;
using System.Text;namespace 贪吃蛇
{abstract class GameObject : IDraw{public Position pos;public abstract void Draw();}
}
using System;
using System.Collections.Generic;
using System.Text;namespace 贪吃蛇
{class Map : IDraw{public Wall[] walls;public Map (){walls = new Wall[Game.w + (Game.h - 3) * 2];int index = 0;for (int i = 0; i < Game .w ; i+=2){walls[index] = new Wall(i, 0);++index;}for (int i = 0; i < Game .w; i+=2){walls[index] = new Wall(i, Game.h - 2);++index;}for (int i = 1; i < Game .h-2; i++){walls[index] = new Wall(0, i);++index;}for (int i = 1; i < Game.h - 2; i++){walls[index] = new Wall(Game .w-2,i);++index;}}public void Draw(){for (int i = 0; i < walls .Length ; i++){walls[i].Draw();}}}
}
using System;
using System.Collections.Generic;
using System.Text;namespace 贪吃蛇
{enum E_SnakeBodyType{Head,Body,}class SnakeBody : GameObject{public E_SnakeBodyType type;public SnakeBody (E_SnakeBodyType type ,int x,int y){this.type = type;pos = new Position(x, y);}public override void Draw(){Console.SetCursorPosition(pos.x, pos.y);Console.ForegroundColor = type == E_SnakeBodyType.Head ? ConsoleColor.Yellow : ConsoleColor.Green;Console.Write(type == E_SnakeBodyType.Head ? "㊣" : "0");}}
}
using System;
using System.Collections.Generic;
using System.Text;namespace 贪吃蛇
{enum E_MoveDir{Up,Down,Left,Right,}class Snake : IDraw{SnakeBody[] bodys;E_MoveDir dir;//来记录当前蛇的长度int nowNum;public Snake(int x, int y){bodys = new SnakeBody[200];bodys[0] = new SnakeBody(E_SnakeBodyType.Head, x, y);++nowNum;dir = E_MoveDir.Right; }public void Draw(){//画一节一节的身子for (int i = 0; i < nowNum ; i++){bodys[i].Draw();}}public void Move(){//移动前//擦除最后一个位置SnakeBody lastBody = bodys[nowNum - 1];Console.SetCursorPosition(lastBody.pos.x, lastBody.pos.y);Console.Write("  ");//在蛇头移动之前 从蛇尾开始 不停的让后一个的位置等于前一个的位置for (int i = nowNum -1; i >0; i--){bodys[i].pos = bodys[i - 1].pos;}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;}}public void ChangDir(E_MoveDir dir){if(dir==this.dir ||nowNum >1&&(this.dir==E_MoveDir .Left &&dir==E_MoveDir.Right ||this.dir ==E_MoveDir.Right && dir ==E_MoveDir.Left ||this.dir==E_MoveDir.Up && dir==E_MoveDir.Down ||this.dir==E_MoveDir.Down && dir==E_MoveDir.Up)){return;}//只要没有return 就记录外边传入的方向,按照这个方向移动this.dir = dir;}public bool CheakEnd(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;}//通过传入一个位置来判断是否和蛇重合public bool CheakSamePos(Position p){for (int i = 0; i < nowNum ; i++){if(bodys[i].pos ==p){return true;}}return false;}public void CheakEatFood(Food food){if(bodys [0].pos ==food.pos ){//吃到了就应该让食物的位置再随机 增加蛇身体的长度food.RandomPos(this);//长身体AddBody();}}private void AddBody(){SnakeBody frontBody = bodys[nowNum - 1];//先长bodys[nowNum] = new SnakeBody(E_SnakeBodyType.Body, frontBody.pos.x, frontBody.pos.y);//再加长度++nowNum;}}
}
using System;
using System.Collections.Generic;
using System.Text;namespace 贪吃蛇
{class Wall : GameObject{public Wall (int x,int y){pos = new Position(x, y);}public override void Draw(){Console.SetCursorPosition(pos.x, pos.y);Console.ForegroundColor = ConsoleColor.Red;Console.Write("■");}}
}
using System;
using System.Collections.Generic;
using System.Text;namespace 贪吃蛇
{class Food : GameObject{public Food(Snake snake){RandomPos(snake);}public override void Draw(){Console.SetCursorPosition(pos.x, pos.y);Console.ForegroundColor = ConsoleColor.Cyan;Console.Write("o");}//随机位置的行为 行为 和蛇的位置有关系 有了蛇再做考虑public void RandomPos(Snake snake){//随机位置Random r = new Random();int x = r.Next(2, Game.w / 2 - 1) * 2;int y = r.Next(1, Game.h - 4);pos = new Position(x, y);//得到蛇//如果重合就会进if语句if(snake .CheakSamePos (pos)){RandomPos(snake);}}}
}
using System;namespace 贪吃蛇
{class Program{static void Main(string[] args){Game game = new Game();game.StartGame();}}
}

二、关键类的功能与关系

1. 游戏核心管理类:Game
  • 功能概述
    • 负责初始化游戏窗口,包括隐藏光标、设置窗口大小和缓冲区等操作。
    • 管理场景的切换,通过ChangeScene方法清除当前场景内容,并创建新的场景实例。
    • 运行游戏主循环,持续调用当前场景的Update方法。
  • 成员变量
    • nowScene:类型为ISceneUpdate,用于引用当前场景对象。
    • wh:作为常量,定义了游戏窗口的宽度(80)和高度(30)。
  • 类间关系
    • ISceneUpdate接口的实现类(如BeginSceneGameSceneEndScene)相关联,通过多态的方式调用场景的更新逻辑。
    • 提供静态方法ChangeScene,供其他类触发场景切换操作。
2. 场景接口与基类
  • ISceneUpdate接口
    • 定义:包含Update()方法,所有场景类都必须实现该方法,用于处理场景的逻辑更新和画面渲染。
    • 实现类BeginSceneGameSceneEndScene
  • BeginOrEndBaseScene基类
    • 功能:为开始场景和结束场景提供通用的输入处理逻辑,例如选项选择(通过selIndex记录当前选中项)和键盘监听(W/S键切换选项,J键确认)。
    • 成员变量
      • selIndex:用于记录当前选中的选项索引。
      • strTiltestrOne:分别表示场景标题和第一个选项的文本内容。
    • 抽象方法EnterJDoing(),由子类实现具体的确认逻辑(如开始游戏、退出游戏等)。
    • 子类BeginSceneEndScene
3. 具体场景类
  • BeginScene(开始场景)
    • 功能:显示 “贪吃蛇” 标题和 “开始游戏”“结束游戏” 选项,当用户选择 “开始游戏” 时,切换到游戏场景;选择 “结束游戏” 时,退出程序。
    • 实现:继承自BeginOrEndBaseScene,重写EnterJDoing方法,根据选中的索引来决定执行切换场景操作还是退出程序。
  • EndScene(结束场景)
    • 功能:显示 “游戏结束” 标题和 “回到开始界面”“结束游戏” 选项,根据用户的选择切换回开始场景或者退出程序。
    • 实现:同样继承自BeginOrEndBaseScene,重写EnterJDoing方法来实现相应的逻辑。
  • GameScene(游戏场景)
    • 功能
      • 管理游戏中的核心元素,包括地图(Map)、蛇(Snake)和食物(Food)。
      • 处理游戏的更新逻辑,如地图绘制、蛇的移动、食物检测、碰撞检测等。
      • 监听玩家的输入(W/A/S/D键),用于改变蛇的移动方向。
    • 成员变量
      • map:类型为Map,代表游戏地图。
      • snake:类型为Snake,代表游戏中的蛇。
      • food:类型为Food,代表游戏中的食物。
      • upDateInded:用于控制更新频率,避免画面刷新过于频繁。
4. 游戏元素类
  • Map(地图)
    • 功能:绘制游戏边界的墙壁,墙壁由多个Wall对象组成。
    • 实现
      • 在构造函数中初始化Wall数组,按照游戏窗口的尺寸生成上下左右四边的墙壁。
      • Draw方法遍历Wall数组,调用每个WallDraw方法来绘制墙壁。
  • Snake(蛇)
    • 功能
      • 管理蛇的身体(由SnakeBody对象数组组成),处理蛇的移动、转向、增长以及碰撞检测等逻辑。
      • 检测蛇是否撞到墙壁或者自己的身体,以此判断游戏是否结束。
      • 检测是否吃到食物,若吃到则增加蛇的身体长度,并重新生成食物的位置。
    • 成员变量
      • bodys:类型为SnakeBody[],存储蛇的各个身体部分。
      • dir:类型为E_MoveDir,表示蛇的当前移动方向。
      • nowNum:记录蛇当前的身体节数。
    • 关键方法
      • Move():按照当前方向移动蛇头,并让蛇身跟随移动,同时擦除蛇尾的位置。
      • ChangDir():改变蛇的移动方向,但要避免蛇反向移动(如向左时不能立即向右)。
      • CheakEnd():检测蛇是否与墙壁或自身身体发生碰撞。
      • CheakEatFood():检测蛇头是否与食物的位置重合。
  • SnakeBody(蛇身体节)
    • 功能:表示蛇的某一节身体,区分蛇头(Head)和蛇身(Body),绘制时使用不同的颜色和符号(蛇头为黄色 “㊣”,蛇身为绿色 “0”)。
    • 继承:继承自GameObject类,GameObject实现了IDraw接口,因此SnakeBody需要实现Draw方法。
  • Food(食物)
    • 功能:随机生成食物的位置,确保该位置不与蛇的身体重合,并绘制食物(青色 “o”)。
    • 实现
      • 在构造函数中调用RandomPos方法生成初始位置。
      • RandomPos方法使用随机数生成位置,并通过Snake.CheakSamePos方法检测该位置是否与蛇的身体重合,若重合则重新生成位置。
5. 基础结构体与接口
  • Position结构体
    • 功能:表示二维坐标(x, y),重载了==!=运算符,方便进行位置比较。
  • IDraw接口
    • 定义:包含Draw()方法,所有需要绘制的游戏元素(如WallSnakeBodyFood)都需实现该方法。
  • GameObject抽象类
    • 功能:作为所有游戏物体的基类,提供pos属性(位置),并要求子类实现Draw方法。
    • 子类WallSnakeBodyFood

三.类图

Game
├─ 依赖 ISceneUpdate(多态调用 Update())
│  ├─ BeginScene(继承 BeginOrEndBaseScene)
│  ├─ GameScene(实现 ISceneUpdate)
│  └─ EndScene(继承 BeginOrEndBaseScene)
│
└─ 组合 GameScene├─ Map(包含 Wall[])│  └─ Wall(继承 GameObject,实现 IDraw)├─ Snake(包含 SnakeBody[])│  └─ SnakeBody(继承 GameObject,实现 IDraw)└─ Food(继承 GameObject,实现 IDraw)BeginOrEndBaseScene
├─ 实现 ISceneUpdate
└─ 派生 BeginScene 和 EndSceneGameObject
└─ 实现 IDraw├─ Wall├─ SnakeBody└─ Food

四、核心流程解析

  1. 游戏启动
    • Program.Main方法创建Game实例,Game的构造函数会初始化窗口,并切换到开始场景(BeginScene)。
  2. 场景更新
    • Game.StartGame进入循环,不断调用nowScene.Update()
    • 在开始场景和结束场景中,BeginOrEndBaseScene.Update负责处理选项显示和键盘输入,用户按下J键时触发EnterJDoing方法来切换场景。
    • 在游戏场景中,GameScene.Update会执行以下操作:
      • 每隔一定帧数(通过upDateInded控制),调用map.Draw()绘制墙壁,food.Draw()绘制食物,snake.Move()移动蛇,snake.Draw()绘制蛇。
      • 检测蛇是否死亡(snake.CheakEnd),若是则切换到结束场景。
      • 检测蛇是否吃到食物(snake.CheakEatFood),若是则增加蛇的身体长度,并重新生成食物的位置。
  3. 蛇的移动与碰撞检测
    • 蛇的移动逻辑是,蛇头按照当前方向移动,蛇身的每一节依次跟随前一节的位置移动,蛇尾的位置会被擦除。
    • 通过Snake.CheakEnd方法检测蛇头是否与墙壁或蛇身发生碰撞,以此判断游戏是否结束。
  4. 食物生成
    • Food.RandomPos方法生成随机位置,若该位置与蛇的身体重合,则递归调用自身重新生成位置,直到找到合适的位置为止。

五、项目可优化部分

  1. 分离职责:可以将输入处理、渲染逻辑和业务逻辑进一步分离,提高代码的可维护性。
  2. 增加配置项:把窗口大小、更新频率等参数提取到配置文件中,方便进行调整。
  3. 完善分数系统:在GameScene中添加分数统计功能,当蛇吃到食物时增加分数,并在界面上进行显示。
  4. 优化碰撞检测:对于蛇身的碰撞检测,可以使用HashSet来存储位置,提高检测效率。

相关文章:

C#面向对象实践项目--贪吃蛇

目录 一、项目整体架构与核心逻辑 二、关键类的功能与关系 1. 游戏核心管理类&#xff1a;Game 2. 场景接口与基类 3. 具体场景类 4. 游戏元素类 5. 基础结构体与接口 三.类图 四、核心流程解析 五、项目可优化部分 一、项目整体架构与核心逻辑 该项目运用场景管理模…...

学习STC51单片机26(芯片为STC89C52RCRC)

每日一言 真正的强者&#xff0c;不是没有眼泪&#xff0c;而是含着泪依然奔跑。 硬件&#xff1a;4G模块 这个是接线原理&#xff0c;我们也只要知道这个4根线的连接就好了&#xff0c;我们也是连接到USB转TTL的模块上 要插卡哈......... 随后我们下载一个叫做亿佰特的调试助…...

Web前端为什么要打包?Webpack 和 Vite 如何助力现代开发?

一. 为什么要使用框架库? 1.1 传统网页与现代前端的差异 在最早期的网页开发中,我们只需要写几个.html文件,配上.css和.js文件,浏览器直接加载就能展现页面,每个文件都是独立的静态资源,简单且直观 但现在网站越来越复杂了: 需要用到最新的js语法(比如ES6)使用框架(Vue…...

Nginx详解(三):ngx_http_rewrite_module模块核心指令详解

概要&#xff1a; 在 Nginx 的众多功能模块中&#xff0c;ngx_http_rewrite_module是实现请求动态处理的核心组件&#xff0c;它通过一系列指令实现 URI 重写、条件判断、响应返回等功能。本文将以 CentOS 7.9 环境为例&#xff08;主机名www.a.com&#xff0c;IP 172.25.0.10…...

C++ 建造者模式:简单易懂的设计模式解析

一、引言 在软件开发中,我们经常会遇到一些复杂对象的创建过程,这些对象通常由多个部分组成,并且每个部分的构建过程可能非常复杂。建造者模式(Builder Pattern)就是为了解决这类问题而诞生的一种创建型设计模式。本文将以简单易懂的方式介绍C++中的建造者模式,帮助你理…...

【笔记】在 MSYS2(MINGW64)中正确安装 Poetry 的指南

#工作记录 在 MSYS2&#xff08;MINGW64&#xff09;中正确安装 Poetry 的指南 一、背景说明 在 MSYS2&#xff08;MINGW64&#xff09;环境中&#xff0c;即使已经安装了 pip&#xff0c;也不建议直接使用 pip install poetry 来安装 Poetry。 这是因为 MSYS2 使用自己的包…...

IDEA项目推送到远程仓库

打开IDEA——>VCS——>Creat Git 选择项目 push提交到本地 创建远程仓库 复制地址 定义远程仓库 推送 推送成功...

DeepSeek 赋能 NFT:数字艺术创作与交易的革新密码

目录 一、NFT&#xff1a;数字世界的独特资产1.1 NFT 的定义与本质1.2 NFT 的价值支撑1.3 NFT 的丰富类型 二、DeepSeek&#xff1a;AI 领域的创新力量2.1 DeepSeek 的发展历程与成就2.2 DeepSeek 的核心技术与能力 三、DeepSeek 在 NFT 创作中的神奇应用3.1 高效生成数字艺术作…...

【后端架构师的发展路线】

后端架构师的发展路线是从基础开发到技术领导的系统性进阶过程&#xff0c;需融合技术深度、架构思维和业务洞察力。以下是基于行业实践的职业发展路径和关键能力模型&#xff1a; 一、职业发展阶梯‌ 初级工程师&#xff08;1-3年&#xff09;‌ 核心能力‌&#xff1a;掌…...

matlab/simulink TLC语法基础练习实例

一、基本语法测试方法 1.新建一个脚本&#xff0c;保存扩展名为tlc,本例中是tst.tlc&#xff0c;设置当前工作路径为保存的tlc文件路径&#xff0c;在tlc文件里面输入下面的代码&#xff0c;然后保存&#xff1a; %warning test 2.在MATLAB的命令窗口输入&#xff1a; tlc …...

MAU算法流程理解

参考文献&#xff1a;湘江船闸的过闸调度算法研究(李 楠&#xff0c;李桂华&#xff0c;尹剑平) &#xff08;湖南湘江航运建设开发有限公司&#xff0c;湖南 长沙 410011&#xff09; MAU算法流程 图4展示的是一种船舶排档算法&#xff08;MAU算法&#xff09;&#xff0c;它…...

蓝桥杯国赛训练 day1

目录 k倍区间 舞狮 交换瓶子 k倍区间 取模后算组合数就行 import java.util.HashMap; import java.util.Map; import java.util.Scanner;public class Main {static Scanner sc new Scanner(System.in);public static void main(String[] args) {solve();}public static vo…...

ESP32之Linux编译环境搭建流程

背景&#xff1a;为了解决 “windows环境中编译ESP32代码速度慢” 的问题&#xff0c;现搭建一个Linux环境&#xff0c;让windows下的VScode连接到Linux环境&#xff0c;VSCode负责编辑代码&#xff0c;虚拟机用于编译代码。 目录 一、安装VMware 1.1 获取VMware安装包 1.2…...

Linux 软件安装方式全解(适用于 CentOS/RHEL 系统)

&#x1f427; Linux 软件安装方式全解&#xff08;适用于 CentOS/RHEL 系统&#xff09; 在 Linux 系统中&#xff0c;软件安装方式丰富多样&#xff0c;常见于以下几种方式&#xff1a; 安装方式命令/工具说明软件包管理器&#xff08;推荐&#xff09;yum, dnf, apt, zypp…...

QT- QML Layout+anchors 布局+锚点实现窗口部件权重比例分配

布局管理 简单比较两种界面管理锚点布局实现比例布局布局管理实现比例布局循环依赖问题简谈 在日常打螺丝中&#xff0c;我们偶尔会需要实现界面各组件能按比例放置&#xff0c;自适应各种分辨率的需求。我用锚点和布局都实现过相关界面&#xff0c;记录下来两种方式实现的差异…...

UE5打包项目设置Project Settings(打包widows exe安装包)

UE5打包项目Project Settings Edit-Project Settings- Packaging-Ini Section Denylist-Advanced 1&#xff1a;打包 2&#xff1a;高级设置 3&#xff1a;勾选创建压缩包 4&#xff1a;添加要打包地图Map的数量 5&#xff1a;选择要打包的地图Maps 6&#xff1a;Project-Bui…...

Python中os模块详解

Python os 模块详解 os 模块提供了丰富的文件和目录操作、环境变量访问、进程管理等功能&#xff0c;是与操作系统交互的核心模块之一。 基本导入方式 import os常用目录与文件操作 1️⃣ 获取/设置当前工作目录 os.getcwd() # 获取当前工作目录 os.chdir(/tmp) …...

便捷高效能源服务触手可及,能耗监测系统赋能智能建筑与智慧城市

在建筑行业迈向智能化、精细化管理的进程中&#xff0c;传统建筑管理模式因信息割裂、数据利用不足等问题&#xff0c;逐渐难以满足现代建筑复杂的运营需求。楼宇自控系统实现了建筑设备的智能调控&#xff0c;BIM技术则构建了建筑的三维数字化模型&#xff0c;当两者相遇&…...

Kotlin List 操作全面指南

在传统 Java 开发 List 相关的 API 中&#xff0c;有着样板代码冗长、缺乏链式调用、空安全等问题。 Kotlin 这门语言 为 List 提供了丰富的扩展函数&#xff0c;这些函数大大简化了集合操作&#xff0c;解决了传统 Java 集合 API 中的许多痛点。 一、基础操作 1. 创建 List …...

C++--范围for循环详解

范围 for 循环是 C11 引入的语法特性&#xff0c;用于简化遍历容器或数组元素的过程。它比传统 for 循环更简洁安全&#xff0c;特别适合初学者。以下是详细讲解&#xff1a; 基本语法 for (元素类型 变量名 : 容器/数组) {// 循环体&#xff08;使用变量名访问当前元素&#…...

ISO18436-2 CATII级振动分析师能力矩阵

ISO18436-2021是当前针对针对分析师的一个标准&#xff0c;它对振动分析师的能力和知识体系做了4级分类&#xff0c;这里给出的是一家公司响应ISO18436的CATII级标准&#xff0c;做的一个专题培训的教学大纲。摘自&#xff1a; 【振動噪音產學技術聯盟】04/19-23 ISO 18436-2…...

deepseek问答:torch.full() 函数详解

torch.full() 是 PyTorch 中用于创建指定形状、所有元素值都相同的新张量的核心函数。它在深度学习中有广泛应用&#xff0c;尤其是在初始化张量和创建特殊数据结构时。 函数签名 torch.full(size, fill_value, *, dtypeNone, layouttorch.strided, deviceNone, requires_gra…...

dvwa4——File Inclusion

LOW: 先随便点开一个文件&#xff0c;可以观察到url栏变成这样&#xff0c;说明?page是dvwa当前关卡用来加载文件的参数 http://10.24.8.35/DVWA/vulnerabilities/fi/?pagefile1.php 我们查看源码 &#xff0c;没有什么过滤&#xff0c;直接尝试访问其他文件 在url栏的pag…...

MYSQL 高级 SQL 技巧

高级 SQL 技巧 以下是一些高级 SQL 技巧&#xff0c;可以帮助优化查询、提高性能并解决复杂的数据处理问题。 使用窗口函数 窗口函数允许在查询结果的行上进行计算&#xff0c;而不会减少行数。常见的窗口函数包括 ROW_NUMBER()、RANK()、DENSE_RANK() 和聚合函数如 SUM() 与…...

Spring Boot养老院管理系统源码分享

概述 基于Spring Boot开发的养老院管理系统&#xff0c;该系统通过智能化管理模块&#xff0c;为养老机构提供高效运营解决方案。 主要内容 后台管理功能 系统后台功能完善&#xff0c;左侧导航栏涵盖首页、安全巡查管理、设备管理等模块。设备管理界面以表格形式清晰展示设…...

go|context源码解析

文章目录 Context接口Deadline()Done()Err()Value() canceler接口ctxemptyCtxcancelCtxtimerCtxvalueCtx 基本使用cancelCtxvalueCtx 首先看一下源码对“context”的描述&#xff0c; When a Context is canceled, all Contexts derived from it are also canceled. 当一个Cont…...

如何在PowerBI中使用Analyze in Excel

如何在PowerBI中使用Analyze in Excel 之前分享过如何使用DAXStudio将PowerBI与Excel连接 &#xff0c;今天介绍另外一个工具&#xff0c;也可以实现同样的功能&#xff0c;Analyze in Excel。 使用Analyze in Excel 第一步&#xff1a; 首先准备好一个PBIX文件&#xff0c…...

【学习记录】Element UI导入报错 * element-ui/lib/theme-chalk/index.css in ./src/main.js

文章目录 &#x1f4cc; 摘要⚠️ 问题描述&#x1f50d; 原因分析✅ 正常情况下的依赖结构❗ 问题根源 ✅ 解决方案✅ 方法一&#xff1a;使用 cnpm 安装 Element UI&#xff08;推荐&#xff09;步骤 1&#xff1a;全局安装 cnpm&#xff08;使用淘宝镜像&#xff09;步骤 2&…...

大模型分布式训练笔记(基于accelerate+deepspeed分布式训练解决方案)

文章目录 一、分布式训练基础与环境配置&#xff08;1&#xff09;分布式训练简介&#xff08;2&#xff09;如何进行分布式训练&#xff08;3&#xff09;分布式训练环境配置 二、数据并行-原理与实战&#xff08;pytorch框架的nn.DataParallel&#xff09;1&#xff09;data …...

鸿蒙UI开发——组件的自适应拉伸

1、概 述 针对常见的开发场景&#xff0c;ArkUI开发框架提供了非常多的自适应布局能力&#xff0c;这些布局可以独立使用&#xff0c;也可多种布局叠加使用。本文针对ArkUI提供的拉伸能力做简单讨论。 拉伸能力是指容器组件尺寸发生变化时&#xff0c;增加或减小的空间全部分…...