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

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

必备知识点--多脚本文件

(可观看CSharp核心--52集进行了解)

必备知识点--UML类图

必备知识点--七大原则

贪吃蛇

项目展示

控制方向的是:WSAD

确定键是:J

需求分析(UML类图)

自个先写--贪吃蛇

结合自己所学进行开发(UML类图是老师提供的,因为自己暂时还不太会绘制,主要是代码逻辑还不够清晰)

补充知识点:

检测键盘是否激活

Console.KeyAvailable == true;

按照UML类图逐个去写逐个去实现(但是有些模块我没有用上)

主要精力是放在了功能实现上

下面是我实现的过程

一、万事开头难--游戏类

(我先确定了开始着手的地方--游戏类,因为它是所有类和方法的汇聚地)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;//游戏类namespace 自个先写CSharp核心小项目_贪吃蛇_
{enum E_Scene{BeginID,GamingID,FinishID,}class Game{public static int x;public static int y;public static E_Scene scene = new E_Scene();Begin begin = new Begin();Finish finish = new Finish();public Game(){x = 100;y = 30;scene = E_Scene.BeginID;}//初始化控制台public void Consoles(){//隐藏光标Console.CursorVisible = false;//设置舞台大小Console.SetWindowSize(x, y);Console.SetBufferSize(x, y);}//游戏主循环public void MajorCycle(){while (true){//思考一下,为什么把开始场景和结束场景的类申明放在外面,而游戏场景的类申明放循环里面//因为开始结束场景是一成不变的,只需申明一次就够用了//而游戏场景进入一次就会执行出结果出来,每次结果都将不一样,所以每次都得重新申明switch (scene){case E_Scene.BeginID:Console.Clear();begin.newers();break;case E_Scene.GamingID:Console.Clear();GameScene gameScene = new GameScene();gameScene.newers();break;case E_Scene.FinishID:Console.Clear();finish.newers();break;default:break;}}}//场景切换public void SceneMove(){}}
}
二、游戏帧更新接口
1.更新接口

2.开始和结束场景基类

开始场景类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;//开始场景namespace 自个先写CSharp核心小项目_贪吃蛇_
{class Begin : BeginAndFinish{public Begin(){str = "贪吃蛇";str1 = "开始游戏";str2 = "结束游戏";}//重写更新方法public override void newers(){Console.SetCursorPosition(48, 10);Console.ForegroundColor = ConsoleColor.White;Console.WriteLine(str);Console.SetCursorPosition(47, 13);Console.ForegroundColor = key == 1 ? ConsoleColor.Red : ConsoleColor.White;Console.WriteLine(str1);Console.SetCursorPosition(47, 15);Console.ForegroundColor = key == 2 ? ConsoleColor.Red : ConsoleColor.White;Console.WriteLine(str2);char c = Console.ReadKey(true).KeyChar;switch (c){case 'W':case 'w':key = 1;break;case 'S':case 's':key = 2;break;case 'J':case 'j':if (key == 2){//关闭控制台Environment.Exit(0);}Game.scene = (E_Scene)key;break;default:break;}}}
}
结束场景类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;//结束场景namespace 自个先写CSharp核心小项目_贪吃蛇_
{class Finish : BeginAndFinish{string str0;public static int num;public Finish(){key = 0;str = "游戏结束";str0 = "本次游戏的长度为:";str1 = "回到开始界面";str2 = "结束游戏";}//重写更新方法public override void newers(){Console.SetCursorPosition(47, 10);Console.ForegroundColor = ConsoleColor.White;Console.WriteLine(str);Console.SetCursorPosition(42, 12);Console.ForegroundColor = ConsoleColor.White;Console.WriteLine(str0 + num);Console.SetCursorPosition(45, 15);Console.ForegroundColor = key == 0 ? ConsoleColor.Red : ConsoleColor.White;Console.WriteLine(str1);Console.SetCursorPosition(47, 17);Console.ForegroundColor = key == 2 ? ConsoleColor.Red : ConsoleColor.White;Console.WriteLine(str2);char c = Console.ReadKey(true).KeyChar;switch (c){case 'W':case 'w':key = 0;break;case 'S':case 's':key = 2;break;case 'J':case 'j':if (key == 2){//关闭控制台Environment.Exit(0);}Game.scene = (E_Scene)key;break;default:break;}}}
}

(这里面其实可以把这些方法提取到开始和结束场景基类里面的,但我懒,没有去整!!!)

3.游戏场景类

(第二个大类,游戏里的墙壁、食物、蛇、各种方法等等都汇聚在这个类中)

三、游戏场景中的各类
1.绘制接口

2.游戏对象类

(讲真的这个类没怎么用上,具体怎么用我还得看看老师是怎么用的)

3.位置结构体

(这个是完全没有用上!!)

4.地图墙壁类

5.食物类

6.蛇类--(最复杂的类)

蛇身体类--没用上

蛇类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;//蛇类namespace 自个先写CSharp核心小项目_贪吃蛇_
{//移动方向枚举enum E_Move{Up,Down,Left,Right,}class Snake{string snakeHead = "●";string snakeBody = "◎";int x = 10;int y = 5;E_Move move = E_Move.Down;char c;Foods foods = new Foods();int bodyNum = 0;//标识符int[] num1 = new int[10000];int[] num2 = new int[10000];//打印出长度public string longs = "当前长度为:";//蛇绘制public void SnakePlan(){//打印长度Console.SetCursorPosition(2, 1);Console.ForegroundColor = ConsoleColor.Red;Console.WriteLine(longs + bodyNum);Finish.num = bodyNum;//蛇头的绘制Console.SetCursorPosition(x, y);Console.ForegroundColor = ConsoleColor.Yellow;Console.WriteLine(snakeHead);//蛇身的绘制for (int i = 0; i < bodyNum; i++){Console.SetCursorPosition(num1[i], num2[i]);Console.ForegroundColor = ConsoleColor.Green;Console.WriteLine(snakeBody);}}//蛇清除public void SnakeClear(){//打印长度清除Console.SetCursorPosition(2, 1);Console.WriteLine("               ");//蛇头的清除Console.SetCursorPosition(x, y);Console.WriteLine("  ");//蛇身的清除for (int i = 0; i < bodyNum; i++){Console.SetCursorPosition(num1[i], num2[i]);Console.WriteLine("  ");}}//蛇转向public void SnakeTurn(){//老师漏讲的知识点,Console.KeyAvailable -- 检测键盘是否被激活if (Console.KeyAvailable == true){c = Console.ReadKey(true).KeyChar;switch (c){case 'W':case 'w':if (move == E_Move.Down && bodyNum != 0){move = E_Move.Down;}else{move = E_Move.Up;}break;case 'S':case 's':if (move == E_Move.Up && bodyNum != 0){move = E_Move.Up;}else{move = E_Move.Down;}break;case 'A':case 'a':if (move == E_Move.Right && bodyNum != 0){move = E_Move.Right;}else{move = E_Move.Left;}break;case 'D':case 'd':if (move == E_Move.Left && bodyNum != 0){move = E_Move.Left;}else{move = E_Move.Right;}break;default:break;}}} //吃食物//死亡//蛇移动 -- (包含了蛇绘制、蛇转向、吃食物)public void SnakeMove(){if(foods.x == 0 || foods.y == 0){foods.Plan();}SnakeTurn();switch (move){case E_Move.Up:SnakeClear();y -= 1;//判断是否死亡//撞墙死亡if (y == 0){Game.scene = E_Scene.FinishID;GameScene.bo = false;break;}//撞身体死亡for (int i = 0; i < bodyNum; i++){if(num1[i] == x && num2[i] == y){Game.scene = E_Scene.FinishID;GameScene.bo = false;break;}}if (foods.x == x && foods.y == y){foods.Plan();//给个判断,让生成的food不会出现在有蛇身体的位置上for (int i = 0; i < bodyNum; i++){if (foods.x == num1[i] && foods.y == num2[i]){Console.SetCursorPosition(foods.x, foods.y);Console.WriteLine("  ");foods.Plan();i = 0;}}bodyNum += 1;for (int i = bodyNum - 1; i > 0; i--){num1[i] = num1[i - 1];num2[i] = num2[i - 1];}num1[0] = x;num2[0] = y + 1;}else{for (int i = bodyNum - 1; i > 0; i--){num1[i] = num1[i - 1];num2[i] = num2[i - 1];}num1[0] = x;num2[0] = y + 1;}SnakePlan();break;case E_Move.Down:SnakeClear();y += 1;//判断是否死亡//撞墙死亡if (y == 29){Game.scene = E_Scene.FinishID;GameScene.bo = false;break;}//撞身体死亡for (int i = 0; i < bodyNum; i++){if (num1[i] == x && num2[i] == y){Game.scene = E_Scene.FinishID;GameScene.bo = false;break;}}if (foods.x == x && foods.y == y){foods.Plan();//给个判断,让生成的food不会出现在有蛇身体的位置上for (int i = 0; i < bodyNum; i++){if (foods.x == num1[i] && foods.y == num2[i]){Console.SetCursorPosition(foods.x, foods.y);Console.WriteLine("  ");foods.Plan();i = 0;}}bodyNum += 1;for (int i = bodyNum - 1; i > 0; i--){num1[i] = num1[i - 1];num2[i] = num2[i - 1];}num1[0] = x;num2[0] = y - 1;}else{for (int i = bodyNum - 1; i > 0; i--){num1[i] = num1[i - 1];num2[i] = num2[i - 1];}num1[0] = x;num2[0] = y - 1;}SnakePlan();break;case E_Move.Left:SnakeClear();x -= 2;//判断是否死亡//撞墙死亡if (x == 0){Game.scene = E_Scene.FinishID;GameScene.bo = false;break;}//撞身体死亡for (int i = 0; i < bodyNum; i++){if (num1[i] == x && num2[i] == y){Game.scene = E_Scene.FinishID;GameScene.bo = false;break;}}if (foods.x == x && foods.y == y){foods.Plan();//给个判断,让生成的food不会出现在有蛇身体的位置上for (int i = 0; i < bodyNum; i++){if (foods.x == num1[i] && foods.y == num2[i]){Console.SetCursorPosition(foods.x, foods.y);Console.WriteLine("  ");foods.Plan();i = 0;}}bodyNum += 1;for (int i = bodyNum - 1; i > 0; i--){num1[i] = num1[i - 1];num2[i] = num2[i - 1];}num1[0] = x + 2;num2[0] = y;}else{for (int i = bodyNum - 1; i > 0; i--){num1[i] = num1[i - 1];num2[i] = num2[i - 1];}num1[0] = x + 2;num2[0] = y;}SnakePlan();break;case E_Move.Right:SnakeClear();x += 2;//判断是否死亡//撞墙死亡if (x == 98){Game.scene = E_Scene.FinishID;GameScene.bo = false;break;}//撞身体死亡for (int i = 0; i < bodyNum; i++){if (num1[i] == x && num2[i] == y){Game.scene = E_Scene.FinishID;GameScene.bo = false;break;}}if (foods.x == x && foods.y == y){foods.Plan();//给个判断,让生成的food不会出现在有蛇身体的位置上for (int i = 0; i < bodyNum; i++){if (foods.x == num1[i] && foods.y == num2[i]){Console.SetCursorPosition(foods.x, foods.y);Console.WriteLine("  ");foods.Plan();i = 0;}}bodyNum += 1;for (int i = bodyNum - 1; i > 0; i--){num1[i] = num1[i - 1];num2[i] = num2[i - 1];}num1[0] = x - 2;num2[0] = y;}else{for (int i = bodyNum - 1; i > 0; i--){num1[i] = num1[i - 1];num2[i] = num2[i - 1];}num1[0] = x - 2;num2[0] = y;}SnakePlan();break;default:break;}}}
}
全部代码文件:看资源
实现视频展示:

C#核心实践项目(自个先写)--贪吃蛇

总结:

代码有点屎山,but跑起来就好!!!

还是知识点运用的不够,很多没用上。

跟着老师实现--贪吃蛇

一.需求分析 -- 就是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#核心实践--贪吃蛇(老师实现的)

完整代码在资源里。

总结一下下

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

多挤些时间啊!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/616450.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第11章 GUI Page495~496 步骤三十一:另存为别的文件

当前的TrySaveFile(bool hint_on_dirty true)有两个特征无法满足“另存”的需求&#xff1a; 一&#xff0c;TrySaveFile仅在数据为“新”的时候才提问用户输入文件名。而“另存”总是要求用户输入一个文件名&#xff0c;多以它总应该弹出一个文件选择对话框&#xff0c;这也…

【网络安全】【密码学】【北京航空航天大学】实验二、数论基础(中)【C语言和Java实现】

实验二、数论基础&#xff08;中&#xff09; 一、实验内容 1、扩展欧几里得算法&#xff08;Extended Euclid’s Algorithm&#xff09; &#xff08;1&#xff09;、算法原理 已知整数 a , b ,扩展的欧几里得算法可以在求得 a , b 的最大公约数的同时&#xff0c;找到一对…

Python如何连接RabbitMQ并编写简单的生产者和消费者代码?有录播直播和私教视频教程

更简单的获取连接的方式 get_connection方法 这个方法的签名如下&#xff1a; def get_connection(host127.0.0.1,port5672,username"zhangdapeng",password"zhangdapeng520",virtual_host/, ):"""获取RabbitMQ客户端连接对象:param hos…

LeetCode[105] 从前序与中序遍历序列构造二叉树

给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返回其根节点。 示例 1: 输入: preorder [3,9,20,15,7], inorder [9,3,15,20,7] 输出: [3,9,20,null,null,15,7] …

Linux计划任务管理

之前已经学习了一些Linux的基础知识和关机方式与文件系统简介&#xff0c;今天来学习下Linux下的计划任务&#xff0c;因为这个功能自己搭建服务器还是用得上的&#xff0c;比如定期清理垃圾缓存、定期备份数据库和网站等等。 系统环境&#xff1a;Centos8 一、什么是计划任务 …

c语言中负数的读取

自记&#xff1a; 1.以字节为例&#xff0c;其取值范围是 -128 ~ 127&#xff0c;即-2E7 ~ 2E7-1, 用最高位表示其符号&#xff0c;0表示正数&#xff0c;1表示负数。数值以补码形式存储。正数的补码就是该正数本身&#xff0c;负数的补码需要转化&#xff0c;如下: 1>.对负…

【flink番外篇】13、Broadcast State 模式示例-广播维表(2)

Flink 系列文章 一、Flink 专栏 Flink 专栏系统介绍某一知识点&#xff0c;并辅以具体的示例进行说明。 1、Flink 部署系列 本部分介绍Flink的部署、配置相关基础内容。 2、Flink基础系列 本部分介绍Flink 的基础部分&#xff0c;比如术语、架构、编程模型、编程指南、基本的…

自定义Flink SourceFunction定时读取数据库

文章目录 前言一、自定义Flink SourceFunction定时读取数据库二、java代码实现总结 前言 Source 是Flink获取数据输入的地方&#xff0c;可以用StreamExecutionEnvironment.addSource(sourceFunction) 将一个 source 关联到你的程序。Flink 自带了许多预先实现的 source funct…

openssl3.2 - 官方demo学习 - 索引贴

文章目录 openssl3.2 - 官方demo学习 - 索引贴概述笔记工程的搭建和调试环境BIOBIO - client-arg.cBIO - client-conf.cBIO - saccept.cBIO - sconnect.cBIO - server-arg.cBIO - server-cmod.cBIO - server-conf.cBIO - 总结certsciphercipher - aesccm.cEND openssl3.2 - 官方…

使用Java连接MongoDB (6.0.12) 报错

报错&#xff1a; Exception in thread "main" com.mongodb.MongoCommandException: Command failed with error 352: Unsupported OP_QUERY command: create. 上图中“The client driver may require an upgrade”说明了“客户端驱动需要进行升级”&#xff0c;解…

数据分析-Pandas如何转换产生新列

数据分析-Pandas如何转换产生新列 时间序列数据在数据分析建模中很常见&#xff0c;例如天气预报&#xff0c;空气状态监测&#xff0c;股票交易等金融场景。此处选择巴黎、伦敦欧洲城市空气质量监测 N O 2 NO_2 NO2​数据作为样例。 python数据分析-数据表读写到pandas 经典…

What does `rpm -ivh` do?

rpm -ivh 安装 并 显示安装进度 (–install–verbose–hash) rpm -ivh /media/cdrom/RedHat/RPMS/samba-3.0.10-1.4E.i386.rpm 安装rpm -ivh --relocate //opt/gaim gaim-1.3.0-1.fc4.i386.rpm 指定安装到 /opt/gaim[Ref] rpm -uvh和-ivh有什么区别以及zabbix 安…

android前台服务:

android前台服务&#xff1a; android-安卓如何开启前台服务&#xff1f;foregroundService的使用方法&#xff0c;什么是前台服务&#xff1f;_foregroundservicetype-CSDN博客

使用BeanShell写入内容到文件【JMeter】

一、前言 ​ 在我们日常工作中&#xff0c;可能会遇到需要将请求返回的数据写入到文件中。在我们使用JMeter进行性能测试时&#xff0c;就经常能够遇到这种情况。要想达到这种目的&#xff0c;我们一般采取BeanShell后置处理器来将内容写入到文件。 二、提取 ​ 在目前大多数的…

基于多智能体点对点转换的分布式模型预测控制

matlab2020正常运行 基于多智能体点对点转换的分布式模型预测控制资源-CSDN文库

Spring MVC 日期转换器

日期转换器 自定义日期转换器 public class DataConvert implements Converter<String, Date> {/**** 配置时间转换类* param date* return*/Overridepublic Date convert(String date) {try {SimpleDateFormat sdf new SimpleDateFormat("yyyy-MM-dd");ret…

对于软件测试的认识和了解

对软件测试的认识&#xff1a; 软件测试要求开发人员避免测试自己开发的程序。从心理学角度讲&#xff0c;这是很有道理的。特别是一个相对复杂的系统&#xff0c;开发人员在刚刚开发完成的时候&#xff0c;尚沉浸于对自己设计的回味之中。此时去测试的话往往会侧重于程序本身的…

CSS3简单运用过渡元素(transition)

CSS3过渡 概念&#xff1a;在CSS3中&#xff0c;我们可以使用transition属性将元素的某一个属性从“一个属性值”在指定的时间内平滑地过渡到“另一个属性值”&#xff0c;从而实现动画效果。 CSS3变形&#xff08;transform)呈现的仅仅是一个结果&#xff0c;而CSS过渡&…

WPS - 表格虚线变成实线解决方案(Office 同上)

1、选中表格区域&#xff0c;在表格中选中需要调整为实线的表格区域 2、点击设置单元格格式&#xff0c;鼠标进行右击并点击设置单元格格式选项 3、选择实线&#xff0c;在单元格格式下的边框&#xff0c;调整到实线 4、设置为实线&#xff0c;即可将表格的虚线设置为实线

AI系统ChatGPT网站系统源码AI绘画详细搭建部署教程,支持GPT语音对话+DALL-E3文生图+GPT-4多模态模型识图理解

一、前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作Ch…