/UNO

Hooray! Card Game UNO!

Primary LanguageC++MIT LicenseMIT

简体中文 | English

UNO

没错!纸牌游戏 UNO

示例

三人对局

安装

下载可执行文件

前往 Releases 页面以下载构建好的可执行文件。

从源码构建

当然您也可以从源码构建。

准备工作

  • 确保 CMake 版本 >= 3.14

  • 确保编译器支持 C++17

    平台 构建
    Linux GCC 8.4.0
    Windows MSVC 19.28 (Visual Studio 16 2019)
    MacOS AppleClang 10.0.1

开始构建

克隆仓库并进行构建:

git clone git@github.com:Gusabary/UNO.git
cd UNO/script

# for linux and mac
chmod +x ./build.sh
./build.sh

# for windows
.\build.bat

构建完成后,uno 可执行文件会在 build/src 目录下。

(如果在构建过程中遇到有关 git 子模块的配置问题,可以参考该 issue

可选地,将 uno 可执行文件安装到 PATH 路径下:

make install

在构建的过程中,可以指定 CMake 的 BUILD_TESTENABLE_LOG 选项以构建测试和日志。

浏览 Wiki 以查看完整的构建选项信息。

快速开始

推荐使用 VSCode 的终端,其他大部分终端都会有类似闪烁的现象,比较影响游戏体验。

开始第一场对局

./uno -c 8.133.165.59:20020 -u username

其中,-c 参数为游戏的服务器地址,-u 参数为玩家的用户名。

8.133.165.59:20020 为预启动的一个游戏服务,该服务配置为两人对局并有一个电脑,即人机对战。如果该服务已被占用,玩家可以尝试连接 20021 ~ 20024 中的任意端口。

浏览 Wiki 以查看更多关于启动参数配置预启动游戏服务的信息。

进入游戏后界面如下所示:

按照提示文字所显示的,按下 ,. 键以移动光标,按下回车键以打出光标目前所指的手牌,按下空格键以跳过出牌(即摸牌,除非前一个玩家打出 Skip 牌则可以不摸)

浏览 Wiki 以查看完整的 UI 及操作方式的介绍,以及可能和您玩过的 UNO 稍有不同的游戏规则

启动自己的游戏服务

./uno -l 9091

其中,-l 参数为游戏服务所在的端口。

启动以后,玩家可以通过 ./uno -c localhost:9091 进行连接。如果游戏服务所在的机器有公网 IP(例如 x.y.z.w),别的玩家可以通过 ./uno -c x.y.z.w:9091 进行连接。(如果网络连接失败,建议先检查防火墙、安全组、端口映射等网络配置,确保服务已暴露出去)

可选地,通过 -n 参数指定该对局的玩家人数(默认为 3 人)。

待实现

  • 改善关于网络连接的玩家体验
  • 游戏内中文支持
  • 更完善的 Windows 支持
  • 完善 UNO 规则细节
  • 配置键盘映射方式
  • 寻找合适的 Unicode 字符以表示 Reverse 和 Skip 牌
  • 个性化 banner

浏览 Wiki 以查看待实现功能的具体需求

寻求帮助!

杂感

这个小玩意儿断断续续差不多写了大半个学期,本意是想以实践的方式学习 Asio 网络库和现代 C++ 的一些语言特性,游戏本身只是一个载体,所以不管是在对 UNO 规则的完整支持还是玩家的体验上,仍然有不少的缺憾。但是通过这小几千行代码,我的的确确精进了不少对于现代 C++ 的理解和运用,包括智能指针、右值引用、Lambda 表达式以及并发。我也在尝试使用 C++17 的一些语法特性,比如结构化绑定、编译期 if、std::optional 等等等等,不过也并非所有地方都使用得恰到好处,有些写法就难免有矫揉造作之嫌。

总之,第一阶段的工作已经告一段落,目前的成果离我最开始的设想与预期也没有很大的偏差。如果您有兴趣和时间,欢迎与我们一起将这个小玩意儿变得更好;如果没有也没关系,叫上朋友们一起来一局紧张刺激的线上 UNO 吧!

使用许可

MIT