Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/luozero-world/arithcard

算数卡牌对战游戏,CS模式
https://github.com/luozero-world/arithcard

javafx netty

Last synced: 5 days ago
JSON representation

算数卡牌对战游戏,CS模式

Awesome Lists containing this project

README

        

# ArithCard

### 项目背景

大三协议设计原理,课程设计作业

Netty+JavaFX

### 项目介绍

> 自定义了一套卡牌对战规则,规则如下:

- **牌型**

数字牌:`1`、`2`、`3`…`13`,每张牌各**六张**

运算牌:`+`**八张**,`-`**四张**;`*`**八张**,`/`、`%`**两张**;`&`、`|`、`^`**三张**;`<<`、`>>`**两张**

- **玩法**

凑24点:将手牌分为数字牌(1-13),和运算牌,利用现有牌进行运算获得新的点数(超过24自动取余),当得到24点时便可以**攻击/防御。**

pvp:回合制游戏,每轮结束后对玩家状态进行运算,决定玩家扣除的血量;另外设置伤害制造器,固定回合对玩家造成部分伤害;直至一方玩家血量为0,游戏结束。

> 自定义协议

![image](https://github.com/LuoZero-World/ArithCard/assets/99077678/ef2f01ea-261a-4120-91c4-cbbe9332d1ff)

还有勉勉强强的卡牌UI,在`src/main/img`路径下就可以看到

### 部署

**服务端**

先把服务端拉起来:启动类路径:`com.llq.server.CardServer`

默认服务器IP:127.0.0.1 端口18000

然后拉客户端

**客户端**

启动类路径:`com.llq.client.CardClientStartUp`

目前**只能登陆**,不能注册,其中账号信息以`Map`形式存储于内存中,其在项目中的位置`com.llq.server.service.UserService`

客户端登录,进入游戏大厅:可创建对局,或加入现有对局(用JavaFX写的界面就这么样了,美化界面太搞了...orz)

1697032199588

1697032220669

### 亮点
以下功能均为本人自认为还不错的实现,学生视角~
- **断线保护**

当有玩家断线时,服务器识别并为之分配一个机器人线程接管断线玩家继续对局;若双方都断线则游戏结束

- **多线程**

UI线程和Netty监听线程隔离管理

- **网络间传递任务**

通常网络间的任务传递使用`Runnable`实现,但我在项目中采用`获取-反射执行`的方式,每个消息都有`executeIt`方法,里面表示获取该消息后应该执行的操作
具体细节见`com.llq.message.MessageService`中的`execMessage方法`

- **消息有序**

虽然传输层使用了TCP,但因为Netty多线程的原因,应用层发送的消息仍然可能乱序
所以我直接将需要发送的消息收集为`List`,然后一起发送

- **策略模式**

序列化有两种策略可以选择:Java原生序列化和Json序列化(Gson)

- **单例模式**

`enum`实现单例

### 未来计划
1. 实时显示剩余牌数量
2. 加入后端,springboot+mysql+MybatisPlus
3. 完善出牌机器人的策略
4. 观战功能

### 联系
QQ:1276602269