实验项目内容
1、实现俄罗斯方块的基本游戏逻辑。
2、利用Socket编写服务器端和客户端程序。
3、实现俄罗斯方块的联网对战功能。
4、实现计分、音效等辅助功能。
本文联网对战是指在本地运行两个程序,一个做server一个做client进行通信。
本程序Client部分 new Socket时默认host为localhost,如需远程联机,只需将localhost改为server处的ip即可。
这是本人初次MVC的练习,关于俄罗斯方块的控制代码借鉴了网上的一些资料,不足之处尽请谅解。
注:本程序存在一个偶尔会发生的方块堆积到顶端时无法停止游戏的bug,原因未知。。
根据不同功能我们主要将程序分为4个模块,分别用于界面显示(view)、逻辑处理(model)、用户交互(Controller)、通信(MySocket).
其中,model包中包含了GameDao以及MusicPlayer这两个类。MusicPlayer主要负责设置游戏中的音效,包括背景音乐以及按键音效。而GameDao则负责整个游戏过程中碰撞检测、行的消除、分数与等级计算等。
MySocket包中的类则是负责实现联网对战的通信,包含了Client,Server以及ExchangeThread这三个类。 Server为服务器端,用于新建一个IP地址,即在游戏中可以“创建房间”,而Client为客户端,用于连接服务器已创建的IP,即在游戏中可“进入房间”。ExchangeThread是一个用于进程之间通信的线程,既可以读取消息,也可以写入消息。在对战中,采用此线程用户可将自己当前的对战情况写入,供对方读取,同样也可以读取对方发送的信息,以此来实现联网对战。
View包中的类则主要负责游戏的界面显示,包括游戏的启动界面(LauncherJPanel)、单机模式界面(OfflinePanel)以及对战模式的界面(OnlinePanel),以及控制整个游戏运行的界面(MainFrame)这四个类。而显示界面所需的控件如背景图、方块、文本框等则是由包entity中的MyButton,Rect,LabelWithBG,GameWindow以及BackGround这些类来实现。
Controller包中的类实现了根据用户操作来控制游戏进程。KeyController可以相应的用户的按键操作,根据用户按键来控制方块移动变形等操作。RemoteController则相应对战方用户操作以显示对战方当前战况,GameController则是游戏整体的控制器,如命令方块移动、游戏暂停开始等一系列操作。
图1. 启动界面
点击单人模式可以进入单人游戏,运行效果如下:
图2. 单机版游戏界面
游戏通过上下左右再加上空格和A键进行操控。其中空格为暂停游戏,A键为恢复游戏。随着得分的提升,游戏等级也会随之提升,从而加快游戏速度,增加难度。
右上方为音乐开关,可以点击自由的开闭音乐,下图为关闭音乐后的效果图。
图3. 音乐开关效果演示
(3) 对战模式
要双人对战,那么首先需要创建一个游戏房间。点击“创建房间”按钮后,输入一个10000-50000之间的数字,作为房间号(使用这个端口,如果端口已经被占用,那么游戏会创建失败),如下图所示:
图4. 创建房间
点击确定时候,可以在控制台看到:,此时程序阻塞等待客户端接入。
另在再启动一个程序模拟另一名玩家,选择进入房间并输入12345(与上面创建的房间号一样即可),并点击确定。此时可以看到,控制台处显示连接成功,并且游戏窗口变为双人模式的界面,如图:
图6. 双人对战模式游戏界面
对战模式中,每位玩家自己操控左侧界面,而对方玩家实时操作及得分将会显示在右侧界面中。
源码下载