《2022年VB程序网络五子棋 .pdf》由会员分享,可在线阅读,更多相关《2022年VB程序网络五子棋 .pdf(11页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、附加实例1网络五子棋本章介绍了使用VB 6.0 制作的一种网络五子棋游戏,可以联网进行下棋。本实例演示了网络通讯和小游戏编程,实例由两个窗体和一个模块组成,运行时双方可通过两台计算机连接,在下棋的同时也可以聊天。五子棋的游戏规则是双方任何一方的棋子在横向或斜向出现五个子连成一条线为赢。源程序位于“光盘chap17wzq.vbp ” 。1.1 网络五子棋实现步骤:(1)新建标准EXE 工程。(2)创建 frmmain 和 frmlogin 窗体。设置 Frmmain 窗体及其主要控件的属性如表17-1 所示。表 17-1 frmmain 窗体及其控件主要属性列表对象属性属性值Form Name
2、Frmmain Caption 网络五子棋Ico Wzq.ico Picture Name Pic1 Picture Qp.jpg Name Picbiaozhi Picture Biaozhi.jpg Text Name Txtchat Multiline True Text 空Combobox Name Combsendtxt Lable Name Lbqzhei Caption 空Name Lbzjhei Caption 空Name Lbqzbai Caption 空Name Lbzjbai Caption 空Name Lbsl Caption 胜Name Lbsb Caption 败c
3、ommandbutton Name Cmdsend Name Cmdclear Name Cmdnew Name Cmdreconnect Name Cmddisconnect Winsock Winsock1 设置 frmlogin 窗体及其控件属性如表17-2 所示。表 17-2 frmlogin 窗体及其控件属性名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 11 页 - - - - - - - - - 对象属性属性值Text Name Text1 text 空Na
4、me Text2 text 空CommandButton name Command1 caption 确定name Command2 caption 取消Optionbutton Name Option1 Caption 建立游戏Name Option2 Caption 加入游戏两个窗体设计完后的界面如图17-1 与图 17-2 所示。图 17-2 网络五子棋主窗体界面名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 11 页 - - - - - - - - - 图 17-
5、2 网络五子棋登录窗体界面(3)编写相应事件的代码。对于编写代码部分,我们专门拿出一小节的内容进行介绍,同时添加一些必要的分析内容。1.2 为各模块编写的主要代码及分析(1)Module1 模块主要代码分析此模块是本游戏的主要部分,负责判断是否五颗同样的子连成一条线,发送和接收所有资料,及下棋时画出棋子等。代码如下:Declare Sub BitBlt Lib gdi32 (ByVal hDestDC As Long, ByVal X As Long, ByVal Y As _ Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal h
6、SrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) Declare Function sndPlaySound Lib Winmm.dll Alias sndPlaySoundA (ByVal SoundName As String, ByVal Flags As Long) As Long bitblt 函数说明:将一幅位图从一个设备场景复制到另一个设备场景。源 DC 和目标 DC 相互间必须兼容返回值非零表示成功,零表示失败。会设置GetLastError 。参数说明HDestDC:目标设备
7、场景。x,y:对目标DC 中目标矩形左上角的坐标。nWidth,nHeight :欲传输图象的宽度和高度。hSrcDC:源设备场景。xSrc,ySrc:对源 DC 中源矩形左上角的坐标。dwRop:参数表示一种绘制方式,常用直接复制方式,这时就取vbSrcCopy。sndPlaySound 函数说明用来播放声音文件。SoundName 描述要播放的声音文件的位置和文件名。Flags 的取值能决定播放声音的模式。主要取值介绍如下:取 H0 时:为同步播放模式;取 H1 时:为异步播放模式;取 H2 时:当声音文件未找到就停止播音返回;名师资料总结 - - -精品资料欢迎下载 - - - - -
8、- - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 11 页 - - - - - - - - - 取 H8 时:为循环播放模式。声明全局变量Global Const srccopy = &HCC0020 Public map(1 To 15, 1 To 15) Public Win(1 To 2), Lost(1 To 2) Public Server Map 数组存放双方的棋子数据;win 和 lost 数组存放双方输和赢的记录;server存放目前为主机或加入连机为1 时是主机为2 时加入主机。DrawScreen 函数Sub Dr
9、awScreen() 画出棋子X = 3: Y = 2 For i = 1 To 15 For j = 1 To 15 If map(i, j) = 1 Then BitBlt frmmain.Pic1.hDC, X, Y, 21, 20, frmmain.Pic2.hDC, 0, 0, srccopy If map(i, j) = 2 Then BitBlt frmmain.Pic1.hDC, X, Y, 21, 20, frmmain.Pic2.hDC, 21, 0, srccopy If map(i, j) = 3 Then BitBlt frmmain.Pic1.hDC, X, Y,
10、21, 20, frmmain.Pic2.hDC, 42, 0, srccopy If map(i, j) = 4 Then BitBlt frmmain.Pic1.hDC, X, Y, 21, 20, frmmain.Pic2.hDC, 63, 0, srccopy Y = Y + 20 Next j Y = 2 X = X + 21 Next i frmmain.Pic1.Refresh End Sub Drawscreen 负责画棋子,根据map 数组的取值将棋子重绘一遍。Send过程代码:Sub Send(mydata As String) 送出资料frmmain.Winsock1.S
11、endData mydata End Sub Send过程用来发送数据。GemyData 过程代码:Sub GetMyData(Size) 接受资料Dim mydata As String frmmain.Winsock1.GetData mydata, vbString Select Case Mid(mydata, 1, 1) Case 1 棋子的资料If Server = 1 Then s = 2 Else s = 1 Call sndPlaySound(put.wav, &H0) sx = Asc(Mid(mydata, 2, 1) sy = Asc(Mid(mydata, 3, 1)
12、 map(sx, sy) = s + 2 DrawScreen map(sx, sy) = s a = GameOver(s) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 11 页 - - - - - - - - - frmmain.Pic1.Enabled = True If a = s Then frmmain.lbsb.Visible = True frmmain.Pic1.Enabled = False Lost(Server) = Lost(Server)
13、+ 1 Win(s) = Win(s) + 1 frmmain.lbzjhei.Caption = 战绩: + Str(Win(1) + 胜 + Str(Lost(1) + 败 frmmain.lbzjbai.Caption = 战绩: + Str(Win(2) + 胜 + Str(Lost(2) + 败 End If Case 2 名字资料If Server = 1 Then frmmain.lbqzbai.Caption = Mid(mydata, 2, Size - 1) Send 2 + frmmain.lbqzhei.Caption Else frmmain.lbqzhei.Capt
14、ion = Mid(mydata, 2, Size - 1) End If Case 3 开新棋局送的资料ResetGame Case 4 对方断线送的资料frmmain.Label2.Caption = 尚未连线 frmmain.Pic1.Enabled = False CloseCom frmmain.Winsock1.Close Case 5 聊天视窗的资料frmmain.txtchat.Text = frmmain.txtchat.Text + 白方 : + Mid(mydata, 2, Size - 1) & Chr(13) & Chr(10) Case Else End Selec
15、t End Sub GetMyData 过程 负责接收数据,其中mydata 数据中第一个字符为标志位,为1 时接收到的是棋子资料,为2 时接收到的是用户名字资料,为3 时接收到的是开新局的资料,为4时接收到的是连线的资料;为5时接收到的是聊天资料。GameOver 过程代码:Function GameOver(a) 判断是否同样的五颗子连成一条线For i = 1 To 11 For j = 1 To 11 If map(i, j) = a And map(i + 1, j + 1) = a And map(i + 2, j + 2) = a And map(i + 3, j + 3) =
16、a And map(i + 4, j + 4) = a Then GameOver = a: Exit Function Next j Next i For i = 5 To 15 For j = 5 To 15 If map(i, j) = a And map(i - 1, j - 1) = a And map(i - 2, j - 2) = a And map(i - 3, j - 3) = a And map(i - 4, j - 4) = a Then GameOver = a: Exit Function 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - -
17、- - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 11 页 - - - - - - - - - Next j Next i For i = 5 To 15 For j = 1 To 11 If map(i, j) = a And map(i - 1, j + 1) = a And map(i - 2, j + 2) = a And map(i - 3, j + 3) = a And map(i - 4, j + 4) = a Then GameOver = a: Exit Function Next j Next i For i = 1 To 11
18、For j = 5 To 15 If map(i, j) = a And map(i + 1, j - 1) = a And map(i + 2, j - 2) = a And map(i + 3, j - 3) = a And map(i + 4, j - 4) = a Then GameOver = a: Exit Function Next j Next i For i = 1 To 15 For j = 5 To 11 If map(i, j) = a And map(i, j - 1) = a And map(i, j - 2) = a And map(i, j - 3) = a A
19、nd map(i, j - 4) = a Then GameOver = a: Exit Function If map(i, j) = a And map(i, j + 1) = a And map(i, j + 2) = a And map(i, j + 3) = a And map(i, j + 4) = a Then GameOver = a: Exit Function Next j Next i For i = 5 To 11 For j = 1 To 15 If map(i, j) = a And map(i + 1, j) = a And map(i + 2, j) = a A
20、nd map(i + 3, j) = a And map(i + 4, j) = a Then GameOver = a: Exit Function If map(i, j) = a And map(i - 1, j) = a And map(i - 2, j) = a And map(i - 3, j) = a And map(i - 4, j) = a Then GameOver = a: Exit Function Next j Next i GameOver = 0 End Function GameOver 函数负责判断下棋时,是否五颗同样的子连成一条线。参数a 值代表服务器端还是
21、客户端如果连在一条线上的子(用map 数组的值来标识)都等于a 时游戏结束,此a的值代表服务器端表示服务器端胜否则客户端胜。因为棋盘纵横都是15 个格,所以只判断11 个格的值即可,还剩4 个格的时候不可能连成5 个。这样共有五种组合。ResetGame 过程代码:Sub ResetGame() 开新棋局frmmain.Pic1.Cls For i = 1 To 15 For j = 1 To 15 map(i, j) = 0 Next j 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - -
22、 第 6 页,共 11 页 - - - - - - - - - Next i frmmain.lbsl.Visible = False frmmain.lbsb.Visible = False End Sub ResetGame 过程负责开新棋局时将pic1 上的图画及数组的值清空,同时将表示胜负的图片框隐藏。(2)Frmlogin.frm 代码本窗体主要负责用户登录及作服务器端登录还是客房端登录。窗体加载事件代码:Private Sub Form_Load() frmmain.Enabled = False CloseCom Text2.Text = frmmain.Winsock1.Loc
23、alIP Server = 1 Win(1) = 0 Win(2) = 0 Lost(1) = 0 Lost(2) = 0 End Sub 窗体加载时负责为控件或数组赋初值,其中frmmain.Winsock1.LocalIP获取本机的IP。确定按钮代码:Private Sub Command1_Click() If Server = 1 Then frmmain.Winsock1.LocalPort = 5238 frmmain.Winsock1.Listen frmmain.lbqzhei.Caption = 黑子: + Text1.Text frmmain.lbqzbai.Caption
24、 = frmmain.Label2.Caption = 等待加入中 frmmain.Caption = 网络五子棋 -黑方 Else frmmain.Winsock1.RemoteHost = Text2.Text frmmain.Winsock1.RemotePort = 5238 frmmain.Winsock1.LocalPort = 0 frmmain.Winsock1.Connect frmmain.lbqzhei.Caption = frmmain.lbqzbai.Caption = 白子: + Text1.Text frmmain.Label2.Caption = 正在连线到主机
25、 frmmain.Caption = 网络五子棋 -白方 End If frmmain.lbzjhei.Caption = 战绩: + Str(Win(1) + 胜 + Str(Lost(1) + 败 frmmain.lbzjbai.Caption = 战绩: + Str(Win(2) + 胜 + Str(Lost(2) + 败 frmmain.Show frmmain.Pic1.Enabled = False frmmain.Enabled = True 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - -
26、 - - - - 第 7 页,共 11 页 - - - - - - - - - frmlogin.Hide Unload frmlogin ResetGame End Sub 其中 locaport 用来设定服务器端的端口号,注意端口号不能和其它服务端口号重复,如常用的 http 服务端口号是80;ftp 服务端口号为21;telenet 端口号为23 等。设置了服务器的端口号, 客户端的端口号必须和服务器端的端口号一致才能相互通讯。设置客户端端口号用 remoteport。Remotehost 用来指一客户端要连接的服务器,其值可以是服务器名也可以是一个 IP 本程序使用的是IP。调用 Co
27、nnect 方法进行连接服务器。Frmmain.frm代码分析本窗体是程序的主窗体,双方游戏的主界面,可以下棋并聊天。窗体加载事件代码:Private Sub Form_Load() Open App.Path + chat.txt For Input As #1 Do Input #1, Gdata Combsendtxt.AddItem Gdata If EOF(1) Then Close #1: Exit Sub Loop End Sub 窗体加载时从chat.txt 中读取聊天常用语并添加到combsendtxt 组合框中。窗体卸载事件代码:Private Sub Form_Unloa
28、d(Cancel As Integer) If Label2.Caption = 连线中 Then Send 4 DoEvents End If Winsock1.Close End End Sub 发送断线数据,关闭Winsock。Pic1 窗体 MouseUp 事件代码:Private Sub Pic1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single) If Button = 1 Then sx = Fix(X / 21) + 1: sy = Fix(Y / 20) + 1 If map(sx, s
29、y) 0 Then Exit Sub Call sndPlaySound(put.wav, &H0) map(sx, sy) = Server DrawScreen a = GameOver(Server) If a = Server Then lbsl.Visible = True Win(Server) = Win(Server) + 1 If Server = 1 Then Lost(2) = Lost(2) + 1 Else Lost(1) = Lost(1) + 1 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师
30、精心整理 - - - - - - - 第 8 页,共 11 页 - - - - - - - - - frmmain.lbzjhei.Caption = 战绩: + Str(Win(1) + 胜 + Str(Lost(1) + 败 frmmain.lbzjbai.Caption = 战绩: + Str(Win(2) + 胜 + Str(Lost(2) + 败 End If Send 1 + Chr(sx) + Chr(sy) Pic1.Enabled = False End If End Sub 其中 button=1 表示左键, sx 和 sy 是通过鼠标坐标计算出来的,map(sx,sy)表
31、示某个格,用 map(sx,sy)=server 来赋值表示哪方下棋,其值为1 表示黑方下子,为2 时表示白方下子,为 0 时表示该格还没有放棋子。If map(sx,sy)0 then exit sub一句,如果 map(sx,sy)的值非 0说明该格已下有棋子,退出该mouseup事件过程即此格不允许下棋。调用DrawScreen 过程画出正确的棋子;a=GameOver(Server)判断哪方赢;Send 1 + Chr(sx) + Chr(sy) 发送下棋数据。连接请求事件代码:Private Sub Winsock1_ConnectionRequest(ByVal requestID
32、 As Long) If Winsock1.State sckClosed Then Winsock1.Close Winsock1.Accept requestID Label2.Caption = 连线中 OpenCom Pic1.Enabled = True End Sub 数据到达事件代码:Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long) GetMyData bytesTotal End Sub 数据到达时调用getmydata 函数连接事件代码:Private Sub Winsock1_Connect() Label
33、2.Caption = 连线中 Send 2 + lbqzbai.Caption OpenCom End Sub 1.3 生成可执行程序选择【文件】【生成工程wzq.exe 】菜单命令,执行此命令会在程序目录中生成一个名为 wzq.exe 的文件。 将生成的wzq.exe 与 chat.txt 和 put.wav 这三个文件拷贝到其它机器上,这时我们开始进行测试,首先,得保证两台机器能正常连接和通讯。然后双方都运行wzq.exe,出现如图17-1 所示的登录界面,建立服务器方输入昵称后,直接确定即可完成服务器端登录,登录前记下主机IP(本实例为192.168.1.3) 。名师资料总结 - -
34、-精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 11 页 - - - - - - - - - 图 17-1 用户登录界面登录后出现等待客户端登录界面如图17-2 所示。图 17-2 等待客户端登录客户端在用户登录界面,输入昵称, 单击加入游戏, 在主机 IP 框内输入192.168.1.3并确定,即可完成客户端登录。这时双方可以对弈了。对弈时双方的界面如图17-3 和图 17-4 所示。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - -
35、 - 名师精心整理 - - - - - - - 第 10 页,共 11 页 - - - - - - - - - 17-3 对弈时服务器端界面图 17-3 对弈时客户端界面提示 :输入的 IP 号根据联网计算机的不同而不同。1.4 小结:在本章内容中介绍了一个小游戏编程的实例,其实使用VB 完全可以编写大型的游戏软件,本程序只是实现简单的下棋、聊天,而且双方下棋时间没有限制,如果感兴趣可以自行添加诸如观战、 注册和密码登录等功能,使其更加完善。 通过该实例, 希望读者能够开拓视野,并能够编写出一些相应的游戏来。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 11 页 - - - - - - - - -