第二十三章《斗地主游戏》第1节:斗地主项目简介

斗地主游戏是一款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类都设置虚拟机运行参数,因为它们所启动的线程都会执行反射相关代码。

除阅读文章外,各位小伙伴还可以点击这里观看我在本站的视频课程学习Java!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

穆哥讲Java

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值