2021年游戏总结 下
本文承接上文,继续聊聊 2021 年我所体验的一些游戏。
伊苏8:丹娜的陨涕日今年玩过最喜欢的 jrpg 作品,几乎满足了我对于一款优秀 jrpg 的全部幻想。
战斗方面爽快而又不失深度。伊苏系列向来以高速的即时制战斗著称,本作也不例外,角色与敌人的动作都相对较快,技能无冷却加之技能槽的回复速度很快,因此本作的战斗与大部分 jrpg 讲究策略的慢节奏战斗有很大不同。但这并不意味着本作战斗就十分无脑,弹反、极限闪避、弱点属性等机制的加入很好的提升了战斗系统的深度。
本作的剧情也很优秀。剧情悬念设置十分得当,给予玩家很强的故事驱动力,人物塑造极佳,进一步增强代入感。
本作最值得夸赞的还是地图探索方面的体验。本作采用的是一个非常典型的“银河恶魔城”式的地图设计,玩家需要探索地图的各个角落,从而解锁新的能力,再次进行更深一步的探索。同时本作探索不光局限于对于物品的获取,还包括了 npc 的发现,这一切与 jrpg 的强故事驱动相结合,使得探索欲望进一步上升。
最后讲讲我对于本作不满的地方。首先是本作的保卫战部分,这部分实属多余,不仅不有趣,还很大程度破坏了地图探索的连贯性与叙事节奏,纯粹 ...
2021年游戏总结 上
转眼间 2021 年已经过去,这一年间也体验了很多不同平台、不同类型的作品。本文将对此做一个小小的总结,内容主要是个人对 2021 年玩过的游戏的一些个人想法。此外,由于篇幅受限,因此并不会包含所有的游戏,部分体验不够深入的或者无话可聊的游戏将不会出现。
双人成形这算是今年玩过的最开心的游戏了,和两个室友花了大概 15 小时通关。
游戏在本身的关卡设计就很优秀,在融合了双人机制下更加显得精妙。且游戏对于资源的利用可谓毫不吝啬,每一大关就完全舍弃掉之前机制,完全变成“另一个游戏”。虽然这样各种机制浅尝辄止的设计理念可能会带来所谓的游戏深度不足,但这并不是本作所追求的,本作就是想给玩家一个极为丰富的一周目流程。仔细想想现在很多游戏的流程越来越长,但很多内容都是注水的,玩家在这些重复劳动的过程中可能会对游戏失去兴趣,最终导致游戏烂尾。而双人成形就是一个每个关卡细节精心编排打磨,每种机制总能在玩家感到无聊之前及时结束,从而转向新的机制。我在实际游戏过程中的感受也是如此,对之后关卡机制的期待是我在现在大部分游戏中所体会不到的。
还有一点值得提的就是本作的箱庭式关卡设计,几乎每个关 ...
记一次CTF校赛
本文记录一下刚刚结束的CTF校赛,感觉本次校赛题目出得实在有点坑,但也算学到了不少东西。
Cryptoeasy_ECC问题描述已知椭圆曲线加密Ep(a,b)参数为
p = 15424654874903
a = 305423748
b = 315284355172
G(15079176652031,83237376468)
私钥为
k = 655321
求公钥K(x,y)
思路常规的椭圆曲线加密问题,直接根据加密原理编写解密程序,得到两个结果。根据问题提示,考虑 flag 为两数的异或结果。
解密脚本def add(A, B):
if A == (0, 0):
return B
if B == (0, 0):
return A
x1, y1 = A
x2, y2 = B
if A != B:
λ = (y2 - y1) * pow((x2 - x1), p - 2, p)
else:
λ = (x1 * x1 * 3 + a ...
C++比较函数cmp
本文将简单介绍C++比较函数 cmp.
排序函数sort()sort函数是我们常用的库函数,它的参数如下:
void sort (RandomAccessIterator first, RandomAccessIterator last, Compare cmp);
通过传入容器的迭代器(或指针),我们可以对指定位置进行排序:
vector<int> nums = { 1,3,2,4,5 };
sort(nums.begin(), nums.end()); //排序得到nums = { 1,2,3,4,5 }
可见,sort 函数的比较函数 cmp 默认参数为升序排列,当然也可以自定义函数来实现不同的排序方法。
比较函数cmp()自定义比较函数首先编写一个示例用以解释:
struct MyStruct {
int weigth;
string str;
};
bool cmp(const MyStruct& ms1, const MyStruct& ms2) {
retu ...
位运算基础及应用
计算机中的数据以二进制的形式存储,即0、1两种状态。位运算就是直接对整数在内存中的二进制位进行操作。本文将介绍位运算的各操作符以及常见应用。
操作符&(与)参加运算的两个数据,按二进制位进行与运算。(两位都为1时才为1,否则为0)
例如 12 和 5 两个数,二进制形式分别为 1100、0101. 逐个按位进行与运算得:0100 = 4. 即 12 & 5 = 4.
|(或)参加运算的两个数据,按二进制位进行或运算。(两位都为0时才为0,否则为1)
例如 12 和 5 两个数,二进制形式分别为 1100、0101. 逐个按位进行或运算得:1101 = 13. 即 12 | 5 = 13.
^(异或)参加运算的两个数据,按二进制位进行异或运算。(相同为0,不同为1)
例如 12 和 5 两个数,二进制形式分别为 1100、0101. 逐个按位进行异或运算得:1001 = 9. 即 12 ^ 5 = 9.
~(取反)参加运算的数据,其各二进制位进行取反运算。(0变成1,1变成0)
例如 5,对于一个 int16 型数据,它的二进制形式为 0 000 0000 0000 0 ...
链表连接出错
太久没接触数据结构了,导致链表这一块的内容有点生疏了,这两天在做一道链表相关的题时出现了一点问题,在此记录一下以免之后再犯。
问题描述题目链接两数相加
链表定义struct ListNode {
int val;
ListNode *next;
ListNode() : val(0), next(nullptr) {}
ListNode(int x) : val(x), next(nullptr) {}
ListNode(int x, ListNode *next) : val(x), next(next) {}
};
解题思路本题很常规,两链表相应位相加得到新链表对应位的值。首先要创建两个个空指针,一个作为新链表的头节点,指向两数相加结果的第一位;一个用以指向链表的子节点,并为其赋值两链表对应位的值相加的结果,最后返回头节点。
错误代码class Solution {
public:
ListNode* addTwoNumbers(Lis ...
ZIP格式分析
最近遇到一道CTF题是和zip格式编码相关的,正好我一直以来就对各文件格式编码没有一个系统的认知,就趁这个机会好好学习一下。
简介
ZIP文件格式是一种数据压缩和文档储存的文件格式,原名Deflate,发明者为菲尔·卡茨(Phil Katz),他于1989年1月公布了该格式的资料。ZIP通常使用后缀名“.zip”,它的MIME格式为application/zip。当前,ZIP格式属于几种主流的压缩格式之一,其竞争者包括RAR格式以及开放源码的7z格式。从性能上比较,RAR及7z格式较ZIP格式压缩率较高,而7-Zip由于提供了免费的压缩工具而逐渐在更多的领域得到应用。Microsoft从Windows ME操作系统开始内置对zip格式的支持,即使用户的计算机上没有安装解压缩软件,也能打开和制作zip格式的压缩文件,OS X和流行的Linux操作系统也对zip格式提供了类似的支持。因此如果在网络上传播和分发文件,zip格式往往是最常用的选择。
官方文档如果想要准确系统的了解整个zip格式,最好还是查看官方文档,链接如下:
.ZIP File Format Specification
格 ...
hexo博客的备份与恢复
为了防止误操作或计算机崩溃导致的博客源文件丢失,或满足我们更换电脑进行写作的需求,定期进行备份与恢复就显得很重要了。
备份需备份的文件目录我们在进行备份时,并不需要将整个博客目录全部备份,只备份以下几个用户自定义的即可:scaffolds目录,source目录,themes目录,.gitignore文件,_config.yml文件,package.json文件,其他都是通用的。
首先我们先来观察整个博客目录的结构:
.deploy_git 本目录会在我们部署时生成,也就是github上保存的文件,无需备份。
node_modules 本目录包含了hexo博客依赖的模块,安装时自动生成,无需备份。
public 与.deploy_git类似,是编译后生成的文件静态网页文件,无需备份。
scaffolds 保存了用户文章的模板,需要备份。
source 保存了用户文章的源文件,需要备份。
themes 保存了用户下载的主题文件与配置,需要备份。
.gitignore 保存了推送到github时忽略的文件名,需要备份。
_config ...
Crypto基础
密码学是研究编制密码和破译密码的技术科学,本文将主要介绍密码学中常见的几种加密方式的原理以及实际的应用,并以攻防世界新手练习区例题为例进行分析。
Base64
Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。Base64编码是从二进制到字符的过程,可用于在HTTP环境下传递较长的标识信息。采用Base64编码具有不可读性,需要解码后才能阅读。
加密原理Base64中的64表示64个可打印的字符(具体范围如下表所示),而要完全表示64个不同的字符至少需要6位二进制数(2^6=64),我们知道一个字符类型数据在计算机中占用1Byte的存储空间,而1Byte为8bit,即一个字符实际在计算机中存储的是一个8位二进制数。
Base64加密的实质是将每三个8bit字节转换为四个6bit字节(8*3=4*6),再在6bit字节的高位添0以补全为8位,最终转换为四个8bit字节,完成加密。例如:字符串s13,对应的ascii码为115 49 51,转换为二进制:01110011 00110001 0011001 ...
CSharp事件和委托
委托与事件在开发中的应用非常广泛,本文将简单介绍C#中委托和事件的定义、使用方法,以及它们之间的区别和联系。
委托C#中的委托(delegate)类似于C/C++中的函数指针,是一种存在对某个方法的引用的引用类型变量,所有的委托都派生自System.Delegate类。
委托的声明声明委托的语法如下:
delegate <return type> <delegate name> <parameter list>
比方说,我要声明一个无返回值,无参数的委托。
public delegate void MyDelegate();
在声明了委托类型后,必须将其实例化才能生效,可以使用new关键字创建并传入参数(参数为一个特定的方法名)。
MyDelegate myDelegate = new MyDelegate(Func1);
以上实例中我们实例化了一个带有Func1方法引用的MyDelegate类型变量,并将其赋值给了myDlegate实例。
委托的调用如果想让委托调用它所引用的方法,可以直接仿照方法调用的写法。
myDelegate();
多播委托其实一个委托类型的 ...