您好,欢迎访问三七文档
一.设计题目:设计五子棋游戏要求:1、游戏可以进行很好的人机交互界面,方便玩家对游戏进行各种操作2、能设计两人联网对战最好3、参考网络及曾经学习的各种程序二.设计思路:(1)网络五子棋游戏服务器端主要有三个类:OmokServer类、Omok_Thread类(线程类)和BManager类(消息广播者)。它的主要功能是连接客户端,使多个客户端连接在一起,最终实现联网。(2)编制客户端服务器。创建页面,包括页面大小,背景颜色等。将页面分成上下两部分:一部分为文本区,显示当前网络地址,以及黑白方下棋过程;一部分为按钮,包括清除显示、服务器状态、关闭服务器。下棋之前需先连接服务器,才可以创建游戏,其它玩家打开相同服务器选择用户,输入该用户的网络地址就可加入游戏。(3)我们可以通过标记号码来区分待机室与下棋室。即用0标记待机室,其他房间使用0以上的自然数来标记。事实上,我们并不时真正创建了房间,而只是将房间号码赋予了客户机而已。以此,我们可以实现拥有相同号码的客户机彼此间可以相互通信。(4)首先要实现五子棋盘(OmokBoard类)。五子棋盘继承了画布类,它内嵌于框架窗口中,拥有15*15(255)个方格。为了响应用户的下棋动作,五子棋盘必须能够响应鼠标事件。并且它必须拥有输出流,用以向对手传递棋手的下棋信息。程序中也有多种方法用来实现绘图操作。然而,程序中最重要的部分时如何决定胜负。横,竖或者对角线方向上拥有五颗同样的棋子时,即为胜利。(5)绘制棋盘,利用构造函数publicvoidpaint(Graphicsg)重绘和applet程序装载的时候会调用的过程,有如下代码:publicclassFiveChessFrameextendsJFrameimplementsMouseListener,Runnable{intwidth=Toolkit.getDefaultToolkit().getScreenSize().width;intheight=Toolkit.getDefaultToolkit().getScreenSize().height;BufferedImagebgImage=null;intx=0;inty=0;int[][]allChess=newint[19][19];booleanisBlack=true;booleancanPlay=true;Stringmessage=黑方先行;intmaxTime=0;Threadt=newThread(this);intblackTime=0;intwhiteTime=0;StringblackMessage=无限制;StringwhiteMessage=无限制;publicFiveChessFrame(){this.setTitle(五子棋);this.setSize(500,500);this.setLocation((width-500)/2,(height-500)/2);this.setResizable(false);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.addMouseListener(this);this.setVisible(true);t.start();t.suspend();this.repaint();}(6)定义黑白棋子,单击鼠标可下棋;点击悔棋按钮可悔棋,系统记录悔棋次数,若超过3次,则跳出循环,不再执行悔棋;点击放弃游戏,可弹出对话框,是否退出游戏;点击重新开始游戏,可重新初始化游戏界面;点击其它连接按钮,可进行各种连接。(7)numb()方法用来查找并计算连在一起的棋子的个数。P为基准坐标,dx、dy分别为表示横向于竖向的变量。col代表棋子颜色。弱dx为-1,dy为0,则计算左边连续棋子的个数;若dx为1,dy为1,则计算左下到右上连续棋子的个数。dx与dy只取-1、0、1三个值之一。下面是numb()方法的代码。Privateintnumb(Pointp,intdx,intdy,intcol){inti=0;for(;map[p.x+(i+1)*dx][p.y+(i+1)*dy]==col;i++){}returni;}(8)游戏分黑白两方,每局由规定黑方先行。黑方玩家移动鼠标在棋盘中点击行棋。当黑方行棋完毕,转由白方行棋。游戏结束后黑白方互换颜色。禁手是对局中被判为负的行棋手段,白棋无禁手。这是核心部分,编写时主要考虑的部分,用以下代码表示输赢:PrivateBooleancheck(pointp,intcool){if(count(p,1,0,col)+count(p,-1,0,col)==4)returntrue;if(count(p,0,1col)+count(p,0,-1,col)==4)returntrue;if(count(p,-1,-1,col)+count(p,1,1col)==4)returntrue;if(count(p,1,-1,col)+count(p,-1,1,col)==4)returntrue;}三.核心代码:namespaceLeimom.FiveChess{///summary///SummarydescriptionforForm1.////summarypublicclassFiveForm:System.WinForms.Form{///summary///Requireddesignervariable.////summaryprivateSystem.ComponentModel.Containercomponents;privateSystem.WinForms.ImageListimageListbw;//definethehotRectangleprivateRectangle[]pointSquares;//chessinformationprivateint[]chessTable;privateintnextTurn;privateconstintbTurn=1;privateconstintwTurn=2;privateStackchessIndex;publicFiveForm(){InitializeComponent();chessIndex=newStack();nextTurn=bTurn;chessTable=newint[225];pointSquares=newRectangle[225];Sizesize=newSize(18,18);intx=0;inty=0;for(inti=0;i225;i++){x=i%15;y=i/15;pointSquares[i].Size=size;pointSquares[i].Offset(9+x*20,6+y*20);chessTable[i]=0;}}protectedoverridevoidOnPaint(PaintEventArgse){//绘制Graphicsg=e.Graphics;}protectedoverridevoidOnMouseDown(System.WinForms.MouseEventArgse){switch(e.Button){//向左移动caseMouseButtons.Left:OnLButtonDown(newPoint(e.X,e.Y));break;//向右移动caseMouseButtons.Right:OnRButtonDown(newPoint(e.X,e.Y));break;}base.OnMouseDown(e);}privatevoidOnLButtonDown(Pointp){intnPos=GetRectID(p);if(nPos!=-1&&chessTable[nPos]==0){Graphicsg=this.CreateGraphics();if(nextTurn==bTurn){//下白棋DrawBlack(g,nPos);chessTable[nPos]=bTurn;nextTurn=wTurn;chessIndex.Push(bTurn);chessIndex.Push(nPos);}else{//下黑棋DrawWhite(g,nPos);chessTable[nPos]=wTurn;nextTurn=bTurn;chessIndex.Push(wTurn);chessIndex.Push(nPos);}g.Dispose();//获胜CheckGameResult(nPos,nextTurn);}}privatevoidCheckGameResult(intnPos,intnextTurn){StackisFive=newStack();intthisTurn=(nextTurn==bTurn)?wTurn:bTurn;intx=nPos%15;inty=nPos/15;for(inti=0;i15;i++){if(chessTable[y*15+i]==thisTurn){isFive.Push(y*15+i);if(isFive.Count==5){MessageBox.Show(GameOver,Notes,MessageBox.OK);ReSetGame();return;}}else{isFive.Clear();}}isFive.Clear();for(inti=0;i15;i++){if(chessTable[i*15+x]==thisTurn){isFive.Push(i*15+x);if(isFive.Count==5){MessageBox.Show(GameOver,Notes,MessageBox.OK);ReSetGame();return;}}else{isFive.Clear();}}isFive.Clear();for(inti=-14;i15;i++){if(x+i0||x+i14||y-i0||y-i14){continue;}else{if(chessTable[(y-i)*15+x+i]==thisTurn){isFive.Push((y-i)*15+x+i);if(isFive.Count==5){MessageBox.Show(GameOver,Notes,MessageBox.OK);ReSetGame();return;}}else{isFive.Clear();}}}isFive.Clear();//scanx=-yhavefivefor(inti=-14;i15;i++){if(x+i0||x+i14||y+i0||y+i14){continue;}else{if(chessTable[(y+i)*15+x+i]==thisTurn){isFive.Push((y+i)*15+x+i);if(isFive.Count==5){MessageBox.Show(GameOver,Notes,MessageBox.OK);ReSetGame();return;}}else{isFive.Clear();}}}isFive.Clear();}privatevoidReSetGame(){//resetgamenextTurn=bTurn;for(inti=0;i225;i++){chessTable[i]=0;}this.Invalidate();}privateintGetRectID(Pointp){//getwitchrectangleclickfor(inti=0;i225;i++){if(pointSquares[i].Contains(p)){returni;}}return-1;}privatevoidOnRButtonDown(Pointp){//regretchessintnPos,x,y;if(chessIndex.Count!=0){nPos=(int)
本文标题:五子棋C#
链接地址:https://www.777doc.com/doc-869324 .html