军棋游戏设计-课程设计报告_第1页
军棋游戏设计-课程设计报告_第2页
军棋游戏设计-课程设计报告_第3页
军棋游戏设计-课程设计报告_第4页
军棋游戏设计-课程设计报告_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

文化创意与传播学院《Windows程序设计》课程设计报告I目录TOC\o"1-3"\h\u23291设计的目的与功能简介 1314931.1设计的目的 1156081.2功能简介 147152游戏分析 2227432.1界面设计 2100382.2棋盘数据结构 4136672.3通信协议设计 4175172.4走棋规则设计 6149282.5布阵规则设计 8165353游戏详细设计 9171803.1初始化棋盘 9214843.2走棋规则 1138593.3读写布阵棋谱文件 12124903.4“保存布阵”、“读取布阵”、“开始对战” 14159493.5通信过程 16146513.6“主机”、“从机”的选择 24111953.7“联机”、“重新开始”、“退出游戏” 243383.8窗体关闭 26134373.9游戏运行测试 2634814设计心得 28161585参考文献 29301996附录 301设计的目的与功能简介1.1设计的目的随着休闲网络游戏市场竞争的升级,尤其是网络棋牌游戏的巨大市场前景的吸引,许多公司都加入到棋牌游戏的竞争之列,一时之间竞争可谓惨烈。由于全国通用的全国流行的棋牌游戏市场(斗地主、象棋、军旗、梭哈)已经基本被几个大的游戏厂商(联众、腾讯、边锋、远航、中游)所占据,加之棋牌游戏玩家忠诚度非常高的特性,继续介入这快市场已经没有任何意义。一般来讲每一个地方游戏都是独立的,每个独立的游戏所面对的目标消费者都是不同的,所以对于企业的营销推广工作要求也比较高。如何在未来开拓出更多精彩的产品项目,为用户提供更为优质的服务,并结合自身的实际情况制定出最为合理的收费模式,便成了各厂商要想得到长足的发展,就必须先解决的一览子问题。在线棋牌游戏有着深厚的文化底蕴、坚实大众基础和广阔的发展空间,对于其前景应该是没有任何值得争议的。1.2功能简介军棋,又称陆战棋。估计华人没有不知道什么叫做军旗的,军棋是一种家喻户晓的棋类游戏,它的多变吸引了无数玩家。军旗的子数:军棋每方共有25个子,司令、军长、军旗各一;师长、旅长、团长、营长、炸弹各二;连长、排长、工兵、地雷各三。军旗的子力:司令>军长>师长>旅长>团长>营长>连长>排长>工兵,大子遇小子,小子拿掉,大子放在原位,炸弹碰到任何子力同时拿下,这是任何规则都遵循的。军旗的摆法:原则上25个棋子可以摆放在棋盘除行营外的任何位置,但是对于一些特殊子力还有特别的限制。例如,军旗只能摆在两个大本营其中的一个;地雷只能摆在后两排除军旗占据的一个大本营外的任何9个位置;炸弹不能摆在第一排的5个位置。军旗和地雷位置一旦固定,出征后就不能够再移动[5]。军旗规则:针对大本营,能进不能出的;针对地雷,工兵飞雷雷下,工兵在;炸弹遇雷同时拿下;其他子力遇到地雷自动碰死拿下,地雷不动。针对炸弹,有炸弹等同与其他子力按规矩行动的,也有炸弹满天飞(行子方式如同工兵)。针对行棋方式:铁路线上棋子只可直行,工兵可以飞行。军棋的胜负判定:夺取敌方的军旗,一般夺旗就算胜。本网络军棋游戏如图1.2所示。图1.2网络军棋游戏界面2游戏分析2.1界面设计下棋需要有棋盘,程序中通过在窗体激活时在图片框控件qi_pan上显示军棋棋盘图片文件。有R.bmp和G.bmp两个图片表示红方和绿方暗子。使用控件数组Qizi_Pic[]的Add方法加载了我们所需要的棋子图片控件并使用相应图片。Qizi_Pic[]中下标i的含义是:如果i小于24,那么说明它属于红方的棋子,否则是绿方的棋子。同时Qizi_Pic[i]的tag属性保存了棋子在控件数组的索引号。在界面中要求用户输入对方IP、端口(本地及对方远端),同时添加“联机”、“重新开始”、“退出”、“保存布阵”、“读取布阵”、“开始对战”6个按钮以及一些提示用的标签。(a)红方军棋棋子图片图2.1(b)绿方军棋棋子图片图2.2图2.3网络两人对战军棋设计界面2.2棋盘数据结构棋盘的数据结构采用17×17二维数组Map存储。X,Y坐标原点是棋盘左上角。虽然使用四人玩的棋盘,本游戏主要是上下两个区域,其他区域可以走棋。例如,上方玩家棋子布阵所在区域是(7,1)到(11,6)范围,下方玩家棋子布阵所在区域是(7,12)到(11,17)范围。2.3通信协议设计网络程序设计的难点在于与对方需要通信,这里使用了UDP(UserDataProtocol)。UDP是用户数据文报协议的简称,两台计算机之间的传输类似于传递邮件;两台之间没有明确的连接,使用UDP协议建立对等通信。这里虽然两台计算机不分主次,但我们设计时假设一台做主机(红方),等待其他人加入。其他人想加入的时候输入主机的IP。为了区分通信中传送的是“输赢信息”、“下的棋子位置信息”、“重新开始”等,在发送信息的首部加上代号。定义了如下协议:命令|参数|参数……联机功能join|2.对方棋子移动信息move|x,y,idx,old_x,old_y,old_idx其中,棋子移动的目标位置坐标是(x,y),棋子移动的起始位置坐标是(old_x,old_y);old_idx是被移动棋子的控件数组索引号,idx是目标位置留下的棋子的控件数组索引号。游戏结束over|+赢方代号(赢了此局)表示要重新开始reset|布阵信息layout|布阵棋子信息布阵棋子信息形式为x,y,idx,x,y,idx……idx是(x,y)处的棋子的控件数组索引号。注意本程序在传递布阵信息时,我们默认了是绿方在棋盘上方,红方在下。但实际下棋如果棋手使用绿方,这样看非累死不可,所以这里我们采取了个小技巧,在发送布阵数据时我们把坐标颠倒(把自己的棋盘颠倒),即(x,y)坐标以(18-x,18-y)坐标发给对方。在下棋过程中,为了保存下过的棋子的位置使用了Map数组,Map数组初值为101,表示此处无棋子。关于0到24的棋子含义如下在qi_index()规定:privatevoidqi_index(){Q=newint[25];Q[0]=29;//军旗29Q[1]=30;Q[2]=30;Q[3]=30;//地雷30Q[4]=31;Q[5]=31;//炸弹31Q[6]=32;Q[7]=32;Q[8]=32;//工兵32Q[9]=33;Q[10]=33;Q[11]=33;//排长33Q[12]=34;Q[13]=34;Q[14]=34;//连长34Q[15]=35;Q[16]=35;//营长35Q[17]=36;Q[18]=36;//团长36Q[19]=37;Q[20]=37;//旅长37Q[21]=38;Q[22]=38;//师长38Q[23]=39;//军长39Q[24]=40;//司令40}即0为军旗,1~3为地雷,4,5为炸弹,6~8为工兵,9~11为排长,12~14为连长,15,16为营长,17,18为团长,19,20为旅长,21,22为师长,23为军长,24为司令。在Q数组中Q[24]=40而不直接写为“司令”,原因是棋子图片命名时采用40.bmp,所以为显示图片方便,这里Q[24]=40。25~49代表绿方棋子。绿方只要减去25(每方25个棋子)即可利用Q数组得知绿方棋子的含义,如27代表的是绿方地雷。2.4走棋规则设计对于军棋游戏来说,规则非常简单,就是按照先后顺序在棋盘上走棋吃子,直到一方最先将对方的“军旗”挖掉为胜。但在走棋过程中,需要考虑以下情况:是否为非棋子区。目标处是否是自己的棋子。判断目标是否是行营,如果是则需判断是否有子,如果没有可以如象棋中的“士”一样斜线走棋。判断起始位置是否是铁道线,如果是则考虑弯道、直道、棋盘正中间的3×3“田字”,否则只能移动一步。“军旗”棋子、地雷棋子不能走动。在“大本营”中的棋子不能移动。可以看出走棋规则比较复杂。在设计时Go_Juge(intold_x,intold_y,intx,inty)判断走棋的位置是否适当。privateboolGo_Juge(intold_x,intold_y,intx,inty)//判断走棋的位置是否适当{label1.Text=old_x.ToString()+"old_x:old_y"+old_y.ToString()+":"+Map[old_x,old_y].ToString();label2.Text=x.ToString()+"x:y"+y.ToString()+Map[x,y].ToString();if((x<=6&&y>=1&&y<=6)||(x>=12&&y>=1&&y<=6)||(x<=6&&y>=12&&y<=17)||(x>=12&&y>=12&&y<=17)||y>17)returnfalse;//目标位置是自己方的棋子//Why***********if(IsmyChess(x,y))returnfalse;//到行营,行营是否有子if(Is_Home(x,y)&&Map[x,y]!=101)returnfalse;//如“士”斜线从行营中出来**********if(Is_Home(old_x,old_y)&&Map[x,y]==101&&Math.Abs(x-old_x)*Math.Abs(y-old_y)==1)returntrue;//如“士”斜线走入行营************if(Is_Home(x,y)&&Map[x,y]==101&&Math.Abs(x-old_x)*Math.Abs(y-old_y)==1)returntrue;//移动一步if(Math.Abs(x-old_x)==1&&y==old_y||Math.Abs(y-old_y)==1&&x==old_x)returntrue;//铁道线if(T_Juge(old_x,old_y,x,y))returntrue;//if(T_Juge(old_y,old_x,y,x)) returntrue;returnfalse;}本程序中go_chess(intold_x,intold_y,intx,inty,intidx)完成走棋吃子功能,其中判断以下几种情况:双方均为工兵到司令的棋子,则按大小比较决定保留那方棋子。其中一方是炸弹(31),则同时去掉。其中一方是地雷(30),对方为工兵,则留兵,否则留雷。其中一方是军旗(29),则可以判断输赢。注意:在发送走棋数据的时候我们仍然需要把再颠倒(把自己的棋盘颠倒),即(x,y)坐标以(18-x,18-y)坐标发给对方。2.5布阵规则设计注意布阵是采用两次单击不同棋子来决定对调的,所以(old_x,old_y)是第一次单击的棋子坐标,(x1,y1)是第二次单击的棋子坐标。判断布局棋子的位置是否适当是使用Layout_Judge(intold_x,intold_y,intx1,inty1)实现以下情况判断:第一排不允许放置炸弹,由于布阵都在南方,因此第一排即(y1=12)。自己的军旗只能放在大本营,由于布阵都在南方,因此大本营即x1==8&&y1==17||x1==10&&y1==17。后两排不允许放置地雷,由于布阵都在南方,因此后两排即y1==16||y1==17。具体实现如下://炸弹控件编号4,5,第一排(y1=12)不允许放置炸弹if(Q[Map[old_x,old_y]%25]==31&&y1==12)returnfalse;if(Q[Map[x1,y1]%25]==31&&old_y==12)returnfalse;//第一排(y1=12)不允许放置炸弹31if(Q[Map[old_x,old_y]%25]==29&&!(x1==8&&y1==17||x1==10&&y1==17))returnfalse;//自己的军旗29,只能放置在大本营if(Q[Map[x1,y1]%25]==29&&!(old_x==8&&old_y==17||old_x==10&&old_y==17))returnfalse;//自己的军旗29,只能放置在大本营if(Q[Map[x1,y1]%25]==30&&!(old_y==16||old_y==17))returnfalse;//第1,2,3,4排不允许放置地雷30,if(Q[Map[old_x,old_y]%25]==30&&!(y1==16||y1==17))returnfalse;//第1,2,3,4排不允许放置地雷,returntrue;//其余情况均可以3游戏详细设计3.1初始化棋盘窗体加载时,初始化棋盘数组每个元素Map[i,j]为101,表示(i,j)处没放置棋子。加载每人的25个棋子Qizi_Pic[i]及相应的图片,但Visible=false让其不可见。“保存布局”、“读取布局”、“开始对战”、“重新开始”4个按钮设为不用。privatevoidForm1_Load(objectsender,System.EventArgse){Pic_Width=qi_pan.Width;//棋盘大小r=(Pic_Width)/17;Map=newint[18,18];for(inti=1;i<18;i++)for(intj=1;j<18;j++)Map[i,j]=101;//101表示(i,j)处没放置棋子qi_index();//棋子编号并设置对应棋子含义begin_pos(2); //加载不可见棋子button1.Visible=false;//保存布阵按钮button2.Visible=false;//读取布阵按钮button3.Visible=false;//开始对战按钮button5.Enabled=false;//重新开始按钮}privatevoidqi_index(){Q=newint[25];Q[0]=29;//军旗29Q[1]=30;Q[2]=30;Q[3]=30;//地雷30Q[4]=31;Q[5]=31;//炸弹31Q[6]=32;Q[7]=32;Q[8]=32;//工兵32Q[9]=33;Q[10]=33;Q[11]=33;//排长33Q[12]=34;Q[13]=34;Q[14]=34;//连长34Q[15]=35;Q[16]=35;//营长35Q[17]=36;Q[18]=36;//团长36Q[19]=37;Q[20]=37;//旅长37Q[21]=38;Q[22]=38;//师长38Q[23]=39;//军长39Q[24]=40;//司令40}//添加处理棋子起始位置方法privatevoidbegin_pos(intm){stringfilename="";path=System.Windows.Forms.Application.StartupPath;//bin路径Qizi_Pic=newPictureBox[25*m];inti;intn=1;for(i=0;i<25*m;i++)//添加25*m个棋子{Qizi_Pic[i]=newPictureBox();this.Controls.Add(Qizi_Pic[i]);Qizi_Pic[i].Width=22;Qizi_Pic[i].Height=22;Qizi_Pic[i].Name="R"+i.ToString();Qizi_Pic[i].Tag=i.ToString();Qizi_Pic[i].Parent=qi_pan;if(i<25){filename=path+"\\..\\..\\bmp\\"+Q[i].ToString()+".bmp";}if(i>=25&&i<50){filename=path+"\\..\\..\\bmp\\G"+Q[i%25].ToString()+".bmp";//暗棋filename=path+"\\..\\..\\bmp\\G.bmp";}Qizi_Pic[i].Image=Image.FromFile(filename);Qizi_Pic[i].Click+=newSystem.EventHandler(bt_Click);Qizi_Pic[i].MouseDown+=newSystem.Windows.Forms.MouseEventHandler(bt_MouseDown);Qizi_Pic[i].MouseMove+=newSystem.Windows.Forms.MouseEventHandler(bt_MouseMove);Qizi_Pic[i].MouseUp+=newSystem.Windows.Forms.MouseEventHandler(bt_MouseUp);if(i%5==0)n++;Qizi_Pic[i].Top=250+n*24;Qizi_Pic[i].Left=10+23*(i%5);Qizi_Pic[i].Visible=false;}}}3.2走棋规则以下是程序最复杂的部分,判断走棋是否符合军旗走棋规则。

开始开始old_x,old_y,x,y是否为棋子区是否为己方行营是否有子是否为铁道走铁道线移动一步斜线入行营结束否是是否否是是否图3.2走棋规则流程图3.3读写布阵棋谱文件以下是读写布阵棋谱文件的两个方法,布阵棋谱采用文本文件,write_qi_pu()完成将棋盘上布局写入有棋谱MyFile.txt中,注意写入时按棋谱坐标(7,12)到(11,17)范围写入。Map数组可以有0~49值(101表示无棋子),其中,0~24代表红方棋子;25~49代表绿方棋子。如果是绿方棋子,我们仍以0~24存放,所以会减25。写入时一个坐标点三个字节数据(x,y,棋子的索引号)。privatevoidwrite_qi_pu(){FileStreamfw=newFileStream("MyFile.txt",FileMode.Create,FileAccess.Write);//将棋子Map写入布阵文件MyFile.txt中 for(bytex=7;x<=11;x++)for(bytey=12;y<=17;y++){fw.WriteByte(x);fw.WriteByte(y);if(Map[x,y]>=25&&Map[x,y]!=101)fw.WriteByte((byte)(Map[x,y]-25));elsefw.WriteByte((byte)Map[x,y]);}fw.Flush();//刷新文件,将缓冲区数据写入文件fw.Close();}Read_qi_pu()完成从布阵棋谱文件“MyFile.txt”中读取棋子放置位置,读取时一次三个字节数据(x,y棋子的索引号),根据坐标点(x,y)和棋子的索引号idx放置棋子。注意棋子的索引号0~24代表红方棋子;25~49代表绿方棋子。如果是绿方棋子,我们需要在索引号加25处理才正确。privatevoidread_qi_pu()//从布阵棋谱文件中读取位置,放置棋子{FileStreamMyfile=newFileStream("MyFile.txt",FileMode.Open,FileAccess.Read);intx,y,idx;while((x=Myfile.ReadByte())!=-1){y=Myfile.ReadByte();idx=Myfile.ReadByte();if(idx!=101){if(player==PlayerColor.Red){MoveChess(idx,x,y);Qizi_Pic[idx].Visible=true;}else{MoveChess(idx+25,x,y);Qizi_Pic[idx+25].Visible=true;}}}Myfile.Close();}3.4“保存布阵”、“读取布阵”、“开始对战”以下是“保存布阵”、“读取布阵”、“开始对战”三个按钮单击事件代码。privatevoidbutton1_Click(objectsender,System.EventArgse)//保存布阵{write_qi_pu();}privatevoidbutton2_Click(objectsender,System.EventArgse)//读取布阵{read_qi_pu();}“开始对战”按钮单击事件将自己的布阵信息形成字符串str_send发给对方,并播放开始对战音乐。privatevoidbutton3_Click(objectsender,System.EventArgse)//开始游戏对战{Layout_Flag=false;//布阵标志stringstr_send;//允许对方布阵if(player==PlayerColor.Red){str_send="begin_layout|"+player.ToString();send(str_send);}str_send="layout|";byte[]m=newbyte[90];inti=0;for(intx=7;x<=11;x++)for(inty=12;y<=17;y++){m[i]=(byte)(18-x);m[i+1]=(byte)(18-y);m[i+2]=(byte)Map[x,y];str_send+=(18-x).ToString()+","+(18-y).ToString()+","+Map[x,y].ToString()+",";}//str_send="layout|"+Encoding.ASCII.GetString(m);toolStripStatusLabel1.Text="布阵完成";send(str_send);//发送布阵信息can_go=true;stringpath=System.Windows.Forms.Application.StartupPath;//bin路径path+="\\..\\..\\wav\\";PlaySound.Play(path+"junqistart.wav");button1.Visible=false;button2.Visible=false;button3.Visible=false;button5.Enabled=true;}3.5通信过程以下是网络通信的两个方法read()和send(stringinfo)。通过read()实现不断侦听本机设定的端口,得到对方发送来的信息,根据自己定义的通信协议中传送的“输赢信息”、“下的棋子位置信息”、“重新开始”等信息而分别处理。privatevoidread(){//侦听本地的端口号udpclient=newUdpClient(Convert.ToInt32(txt_port.Text));remote=null;//设定编码类型Encodingenc=Encoding.Unicode;intx,y,old_x,old_y,idx,old_idx;while(ReadFlag==true){try{Byte[]data=udpclient.Receive(refremote);//得到对方发送来的信息StringstrData=enc.GetString(data);string[]a=newstring[5];a=strData.Split('|');switch(a[0]){case"join"://获取传送信息到本地端口号的远程计算机IP地址stringremoteIP=remote.Address.ToString();//显示对方计算机IP地址toolStripStatusLabel1.Text=remoteIP+"对方已经加入,你是红方请布棋阵";//**************************//允许己方布阵button1.Visible=true;button2.Visible=true;button3.Visible=true;player=PlayerColor.Red;button4.Enabled=false;//联机按钮//允许对方布阵//stringstr_send="begin_layout|"+player.ToString();//send(str_send);break;case"begin_layout"://允许对方布阵 if(player==PlayerColor.Green&&toolStripStatusLabel1.Text=="程序处于等待联机状态!"){button1.Visible=true;button2.Visible=true;button3.Visible=true;}toolStripStatusLabel1.Text="你是绿方,可以开始布阵了";break;case"layout"://布阵信息 toolStripStatusLabel1.Text="收到对方布阵信息";get_message(a[1]);//读取对方布阵棋子信息 if(player==PlayerColor.Red){IsMyTurn=true;//能走棋toolStripStatusLabel1.Text="对方已经布阵,你是红方请先走棋";}break;case"move"://对方棋子移动信息 x=Convert.ToInt16(a[1]);y=Convert.ToInt16(a[2]);idx=Convert.ToInt16(a[3]);old_x=Convert.ToInt16(a[4]);old_y=Convert.ToInt16(a[5]);old_idx=Convert.ToInt16(a[6]);toolStripStatusLabel1.Text="对方下棋子位置:"+x.ToString()+","+y.ToString();//移动对方棋子,修改Map //判断是否有子被吃if(Map[x,y]==101)//仅仅走棋,而不是吃子{MoveChess(old_idx,x,y);Map[old_x,old_y]=101;}else//吃子{if(Map[x,y]!=idx)//目标处棋子被吃掉{Qizi_Pic[Map[x,y]].Visible=false;if(idx==101)//同时去掉{MoveChess(old_idx,x,y);Map[x,y]=101;Qizi_Pic[old_idx].Visible=false;}elseMoveChess(old_idx,x,y);Map[old_x,old_y]=101;}else//目标处棋子保留{Qizi_Pic[old_idx].Visible=false;//MoveChess(old_idx,x,y);Map[old_x,old_y]=101;}}IsMyTurn=true;reverse();break;case"over":toolStripStatusLabel1.Text=a[1]+"赢了此局";if(a[1]=="绿方")//将对方棋子全部去掉{for(intk=0;k<25;k++)Qizi_Pic[k].Visible=false;}else{for(intk=25;k<50;k++)Qizi_Pic[k].Visible=false;}can_go=false;button5.Enabled=true;break;case"reset":toolStripStatusLabel1.Text="对方重新开局了";Cls_Box();//隐藏棋盘所有棋子IsMyTurn=false;can_go=false;button5.Enabled=true;break;}}catch{//退出循环,结束线程break;}}}发送信息send(stringinfo)较为简单,主要实现创建UDP网络服务,传送信息到指定计算机的txt_remoteport端口号后,关闭UDP网络服务。privatevoidsend(stringinfo){//创建UDP网络服务UdpClientSendUdp=newUdpClient();IPAddressremoteIP;//判断IP地址的正确性try{remoteIP=IPAddress.Parse(txt_IP.Text);}catch{MessageBox.Show("请输入正确的IP地址!","错误");return;}IPEndPointremoteep=newIPEndPoint(remoteIP,Convert.ToInt32(txt_remoteport.Text));Byte[]buffer=null;Encodingenc=Encoding.Unicode;stringstr=info;buffer=enc.GetBytes(str.ToCharArray());//传送信息到指定计算机的txt_remoteport端口号SendUdp.Send(buffer,buffer.Length,remoteep);//textBox1.Clear();//关闭UDP网络服务SendUdp.Close();}get_message(steinga)从字符串a读取对方布阵棋子信息中,并且将对方棋子图片改为暗棋图片且控件显示出来,注意以前控件虽然已经加载但不可见。privatevoidget_message(stringa)//读取对方布阵棋子信息并且将对方棋子图片改为暗棋图片{//读取对方棋子 //30*3;注意不是25*3 intx,y,idx;intx2,y2;inti;string[]m=newstring[91];m=a.Split(',');stringfilename;for(i=0;i<90;i+=3){x=Convert.ToInt16(m[i]);y=Convert.ToInt16(m[i+1]);//x2=18-x;//OneConvertTwo(x,y,x2,y2)//y2=18-y;x2=x;y2=y;idx=Convert.ToInt16(m[i+2]);if(idx!=101){if(player!=PlayerColor.Green){MoveChess(idx,x2,y2);//将对方棋子图片改为暗棋图片filename=path+"\\..\\..\\bmp\\G.bmp";Qizi_Pic[idx].Image=Image.FromFile(filename);Qizi_Pic[idx].Visible=true;}else{MoveChess(idx,x2,y2);//将对方棋子图片改为暗棋图片filename=path+"\\..\\..\\bmp\\R.bmp";Qizi_Pic[idx].Image=Image.FromFile(filename);Qizi_Pic[idx].Visible=true;}}}}3.6“主机”、“从机”的选择两个radioButton按钮实现“主机”、“从机”的选择,实际上是不需要的,仅仅为了单机上实现两人可以对下的方便,如果两台机器对战,则不需要两个端口的对调。privatevoidradioButton1_CheckedChanged(objectsender,System.EventArgse){txt_port.Text="3333";txt_remoteport.Text="4444";}privatevoidradioButton2_CheckedChanged(objectsender,System.EventArgse){txt_port.Text="4444";txt_remoteport.Text="3333";}3.7“联机”、“重新开始”、“退出游戏”以下是“联机”、“重新开始”、“退出游戏”三个按钮单击事件代码。privatevoidbutton4_Click(objectsender,System.EventArgse)//联机{send("join|");//创建一个线程th=newThread(newThreadStart(read));th_flag=true;//启动线程th.Start();toolStripStatusLabel1.Text="程序处于等待联机状态!";button4.Enabled=false;}privatevoidCls_Box(){for(intk=0;k<50;k++)Qizi_Pic[k].Visible=false;button1.Visible=true;button2.Visible=true;button3.Visible=true;}privatevoidbutton5_Click(objectsender,System.EventArgse)//重新开始{Cls_Box();//隐藏棋盘所有棋子IsMyTurn=false;can_go=false;//reset();send("reset|");//button2.Enabled=false; Reset_flag=true;}privatevoidbutton6_Click(objectsender,System.EventArgse)//退出游戏{ReadFlag=false;if(th!=null&&th.IsAlive)th.Abort();Application.ExitThread();Application.Exit();}3.8窗体关闭为了避免用户不使用“退出游戏”按钮退出,所以写窗体关闭事件代码。privatevoidForm1_FormClosing(objectsender,FormClosingEventArgse){ReadFlag=false;if(th!=null&&th.IsAlive)th.Abort();Application.ExitThread();Application.Exit();}3.9游戏运行测试单击快捷键F5编译成功后,把此程序分发到网络中的两台计算机中。在正确输入本机端口号、对方IP地址、对方端口号后,单击“联机”按钮建立通信。如果你只有一台计算机,可以把这个项目编译成EXE文件,并且运行两个实例,可以将地址填写为:,这样一个作为主机(运行效果如图所示),另一个作为从机,便可以和自己对弈了。图3.91图3.924设计心得通过对“军棋游戏“的程序设计,我更深刻地了解了软件开发的重要性,同时,我解决实际问题的能力也得到了提高。本程序设计采用VisualStudio2010开发平台,采用C#语言面向对象的软件编程技术设计实现了网络对战军棋游戏的设计和开发。通过这次做课程设计,我学到了许多以前没有学到的东西,认识了许多自己以前没有认识到的问题。通过这段时间的学习,巩固加深了对C#的理解。希望以后能更好的去运用。5参考文献:[1]KarliWatson,ChristianNagel.C#入门经典(第五版)[M].清华大学出版社.2010[2]ChristiaNagel,BillEvjen,JayGlynn.C#高级编程(第七版)[M].清华大学出版社.2010[3]明日科技.C#从入门到精通(第三版)[M].清华大学出版社.2012[4]蒙祖强.C#程序设计教程[M].清华大学出版社.2010[5]梁冰,吕双.C#程序开发范例宝典(第二版)[M].人民邮电出版社.2009[6]徐安东,谭浩强.VisualC#程序设计基础[M].清华大学出版社.2012[7]郑阿奇.VisualC#网络编程[M].电子工业出版社.20116附录主要程序代码privateboolGo_Juge(intold_x,intold_y,intx,inty)//判断走棋的位置是否适当{label1.Text=old_x.ToString()+"old_x:old_y"+old_y.ToString()+":"+Map[old_x,old_y].ToString();label2.Text=x.ToString()+"x:y"+y.ToString()+Map[x,y].ToString();//是否是棋子区域if((x<=6&&y>=1&&y<=6)||(x>=12&&y>=1&&y<=6)||(x<=6&&y>=12&&y<=17)||(x>=12&&y>=12&&y<=17)||y>17)returnfalse;//目标位置是自己方的棋子//Why***********if(IsmyChess(x,y))returnfalse;//到行营,行营是否有子if(Is_Home(x,y)&&Map[x,y]!=101)returnfalse;//如“士”斜线从行营中出来**********if(Is_Home(old_x,old_y)&&Map[x,y]==101&&Math.Abs(x-old_x)*Math.Abs(y-old_y)==1)returntrue;//如“士”斜线走入行营************if(Is_Home(x,y)&&Map[x,y]==101&&Math.Abs(x-old_x)*Math.Abs(y-old_y)==1)returntrue;if(Math.Abs(x-old_x)==1&&y==old_y||Math.Abs(y-old_y)==1&&x==old_x)returntrue;//铁道线if(T_Juge(old_x,old_y,x,y))returntrue;//if(T_Juge(old_y,old_x,y,x)) returntrue;returnfalse;}privateboolT_Juge(intold_x,intold_y,intx,inty)//铁道线可以走否{//长垂直铁路线与弯道铁道线if(old_x==7){if(x==7&&y<17&&y>1&&y!=8&&y!=10&&VLine_Juge(old_y,y,x))returntrue;//长垂直铁路线if(x<7&&x>1&&y==7&&old_y<=7&&VLine_Juge(old_y,y,old_x)&&HLine_Juge(old_x,x,y))returntrue;if(x<7&&x>1&&y==11&&old_y>=11&&VLine_Juge(old_y,y,old_x)&&HLine_Juge(old_x,x,y))returntrue;}if(old_x==11){if(x==11&&y<17&&y>1&&y!=8&&y!=10&&VLine_Juge(old_y,y,x))returntrue;//长垂直铁路线if(x<17&&x>=12&&y==7&&old_y<=7&&VLine_Juge(old_y,y,old_x)&&HLine_Juge(old_x,x,y))returntrue;if(x<17&&x>=12&&y==11&&old_y>=11&&VLine_Juge(old_y,y,old_x)&&HLine_Juge(old_x,x,y))returntrue;}//短水平铁路线if(old_y==2||old_y==6||old_y==12||old_y==16)if(y==old_y&&Math.Abs(x-old_x)<=4&&HLine_Juge(old_x,x,y))returntrue;//********************************//长水平铁路线与弯道铁道线if(old_y==7){if(y==7&&x<17&&x>1&&x!=8&&x!=10&&HLine_Juge(old_x,x,y))returntrue;//************if(y<7&&y>1&&x==7&&old_x<=7&&HLine_Juge(old_x,x,old_y)&&VLine_Juge(old_y,y,x))returntrue;if(y<7&&y>1&&x==11&&old_x>=11&&HLine_Juge(old_x,x,old_y)&&VLine_Juge(old_y,y,x))returntrue;}if(old_y==11){if(y

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论