16Java开发实例网络五子棋游戏.docx
- 文档编号:17708170
- 上传时间:2023-08-03
- 格式:DOCX
- 页数:39
- 大小:740.01KB
16Java开发实例网络五子棋游戏.docx
《16Java开发实例网络五子棋游戏.docx》由会员分享,可在线阅读,更多相关《16Java开发实例网络五子棋游戏.docx(39页珍藏版)》请在冰点文库上搜索。
16Java开发实例网络五子棋游戏
16章Java开发实例——网络五子棋游戏
使用Eclipse集成开发工具可以方便地开发Java应用程序,本节就以一个综合实例对前面章节学过的内容进行总结与提升。
读完本章后,读者能够清楚地知道使用Eclipse开发Java应用程序的完整流程。
JavaSocket编程基础
由于本章采用的实例需要用到Java的Socket类实现网络通信,首先来介绍一下JavaSocket编程的基础知识,以便读者能够相对轻松地阅读后面的章节。
16.1.1Socket简介
Socket通常称为“套接字”,它是一个封装了IP地址和端口通信链的句柄,应用程序通常通过“套接字”向网络发出请求或者应答网络请求。
Socket可以视为两个程序进行的通信连接的端点,一个程序将信息写入Socket中,该Socket将信息发送到对方Socket中,通信另一方的应用程序通过读取Socket来获取相应得信息。
Socket的通信过程如图16-1所示。
由图16-1可以看到,Socket通信的过程如下。
(1)主机A上的程序A将一段信息写入Socket中,Socket的内容被主机A的网络管理软件访问后通过主机A的网络接口卡发送到主机B。
(2)主机B的网络接口卡将接收到的信息传送给主机B的网络管理软件,网络管理软件将这段信息保存在主机B的Socket中,然后程序B在自己的Socket中阅读这段信息。
16.1.2JavaSocket的基本类
网络编程的基本模型是客户机/服务器模型,即通常所说的C/S结构。
JavaSDK提供一些API类来完成客户机Socket和服务器Socket的构建与通信,这些类存在于包中。
常用的类有Socket和ServerSocket类。
(1)Socket类。
当客户程序需要与服务器程序通信的时候,客户程序要在客户机创建一个Socket对象。
Socket类常用的构造函数是Socket(Stringhost,intport),它创建一个基于Socket的连接服务器流套接字的客户流套接字。
如果创建了一个Socket对象,它可以通过调用Socket的getInputStream()方法从服务程序获得输入流传送来的信息,也可以通过调用Socket的getOutputStream()方法获得输出流,来发送消息。
在读写活动完成之后,客户程序必须调用close()方法关闭流和流套接字。
(2)ServerSocket类。
服务器端有一个专门的ServerSocket对象,ServerSocket有几个构造函数,最简单的是ServerSocket(intport)。
服务首先构造一个ServerSocket对象(port参数传递的端口号就是服务器监听连接请求的口),创建完成后就开始准备接收连接请求。
接下来服务程序进入循环,循环从调用ServerSocket的accept()方法开始(accept()方法将导致调用线程阻塞直到连接建立),建立连接后accept()返回一个绑定了客户程序的IP地址或端口号的Socket对象。
由于存在单个服务程序与多个客户程序通信的可能,解决方法是服务器主机运行一个处理服务程序和客户程序的通信后台线程。
网络五子棋程序的代码结构详解
本实例是一个简单的网络五子棋程序。
程序由两个部分组成:
一部分为服务器,另一部分为五子棋客户。
其中服务器以消息方式完成客户的管理,客户支持对弈和聊天。
实例源代码由、和3个包组成。
注意详细注释都写在代码中。
16.2.1
此包主要包含与游戏客户界面有关的一些类文件,如chessPad、chatPad、controlPad和inputPad等。
下面分别介绍这几个文件。
1.chatPad
chatPad类是一个用户界面组件,其本身是一个具有带有滚动条的文本域的Panel,用户的聊天信息和命令的执行结果都将在此文本域上显示。
chatPad的实现代码如实例16-1所示。
【实例16-1】chatPad()
package
import
import
import
/**
*@authorwufenghanren
*聊天信息Panel。
Panel上的文本域可以显示用户聊天信息
*/
publicclasschatPadextendsPanel{
publicTextAreachatLineArea=newTextArea("",18,30,
;
publicchatPad(){
setLayout(newBorderLayout());
add(chatLineArea,;
}
}
2.userPad
chatPad类也是一个用户界面组件,它是一个带有列表框的Panel,所有的用户名都将显示在列表中。
userPad的实现代码如实例16-2所示。
【实例16-2】userPad()
package
import.*;
/**
*@authorwufenghanren
*用户列表Panel。
此Panel维护一个服务器的当前用户列表
*所有的用户名都将显示在列表中
*/
publicclassuserPadextendsPanel{
publicListuserList=newList(10);
publicuserPad(){
setLayout(newBorderLayout());
for(inti=0;i<30;i++){
(i+"."+"当前暂无用户");
}
add(userList,;
}
}
3.inputPad
inputPad类的Panel左边的下拉列表中可以列出所有用户的名字,右边的文本框中可以输入想要发送的消息,点击回车,信息被发送。
此外,在文本框中还可以使用简单的命令,如changename(用于改变用户名)、list(用于更新用户列表)。
inputPad的实现代码如实例16-3所示。
【实例16-3】inputPad()
package
import
import
import
import
import
import
/**
*@authorwufenghanren
*输入信息Panel。
Panel左边的下拉列表中列出了所有用户的名字
*右边的文本框可以输入聊天信息,点击回车信息被发送
*此外还可以在文本框中输入命令如changename、list等
*/
publicclassinputPadextendsPanel{
publicTextFieldinputWords=newTextField("点击回车发送信息",20);
publicChoiceuserChoice=newChoice();
publicLabelchatLabel=newLabel("输入发送信息:
");
publicinputPad(){
setLayout(newFlowLayout);
setBackground(newColor(204,204,204));
for(inti=0;i<30;i++){
(i+"."+"当前暂无用户");
}
(60,24);
add(userChoice);
add(chatLabel);
add(inputWords);
}
}
4.controlPad
controlPad类的Panel上包含整个客户的控制按钮,如“连接主机”、“建立游戏”、“加入游戏”和“选择界面颜色”等。
点击这些按钮会完成相应的能。
controlPad的实现代码如实例16-4所示。
【实例16-4】controlPad()
package
import
import
import
import
import
import
/**
*@authorwufenghanren
*控制Panel。
此Panel上的按钮如其名,完成相应的能
*/
publicclasscontrolPadextendsPanel{
publicLabelIPlabel=newLabel("服务器IP:
",;
publicTextFieldinputIP=newTextField("localhost",10);
publicButtonconnectButton=newButton("连接主机");
publicButtoncreatGameButton=newButton("建立游戏");
publicButtonjoinGameButton=newButton("加入游戏");
publicButtoncancelGameButton=newButton("放弃游戏");
publicButtoncolorChangeButton=newButton("选择界面颜色");
publicButtonexitGameButton=newButton("关闭程序");
;
import
import.*;
import.*;
/**
*@authorwufenghanren
*显示棋盘的Panel。
此Panel实现了鼠标监听器
*/
publicclasschessPadextendsPanelimplementsMouseListener{
publicintchessPoint_x=-1,chessPoint_y=-1,chessColor=1;
intchessBlack_x[]=newint[200];.");
}
.");
}
}
/**
*将各个棋子的坐标保存在数组里
*/
publicvoidgetLocation(inta,intb,intcolor){
if(color==1){
chessBlack_x[chessBlackCount]=a*20;
chessBlack_y[chessBlackCount]=b*20;
chessBlackCount++;
}elseif(color==-1){
chessWhite_x[chessWhiteCount]=a*20;
chessWhite_y[chessWhiteCount]=b*20;
chessWhiteCount++;
}
}
/**
*依据五子棋的行棋规则判断某方获胜
*/
publicbooleancheckWin(inta,intb,intcheckColor){
intstep=1,chessLink=1,chessLinkTest=1,chessCompare=0;
if(checkColor==1){
chessLink=1;
for(step=1;step<=4;step++){
for(chessCompare=0;chessCompare<=chessBlackCount;
chessCompare++){
if(((a+step)*20==chessBlack_x[chessCompare])
&&((b*20)==chessBlack_y[chessCompare])){
chessLink=chessLink+1;
if(chessLink==5){
return(true);
}
}
}
if(chessLink==(chessLinkTest+1))
chessLinkTest++;
else
break;
}
for(step=1;step<=4;step++){
for(chessCompare=0;chessCompare<=chessBlackCount;
chessCompare++){
if(((a-step)*20==chessBlack_x[chessCompare])
&&(b*20==chessBlack_y[chessCompare])){
chessLink++;
if(chessLink==5){
return(true);
}
}
}
if(chessLink==(chessLinkTest+1))
chessLinkTest++;
else
break;
}
chessLink=1;
chessLinkTest=1;
for(step=1;step<=4;step++){
for(chessCompare=0;chessCompare<=chessBlackCount;
chessCompare++){
if((a*20==chessBlack_x[chessCompare])
&&((b+step)*20==chessBlack_y[chessCompare]))
chessLink++;
if(chessLink==5){
return(true);
}
}
}
if(chessLink==(chessLinkTest+1))
chessLinkTest++;
else
break;
}
for(step=1;step<=4;step++){
for(chessCompare=0;chessCompare<=chessBlackCount;
chessCompare++){
if((a*20==chessBlack_x[chessCompare])
&&((b-step)*20==chessBlack_y[chessCompare])){
chessLink++;
if(chessLink==5){
return(true);
}
}
}
if(chessLink==(chessLinkTest+1))
chessLinkTest++;
else
break;
}
chessLink=1;
chessLinkTest=1;
for(step=1;step<=4;step++){
for(chessCompare=0;chessCompare<=chessBlackCount;
chessCompare++){
if(((a-step)*20==chessBlack_x[chessCompare])
&&((b+step)*20==chessBlack_y[chessCompare])){
chessLink++;
if(chessLink==5){
return(true);
}
}
}
if(chessLink==(chessLinkTest+1))
chessLinkTest++;
else
break;
}
for(step=1;step<=4;step++){
for(chessCompare=0;chessCompare<=chessBlackCount;
chessCompare++){
if(((a+step)*20==chessBlack_x[chessCompare])
&&((b-step)*20==chessBlack_y[chessCompare])){
chessLink++;
if(chessLink==5){
return(true);
}
}
}
if(chessLink==(chessLinkTest+1))
chessLinkTest++;
else
break;
}
chessLink=1;
chessLinkTest=1;
for(step=1;step<=4;step++){
for(chessCompare=0;chessCompare<=chessBlackCount;
chessCompare++){
if(((a+step)*20==chessBlack_x[chessCompare])
&&((b+step)*20==chessBlack_y[chessCompare])){
chessLink++;
if(chessLink==5){
return(true);
}
}
}
if(chessLink==(chessLinkTest+1))
chessLinkTest++;
else
break;
}
for(step=1;step<=4;step++){
for(chessCompare=0;chessCompare<=chessBlackCount;
chessCompare++){
if(((a-step)*20==chessBlack_x[chessCompare])
&&((b-step)*20==chessBlack_y[chessCompare])){
chessLink++;
if(chessLink==5){
return(true);
}
}
}
if(chessLink==(chessLinkTest+1))
chessLinkTest++;
else
break;
}
}elseif(checkColor==-1){
chessLink=1;
for(step=1;step<=4;step++){
for(chessCompare=0;chessCompare<=chessWhiteCount;
chessCompare++){
if(((a+step)*20==chessWhite_x[chessCompare])
&&(b*20==chessWhite_y[chessCompare])){
chessLink++;
if(chessLink==5){
return(true);
}
}
}
if(chessLink==(chessLinkTest+1))
chessLinkTest++;
else
break;
}
for(step=1;step<=4;step++){
for(chessCompare=0;chessCompare<=chessWhiteCount;
chessCompare++){
if(((a-step)*20==chessWhite_x[chessCompare])
&&(b*20==chessWhite_y[chessCompare])){
chessLink++;
if(chessLink==5){
return(true);
}
}
}
if(chessLink==(chessLinkTest+1))
chessLinkTest++;
else
break;
}
chessLink=1;
chessLinkTest=1;
for(step=1;step<=4;step++){
for(chessCompare=0;chessCompare<=chessWhiteCount;
chessCompare++){
if((a*20==chessWhite_x[chessCompare])
&&((b+step)*20==chessWhite_y[chessCompare])){
chessLink++;
if(chessLink==5){
return(true);
}
}
}
if(chessLink==(chessLinkTest+1))
chessLinkTest++;
else
break;
}
for(step=1;step<=4;step++){
for(chessCompare=0;chessCompare<=chessWhiteCount;
chessCompare++){
if((a*20==chessWhite_x[chessCompare])
&&((b-step)*20==chessWhite_y[chessCompare])){
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 16 Java 开发 实例 网络 五子棋 游戏
![提示](https://static.bingdoc.com/images/bang_tan.gif)