16 Java 开发实例网络五子棋游戏.docx

上传人:b****5 文档编号:29370858 上传时间:2023-07-22 格式:DOCX 页数:29 大小:751.58KB
下载 相关 举报
16 Java 开发实例网络五子棋游戏.docx_第1页
第1页 / 共29页
16 Java 开发实例网络五子棋游戏.docx_第2页
第2页 / 共29页
16 Java 开发实例网络五子棋游戏.docx_第3页
第3页 / 共29页
16 Java 开发实例网络五子棋游戏.docx_第4页
第4页 / 共29页
16 Java 开发实例网络五子棋游戏.docx_第5页
第5页 / 共29页
点击查看更多>>
下载资源
资源描述

16 Java 开发实例网络五子棋游戏.docx

《16 Java 开发实例网络五子棋游戏.docx》由会员分享,可在线阅读,更多相关《16 Java 开发实例网络五子棋游戏.docx(29页珍藏版)》请在冰豆网上搜索。

16 Java 开发实例网络五子棋游戏.docx

16Java开发实例网络五子棋游戏

16章Java开发实例——网络五子棋游戏

使用Eclipse集成开发工具可以方便地开发Java应用程序,本节就以一个综合实例对前面章节学过的内容进行总结与提升。

读完本章后,读者能够清楚地知道使用Eclipse开发Java应用程序的完整流程。

16.1JavaSocket编程基础

由于本章采用的实例需要用到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的构建与通信,这些类存在于J包中。

常用的类有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对象。

由于存在单个服务程序与多个客户程序通信的可能,解决方法是服务器主机运行一个处理服务程序和客户程序的通信后台线程。

16.2网络五子棋程序的代码结构详解本实例是一个简单的网络五子棋程序。

程序由两个部分组成:

一部分为服务器,另一部分为五子棋客户。

其中服务器以消息方式完成客户的管理,客户支持对弈和聊天。

实例源代码由com.fivechess.chessface、com.fivechess.client和com.fivechess.server3个包组成。

注意详细注释都写在代码中。

16.2.1com.fivechess.chessface此包主要包含与游戏客户界面有关的一些类文件,如chessPad、chatPad、controlPad和inputPad等。

下面分别介绍这几个文件。

1.chatPadchatPad类是一个用户界面组件,其本身是一个具有带有滚动条的文本域的Panel,用户的聊天信息和命令的执行结果都将在此文本域上显示。

chatPad的实现代码如实例16-1所示。

【实例16-1】chatPad(chatPad.java)packagecom.fivechess.chessface;importjava.awt.BorderLayout;importjava.awt.Panel;importjava.awt.TextArea;/***@authorwufenghanren*聊天信息Panel。

Panel上的文本域可以显示用户聊天信息*/publicclasschatPadextendsPanel{publicTextAreachatLineArea=newTextArea("",18,30,TextArea.SCROLLBARS_VERTICAL_ONLY);publicchatPad(){setLayout(newBorderLayout());add(chatLineArea,BorderLayout.CENTER);}}2.userPadchatPad类也是一个用户界面组件,它是一个带有列表框的Panel,所有的用户名都将显示在列表中。

userPad的实现代码如实例16-2所示。

【实例16-2】userPad(userPad.java)packagecom.fivechess.chessface;importjava.awt.*;/***@authorwufenghanren*用户列表Panel。

此Panel维护一个服务器的当前用户列表*所有的用户名都将显示在列表中*/publicclassuserPadextendsPanel{publicListuserList=newList(10);publicuserPad(){setLayout(newBorderLayout());for(inti=0;i<30;i++){userList.add(i+"."+"当前暂无用户");}add(userList,BorderLayout.CENTER);}}3.inputPadinputPad类的Panel左边的下拉列表中可以列出所有用户的名字,右边的文本框中可以输入想要发送的消息,点击回车,信息被发送。

此外,在文本框中还可以使用简单的命令,如changename(用于改变用户名)、list(用于更新用户列表)。

inputPad的实现代码如实例16-3所示。

【实例16-3】inputPad(inputPad.java)packagecom.fivechess.chessface;importjava.awt.Choice;importjava.awt.Color;importjava.awt.FlowLayout;importjava.awt.Label;importjava.awt.Panel;importjava.awt.TextField;/***@authorwufenghanren*输入信息Panel。

Panel左边的下拉列表中列出了所有用户的名字*右边的文本框可以输入聊天信息,点击回车信息被发送*此外还可以在文本框中输入命令如changename、list等*/publicclassinputPadextendsPanel{publicTextFieldinputWords=newTextField("点击回车发送信息",20);publicChoiceuserChoice=newChoice();publicLabelchatLabel=newLabel("输入发送信息:

");publicinputPad(){setLayout(newFlowLayout(FlowLayout.LEFT));setBackground(newColor(204,204,204));for(inti=0;i<30;i++){userChoice.addItem(i+"."+"当前暂无用户");}userChoice.setSize(60,24);add(userChoice);add(chatLabel);add(inputWords);}}4.controlPadcontrolPad类的Panel上包含整个客户的控制按钮,如“连接主机”、“建立游戏”、“加入游戏”和“选择界面颜色”等。

点击这些按钮会完成相应的能。

controlPad的实现代码如实例16-4所示。

【实例16-4】controlPad(controlPad.java)packagecom.fivechess.chessface;importjava.awt.Button;importjava.awt.Color;importjava.awt.FlowLayout;importjava.awt.Label;importjava.awt.Panel;importjava.awt.TextField;/***@authorwufenghanren*控制Panel。

此Panel上的按钮如其名,完成相应的能*/publicclasscontrolPadextendsPanel{publicLabelIPlabel=newLabel("服务器IP:

",Label.LEFT);publicTextFieldinputIP=newTextField("localhost",10);publicButtonconnectButton=newButton("连接主机");publicButtoncreatGameButton=newButton("建立游戏");publicButtonjoinGameButton=newButton("加入游戏");publicButtoncancelGameButton=newButton("放弃游戏");publicButtoncolorChangeButton=newButton("选择界面颜色");publicButtonexitGameButton=newButton("关闭程序");//构造函数,负责Panel的初始布局publiccontrolPad(){setLayout(newFlowLayout(FlowLayout.LEFT));setBackground(newColor(204,204,204));add(IPlabel);add(inputIP);add(connectButton);add(creatGameButton);add(joinGameButton);add(cancelGameButton);add(colorChangeButton);add(exitGameButton);}}5.chessPad几个界面组件中最复杂的是chessPad,它不仅仅是一个包含棋盘和棋子的Panel,除此之外还要完成绘制棋子、保存处理落子后棋子的位置信息、判断棋局胜负和对棋局终了时进行棋盘的重新清理和初始化等操作。

chessPad包含了3个类:

一个是绘制棋盘的Panel、一个表示黑子的类,一个表示白子的类。

chessPad的实现代码如实例16-5所示。

【实例16-5】chessPad(chessPad.java)packagecom.fivechess.chessface;importjava.awt.*;importjava.awt.event.*;importjava.io.*;import.*;/***@authorwufenghanren*显示棋盘的Panel。

此Panel实现了鼠标监听器*/publicclasschessPadextendsPanelimplementsMouseListener{publicintchessPoint_x=-1,chessPoint_y=-1,chessColor=1;intchessBlack_x[]=newint[200];//黑子的x坐标intchessBlack_y[]=newint[200];//黑子的y坐标intchessWhite_x[]=newint[200];//白子的x坐标intchessWhite_y[]=newint[200];//白子的y坐标intchessBlackCount=0,chessWhiteCount=0;intchessBlackWin=0,chessWhiteWin=0;publicbooleanisMouseEnabled=false,isWin=false,isInGame=false;publicLabelstatusLabel=newLabel("客户状态");publicTextFieldstatusText=newTextField("请先连接服务器");//显示客户状态的文本框publicSocketchessSocket;DataInputStreaminData;DataOutputStreamoutData;publicStringchessSelfName=null;//己方的名字publicStringchessPeerName=null;//对方的名字publicStringhost=null;publicintport=4331;publicchessThreadchessthread=newchessThread(this);/***棋盘Panel的构造函数*/publicchessPad(){setSize(440,440);setLayout(null);setBackground(newColor(204,204,204));addMouseListener(this);add(statusLabel);statusLabel.setBounds(30,5,70,24);add(statusText);statusText.setBounds(100,5,300,24);statusText.setEditable(false);}/***和服务器通信的函数*/publicbooleanconnectServer(StringServerIP,intServerPort)throwsException{try{//利用参数创建一个Socket的实例来完成和服务器之间的信息交换chessSocket=newSocket(ServerIP,ServerPort);inData=newDataInputStream(chessSocket.getInputStream());outData=newDataOutputStream(chessSocket.getOutputStream());chessthread.start();returntrue;}catch(IOExceptionex){statusText.setText("chessPad:

connectServer:

无法连接\n");}returnfalse;}/***一方获胜时对棋局的处理*/publicvoidchessVictory(intchessColorWin){//清除所有的棋子this.removeAll();//将保存所有黑棋和白棋的位置坐标的数组清空,为下一盘棋做准备for(inti=0;i<=chessBlackCount;i++){chessBlack_x[i]=0;chessBlack_y[i]=0;}for(inti=0;i<=chessWhiteCount;i++){chessWhite_x[i]=0;chessWhite_y[i]=0;}chessBlackCount=0;chessWhiteCount=0;add(statusText);statusText.setBounds(40,5,360,24);//如果黑棋获胜,计算双方获胜盘数,将双方的战绩在状态文本框中显示出来if(chessColorWin==1){chessBlackWin++;statusText.setText("黑棋胜,黑:

白为"+chessBlackWin+":

"+chessWhiteWin+",重新开局,等待白棋下子...");}//白棋获胜,同上elseif(chessColorWin==-1){chessWhiteWin++;statusText.setText("白棋胜,黑:

白为"+chessBlackWin+":

"+chessWhiteWin+",重新开局,等待黑棋下子...");}}/***将各个棋子的坐标保存在数组里*/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++;elsebreak;}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++;elsebreak;}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++;elsebreak;}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++;elseb

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 职业规划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1