Java网上五子棋游戏设计
更新时间:2023-08-27 17:00:01 阅读量: 教育文库 文档下载
Java网上五子棋游戏设计
Java网上五子棋游戏设计
傅伟,吴希忠
来源:http://www.77cn.com.cn
一 课程选题背景
在修WEB高级开发与应用技术课程之前,我对于java语言了解甚少。所以想通过这次课程的机会,深入系统的学习一下这门语言,同时,学习关系web开发的基础知识。所以我先从语言入手,用java编写了这个网上五子棋游戏,作为我们的课程论文。
二 目标
Java的广泛流行是与它所编写的程序可以在网络上运行且可以跨平台。事实上,支持Java的浏览器内置Java虚拟机,使得Java的小程序能够在网络上完全地传送和运行。这样使得程序人员即使不具备有关的网络知识,也能编写出高质量的网络通信程序。“网上五子棋游戏”便是其最好的例子。
本程序是一个基于网络协议为TCP/IP的网上对弈游戏,采用服务器-客户端的网络架构模式,允许网络上的多台机器(可能是两台机器)同时运行,一台用作服务器,始终处理网络上要求它进行服务的请求。如果有机器请求与它进行连接,用作服务器的机器接受之后就可以进行相互之间的通信。
通过本程序,我们初步熟悉并掌握java语言的基本知识,掌握服务器-客户端的网络架构模式,为以后学习高级web开发课程做准备。
三 总体构架
我们通过使用套接字SOCKET来实现游戏之间的通讯,它是基于点对点的通讯,开始让服务器初始化建立服务器套接字SOCKET,基于某个端口PORT,然后打开客户端套接字SOCKET,连接到服务器端的地址ADDRESS和端口PORT,在这之间可能发生异常EXCEPTION。
“网络五子棋”是由服务器端和客户端组成的。游戏分为黑方与白方,只要其中一方的棋子形成“五子连珠”之势,即可获胜。
Java网上五子棋游戏设计
网络五子棋游戏服务器端主要有三个类:OmokServer类、Omok_ Thread类(线程类)和BManager类(消息广播者)。它的主要功能是连接客户端,使多个客户端连接在一起,最终实现联网。
图表 1 服务器端
Java网上五子棋游戏设计
网络五子棋游戏客户端主要是实现五子棋的界面和功能的程序,我们可以通过服务器端连接多个客户端实现最终游戏的目的。
图表2 客户端
四 技术要点
一.创建待机室
该游戏创建了待机室,供其他未处于下棋状态的人们使用,也可以创建另一个房间,供下棋的两个人使用。
我们可以通过标记号码来区分待机室与下棋室。即用0标记待机室,其他房间使用0以上的自然数来标记。事实上,我们并不时真正创建了房间,而只是将房间号码赋予了客户机而已。以此,我们可以实现拥有相同号码的客户机彼此间可以相互通信。
例如,客户机向服务器提出进入某个房间的请求后,服务器必须确认所请求的房间是否允许它进入,然后,发送相应的请求给客户机。对于消息,我们可以采用“[消息类型]+内容”的形式。假若客户机想进入20号房间,那么,它需要向服务器发送消息“[ROOM]20”.如果第20号房间允许进入,那么,服务器在进行了某些处理后会向客户机传送消息“[ROOM]20”。相反,若20号房间禁止入内,则服务器将向客户机发送“[NULL]”消息。
Java网上五子棋游戏设计
客户机请求:[ROOM]20
服务器的应答:[ROOM]20,或[NULL]
又例如,假设两个玩家同时进入某个房间,要进行对弈。首先,一名玩家点击开始按钮,向服务器发送“[STAERT]”消息,另一名玩家也向服务器发送了“[STAERT]”消息,然后服务器将会认为这两名玩家要进行对弈,它会随时向玩家指派棋子,并分别向玩家发送“[COLOR]BLACK”与“[CLOR]WHITE”消息。
客户机1的请求:“[STAERT]”
客户机2的请求:“[STAERT]”
服务器的应答:[COLOR]BLACK”与“[CLOR]WHITE
二.服务器端
网络五子棋游戏服务器端主要有三个类:OmokServer类、Omok_ Thread类(线程类)和BManager类(消息广播者)。
OmokServer类在受到客户机的连接请求后,将创建新的套接字,并使其与客户机连接,然后启动线程,并将线程添加至BManager对象中。
Private BManager bMan=new BManager(); //消息广播者对象 ...........
While(true){
Socket socket=server.accept(); //获取套接字
Omok_Thread ot=new Omok_Thread(socket); //创建线程
ot.start(); //启动线程
bMan.add(ot); //添加线程
...........
}
Java网上五子棋游戏设计
Omok_Thread对象不仅可以获取套接字、输入输出流,而且它还提供了有关客户机的消息。例如客户机的姓名、房间号、游戏开始与否等。这是因为我们需要确定消息的来源及主要在某个房间传播的消息。并且,消息广播者也需要参照线程对象的房间号,以便将消息发送至某个房间中。
BManager类继承了Vector类,它的元素为Omok_ Thread线程对象,这样才能自由地参照Omok_ Threadd对象的房间号及玩家的名字等。为了实现向指定的房间发送消息,需要比较Bmanager各元素的房间号和给定的房间号,若两者相同,则向此房间发送消息。
SendToRoom()方法用于向指定的房间(roomnum)发送消息(msg),代码如下。
void sendToRoom(int roomNum,String msg){
for(int i=0;i<size();i++){
if(roomNum==第i个线程的房间号) //向第i个线程连接的客户机发送消息 }
}
}
SendToOthers()方法用于向同房间的其他用户发送消息(msg)这个方法与SendToRoom()一样,将使用for循环检查元素(线程)的房间号。但是,并不会与ot连接的客户机发送消息。
void sendToOthers(Omok_Thread ot,String msg){
for(int i=0;i<size();i++){
if(第i个线程的房间号==ot的房间号&&第i个线程!=ot){
}
}
}
sendToRoom()与sendToOthers()方法的不足之处在于,房间越多,它们就会增重
Java网上五子棋游戏设计
服务器的负担,消息的传播将变得十分缓慢。
三. 客户端
首先要实现五子棋盘(OmokBoard类)。五子棋盘继承了画布类,它内嵌于框架窗口中,拥有15*15(255)个方格。为了响应用户的下棋动作,五子棋盘必须能够响应鼠标事件。并且它必须拥有输出流,用以向对手传递棋手的下棋信息。程序中也有多种方法用来实现绘图操作。然而,程序中最重要的部分时如何决定胜负。横,竖或者对角线方向上拥有五颗同样的棋子时,即为胜利。
请看图表3。假设五个黑子从左向右分别标记为1、2、3、4、5,那么我们可以先放置1、2、3、4棋子,如果黑方最后一颗棋子5号棋放在如图所示的位置,则黑方在横向上五子连珠,黑方胜。这个过程如何用程序实现呢?在放5号棋子后,首先程序要计算出他左边连在一起的黑色棋子的个数。其左边已放有2号与1号棋子,且这两颗棋子连在一起,所以5号棋子左边相连的黑色棋子有两颗。然后,再计算5号棋子右边连在一起的黑色棋子的个数。如图,5号棋子右边有3号。4号两颗棋子。因此,5号棋子左边、右边及5号棋子合起来共5颗黑色棋子,黑方获胜。当然在竖直方向与对角线方向上也采取相同的方法进行检查。
图表 3
Map是一个二元数组,用于保存棋子的位置。如果在(2,3)位置上有一颗黑色棋子,则向数组元素map[2][3]赋入常数BLACK(=1);则将WHITE(=-1)值代入。并且,如果某个五子棋盘左上端坐标就变为(1,1),而非(0,0)。
为了计算方便,我这里将map的大小定义为17*17,而并非是先前的15*15。因此,五子棋盘左上就坐标就变为(1,1),而非(0,0)
Java网上五子棋游戏设计
count()方法用来查找并计算连在一起的棋子的个数。P为基准坐标,dx、dy分别为表示横向于竖向的变量。col代表棋子颜色。弱dx为-1,dy为0,则计算左边连续棋子的个数;若dx为1,dy为1,则计算左下到右上连续棋子的个数。dx与dy只取-1、0、1三个值之一。下面是count()方法的代码。
Private int count(Point p,int dx,int dy,int col)
{
int i=0;
for(;map[p.x+(i+1)*dx][p.y+(i+1)*dy]==col;i++)
{}
return i;
}
check()方法会调用count()方法,用来判断是否五子连珠。其代码如下。 Private Boolean check(point p,int cool)
{
if(count(p,1,0,col)+count(p,-1,0,col)==4) // 横向检查
return true;
if(count(p,0,1col)+count(p,0,-1,col)==4) // 竖向检查
return true;
if(count(p,-1,-1,col)+count(p,1,1col)==4) // 对角线方向检查
return true;
if(count(p,1,-1,col)+count(p,-1,1,col)==4) // 对角线方向检查
return true; }
若用户将color颜色的棋子放在(x,y)位置上,程序将会进行如下检查。如果获胜,则向服务器发送“[WIN]”消息。同时,服务器也会向其对手发送“[LOSE]”消息。
Map[x][y]=color;
If(check(new Point(x,y),color))
{writer.println(“[WIN]”);
Java网上五子棋游戏设计
}
五 成果与测试
假设OmokServer.java与 OmokClient.java都存放在C盘根目录下,那么我们可以根据以下步骤运行及测试游戏。
1、在DOS窗口中输入 C:\javac OmokServer.java 运行服务器端。
2、在DOS窗口中输入 C:\javac OmokClient.java 运行第一个客户端。
3、在DOS窗口中再次输入 C:\javac OmokClient.java 运行第二个客户端。
4、在第一个客户端输入有效的姓名后,点击“去待机室”进入等待状态。
5、第二个客户端输入有效的姓名后,点击“去待机室”也进入等待状态。
此时我们可以在待机室中分别看到这两个客户的名字,在等待两名客户分别输入房间号后,他们就可以进入该房间。如果这两个用户输入的房间号相同,那么他们就可以分别点击“开始对决”正式进入游戏状态。当一名用户输掉比赛或者认输后,用户可以点击“弃权”键结束游戏,此时用户可以自由选择重新开始或者再次进入待机室。(图表4)
图表 4
Java网上五子棋游戏设计
在游戏的过程中我们要测试程序是否能够真正达到五子棋的标准,那么我们就要根据下面的五子棋规则进行参照(图表5)。
五子棋规则:
1. 五子棋专用盘为 15条横线×15条坚线组成,交叉的每个点都可以行棋。
2. 游戏分黑白两方,每局由规定黑方先行。黑方玩家移动鼠标在棋盘中点击
行棋。
3. 当黑方行棋完毕,转由白方行棋。游戏结束后黑白方互换颜色。
4. 禁手是对局中被判为负的行棋手段。白棋无禁手。
胜负判定:
某一方玩家最先在棋盘上形成横、竖、斜连成五连或长连。将获得胜利。
图表 5
和局判定:
1. 对局双方一致同意和棋。
2. 全盘已下满,无空白交叉点。
经过我的测试后,程序能够正常运行,并无任何错误
正在阅读:
Java网上五子棋游戏设计08-27
智能电网欧洲标准08-12
苏教版小学二年级语文下册《23.会走路的树》教学设计03-03
何凯文三十年高频373真题例句!09-18
(省厅)关于举办第五十五~五十九期全省村镇规划建设管理人员培03-10
第3节 原生动物与微型后生动物04-22
教育学原理复习题选择题汇编04-16
外研版英语必修四单词打印版12-31
ACTARIS SL7000 Operation manual06-28
突然很想你02-14
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 五子棋
- 设计
- 网上
- 游戏
- Java
- 中小学心理健康教育C证论文
- 06-10司法考试国际经济法真题
- 餐饮行业信息化项目计划
- 图形学c语言sdf
- 2.2承担对社会的责任
- 2019-2020年最新部编本人教版小学三年级语文下册10纸的发明教案含教学反思【表格版】
- Taming the Anger Monster
- 2018年中国工艺陶瓷市场分析报告-行业深度调研与发展趋势预测(目录)
- 吊车司机安全培训考试试题
- 《台历、挂历的设计》教案
- 苏珊米勒2015年10月双子座运势
- 软件限制策略的简单应用应用简单策略限制软件运行所有
- 室内设计基础图画法
- 泰达宏利价值优化型稳定类行业证券投资基金2010年第2季度报告2010年06月30日
- 匀变速直线运动专项练习题.doc
- 验收测试报告模板
- 五年级列方程应用题100道
- (Web编程基础知识)第4章 页面设计
- 炼钢生产线工艺流程图
- Apriori算法在足球技战术分析中的应用