电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

python網絡編程之五子棋游戲

瀏覽:19日期:2022-07-25 15:58:31

一.本案例基于UDP的socket編程方法來制作五子棋程序,網絡五子棋采用C/S架構,分為服務器端和客戶端,游戲時服務端首先啟動,當客戶端啟動連接后,服務器端可以走棋,輪到自己棋才可以在棋盤上落子,同時下方標簽會顯示對方走起信息,服務器端用戶可以通過“退出游戲”按鈕可以結束游戲;

1.數據通信協議

網絡五子棋游戲設計的難點在于對方進行通信,這里使用面向非連接的Socket編程,Socket編程用于C/S開發,在這類應用中,客戶端和服務器端通常需要先建立連接,然后發送和接收數據,交互完成后需要斷開連接,本章采用基于UDP的Socket編程實現,這里雖然兩臺計算機不分主次,但涉及時候假設一臺作為服務器端,等待其他方加入,其他想加入必須輸入服務器端主機的IP;

下面展示一些 數據通信協議代碼。

def receiveMessage(): global s while True: global addr data,addr=s.recvfrom(1024) data=data.decode(’utf-8’) a=data.split('|') if not data: print('client has exited!') break elif a[0]==’join’: #連接服務器請求 print(’client 連接服務器!’) label1['text']=’client連接服務器成功,請你走棋!’ elif a[0]==’exit’: print(’client 對方退出!’) label1['text']=’client對方退出,游戲結束!’ elif a[0]==’over’: print(’對方贏信息!’) label1['text']=data.split('|')[0] showinfo(title='提示',message=data.split('|')[1]) elif a[0]==’move’: print(’received:’,data,’from’,addr) p=a[1].split(',') x=int(p[0]) y=int(p[1]) print(p[0],p[1]) label1['text']='客戶端走的位置'+p[0]+p[1] drawOtherChess(x,y) s.close()

2.判斷輸贏的算法

本游戲關鍵技術就是判斷輸贏的算法,對于算法實現大致可以分為以下幾個部分:

(1)判斷X=Y軸上是否形成五子連珠;

(2)判斷X=-Y軸上是否形成五子連珠;

(3)判斷X軸上是否形成五子連珠;

(4)判斷Y軸上是否形成五子連珠;

#輸贏判斷def win_lose(): a=str(turn) print('a=',a) for i in range(0,11): for j in range(0,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: print('x=y軸上形成五子連珠') return True for i in range(4,15): for j in range(0,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: print('x=-y軸上形成五子連珠') return True for i in range(0,15): for j in range(4,15): if map[i][j]==a and map[i][j-1]==a and map[i][j-2]==a and map[i][j-2]==a and map[i][j-4]==a: print('Y軸上形成了五子連珠') return True for i in range(0,11): for j in range(0,15): 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: print('X軸形成五子連珠') return True return False

二. 源代碼:

1.客戶端編程代碼如下:

from tkinter import *from tkinter.messagebox import *import socketimport threadingimport os#主程序root=Tk()root.title('網絡五子棋v2.0--UDP客戶端')imgs=[PhotoImage(file=’E:gameBlackStone.gif’),PhotoImage(file=’E:gameWhiteStone.gif’)]turn=0Myturn=-1#畫對方棋子def drawOtherChess(x,y): global turn img1=imgs[turn] cv.create_image((x*40+20,y*40+20),image=img1) cv.pack() map[x][y]=str(turn) #換下一方走棋 if turn==0: turn=1 else: turn=0#發送消息def sendMessage(pos): global s s.sendto(pos.encode(),(host,port))#退出函數def callexit(event): pos='exit|' sendMessage(pos) os._exit(0)#走棋函數def callback(event): global turn global Myturn if Myturn==-1: Myturn=turn else: if(Myturn!=turn): showinfo(title='提示',message='還沒輪到自己走棋') return #print('clicked at',event.x,event.y) x=(event.x)//40 y=(event.y)//40 print('clicked at',x,y,turn) if map[x][y]!=' ': showinfo(title='提示',message='已有棋子') else: img1=imgs[turn] cv.create_image((x*40+20,y*40+20),image=img1) cv.pack() map[x][y]=str(turn) pos=str(x)+’,’+str(y) sendMessage('move|'+pos) print('客戶端走的位置',pos) label1['text']='客戶端走的位置'+pos #輸出輸贏信息 if win_lose( )==True: if turn==0: showinfo(title='提示',message='黑方你贏了') sendMessage('over|黑方你贏了!') else: showinfo(title='提示',message='白方你贏了!') sendMessage('over|白方你贏了!') #換下一方走棋: if turn==0: turn=1 else: turn=0#畫棋盤def drawQiPan( ): #畫棋盤 for i in range(0,15): cv.create_line(20,20+40*i,580,20+40*i,width=2) for i in range(0,15): cv.create_line(20+40*i,20,20+40*i,580,width=2) cv.pack()#輸贏判斷def win_lose(): a=str(turn) print('a=',a) for i in range(0,11): for j in range(0,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: print('x=y軸上形成五子連珠') return True for i in range(4,15): for j in range(0,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: print('x=-y軸上形成五子連珠') return True for i in range(0,15): for j in range(4,15): if map[i][j]==a and map[i][j-1]==a and map[i][j-2]==a and map[i][j-2]==a and map[i][j-4]==a: print('Y軸上形成了五子連珠') return True for i in range(0,11): for j in range(0,15): 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: print('X軸形成五子連珠') return True return False#接受消息def receiveMessage(): #接受消息 global s while True: data = s.recv(1024).decode(’utf-8’) a = data.split('|') if not data: print(’server has exited!’) break elif a[0] == ’exit’: print(’對方退出!’) lanel1['text'] = ’對方退出!游戲結束!’ elif a[0] == ’over’: print(’對方贏信息!’) label1['text'] = data.split('|')[0] showinfo(title='提示', message=data.split('|')[1]) elif a[0] == ’move’: print(’received:’, data) p = a[1].split(',') x = int(p[0]) y = int(p[1]) print(p[0], p[1]) label1['text'] = '服務器走的位置' + p[0] + p[1] drawOtherChess(x,y) s.close()#啟動線程接受客戶端消息def startNewThread(): thread=threading.Thread(target=receiveMessage,args=()) thread.setDaemon(True) thread.start()#主程序map=[[' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '] for y in range(15)]cv=Canvas(root,bg=’green’,width=610,height=610)drawQiPan()cv.bind('<Button-1>',callback)cv.pack()label1=Label(root,text='客戶端...')label1.pack()button1=Button(root,text='退出游戲')button1.bind('<Button-1>',callexit)button1.pack()#創建UDPs=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)port=8000host=’localhost’pos=’join|’sendMessage(pos)startNewThread()root.mainloop()

2.數據通信協議源代碼:

下面展示一些 數據通信協議源代碼。

def receiveMessage(): global s while True: global addr data,addr=s.recvfrom(1024) data=data.decode(’utf-8’) a=data.split('|') if not data: print('client has exited!') break elif a[0]==’join’: #連接服務器請求 print(’client 連接服務器!’) label1['text']=’client連接服務器成功,請你走棋!’ elif a[0]==’exit’: print(’client 對方退出!’) label1['text']=’client對方退出,游戲結束!’ elif a[0]==’over’: print(’對方贏信息!’) label1['text']=data.split('|')[0] showinfo(title='提示',message=data.split('|')[1]) elif a[0]==’move’: print(’received:’,data,’from’,addr) p=a[1].split(',') x=int(p[0]) y=int(p[1]) print(p[0],p[1]) label1['text']='客戶端走的位置'+p[0]+p[1] drawOtherChess(x,y) s.close()#輸贏判斷def win_lose(): a=str(turn) print('a=',a) for i in range(0,11): for j in range(0,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: print('x=y軸上形成五子連珠') return True for i in range(4,15): for j in range(0,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: print('x=-y軸上形成五子連珠') return True for i in range(0,15): for j in range(4,15): if map[i][j]==a and map[i][j-1]==a and map[i][j-2]==a and map[i][j-2]==a and map[i][j-4]==a: print('Y軸上形成了五子連珠') return True for i in range(0,11): for j in range(0,15): 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: print('X軸形成五子連珠') return True return Falsedef checkwin(x,y): flag=False count=1 color=map[x][y] i=1 #橫向判斷 while color==map[x+i][y]: count=count+1 i=i+1 i=1 while color==map[x-i][y]: count=count+1 i=i+1 if count>=5: flag=True #豎向判斷 i=1 while color==map[x][y+i]: count=count+1 i=i+1 i=1 while color==map[x][y-i]: count=count+1 i=i+1 if count>=5: flag=True #x=y判斷 i=1 j=1 while color==map[x+i][y+i]: count=count+1 i=i+1 j=j+1 if count>=5: flag=True j=1 i=1 while color==map[x-i][y-i]: count=count+1 i=i+1 j=j+1 if count>=5: flag=True

3.服務器端源代碼

客戶端源代碼如下:

from tkinter import *from tkinter.messagebox import *import socket,threading,osdef drawQiPan(): for i in range(0,15): cv.create_line(20,20+40*i,580,20+40*i,width=2) for i in range(0,15): cv.create_line(20+40*i,20,20+40*i,580,width=2) cv.pack()#走棋函數def callpos(event): global turn global Myturn if Myturn==-1: #第一次確認自己的角色 Myturn=turn else: if(Myturn!=turn): showinfo(title='提示',message='還沒輪到自己下棋') return #print('clicked at',event.x,event.y,true) x=(event.x)//40 y=(event.y)//40 print('clicked at',x,y,turn) if map[x][y]!=' ': showinfo(title='提示',message='已有棋子') else: img1=imgs[turn] cv.create_image((x*40+20,y*40+20),image=img1) cv.pack() map[x][y]=str(turn) pos=str(x)+','+str(y) sendMessage('move|'+pos) print('服務器走的位置',pos) label1['text']='服務器走的位置'+pos #輸出輸贏信息 if win_lose( )==True: if turn==0: showinfo(title='提示',message='黑方你贏了') sendMessage('over|黑方你贏了') else: showinfo(title='提示', message='白方你贏了') sendMessage('over|白方你贏了') #換下一方走棋 if turn==0: turn=1 else: turn=0#發送消息def sendMessage(pos): global s global addr s.sendto(pos.encode(),addr)#退出函數def callexit(event): pos='exit|' sendMessage(pos) os._exit(0)#畫對方棋子def drawOtherChess(x,y): global turn img1=imgs[turn] cv.create_image((x*40+20,y*40+20),image=img1) cv.pack() map[x][y]=str(turn) #換下一方走棋 if turn==0: turn=1 else: turn=0#判斷整個棋盤的輸贏def win_lose(): a=str(turn) print('a=',a) for i in range(0,11): for j in range(0,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: print('x=y軸上形成五子連珠') return True for i in range(4,15): for j in range(0,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: print('x=-y軸上形成五子連珠') return True for i in range(0,15): for j in range(4,15): if map[i][j]==a and map[i][j-1]==a and map[i][j-2]==a and map[i][j-2]==a and map[i][j-4]==a: print('Y軸上形成了五子連珠') return True for i in range(0,11): for j in range(0,15): 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: print('X軸形成五子連珠') return True return False#輸出map地圖def print_map(): for j in range(0,15): for i in range(0,15): print(map[i][j],end=’ ’) print(’w’)#接受消息def receiveMessage(): global s while True:#接受客戶端發送的消息 global addr data,addr=s.recvfrom(1024) data=data.decode(’utf-8’) a=data.split('|') if not data: print(’client has exited!’) break elif a[0]==’join’:#連接服務器的請求 print(’client 連接服務器!’) label1['text']=’client連接服務器成功,請你走棋!’ elif a[0]==’exit’: print(’client對方退出!’) label1['text']=’client對方退出,游戲結束!’ elif a[0]==’over’: print(’對方贏信息!’) labl1['text']==data.split('|')[0] showinfo(title='提示',message=data.split('1')[1]) elif a[0]==’move’: print(’received:’,data,’from’,addr) p=a[1].split(',') x=int(p[0]) y=int(p[1]) print(p[0],p[1]) label1['text']='客戶端走的位置'+p[0]+p[1] drawOtherChess(x,y) s.close()def startNewThread( ):#啟動新線程來接受客戶端消息 thread=threading.Thread(target=receiveMessage,args=()) thread.setDaemon(True) thread.start()root=Tk()root.title('網絡五子棋v2.0-服務器端')imgs=[PhotoImage(file=’E:gameBlackStone.gif’),PhotoImage(file=’E:gameWhiteStone.gif’)]turn=0Myturn=-1map=[[' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '] for y in range(15)]cv=Canvas(root,bg=’green’,width=610,height=610)drawQiPan()cv.bind('<Button-1>',callpos)cv.pack()label1=Label(root,text='服務器端...')label1.pack()button1=Button(root,text='退出游戲')button1.bind('<Button-1>',callexit)button1.pack()#創建UDP SOCKETs=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)s.bind((’localhost’,8000))addr=(’localhost’,8000)startNewThread()root.mainloop()

運行結果展示:

python網絡編程之五子棋游戲

所有的都在這里了。

更多有趣的經典小游戲實現專題,也分享給大家:

C++經典小游戲匯總

python經典小游戲匯總

python俄羅斯方塊游戲集合

JavaScript經典游戲 玩不停

java經典小游戲匯總

javascript經典小游戲匯總

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 高压互感器,电流互感器,电压互感器-上海鄂互电气科技有限公司 | 专业甜品培训学校_广东糖水培训_奶茶培训_特色小吃培训_广州烘趣甜品培训机构 | 铝镁锰板厂家_进口钛锌板_铝镁锰波浪板_铝镁锰墙面板_铝镁锰屋面-杭州军晟金属建筑材料 | 5L旋转蒸发器-20L-50L旋转蒸发器-上海越众仪器设备有限公司 | 杭州双螺杆挤出机-百科| 橡胶电子拉力机-塑料-微电脑电子拉力试验机厂家-江苏天源 | 搪瓷搅拌器,搪玻璃搅拌器,搪玻璃冷凝器_厂家-淄博越宏化工设备 | 矿用履带式平板车|探水钻机|气动架柱式钻机|架柱式液压回转钻机|履带式钻机-启睿探水钻机厂家 | 颚式破碎机,圆锥破碎机,制砂机-新乡市德诚机电制造有限公司 | 盘扣式脚手架-附着式升降脚手架-移动脚手架,专ye承包服务商 - 苏州安踏脚手架工程有限公司 | 精密机械零件加工_CNC加工_精密加工_数控车床加工_精密机械加工_机械零部件加工厂 | 专业生物有机肥造粒机,粉状有机肥生产线,槽式翻堆机厂家-郑州华之强重工科技有限公司 | 智能终端_RTU_dcm_北斗星空自动化科技 | 聚合氯化铝-碱式氯化铝-聚合硫酸铁-聚氯化铝铁生产厂家多少钱一吨-聚丙烯酰胺价格_河南浩博净水材料有限公司 | 科箭WMS仓库管理软件-TMS物流管理系统-科箭SaaS云服务 | 防潮防水通风密闭门源头实力厂家 - 北京酷思帝克门窗 | 不锈钢管件(不锈钢弯头,不锈钢三通,不锈钢大小头),不锈钢法兰「厂家」-浙江志通管阀 | 医用酒精_84消毒液_碘伏消毒液等医用消毒液-漓峰消毒官网 | 超声波流量计_流量标准装置生产厂家 _河南盛天精密测控 | 小港信息港-鹤壁信息港 鹤壁老百姓便民生活信息网站 | 定时排水阀/排气阀-仪表三通旋塞阀-直角式脉冲电磁阀-永嘉良科阀门有限公司 | 钛板_钛管_钛棒_钛盘管-无锡市盛钛科技有限公司 | 内六角扳手「厂家」-温州市威豪五金工具有限公司 | 卫生纸复卷机|抽纸机|卫生纸加工设备|做卫生纸机器|小型卫生纸加工需要什么设备|卫生纸机器设备多少钱一台|许昌恒源纸品机械有限公司 | 微型气象仪_气象传感器_防爆气象传感器-天合传感器大全 | 双相钢_双相不锈钢_双相钢圆钢棒_双相不锈钢报价「海新双相钢」 双能x射线骨密度检测仪_dxa骨密度仪_双能x线骨密度仪_品牌厂家【品源医疗】 | 英语词典_成语词典_日语词典_法语词典_在线词典网 | 爆破器材运输车|烟花爆竹运输车|1-9类危险品厢式运输车|湖北江南专用特种汽车有限公司 | 动力配电箱-不锈钢配电箱-高压开关柜-重庆宇轩机电设备有限公司 聚天冬氨酸,亚氨基二琥珀酸四钠,PASP,IDS - 远联化工 | 上海刑事律师|刑事辩护律师|专业刑事犯罪辩护律师免费咨询-[尤辰荣]金牌上海刑事律师团队 | 对夹式止回阀_对夹式蝶形止回阀_对夹式软密封止回阀_超薄型止回阀_不锈钢底阀-温州上炬阀门科技有限公司 | 无纺布包装机|径向缠绕包装机|缠绕膜打包机-上海晏陵智能设备有限公司 | 仓储货架_南京货架_钢制托盘_仓储笼_隔离网_环球零件盒_诺力液压车_货架-南京一品仓储设备制造公司 | FAG轴承,苏州FAG轴承,德国FAG轴承-恩梯必传动设备(苏州)有限公司 | 重庆网站建设,重庆网站设计,重庆网站制作,重庆seo,重庆做网站,重庆seo,重庆公众号运营,重庆小程序开发 | 上海质量认证办理中心| 旋转气浴恒温振荡器-往复式水浴恒温振荡器-金怡百科 | 洁净实验室工程-成都手术室净化-无尘车间装修-四川华锐净化公司-洁净室专业厂家 | 电动葫芦-河北悍象起重机械有限公司 | 搜活动房网—活动房_集装箱活动房_集成房屋_活动房屋 | 2-羟基泽兰内酯-乙酰蒲公英萜醇-甘草查尔酮A-上海纯优生物科技有限公司 |