斗地主游戏是一款3人参与的棋牌游戏,3方用一副牌(54张)展开游戏,其中一方为地主,其余两家为另一方,双方对战,先出完牌的一方获胜。用计算机程序实现的斗地主程序需要3个客户端,每个客户端都代表一个玩家,3个玩家聚齐后系统自动进入游戏进行状态。
23.1.1斗地主游戏界面
斗地主游戏有两个界面,一个是玩家登录界面,另一个是斗地主游戏主界面,玩家登录界面如图23-1所示。
图23-1玩家登录界面
真实的斗地主游戏玩家在登录时需要输入用户名和密码,本项目案例为简化这个过程,玩家在登录时只需要输入用户名即可,无需输入密码,这个用户名实际上就是玩家的昵称。斗地主游戏主界面如图23-2所示。
图23-2斗地主游戏主界面
需要向读者说明:图23-2所示的界面有一张固定的游戏背景,任何一个玩家看到的背景都是相同的,但所看到的牌面和各种操作按钮是不同的。如果轮到己方出牌,则界面上才会显示出“出牌”或“不出”的操作按钮。此外,由于每个玩家都看到相同的背景,所以游戏中玩家的“上家”在左边、“下家”在右边,玩家根据提示信息出现的位置就能判断出谁是地主以及哪一个玩家做出了什么样的操作。例如在图23-2中,左上方出现“地主”标签,说明玩家的上家是地主,而右上方出现“不出”标签,则说明玩家的下家在本轮出牌过程中选择了“不出”。
23.1.2项目结构简介
斗地主游戏的工程项目可以分为以下几部分:
- 程序源代码
- 第三方jar文件
- 资源文件
斗地主游戏的源代码比前面两章所介绍的实战项目所涉及的类更多,每个类的作用和意义也各不相同,因此为了代码结构能更加清晰,本项目把类分成了多个包。源代码首先分为两个大包分别是client包和server包。从包的名称不难看出:client包用来存放客户端程序相关的类,而server包用来存放服务器程序相关的类。
client包又分为4个子包,它们分别是:model包,它用来存放表示实体的类、thread包,它用来存放表示线程的类、util包,用来存放工具类,view包,用来存放窗体界面的类以及启动窗体的类。而server包没有继续划分子包,这是因为server包下仅有两个类。下面的表23-1展示了各个类所在的包以及它们的意义和作用。
表23-1 斗地主项目所有类
所在包 | 类名称 | 意义 |
client.model | Message | 消息类 |
client.model | Player | 玩家类 |
client.model | Poker | 扑克类 |
client.model | PokerLabel | 扑克标签类 |
client.thread | ChuPaiThread | 完成出牌的线程 |
client.thread | CountThread | 计时器线程 |
client.thread | ReceiveThread | 接收消息线程 |
client.thread | SendThread | 发送消息的线程 |
client.util | GameUtil | 移动扑克的类 |
client.util | PokerRule | 游戏规则类 |
client.util | PokerType | 牌型(枚举) |
client.view | LoginFrame | 玩家登录窗体 |
client.view | MainFrame | 游戏主界面窗体 |
client.view | MyPanel | 游戏主界面面板 |
client.view | Main | 启动玩家登录窗体的类,包含main()方法 |
server | MainServer | 游戏服务器类 |
server | Main | 启动游戏服务器的类 |
游戏中,每当玩家出一次牌都要向服务器传递消息,系统采用JSON格式传递消息,JSON格式很简单,它把一个实体的各项属性与值以键值对的组合,键与值以冒号连接,而多个键值对由逗号隔开,最外围用一对大括号表示这些键值对属于同一个实体。例如有一个Person类,其定义如下:
class Person{
String name;//姓名
String sex;//性别
int age;//年龄
}
从以上代码可以看出:Person类有3个属性,分别是表示姓名的name,表示性别的sex和表示年龄的age。如果一个Person对象被设置为姓名张三,性别男,年龄20,那么如果以JSON格式的字符串来表示它就是:
{ "name":"张三","sex":"男","age":20 }
需要提醒各位读者,如果一个实体的属性是数字类型,属性值不需要加双引号。为把一个实体转换成JSON格式的字符串,本项目借助第三方工具包fastjson-1.2.79.jar实现,本书的代码文件夹中会提供这个jar文件,读者需要把它加入到项目的CLASSPATH中。
斗地主游戏需要用到大量图片,例如游戏主界面的背景图等,这些图片保存在images文件夹中,为正确读取这些图片文件,读者需要把这个文件夹放在项目文件夹的根目录下。
23.1.3配置虚拟机参数
由于fastjson-1.2.79.jar文件中所包含的代码在运行时需要用到反射机制读取对象信息,而从JDK1.8之后,Java官方的虚拟机产品对反射相关操作做了一些限制,因此需要对虚拟机运行时参数进行设置才能正确运行程序,具体设置过程如下:打开“菜单”,选择“Edit Configurations”菜单项,在弹出的对话框中单击“Modify options”,之后在弹出的菜单中单击“Add VM options”,如图23-3所示。
图23-3配置虚拟机运行时参数
单击“Add VM options”选项后会出现一个文本框,在文本框中加入以下配置参数:
--add-opens java.base/java.net=ALL-UNNAMED
--add-opens java.base/sun.net.util=ALL-UNNAMED
这两行参数同时写在单行文本框中时需要用空格隔开。此外需要提醒各位读者,启动游戏服务器和游戏客户端的类都叫Main,读者需要对两个Main类都设置虚拟机运行参数,因为它们所启动的线程都会执行反射相关代码。
本文字版教程还配有更详细的视频讲解,小伙伴们可以点击这里观看。
标签:第二十三章,界面,游戏,斗地主,简介,23,玩家,client From: https://blog.51cto.com/mugexuetang/5991341