自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(47)
  • 资源 (1)
  • 收藏
  • 关注

原创 游戏设计模式----单例模式

定义单例模式是指在内存中只会创建且仅创建一次对象的设计模式。在程序中多次使用同一个对象且作用相同时,为了防止频繁地创建对象使得内存飙升,单例模式可以让程序仅在内存中创建一个对象,让所有需要调用的地方都共享这一单例对象。C#单例模式主要分两种饿汉式在类加载时已经创建好该单例对象。public class Test_Instan{ private static Test_Instan instant=new Test_Instan(); public static Test_In

2022-01-11 16:26:12 2493

原创 设计模式之游戏--观察者模式详解

引入问题在我们的游戏开发中,我们常常会遇见这种场景,比如在战斗系统中如果敌人死亡,我们要通知UI系统,成就系统,关卡系统等一些其它系统做出相应的行为。你可能做出如下设计方法1:让战斗系统亦或者敌人持有其它系统的的引用,然后在敌人死亡时调用其它系统的相应方法。方法2:让各系统时时监听敌人的相应状态,敌人死亡时调用系统的相应方法这两种方法看起来没多大毛病,但仔细分析我们就就会发现其实是有所欠缺的。方法1:当我们后期需求变更,增加了一个新的系统或者一个新的功能,那么我们就需要修改战斗系统或者敌人的代码,

2022-01-07 15:26:06 2268

原创 C++如何制作一个Split()函数(使用STL进行组合的坑)

一.使用STL进行组合find函数原型:size_t find(const string& str, size_t pos = 0) const;功能:查找子字符串第一次出现的位置。参数说明:str为子字符串,pos为初始查找位置。返回值:找到的话返回第一次出现的位置,否则返回string::npossubstr函数原型:string substr(size_t pos = 0, size_t n = npos) const;功能:获得子字符串。参数说明:pos为起始位置(默认为0

2022-01-06 12:48:16 601

原创 设计模式之游戏--命令模式

设计模式之游戏--命令模式引入问题**定义**UML具体示例总结引入问题在软件开发过程中,请求-响应模式的功能是一个很常见的功能,比如在我们的策略游戏中,通常有一个兵营系统,当我们点击某个兵营训练时就训练出某种士兵。如果是非命令模式下,你可能会做出如下模拟:首先新建一个兵营类:public class Camp{ public void Make_Warrior_Soldier() { MonoBehaviour.print("开始制造战士士兵"); }

2022-01-05 13:59:39 1909

原创 设计模式之游戏--状态模式

一.引入问题在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理。最直接的解决方案是将这些所有可能发生的情况全都考虑到。然后使用判断语句来做状态判断来进行不同情况的处理。但是对复杂状态的判断就显得“力不从心了”。随着增加新的状态或者修改一个状态导致判断语句的增多或者修改可能会引起很大的修改,而且程序的可读性,扩展性也会变得很弱。维护也会很麻烦。此时我们的状态模式就孕育而生了。而状态模式的作用就是:解决当控制一个对象状态转换的条件表达式过于复杂时,把状态的判断逻辑转移到表示不同的一系列类当中,把复

2022-01-03 11:46:59 1429

原创 设计模式之游戏--工厂模式详解

工厂模式一.简单工厂模式二.工厂方法模式三.抽象工厂模式使用总结引入问题:在面向对象编程中,创建一个对象的最常用的方法是new一个对象实例,new对象操作符就是用来构造对象实例的,但是在一些情况下,new操作符直接生成对象会带来一些问题,举例说,许多类型对象的创建都需要一系列的步骤,可能需要计算或取得对象的初始设置,选择生成哪个子对象实例,或者在生成需要的对象之前必须先生成一些辅助功能的对象,这些情况下,对象的建立就是一个过程,不仅是一个操作。定义:将原来分布在各个地方的复杂对象创建过程单独抽离出来,

2021-11-19 12:26:20 4034

原创 设计模式之游戏--桥接模式

设计模式之游戏–桥接模式一.引入问题在游戏引擎中,同一种图形可以由不同的绘图引擎,同一种绘图引擎也可以绘制不同的图形。从继承的角度上分析的话可以划分如下层次。通过分析我们发现这样设计有很大的问题:(1)扩展性问题:如果新增图形类,那么就要新增各绘图引擎下的类,同理新增绘图引擎也是如此,这样到了后期类的个数会呈几何倍数递增。(2)违反了单一职责原则:一个类XXXX绘制的图形有两个引起这个类变化的原因。简单来说就是使用继承的方式,不管新增一个类型还是新增一个品牌,都会牵扯出另外一个维度的变化。

2021-11-15 23:05:38 2847

原创 (二)设计模式之游戏--依赖倒置原则

(二)设计模式之游戏–依赖倒置原则引入问题:类A直接依赖类B,假如要将类A改为依赖类C,则必须通过修改类A的代码来达成。这种场景下,类A一般是高层模块,负责复杂的业务逻辑;类B和类C是低层模块,负责基本的原子操作;假如修改类A,会给程序带来不必要的风险。解决方案:将类A修改为依赖抽象I,类B和类C各自实现抽象I,类A通过接口I间接与类B或者类C发生联系,则会大大降低修改类A的几率,实际上就是解耦合。(1)定义:高层模块不应该依赖底层模块,他们都依赖于抽象(接口,抽象类等),抽象不应该依赖于细

2021-11-13 14:15:30 2647

原创 (一)设计模式之游戏--开闭原则

开闭原则(1)定义:对扩展开放,对修改关闭。通俗来讲就是软件实体应尽量在不修改原有代码的情况下进行拓展。(2)实现分析:抽象化是实现开闭原则的关键。我们通常通过提取事物的共性来进行抽象封闭,然后对事物的差异性提供接口进行扩展开放。(3)示例:在游戏中经常会出现让玩家选择角色进行游戏这个功能。1)我们的原始方案可能如下:using System.Collections;using System.Collections.Generic;using UnityEngine;public c

2021-11-12 08:31:47 1360

原创 希尔排序分析与理解

一.算法思想基本思想:将数据分成若干个序列,然后对每个序列分别进行直接插入排序,每个序列由两两相邻x位置组成,该x称为每次切割的增量。接着减少增量x,再对每个序列进行直接插入排序,当增量x足够小时,则说明此时序列基本有序,此时再对整个序列进行最后一次插入排序,由于此时序列基本有序,所以插入排序的效率是非常高的。所以希尔排序在时间效率上比直接插入排序有较大提高。...

2021-11-05 14:59:05 931

原创 两球之间的磁力

1552. 两球之间的磁力分析可知:

2021-09-24 11:08:31 232

原创 整数拆分-动态规划

解法:动态规划一.确定状态根据题目使拆分整数乘积最大,我们可以设dp[i]表示整数i的拆分的最大乘积。二.转移方程根据题目描述,一个整数最少要拆分为两个整数,我们可以表示为:j和i-j(0<j<i),而dp[i]应取j*d[i-j]或j*(i-j)这两者的最大值。有些人可能会问为什么j不用拆分,这是因为遍历j已经实现了j的拆分。三.初始化边界只需使dp[1]=1。int integerBreak(int n){ vector< int > dp(n+1).

2021-09-03 10:55:22 306

原创 最长回文子串

解法:动态规划。一:确定状态根据问题寻找 s 中最长的回文子串。我们假设字符串x为回文串,那么我们在x前后各增加同一个字符,得到的新串肯定为一个回文串。由此可知(1)最后一步为:在x前后各增加同一个字符,得到最长的回文子串。(2)子问题:用长为L得回文串str,在其前后各增加同一个字符,得到长为L+2得新回文串二:转移方程我们用P(i,j) 表示字符串 s 的第 i 到 j个字母组成的串(下文表示成 s[i:j]s[i:j])是否为回文串P(i,j)=P(i+1,j)...

2021-09-02 18:48:04 56

原创 C++的STL(持续更新)

C++的STL(持续更新)一. upper_bound()函数和 lower_bound()一. upper_bound()函数和 lower_bound()1. upper_bound()功能:1.//查找[first, last)区域中第一个大于 val 的元素。ForwardIterator upper_bound (ForwardIterator first, ForwardIterator last,const T& val);详细解释:其中first和last表示的是区间地

2021-09-02 11:08:09 122

原创 Unity摇杆制作

1.首先创建一个空物体,命名为摇杆,锚点调至左下角2.创建一个image作为摇杆厨盆的有效地方,并命名为tough_place3.创建一个image放入摇杆的背景图片,并命名为bg。4.创建一个image放入摇杆的控制点,并命名为point。5.把tough_place的颜色设置为透明二.代码编写创建脚本命名为PEListener,并引入相关接口,并进行封装。using System;using UnityEngine;using UnityEngine.EventSystem

2021-08-09 11:51:05 420

原创 Leetcode- 使字符串平衡的最小交换次数

这是一个括号匹配问题。通过分析可知对于一个平衡字符串,从左往右遍历它,统计未匹配的左括号的个数 num,遇到左括号就加1,遇到右括号就减1,如果遍历时遇到右括号之后发现num为负数,那么就需要在后面找一个左括号并与这个右括号交换,然后使num+2.如果任何时刻 num 都不为负数,那么这个字符串就是平衡的。当然本题中给的数据最终都可以达到平衡状态。通过分析,我们可以发现为了使后续的交换次数最小,这个被交换走的右括号应当越靠右越好,所以我们可以拿字符串最右边的左括号来交换。当然在实际求解这道题使可以不..

2021-08-08 18:29:20 430

原创 分段经验条制作

一.UI制作1.调整Canvas的参数2.新建屏幕大小与References Resolution对应。3.创建空物体,命名为Buttom_UI4.制作经验标识图片5.制作经验背景图片6.在背景图片下创建空物体item_list,并添加GridLayoutGroup组件。7.在item_list下创建经验条,并复制九份。注意要改成fill模式8.调整GridLayoutGroup组件的参数。二.添加脚本现在的分段经验条只能在标准模式下适配,一旦屏幕大小出现变化就会出现拉伸变

2021-08-07 10:57:47 373

原创 快速幂和快速幂取模

【二进制快速幂】对于幂计算mn,比如57,我们可以将7改写为二进制111,然后可以对57进行分解。57=3^(1*2 ^ 0)3^(1 * 2 ^ 1 ) 3^(1 * 2 2);不难发现,分解后每项的指数的计算,我们可以发现我们把原本的6次乘法变成了,2次乘法,当然在计算机里面没有乘法的概念,乘法其实质就是累加,从这个方面来看,其提升的效率比我们想象的还要大。下面我来讲讲具体实现。1.首先我们来实现每项指数的递增,也就是2^0-> 2^1-> 2^2(1->2-&gt

2021-07-09 18:44:48 139

原创 线性筛+合数的唯一分解

我们学过Eratosthenes筛法,它的思想是:从2开始找素数的倍数(1倍、2倍、3倍,,,)为合数。它的缺点是会重复筛除一些合数 (像筛除3* 5*之后又会筛除5 *3)而快速线性筛法原理:任何合数都能表示成一系列素数的积,且每个合数必有一个最小素因子。快速线性筛法的特点就是不会重复筛除一个合数。设合数 i=p1p2…*pn, pi都是素数(2<=i<=n),pi<=pj ( i<=j )由上可知p1是合数i的最小素数。这样每一个合数就有一个确定唯一的表示方法(像28=

2021-07-08 11:20:41 152

原创 选择与除法(唯一分解定理+阶乘质因子分解技巧+Eratosthenes筛法求素数)

选择与除法已知C(m,n) =m!/(n!(m-n)!),输入整数p, q,1,s ( p=q , r2s , p.q ,7,s≤10000 ) ,计算C(p,q)/C(r,s)。输出保证不超过108,保留5位小数。【分析】1.预处理素数表,分解每一个1~100002.2.将乘除法变成素数指数的加减法(唯一分解定理)C(p,q)/C(r,s)​​=p!s!(r−s)!​/r!q!(p-q)!值得注意的是可以通过阶乘质因子分解公式来提高我们的效率。阶乘质因子分解公式:N的阶乘的质因子m的指数:X

2021-07-07 18:27:14 131

原创 最小公倍数的最小和

最小公倍数的最小和题目:输入整数n ( 1≤n<2^31),求至少两个正整数,使得它们的最小公倍数为n,且这些整数的和最小。输出最小的和。【分析】设唯一分解式n=a1p1*a2p2*…ai^pi,不难发现每个ai为素数时为最优解。听起挺高大尚的,其实实现起来和简单,就是不断的对n从2进行判断,可以除尽,俩者尽行相除,最后当n为素数时结束。当然,当n为1和素数时,要进行特殊处理,也就是求和的时候要多加1.#include <iostream>#include <math.h&

2021-07-06 10:30:06 232

原创 无平方因子的数

无平方因子的数给出正整数n和m,计算区间[n,m]内的"无平方因子"的数有多少个?整数p无平方因子,当且仅当不存在k>1,使得p是k2的倍数。(1<n≤m≤1012 ,m-n≤107)【分析】1.直接枚举肯定超时。另一种办法和Eratosthenes筛法思路差不多1.筛法求出所有素数。2.对于不超过√m的所有素数p,筛掉区间[n, m]内p^2的所有倍数。#include <iostream>#include <vector>#include <

2021-07-05 11:10:57 469

原创 Eratosthenes筛法求素数

Eratosthenes筛法对于不超过n的每个非负整数p,删除2p, 3p,4p,…,当处理完所有数之后,还没有被删除的就是素数。用shu[i]表示i已经被删除。 vector<int> shu(n+1,1); for (int i=2;i<=n;i++ ) { if(shu[i])//i为素数 { for(int j=i*i;j<=n;j+=i) {

2021-07-05 11:00:47 194

原创 数论-整数对

整数对考虑一个不含前导零的正整数X,把它去掉一个数字以后得到另一个数Y。输入X+Y的值N(1<=N<=10^9),输出所有可能的等式X+Y=N。例如N=34有两个解:31+3=34;27+7=34。思路:1.记N的10进制表示形式的长度为L.2.设从x右边数的第i(0<=i<L)位删除数字d(0<=d<10)得到Y(如图)3.记X=a10(i+1)+d10i+b,(b<10i),则Y=a10i+b,且X+Y=N;由此可得11a10i+d10^i+2b=N

2021-07-04 18:39:52 946

原创 BFS之迷宫的最短路径

BFS之迷宫的最短路径整体思想:简单来说就是步步为营,在现实生活中我们走迷宫无非两种方法,一种是拿一条线,不管三七二十一一路走下去,如果碰到障碍就返回,然后换一个方向走下去。另一种就是你每走一步 ,就观察你周围的情况,并把它记录下来,然后你走下一步的时候,就把你刚才记录的可以走的地方都试着走一遍,并记录周围的情况,以及标记我是从哪里走到这个位置的。重复以上步骤,最后按照这种方式你也可以找到出口,由于你每走到一个地方都会标记我是从哪里走到这个位置的,所以你可以 根据这个反推路径。从编程的角度来看:找到从

2021-07-01 10:55:17 549

原创 做题模板小结

深度搜索#include <iostream>#include <vector>using namespace std;int n=3,m=3;//收缩地域的大小(一般题目)会给出vector< vector<char> > map(n,vector<char>(m));//搜索的地方vector< vector<bool> > visi(n,vector<bool>(m));//搜索的标记int

2021-03-30 20:42:03 92

原创 Unity粒子系统(5.x)实战(一)---篝火

今天我们来开启我们的实战第一篇—篝火。大概是这种效果:首先下载素材资源包–>篝火素材一.火焰1.首先我们创建一个粒子系统并拖入素材Materials的fire_particle_2材质球到新创建的粒子系统上。2.打开Texture Sheet Animation module模块调整如下:2.调整基础属性(1)默认的随机旋转,让火焰更加自然。(2)放大Size,可以给一个随范围值。(3)因为火焰有一种红橙之色,所以我们可以使用Start Color来调整一下。具体数值如下,可以自

2021-02-23 10:28:18 1590 2

原创 Unity粒子系统(5.x)基础(三)

好,我们继续上节课的子模块讲。1.External Forces作用:此模板主要是增加风力对粒子的影响。主要有三个参数:(1)Multiplier:控制风力对粒子的影响程度。我们可以做个实验:首先,先建一个风,如图:然后,播放粒子,发现Multiplier越大,粒子受风力影响就越大。(2)Influence Filter:控制风力的影响对象,一般通过Layer Mask来控制。比如我们把Influence Mask的Everything改成Nothing或者非Default层粒子就不会

2021-02-21 17:15:51 1453 1

原创 Unity粒子系统(5.x)基础(二)

大家好,接下来一节我讲的是Unity粒子系统(5.x)的子模块。值得注意的是,如果我们可以结合Emission(发射器)和Word模式来制作拖尾效果。我们可以先调高发射器的Rate(发射速率),然后拖动它。如下...

2021-02-18 17:14:03 4010

原创 Unity粒子系统(5.x)基础(一)

大家好,首先我们来讲一下粒子系统的基础属性。首先我们新建一个粒子系统。如图。然后点击新创建的粒子,观看右侧基本属性栏1.Duration:粒子发射器的生命。比如现在Duration为5秒,那么粒子发射器就会持续5秒处于发射状态,但值得注意的是它与单个粒子的持续时间(start Lifetime)毫不相关。比如我把Duration和start Lifetime都设置为5秒,那么到第十秒,最后一个粒子才消失,如下。这是因为粒子发射器最后一秒(第五秒)发射的的粒子它的生命周期是(start L

2021-02-17 11:22:28 1176 3

原创 TCP协议底层结构详解

一. TCP套接字的I/0缓冲我们知道,TCP 套接字的数据收发无边界。服务器端即使调用1次write函数传输40字节的数据,客户端也有可能通过4次read函数调用每次读取10字节。但此处也有一些疑问,服务器端一-次性传输了40字节,而客户端居然可以缓慢地分批接收。客户端接收10字节后,剩下的30字节在何处等候呢?是不是像飞机为等待着陆而在空中盘旋一样,剩下30字节也在网络中徘徊并等待接收呢?实际上,write 函数调用后并非立即传输数据,read 函数调用后也并非马上接收数据。更准确地说,如下图所示,

2021-02-08 17:49:51 1857

原创 网络编程的基本概念

一.网络中的地址(IP)作用:给Internet上的电脑一个编号,用于电脑间的连接。每个IP地址都包含两部分:网络ID和主机ID。网络ID标识在同一个物理网络上的所有主机,主机ID标识该物理网络上的每一个主机。二.网络中的端口为什么有端口:大部分设备(终端)都只有一个IP,那么当我们和一个服务器进行通信时就无法与服务器进行通信,比如我们我们在进行邮件服务(发邮件)就不能进行聊天了。为了解决这个问题,端口的概念由此而生。端口作用:不同端口对应不同服务,使计算机的应用进程能够互相通信。端口的种类:

2021-02-07 10:43:02 104

原创 二叉排序树

1.二叉排序树定义(1)若左子树不空,则左子树上所有结点的值均小于或等于它的根结点的值;(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;(3)左、右子树也分别为二叉排序树;例如这样一组数据3, 5, 1, 7, 2。它的有它构成的排序树为:2.二叉排序树操作(举例为左小右大)(1)插入:根据二叉树的性质,使用指针和循环或者使用递归寻找到相应位置插入节点。(2)删除:对于二叉排序树的每个结点,它的左子树上的元素都小于该结点上的元素 ,右子树上的元素都大于该结点上的元素,根据这个

2021-02-01 17:43:32 1515

原创 快速排序

快速排序算法的基本内容:选择一个基准数,然后结合分治法,把数据分为两个部分,如果你想要数据升序排列,那么基准数左边就需要比基准数小,基准数右边就需要比基准数大,如果是降序排列则相反。接下来基准数左右两边数据继续使用快速排序进行排序(一般使用递归),当左边数据或右边数据只剩一个元素时,则说明元素排序完成。下面我们结合具体数据来说明一下。将下面这组数据由小到大进行排列.1.首先我们先选择一个基准数(base)通常是数据的第一位,也就是4,下标(baseindex)为0;2.然后开始比较,规则如下:(

2021-01-30 16:04:45 153

原创 栈和队列,及其低层实现

一.栈1)栈的概念:栈是操作限定在表的尾端进行的线性表。表尾由于要进行插入、删除等操作,所以,它具有特殊的含义,把表尾称为栈顶,另一端是固定的,叫栈底。当栈中没有数据元素时叫作空栈。2)栈的特点:先进后出3)栈的好处:单纯从功能上讲,数组或者链表可以替代栈。它们的操作过于灵活,,当数据量很大的时候就会出现一些隐藏的风险。虽然栈限定降低了操作的灵活性,但这也使得栈在处理只涉及一端新增和删除数据的问题时效率更高,更不容易出错。1. 顺序栈(1)顺序栈的概念:用一片连续的存储空间来存储栈中的数据元素(使

2021-01-28 16:59:41 375

原创 线性表(顺序表,链表等)及其实现(C#版)

线性表线性表的实现方式有下面几种1.顺序表线性表的顺序存储是指在内存中用一块地址连续的空间依次存放线性表的数据元素,用这种方式存储的线性表叫顺序表,它的实现主要依赖于数组。顺序表的实现:using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace _线性表{ //IComparable<T&g

2021-01-25 16:52:15 383

原创 委托和事件的应用场景

C#委托和事件的应用场景接触过委托和事件的人都知道,它们的语法都很简单,真正的难点是在什么场景中利用它们的特性来使用它。下面我希望通过我分析下面的这个案例可以读者有一些启发。有错误的地方还望指出,一起进步,谢谢!假设你在一天的某个心情好的时刻会玩王者荣耀,你的5个寝室友(A,B,C,D,E…)将在一起打赌,如果你赢了,5个寝室友悄悄各帮你写一门作业,如果你输了你的室友会对你发出嘲讽。有些同学可能会觉得这个题目很简单,不就是if判断吗。If(心情好,在玩游戏){If(赢){A帮你写英语作业B

2020-12-29 16:21:11 1209 1

原创 有两个数a,b,第一个数只为0或1,另一个数为一个任意整数,只使用位运算实现下要求。

有两个数a,b,第一个数只为0或1,另一个数为一个任意整数,只使用位运算实现下要求。当第一个数为0时,另一个数为偶数时结果为1,另一个数为奇数时结果为0;当第一个数为1时,另一个数为偶数时结果为0,另一个数为奇数时结果为1。我们知道当一个数为0时,我们可以通过’^1运算使最终的结果为1,^0运算使最终的结果为0,然后偶数的二进制表现形式的最后一位一定为0,然后题目要求的是另一个数为偶数时结果为1,奇数时结果为0,为了满足题目要求我们可以对另一个数进行位取反运算,使偶数的二进制表现形式的最后一

2020-12-21 12:48:09 145 1

原创 百钱买百鸡问题的最优解法

解决百钱买百鸡问题,某人有100元钱,要买100只鸡,公鸡5元钱一只,母鸡3元钱一只,小鸡一元钱3只,问可买到的公鸡,母鸡,小鸡各为多少只,请把所有的可能性打印出来。一,普通解法思路:我们设a,b,c分别代表公鸡,母鸡以及小鸡。由题可得到a+b+c=100和5a+3b+1/3*c=100这两个关系式,以及a,b,c的取值范围。下面是相关代码。然后大概计算了660次。for (int a = 0; a < (100/5); a++) {

2020-12-13 09:16:18 24725 6

原创 Unity实现鼠标拖动交换两个物体位置,拖动移动及拖动复制

1.拖动交换两个物体位置(1)首先在场景中新建一个Plane 两个Sphere,两个材质球和一个空对象。如图(2)然后新建脚本thing,编辑脚本如下,主要是定义鼠标对应三个状态的函数。using System.Collections;using System.Collections.Generic;using UnityEngine;public class thing : MonoBehaviour{ //当鼠标按下时 private void OnMouseDown

2020-12-07 17:15:20 2764

Snake--Unity贪吃蛇.zip

Unity贪吃蛇工程文件

2021-05-24

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除