ET是一个开源的游戏客户端(基于unity3d)服务端双端框架,服务端是使用C# .net core开发的分布式游戏服务端,其特点是开发效率高,性能强,双端共享逻辑代码,客户端服务端热更机制完善,同时支持可靠udp tcp websocket协议,支持服务端3D recast寻路等等,作者为熊猫(Egametang),曾在网易工作多年,是游戏开发行业中的佼佼者。
一般来说,分布式服务端要启动很多进程,一旦进程多了,单步调试就变得非常困难,导致服务端开发基本上靠打log来查找问题。平常开发游戏逻辑也得开启一大堆进程,不仅启动慢,而且查找问题及其不方便,要在一堆堆日志里面查问题,这感觉非常糟糕,这么多年也没人解决这个问题。ET框架使用了类似守望先锋的组件设计,所有服务端内容都拆成了一个个组件,启动时根据服务器类型挂载自己所需要的组件。这有点类似电脑,电脑都模块化的拆成了内存,CPU,主板等等零件,搭配不同的零件就能组装成一台不同的电脑,例如家用台式机需要内存,CPU,主板,显卡,显示器,硬盘。而公司用的服务器却不需要显示器和显卡,网吧的电脑可能不需要硬盘等。正因为这样的设计,ET框架可以将所有的服务器组件都挂在一个服务器进程上,那么这个服务器进程就有了所有服务器的功能,一个进程就可以作为整组分布式服务器使用。这也类似电脑,台式机有所有的电脑组件,那它也完全可以当作公司服务器使用,也可以当作网吧电脑。
分布式服务端要开发多种类型的服务器进程,比如Login server,gate server,battle server,chat server friend server等等一大堆各种server,传统开发方式需要预先知道当前的功能要放在哪个服务器上,当功能越来越多的时候,比如聊天功能之前在一个中心服务器上,之后需要拆出来单独做成一个服务器,这时会牵扯到大量迁移代码的工作,烦不胜烦。ET框架在平常开发的时候根本不太需要关心当前开发的这个功能会放在什么server上,只用一个进程进行开发,功能开发成组件的形式。发布的时候使用一份多进程的配置即可发布成多进程的形式,是不是很方便呢?随便你怎么拆分服务器。只需要修改极少的代码就可以进行拆分。不同的server挂上不同的组件就行了嘛!
ET框架使用C#做服务端,现在C#是完全可以跨平台的,在linux上安装.netcore,即可,不需要修改任何代码,就能跑起来。性能方面,现在.netcore的性能非常强,比lua,python,js什么快的多了。做游戏服务端完全不在话下。平常我们开发的时候用VS在windows上开发调试,发布的时候发布到linux上即可。ET框架还提供了一键同步工具,打开unity->tools->rsync同步,即可同步代码到linux上
./Run.sh Config/StartConfig/192.168.12.188.txt
即可编译启动服务器。
C#天生支持异步变同步语法 async和await,比lua,python的协程强大的多,新版python以及javascript语言甚至照搬了C#的协程语法。分布式服务端大量服务器之间的远程调用,没有异步语法的支持,开发将非常麻烦。所以java没有异步语法,做单服还行,不适合做大型分布式游戏服务端。例如:
// 发送C2R_Ping并且等待响应消息R2C_Ping
R2C_Ping pong = await session.Call(new C2R_Ping()) as R2C_Ping;
Log.Debug("收到R2C_Ping");
// 向mongodb查询一个id为1的Player,并且等待返回
Player player = await Game.Scene.GetComponent<DBProxyComponent>().Query<Player>(1);
Log.Debug($"打印player name: {player.Name}")
可以看出,有了async await,所有的服务器间的异步操作将变得非常连贯,不用再拆成多段逻辑。大大简化了分布式服务器开发
erlang语言一大优势就是位置透明的消息机制,用户完全不用关心对象在哪个进程,拿到id就可以对对象发送消息。ET框架也提供了actor消息机制,实体对象只需要挂上MailBoxComponent组件,这个实体对象就成了一个Actor,任何服务器只需要知道这个实体对象的id就可以向其发送消息,完全不用关心这个实体对象在哪个server,在哪台物理机器上。其实现原理也很简单,ET框架提供了一个位置服务器,所有挂载MailBoxComponent的实体对象都会将自己的id跟位置注册到这个位置服务器,其它服务器向这个实体对象发送消息的时候如果不知道这个实体对象的位置,会先去位置服务器查询,查询到位置再进行发送。
热更是游戏服务器不可缺少的功能,ET框架使用的组件设计,可以做成守望先锋的设计,组件只有成员,无方法,将所有方法做成扩展方法放到热更dll中,运行时重新加载dll即可热更所有逻辑。
可以使用csharp.lua或者ILRuntime稍加改造即可做客户端热更。再也不用使用狗屎lua了,客户端可以实现所有逻辑热更新,包括协议,config,ui等等。
开发不用重启客户端即可修改客户端逻辑代码,开发极其方便
下载ET框架,打开服务端工程,可以看到服务端引用了客户端很多代码,通过引用客户端代码的方式实现了双端共享代码。例如客户端服务端之间的网络消息两边完全共用一个文件即可,添加一个消息只需要修改一遍。
ET框架不但支持TCP,而且支持可靠的UDP协议(ENET跟KCP),ENet是英雄联盟所使用的网络库,其特点是快速,并且网络丢包的情况下性能也非常好,这个我们做过测试TCP在丢包5%的情况下,moba游戏就卡的不行了,但是使用ENet,丢包20%仍然不会感到卡。非常强大。框架还支持使用KCP协议,KCP也是可靠UDP协议,据说比ENET性能更好,使用kcp请注意,需要自己加心跳机制,否则20秒没收到包,服务端将断开连接。协议可以无缝切换。
可以Unity导出场景数据,给服务端做recast寻路。做MMO非常方便,demo演示了服务端3d寻路功能
这样就可以打印出进程中任何数据,大大简化了服务端查找问题的难度,开启repl方法,直接在console中输入repl回车即可进入repl模式
几行代码即可创建机器人登录游戏。机器人压测轻而易举,机器人跟正常的玩家完全一样,上线前用机器人做好压测,大大降低上线崩溃几率
ET的AI框架让AI编写比UI还简单
跟市面上的测试用例不同,ET的测试用例都是一个完整的游戏环境,针对协议级别,不需要搞各种接口去mock。写起来非常快速
a.及其方便检查CPU占用和内存泄漏检查,vs自带分析工具,不用再为性能和内存泄漏检查而烦恼
b.使用NLog库,打log及其方便,平常开发时,可以将所有服务器log打到一个文件中,再也不用一个个文件搜索log了
c.统一使用Mongodb的bson做序列化,消息和配置文件全部都是bson或者json,并且以后使用mongodb做数据库,再也不用做格式转换了。
d.提供一个同步工具
ET框架是一个强大灵活的分布式服务端架构,完全可以满足绝大部分大型游戏需求。使用这套框架,客户端开发者就可以自己完成双端开发,节省大量人力物力,节省大量沟通时间。
ET开源地址地址:egametang/ET: Unity3D Client And C# Server Framework (github.com) qq群:474643097
Flutter系列文章连载~《FlutterAndroid工程结构及应用层编译源码深入分析》《Flutter命令本质之Fluttertools机制源码深入分析》《Flutter的runApp与三棵树诞生流程源码分析》《FlutterAndroid端Activity/Fragment流程源码分析》《FlutterAndroid端FlutterInjector及依赖流程源码分析》《FlutterAndroid端FlutterEngineJava相关流程源码分析》《FlutterAndroid端FlutterView相关流程源码分析》《Flutter绘制动机VSYNC流程源码全方位分析》《Flutter安卓Platform与Dart端消息通信方式Channel源码解析》背景前面系列文章我们分析了FlutterActivity等相关流程,知道一个FlutterAndroidApp的本质是通过FlutterView进行渲染。当时由于篇幅限制,我们没有进入详细分析,这里作为一个专题进行简单分析。SDK中同属于FlutterView体系的控件大致有如图这些:在这里插入图片描述下文主要围绕上图进行分析
基于海思Hi3559A往全景及AI应用方向的产品开发,做了一些实际场景的测试,目前全景摄像机主要应用于室外视野开阔的场所,譬如道路交通、露天广场、小区楼宇、港口码头等,某些场所监控宽度甚至达到百米以上。目前来看这套方案还处于较为成熟几无替代的地位;Hi3559AV100支持业界领先的多路4KSensor输入,多路ISP图像处理支持HDR10高动态范围技术标准,并支持多路全景硬件拼接,是多路拼接的超广角相机、3D/全景VR相机的最佳方案。Hi3559AV100支持8K@30fps/4K120fps视频录制下,提供硬化的6-Dof数字防抖。Hi3559AV100集成了海思独有的SVP平台,提供了高效且丰富的计算资源,支撑客户开发各种计算机视觉应用,如无人机、机器人等行业类应用。Hi3559AV100集成了双核A73和双核A53,独创性的大小核架构和双操作系统,使得功耗和启动时间达到均衡。4目180°前拼模组5目360°前拼模组HiSiliconPanoramaStitchingTechnologyUpto8-Channelinput|720ºStitching&Rotati
之前的文章,小编分享了一些关于jmeter的使用心得,不知是否对大家的测试工作有些许的帮助呢,本期将继续为大家带来jmeter相关的使用心得第三篇。 往期文章:jmeter使用心得(一) jmeter使用心得(二)一、jmeter实现定量测试在接口测试中,我们常常需要控制某次测试进行请求的总次数,在jmeter中,控制请求次数有多种实现方式,小编常用的有3种:1、设置线程组的循环次数(精确控制) 2、设置的线程组的执行时间(非精确控制) 3、通过设置参数化列表(CSVData)来限制请求数量(精确控制) 这3种方式都可以控制请求的次数,大家在使用jmeter的过程中想必也会有所应用。但其实这3种方式在效果上却有着很大区别,并不是哪种用着方便我们就随意选择一种来使用,还需要结合实际情况来决定具体使用的控制方式,以实现我们想达到的效果,同时避免对测试结果造成额外的影响。下面小编结合自身经验,来介绍下这几种控制方式的特点和如何进行选择。 首先,这3种方式中,只有设置线程组循环次数和通过设置参数化列表来限制请求数量可以实现对请求次数的精确限制,而设置线程组的执行时间是不能做到这一点的,因为它控
门前冷落鞍马稀,老大嫁作商人妇。这篇文章主要来讲解下Python自带的爬虫库urllib常见用法,主要围绕urllib定义、urllib的常用模块和urllib+lxml爬虫案例三个部分进行展开。一、什么是urllib它是一个http请求的Python自带的标准库,无需安装,直接可以用。并且提供了如下功能:网页请求、响应获取、代理和cookie设置、异常处理、URL解析,可以说是一个比较强大的模块。二、urllib模块可分为以下模块:urllib.request请求模块 urllib.error异常处理模块 urllib.parse解析模块 urllib.robotparser解析模块复制那么,我们先从第一个模块开始说起吧,首先说一下它的大致用法: urllib.request.urlopen(url,data=None,[timeout,]*,cafile=None,capath=None,cadefault=False,context=None)#里面有很多方法,类似与requests模块中的renquest方法复制request里包含了很多方法,如果我们要发送一个请求并读取请求内
一、什么是WebRTC?WebRTC,即WebReal-TimeCommunication(网页即时通信)。它是一个开源项目,旨在创建简单、标准化的流程通过Web提供实时通信(RTC)。WebRTC最初是为了在网页浏览器中进行实时通信而建立的。你可以理解为,它是一个支持网页浏览器进行实时语音对话或视频对话的API。二、发展由来GoogleChrome发布后不久,其团队注意到,在进行实时通信时,网页基础设施不足。在当时,浏览器都没有默认提供人与人之间直接进行数据传输的功能,更不用说让所有浏览器都实现标准化操作。因此Google开始着手创建Web实时通信的标准化规范,以便在通用平台上顺利进行数据传输,从而消除对第三方应用程序或插件的需求。在随后的几年里,Mozilla、Microsoft、Opera和Apple都加入了该项目。WebRTC技术的诞生,有一个很重要的原因在于,在浏览器实现实时音视频通话,需要依赖相关插件或程序,而插件安全漏洞问题则更为关键。浏览器开发人员无法控制这些插件以及更新,因此插件带来的安全风险也相对较大。例如,AdobeFlash一直以来以安全性问题闹了不少负面新闻,
011ead2e167b86d1d4def84147fbbdf6c6bb1c01.jpg最近看到掘金、前端公众号好多ES2020的文章,想说一句:放开我,我还学得动! 先问大家一句,日常项目开发中你能离开ES6吗? 一、前言对于前端同学来说,编译器可能适合神奇的魔盒?,表面普通,但常常给我们惊喜。 编译器,顾名思义,用来编译,编译什么呢?当然是编译代码咯?。 其实我们也经常接触到编译器的使用场景:React中JSX转换成JS代码;通过Babel将ES6及以上规范的代码转换成ES5代码;通过各种Loader将Less/Scss代码转换成浏览器支持的CSS代码;将TypeScript转换为JavaScript代码。andsoon... 使用场景非常之多,我的双手都数不过来了。? 虽然现在社区已经有非常多工具能为我们完成上述工作,但了解一些编译原理是很有必要的。接下来进入本文主题:200行JS代码,带你实现代码编译器。 二、编译器介绍2.1程序运行方式现代程序主要有两种编译模式:静态编译和动态解释。推荐一篇文章《Angular2JITvsAOT》介绍得非常详细。 静态编译简称AOT(Ahe
本章只讲述所有基本的的I/O函数,更多函数请参考Python标准文档。打印到屏幕最简单的输出方法是用print语句,你可以给它传递零个或多个用逗号隔开的表达式。此函数把你传递的表达式转换成一个字符串表达式,并将结果写到标准输出如下:#!/usr/bin/python print "Python is really a great language,", "isn't it?";复制你的标准屏幕上会产生以下结果:Python is really a great language, isn't it?复制读取键盘输入Python提供了两个内置函数从标准输入读入一行文本,默认的标准输入是键盘。如下:raw_inputinputraw_input函数raw_input([prompt])函数从标准输入读取一个行,并返回一个字符串(去掉结尾的换行符):#!/usr/bin/python str = raw_input("Enter your input: "); print "Received in
函数篇extrude(拉伸)名字看起来,跟FME的转换器很像,实现的功能也比较类似。功能:挤出一个高度,使模型从面状变成体块(二维到三维)。概要:extrude(height) extrude(axisWorld,height)参数:height:拉伸的高度。默认沿模型的Y轴拉伸; axisWorld:设定拉伸轴线,使用世界坐标系的轴作为拉伸轴线。其可选参数为:world.x/world.y/world.z。comp(拆分)功能:从模型中分离出满足一定条件的模型。概要comp(compSelector){selector:shape_or_op}参数compSelector:可选值:1、f(拆分的对象是面);2、e(拆分的对象是边);3、v(拆分的对象是点)。 selector(keyword) front,back,left,right,top,bottom:前后左右上下,相对于模型轴系而言,比较常用; vertical(垂直),horizontal(水平),aslant(有坡度的),nutant(往下垂的); side:除了水平部件外的其他部分; all:所有的;color功能就跟
今天给大家介绍的是一款名叫sRDI的注入工具,它可以基于Shellcode实现反射型DLL注入,并能够将DLL转换成独立的Shellcode。工具介绍sRDI的所有功能基于以下两个组件:1.一个C语言项目,可将PELoader编译为Shellcode;2.转换代码负责将DLL、RDI和用户数据进行绑定。该项目由以下元素组成:-ShellcodeRDI:编译Shellcode;-NativeLoader:在必要情况下将DLL转换为Shellcode,并将其注入至内存;-DotNetLoader:NativeLoader的C#实现;-Python\ConvertToShellcode.py:将DLL转换为Shellcode;-Python\EncodeBlobs.py:对已编译的sRDI进行编码,并实现动态嵌入;-PowerShell\ConvertTo-Shellcode.ps1:将DLL转换为Shellcode;-FunctionTest:导入sRDI的C函数,用于调试测试;-TestDLL:样本Dll,包含两个导出函数,可用于后续的加载和调用;复制使用样例在使用该工具之前,我建议大家
http://www.cnblogs.com/answeryi/archive/2012/09/27/2705860.html主要内容主要了解PyQt程序的整体框架;涉及模块:QApplication,QLabel,QTimer实例讲解首先先看一个简单的PyQt程序:1 2 3 4 5 6 7 8 9 10import sys from PyQt4.QtGui import * from PyQt4.QtCore import * app = QApplication(sys.argv) label = QLabel("<font color=redsize=128><b>HelloPyQT!</b></font>") label.setWindowFlags(Qt.SplashScreen) label.show() QTimer.singleShot(10000, app.quit) # 设置10s后自动退出 app.exec_() 先看导入内容,PyQt中与界面有关的模块一
本文是谷歌产品高级副总裁JonathanRosenberg在其母校克莱蒙特·麦肯纳学院向毕业生分享的他自己多年的职场经验,包括沟通、文化、团队建设、决策、创新和谦卑等六方面内容。这浩浩荡荡的42条“职场生存军规”,来自世界上最优秀的公司,而这会给你怎样的启发呢?1沟通篇Communication1别担心沟通过度“每当你认为自己沟通过度时,你可能才刚刚开始。”Rosenberg强调全体员工大会、日常邮件、办公时间和场外工作团队的重要性。哪怕与你共同的都是些聪明过人的能人,你也得假设他们脑子里都有100件其他的事情要忙。“根本就没有过度沟通这回事儿。”2分享所有,不隐瞒“在Google,我们的默认方式是分享一切信息。从信息的角度,我们赋予每个人平等的权利。在互联网时代,力量源于分享信息,而不是囤积它们。员工们希望被信任,而不是讨厌和惊讶。”一个完全透明的政策可以满足他们的需求。3惜字如金一个领导人的话应该是考虑周全而且精准的——你的一切言语都会被演绎。“干脆、直接、聪明地选择每一个词语”,他还引用了作家ElmoreLeonard的话,“沟通不是来自一封封长长的邮件,也不是我们脑子里冒出的每
SVG与Canvas是HTML5上绘制图形应用的两种完全不同模式的技术,两种绘制图形方式各有优缺点,但两者并非水火不容,尤其是SVG内容可直接绘制在Canvas上的功能,使得两者可以完美的融合在一起,让Canvas可享用到现有丰富的SVG素材,并不失SVG矢量无级缩放的特点。《基于HTML5的DragandDrop生成图片Base64信息》这篇虽然展示的是拖拽普通栅格图片的效果,但你也可以直接拖拽SVG格式的图片进行显示,只不过普通图片的格式数据为data:image/png类型,而SVG格式的数据类型为data:image/svg+xml的类型,下图为该HTforWeb拓扑图拖拽入SVG格式图片的运行效果:以下一段小例子,展示了加载一个SVG图片后,分为七个基本进行缩放绘制的效果,可看出Canvas绘制SVG可保持其矢量不失真的特性function draw(){ var img = new Image(); img.src = 'chart.svg'; document.body.appendChild(img); img.onl
//02.01-2018更新-增加:13.0放在文章草稿里好久几个月了,是继承上一篇文章哪类人适合当产品经理?结尾裁剪下来的。多是些感悟和杂谈,感觉还是有点用的。既然是杂谈那就开始吧。01.0产品经理类型 02.0创那么一次业 03.0产品人的一些面 04.0产品经理的底线 05.0自我管理 06.0资源整合 07.0协调能力 08.0工作技能 09.0关于产品升级 10.0写文档 11.0执行能力 12.0新人的危险期 13.0自我减压方案 14.0产品经理PS项目经理 15.0关于产品经理:有色眼镜的局限性 16.0关于模块设计的取舍 17.0局部碎片概念 18.0产品的术/法/道复制01.0产品经理类型产品经理细分的话各种各样,有很多的相同点,也有各自侧重的不同点,目前我这边介绍的主要还是互联网产品经历。主流一般都是说产品经理更偏向项目建设多一点。但我想说的还是在这个池子内,也有各种在能力方面有区别性的产品经理。比如,研发人员出生的产品经理,多数都去了软件研发公司;运营出生的产品,多数去了品牌/电商/广告公司;所以个人建议初级PM们选择自己的公司时,最好不要盲投,免得去了和自
参考文章:原文链接:https://blog.csdn.net/chensirbbk/article/details/52189985 #region2.NPOI读取Excel验证Excel数据的有效性(非空)并修改指定单元格样式 IWorkbookworkbook=null; ISheetsheet=null; ArrayListquestionRowIndex=newArrayList();/*收集出现问题行的索引*/ using(FileStreamfs=System.IO.File.Open(readExcelPath,FileMode.Open,FileAccess.ReadWrite,FileShare.ReadWrite)) { #region选择解析方式 if(dataLog.ExcelName.IndexOf(".xlsx")>0) { workbook=newXSSFWorkbook(fs); } elseif(dataLog.ExcelName.IndexOf(".xls")>0) { workbook=newHSSFWorkbook(fs);
Disconf的启动,主要是包括两次扫描和XML非注解式配置,总共分为上下两篇,上篇先主要介绍第一次静态扫描过程。 先从入口分析,通过Disconf帮助文档,可以看到xml必须添加如下配置。 <!--使用disconf必须添加以下配置--> <beanid="disconfMgrBean"class="com.baidu.disconf.client.DisconfMgrBean" destroy-method="destroy"> <propertyname="scanPackage"value="com.demo.disconf"/> </bean> <beanid="disconfMgrBean2"class="com.baidu.disconf.client.DisconfMgrBeanSecond" init-method="init"destroy-method="destroy"> </bean> 复制 DisconfMgrBean继承了ApplicationContextAware,disconf重
基于摄像头的简单手势控制系统系统,主要利用Pytnon语言和控制摄像头的opencv库,识别和获取手部信息的mediapipa库以及控制鼠标和键盘的pyautogui库。通过对手指竖起的数量和特定的手势来实现人机交互,从而来实现控制系统的所有功能。使用这个系统进行的人机交互可以实现电脑的一些常用操作。 大致功能如下: a)控制电脑音量大小。 b)控制鼠标的移动,能大致完成鼠标的所有功能。比如鼠标的移动,单击左键或右键,拖动文件,画图,滑动等 c)通过手的左右移动来实现键盘左右方向键的功能。比如PPT的翻页,文件和网页的浏览等. 安装:下载Python3.8和PyCharmCommunityEdition2021.3.3(安装路径尽量不要出现中文) 下载opencv-python,mediapiia,pyautogui,numpy,pycaw,comtypes库 作品思路: 首先,构建了手指、手指形状、手指个数与系统功能间的对应关系,确定交互系统的大致设计框架和方向;然后根据实际需求选择了Python作为本交互系统的设计语言;最后根据系统的需求,选取合适的Python库及其方法: a)根
题目 扫描线算法 这里需要遍历所有日期,题目中日期范围是1<=events[i][0]<=events[i][1]<=10^5,那么就遍历这些日期,逐个日期去判断当前日期是否可以参加会议。 publicintmaxEvents(int[][]events){ intres=0,eventIndex=0,n=events.length; Arrays.sort(events,(a,b)->a[0]==b[0]?a[1]-b[1]:a[0]-b[0]); PriorityQueue<Integer>pq=newPriorityQueue<>();//存放endday for(inti=1;i<=100000;++i){//遍历所有日期 if(eventIndex==n&&pq.isEmpty())break;//已经没有可参加的会议 //当前日期恰好为某会议的startday while(eventIndex<n&&events[eventIndex][0]==i){ pq.offer(event
目录1.关键点2.效果图3.源代码 1.关键点 使用单线程爬取,未登录,爬取网易云歌单主要有三个关键点: url为https://music.163.com/discover/playlist/?order=hot&cat=%E8%AF%B4%E5%94%B1&limit=35&offset=105 网易云使用翻页形式,其特点为url的limit和offset参数 limit表示单页显示的歌单数(修改无效) offset表示当前页数,即offset/limit+1 发送get请求时froms与url的参数一样 cat歌单类型,必须将中文转码 order最新或最热 limit与url参数一致 offset与url参数一致 2.效果图 3.源代码 #!/usr/bin/python3 #_*_coding:utf-8_*_ """ @File:网易歌单爬取.py @Author:LiuHeDong @Mail:liuhedong135@163.com @Date:2019-04-1518:28:48 """ fromurllibimp
我们之前有<C++模板编程模块>中的第<四>节理解空间配置器allocator优化STL中的Vector 我将在此基础上加入迭代器功能代码 Iterator为什么可以遍历所有的容器的方式都一样? autoit=continer.beign(); for(;it!=continer.end();++it){ cout<<*it<<endl; } //我们在自己的容器里的Iteratorde++,*由自己来实现,所有对外部使用者来看都是统一的. //泛型算法能够给所有的容器都使用,也是基于容器对外提供了统一的遍历接口,其参数接受的都是容器的迭代器 复制 #include<iostream> usingnamespacestd; classperson{ public: //构造函数 person(int_age=1,char*_pname=nullptr): age(_age) { if(_pname==nullptr){ pname=newchar[1]; pname[0]='\0'; }
运行界面: 项目代码 https://git.dev.tencent.com/lny011/1600802040-01-weather.git 团队 高志杰 1600802039 162班 https://www.cnblogs.com/gao98 高怡 1600802040 162班 https://http://www.cnblogs.com/luy011/ 马玉娟 1600802053 162班 https://www.cnblogs.com/huanmeng/ 团队项目描述: 实现一个手机课程表app,目前我们使用的课程表有很多附加功能,或者广告等等,所以我们打算制作简易的课程表的功能,只进行课程表的实现并无其他附加功能。 项目需要实现的功能是UI界面的实现,课程表的添加、删除、更改,同时实现设置第一周然后自动跳转到当