俄罗斯方蟹(Crabtris)

俄罗斯方蟹 = Crab(蟹)+ Tetris(俄罗斯方块),是一个用C语言实现的俄罗斯方块游戏,只能在终端横着走。 GitHub: https://github.com/wsgggws/Crabtris 游戏截图 设计说明 该蟹身长 22 坐标点,宽 10 坐标点。 方块向右前进,可上下移动与旋转。 没有开始选项。 没有暂停选择。 结束只能Ctrl+c。 能消列,但不计分数,只看能玩多久 蟹如人生呀,戏T! 实现说明 用一个二维数组表示俄罗斯地图,可视的只有22,另外3行隐藏,以便随机产生新的方块。 (0,0)--------------->x(WIDTH) | | . | |y(HIGHT) 地图元素有哪些组成。 固定的方块 移动的方块 加锚点的空气 边界 方块用4个坐标点表示,可以列出有7种方块。不同的元素输出不同的字符。 如何出现动画? 每秒都从终端的坐标点(0,0)开始输出,每秒输出的内容不一样,就形成了动画。这需要使用到termios 库。 如何监听键盘输入 需要设置终端以非阻塞读取输入,根据输入重新生成地图,即改变二维数组里每个元素的值。并重新从(0,0)输出。 每秒向右移动如何实现 每个坐标点的X坐标加一操作,赋值给一个临时方块保存。 地图里旧的坐标点都设置为空气,地图里临时保存方块的坐标设置为移动方块。 向上下左右移动类似。但都需要在移动前检查移动位置的有效性(是否超越了地图,新位置是否已经有固定了的方块。 向上平移效果 在向上下平衡时,需要设置加一个缓冲等待时间(默认是每次等待一秒刷新地图的),以实现平移效果,而不是平移加向右的别扭效果。 如何清行 在每次移动的方块变成固定的方块后,尝试清行,即检查每一列是否都为固定的方块。如发现可消的列,前面所有的列往后移动,并继续从该列开始检查,可只检查4次,毕竟一次操作最多只能消除4列,当然,为了函数简便,我检查了所有列。 如何计分 不计分,游戏开始时有个开始时间,当游戏结束时,两时间相减,即为你能玩的时间,也可以说是你浪费的时间。 如何结束游戏 不会检查固定的列是否到达了顶点,它会一直产生新的方块,永无止境。按ctrl+c通过信号强制结束程序。 游戏结束之后做什么 从游戏本身来说,它需要恢复原生的 terminal 运行环境。对于玩者来说:“这算什么蟹T游戏”

October 16, 2023 · 1 min · 54 words · Navy

MacOS Tools

以下是我常使用的 MacOS 工具(App),我并会对部分 App 进行说明,希望能在效率上帮助到你。 如果你有好的工具推荐,欢迎留言。 常用工具 软件 作用 Homebrew 软件包管理 Chrome 搜索与网页浏览 Raycast 效率神器 iTerm2 终端 Karabiner 改键 Neovim 文本编辑 Notion 笔记 Sublime Text 文本编辑器 Keycastr 按键回显 Postman Web API 请求 LICEcap 录制 Gif AppCleaner 软件卸载 Dictionary 字典 Snipaste 截图 Zoom 视频会议 Omi 视频录制 IINA 视频播放 NeteaseMusit 音乐播放 KeepingYouAwake 防锁屏 ClashX 科学上网 fzf 模糊搜索文件 bat cat 替代者 AltTab 切换窗口 Hidden Bar 隐藏菜单栏 mitmproxy 抓包工具 Thor Launcher 快捷键直接打开App KeyboardHolder 设置App初始输入法 Homebrew 目前使用的是 MacBook M2,绝大部分软件通过 HomeBrew 安装。并可备份与复原...

March 17, 2023 · 1 min · 170 words · Navy

XPath 使用与技巧

XPath(XML/HTML Path Language)通过“路径表达式” 在 XML/HTML 中选择节点。 什么是路径表达式? 由节点,限定符构成的能选择节点集合的表达式。 节点 标签节点 (XML/HTML 标签,如 div, tr, td 等) 文本节点, (一般在最后最底层,字符串类型了,如属性 @class,文本 text(), 注释 comment()) 特殊节点(如 . 表示当前节点,.. 表示父节点) 限定符 // # 限定范围为所有后代节点 / # 限定范围为子节点 [] # 限定范围为当前节点 Axe:: # 限定范围为轴相邻节点,如兄弟,最近的祖先,最近的子孙等 使用方式 Chrome Elements Chrome Console Scrapy shell 案例 //ul/li/a # 所有 ul 节点,下一节点为 li,且 li 下一节点为 a 的 a 标签节点集合 //button/text()[.=‘Submit’] # 所有 button 节点, 下一节点为 text() 结点,且该结点的内容为 'Submit' 的 文本节点集合 //a[@id=“abc”][@for=“xyz”] # 所有 a 节点,且该节点的 id 属性结点内容为 abc, 且该节点的 for 属性结点内容为 xyz 的 a 标签集合 # 使用 [][] 进行了多重且限定,与 //a[@id="abc" and @for="xyz"] 等价 //a[@name or @href] # 所有 a 节点,且该节点有 name 属性结点或者有 href 属性结点的 a 标签结点集合 # 使用 or 进行了多重或限定 //a[starts-with(@href, “/”)] # 所有 a 节点,且该节点的 href 属性以 / 开头的 a 标签集合, # //a[starts-with(....

March 16, 2023 · 2 min · 346 words · Navy

How To Build This Website

Depoly this website to GitHub page by Hugo Prequiments Hugo Git GitHub brew install git brew install hugo Create new site by Hugo hugo new site wsgggws.github.io cd wsgggws.github.io git config --global init.defaultBranch main git init Install theme PaperMod git submodule add --depth=1 https://github.com/adityatelange/hugo-PaperMod.git themes/PaperMod git submodule update --init --recursive # needed when you reclone your repo (submodules may not get cloned automatically) Edit config.yaml Noted I set profileMode as true...

March 12, 2023 · 2 min · 238 words · Navy