网络五子棋的通信原理及编程_凌仕华.pdf
《网络五子棋的通信原理及编程_凌仕华.pdf》由会员分享,可在线阅读,更多相关《网络五子棋的通信原理及编程_凌仕华.pdf(7页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、2013.01网络五子棋的通信原理及编程凌仕华汪 琴五子棋是一种广为人知的益智娱乐游戏,现在的很多家庭有两台及以上的计算机组成局域网,这样可以让五子棋能通过网络来博弈。下文就如何通过局域网或因特网互连来博弈的网络五子棋实现进行讲解,程序代码采用Java语言编写。1原理计算机中的网络应用程序通过网络(包括局域网、因特网等)将数据发给对方应用程序,这种数据传输是通过计算机网络的应用层中的某个端口来实现。也即是服务器端应用程序启动系统的某个端口(例如SQL Server的1433端口),然后不间断地侦听该端口传来的数据并做相应处理或将数据从某端口发送给对方。在Java语言中,首先是通过ServerS
2、ocket类来创建一个服务器套接字(Server Socket),再在该套接字上绑定一个端口。例如:ServerSocket chatSocketServer=new ServerSocket(8500);/创建一个服务器套接字(Socket),并绑定到8500端口/(port)接着通过创建的ServerSocket对象中的accept()方法来创建一个套接字(Socket),然后再在创建的套接字端口上侦听从网络传来的数据,例如:Socket serverSocket=chatSocketServer.accept();在这Java语言中accept()方法是用来侦听(listen)从某个连接
3、套接字端口上是不是有数据传来,如果有就接收该数据,否则就不断侦听。如果要往套接字中接入的某个连接传输数据给对方主机应用程序,只要通过套接字(在Java中是Socket类的对象)中的getOutputStream()方法创建一个输入输出流,然后再往其中写入想要输入的数据。程序如下:String host=serverSocket.getInetAddress().getHostName();/获取对方主机信息String ip=serverSocket.getInetAddress().getHostAddress();/获取对方IP地址/获取网络输入流,然后就可以往里面写入数据并发送给/对方I
4、nputStream is=serverSocket.getInputStream();网络五子棋程序采用C/S模式,该程序既是客户端也是服务器端。五子棋实现的原理是创建一个字节二维数组,数组中存放棋子(白方用1代表,黑方用-1代表,没有棋子则为0),然后通过网络将该数组发给彼此,如果数组中有数据改变(从0变为1或-1)则立刻更新屏幕,就像用户下了一颗棋一样,如果数组矩阵中有某颜色五个棋子并列排成一行、一列或一斜列都算是赢了:private byte chessmanArray=new byte1515;/定/义棋子数组,有15行与15列矩阵2编程界面如图1所示。2.1在屏幕中绘制棋盘首先在屏
5、幕中制作一个棋盘,通过java.awt中Graphics2D类的对象中的方法来实现。程序如下:public class ChessBoardPanel extends javax.swing.JPanel/代表棋盘面板在ChessBoardPanel类里面包括 绘制棋 盘的drawPanel()方法,程序如下:private void drawPanel(Graphics2D g)摘要:五子棋是一种广为人知的益智娱乐游戏,当今计算机网络应用几乎无处不在。论述了通过计算机网络运行五子棋的原理及Java语言关键代码实现。关键词:计算机网络;五子棋;Java语言;Socket通信图1程序运行界面GA
6、ME PROGRAM游戏编程712013.01实用第一智慧密集Composite composite=g.getComposite();/备份/合成规则Color color=g.getColor();/备份前景颜色g.setComposite(AlphaComposite.SrcOver.derive(0.6f);/设置透明合成g.setColor(new Color(0 xAABBAA);/设置前景白色g.fill3DRect(0,0,getWidth(),getHeight(),true);/绘制半透明的矩形g.setComposite(composite);/恢复合成规则g.setCo
7、lor(color);/恢复原来前景色int w=getWidth();/棋盘宽度,从JPanel继承而来int h=getHeight();/棋盘高度,从JPanel继承而来int chessW=w/15,chessH=h/15;/棋子宽度/和高度int left=chessW/2+(w%15)/2;/棋盘左边界int right=left+chessW*14;/棋盘右边界int top=chessH/2+(h%15)/2;/棋盘上边界int bottom=top+chessH*14;/棋盘下边界for(int i=0;i 15;i+)/画每条横线g.drawLine(left,top+(i
8、*chessH),right,top+(i*chessH);for(int i=0;i 15;i+)/画每条竖线g.drawLine(left+(i*chessW),top,left+(i*chessW),bottom);2.2用户鼠标单击棋盘下棋当用户用鼠标在屏幕上点击,则在棋盘中鼠标单击处下一颗棋子,程序如下(程序同在ChessBoardPanel类中):private void formMouseClicked(java.awt.event.MouseEventevt)/判断是否开始游戏if(!start|!isTowardsStart()|myColor=0|!turn)return;
9、/start变量代表下棋是否已开始,isTowardsStart()代表对方是/不是也开始/myColor是代表棋子的颜色,颜色包括1(白色)和-1(黑色),/turn是不是轮到某方Point point=evt.getPoint();/取得用户鼠标点击屏/幕中点的坐标,判断是那个格子int xindex=point.x/chessWidth;/除以棋子的宽/度,取得格子X坐标int yindex=point.y/chessHeight;/除以棋子的高/度,取得格子Y坐标bytechessmanArray=chessModel1.getChessmanArray();/取得代表棋盘数组if(c
10、hessmanArrayxindexyindex=0)turn=!turn;/棋子最近颜色,区别已经下的和刚下的棋子chessmanArrayxindexyindex=(byte)(myColor 3);/更新棋盘数据,从而更新屏幕chessModel1.setChessmanArray(chessmanArray);chessPanel.backButton.setEnabled(false);/整理棋盘,把前一步对方刚下棋子变为普通棋子zhengliBoard(byte)-myColor);/判断是不是五个同颜色棋子排成一行、一列或一斜列int winColor=arithmetic(my
11、Color,xindex,yindex);/发送数据给对方主机五子棋应用程序chessPanel.send(chessModel1.getChessmanArrayCopy();if(winColor!=0&winColor=myColor)chessPanel.send(ChessPanel.WIN);/发送胜利代码win=true;chessPanel.reInit();/在判断胜负情况后再发送model中的棋盘/数组,因为这个数组可能带有标/识连线的棋子数据整理棋盘方法代码如下:/*整理棋盘,将标识上一步的棋子恢复普通棋子*/public void zhengliBoard(byte c
12、olor)bytechessmanArray=chessModel1.getChessmanArray();for(int i=0;i chessmanArray.length;i+)for(int j=0;j chessmanArrayi.length;j+)if(chessmanArrayij=(color 3)chessmanArrayij=color;/改变为原来颜色棋子chessModel1.updateChessmanArray(chessmanArray);/更新棋盘数组repaint();/重绘棋盘2.3绘制刚下的棋子绘制刚下的棋子代码如下:public void paint(
13、Graphics g1)Graphics2D g=(Graphics2D)g1;super.paint(g);/调用父类的绘图方法if(chessPanel!=null)chessPanel.setTurn(turn);Composite composite=g.getComposite();/备份/合成模式drawPanel(g);/调用绘制棋盘的方法g.translate(4,4);size=new Dimension(getWidth(),getHeight();722013.01/获取棋盘面板的大小chessWidth=size.width/15;/初始化棋子宽chessHeight=
14、size.height/15;/初始化棋子高bytechessmanArray=chessModel1.getChessmanArrayCopy();/复制棋盘数组数据for(int i=0;i chessmanArray.length;i+)/遍/历棋盘数据模型绘制棋子for(int j=0;j chessmanArrayi.length;j+)byte chessman=chessmanArrayij;int x=i*chessWidth;int y=j*chessHeight;if(chessman!=0)System.out.println(chess is:+chessman);if
15、(chessman=WHITE_CHESSMAN)/绘制白棋g.drawImage(white_chessman_img,x,y,chessWidth,chessHeight,this);else if(chessman=BLACK_CHESSMAN)/绘制黑棋g.drawImage(black_chessman_img,x,y,chessWidth,chessHeight,this);else if(chessman=(WHITE_CHESSMAN 3)/绘制最近的白棋落子g.drawImage(white_chessman_img,x,y,chessWidth,chessHeight,th
16、is);g.drawRect(x,y,chessWidth,chessHeight);else if(chessman=(BLACK_CHESSMAN 3)/绘制最近的黑棋落子g.drawImage(black_chessman_img,x,y,chessWidth,chessHeight,this);g.drawRect(x,y,chessWidth,chessHeight);else if(chessman=(byte)(WHITE_CHESSMAN 8)/绘制导致胜利的连线白棋g.drawImage(white_chessman_img,x,y,chessWidth,chessHeigh
17、t,this);g.drawImage(rightTop_img,x,y,chessWidth,chessHeight,this);else if(chessman=(BLACK_CHESSMAN 8)/绘制导致胜利的连线黑棋g.drawImage(black_chessman_img,x,y,chessWidth,chessHeight,this);g.drawImage(rightTop_img,x,y,chessWidth,chessHeight,this);if(!isStart()/如果游戏不处于开始状态if(towardsWin|win|draw)/如果游戏处于胜利或和棋状态,绘制
18、棋盘提示信息/设置70%透明的合成规则g.setComposite(AlphaComposite.SrcOver.derive(0.7f);String mess=对方胜利;/定义提示信息g.setColor(Color.RED);/设置前景色为红色if(win)/如果是自己胜利mess=你胜利了;/设置胜利提示信息g.setColor(new Color(0 x007700);/设置绿色前景色 else if(draw)/如果是和棋状态mess=此战平局;/定义和棋提示信息g.setColor(Color.YELLOW);/设置/和棋信息使用黄色提示/设置提示文本的字体为隶书、粗斜体、大小7
19、2Font font=new Font(隶 书,Font.ITALIC|Font.BOLD,72);g.setFont(font);/获取字体渲染上下文对象FontRenderContext context=g.getFontRenderContext();/计算提示信息的文本所占用的像素空间Rectangle2D stringBounds=font.getStringBounds(mess,context);double fontWidth=stringBounds.getWidth();/获取提示文本的宽度/居中绘制提示信息g.drawString(mess,(int)(getWidth(
20、)-fontWidth)/2),getHeight()/2);g.setComposite(composite);/恢复原有合成规则 else /如果当前处于其他未开始游戏的状态String mess=等待开始;/定义等他提示信息Font font=new Font(隶 书,Font.ITALIC|Font.BOLD,48);g.setFont(font);/设置48号隶书字体FontRenderContextcontext=g.getFontRenderContext();Rectangle2DstringBounds=font.getStringBounds(mess,context);d
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 网络 五子棋 通信 原理 编程 凌仕华
限制150内