成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

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

python網絡編程之五子棋游戲

瀏覽:66日期: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 編程
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
国产精品v欧美精品v日韩| 欧美不卡高清| caoporn国产一区二区| 在线免费观看一区| 亚洲一区二区视频在线| 欧美午夜一区| 中文字幕不卡的av| 91免费国产在线| www国产精品av| 成人永久免费视频| 欧美日韩亚洲丝袜制服| 美女免费视频一区二区| 一区二区日韩免费看| 国产精品亲子伦对白| 欧美另类女人| 中文字幕av资源一区| 91美女在线视频| 国产三级久久久| 欧美一区免费视频| 国产日韩欧美制服另类| 91麻豆国产精品久久| 久久久国际精品| 欧美二区不卡| 国产精品久久久久aaaa| 欧美日韩一视频区二区| 欧美韩国日本一区| 欧美日韩一区二区三区四区在线观看| 久久久青草青青国产亚洲免观| 成人福利视频在线| 久久综合丝袜日本网| aaa欧美大片| 久久久久9999亚洲精品| 97久久精品人人澡人人爽| 国产亚洲精品超碰| 欧美国产先锋| 国产精品久久一级| 亚洲国产免费| 亚洲综合成人网| 色综合久久天天| 久久99精品网久久| 日韩精品一区二区三区老鸭窝| 99精品视频一区| 欧美国产日韩一二三区| 亚洲二区在线| 亚洲制服丝袜一区| 欧洲一区在线观看| 国产精品18久久久久久久久久久久 | 在线成人午夜影院| 99热这里都是精品| 1024成人网| 香蕉久久国产| 免费的成人av| 欧美大片在线观看| 国产伊人精品| 一卡二卡三卡日韩欧美| 91精品91久久久中77777| 国产麻豆精品久久一二三| 日韩欧美国产精品| 国产综合第一页| 性感美女极品91精品| 欧美日韩国产成人在线免费| av不卡在线播放| 亚洲精品一二三| 91福利区一区二区三区| 成人毛片在线观看| 亚洲欧洲精品一区二区精品久久久 | 1024成人网| 久久一区免费| 大胆亚洲人体视频| 亚洲欧洲www| 欧美在线一区二区| 91色九色蝌蚪| 视频一区欧美精品| 日韩一区二区三区精品视频| 激情成人亚洲| 免费在线观看日韩欧美| www国产精品av| 国产精品一区视频网站| 国产综合色精品一区二区三区| 久久日韩粉嫩一区二区三区| 亚洲欧美精品在线观看| 国产不卡视频在线观看| 亚洲人吸女人奶水| 欧美精品色一区二区三区| 欧美视频二区| 久久精品久久综合| 亚洲国产电影在线观看| 一本到不卡精品视频在线观看| 成年人网站91| 亚洲高清免费在线| 日韩一级视频免费观看在线| 日韩亚洲国产欧美| 国产中文一区二区三区| 日本一区二区在线不卡| 色婷婷av一区二区| 欧美日韩高清免费| 奇米一区二区三区| 欧美国产日韩精品免费观看| 欧美三级蜜桃2在线观看| 欧美午夜电影在线观看| 久久国产精品99久久人人澡| 国产精品久久夜| 欧美日本韩国一区二区三区视频| 激情综合激情| 国产精品白丝jk白祙喷水网站| 一区二区三区日韩精品视频| 欧美变态tickle挠乳网站| 久久国产精品高清| 色综合天天视频在线观看 | 性久久久久久久久| 欧美国产日韩精品免费观看| 欧美日韩美少妇| 亚洲国产婷婷| 国产成人在线视频播放| 亚洲线精品一区二区三区八戒| 久久色视频免费观看| 色噜噜狠狠一区二区三区果冻| 国产一区二区中文字幕免费看| 国产在线观看一区二区| 一区二区三区成人| 久久蜜桃香蕉精品一区二区三区| 老司机精品导航| 欧美天天在线| 成人免费观看av| 麻豆免费精品视频| 一二三四区精品视频| 久久久久久久国产精品影院| 欧美日韩成人综合在线一区二区| 夜夜嗨av一区二区三区网站四季av| 丁香婷婷综合网| 日本不卡1234视频| 一区二区欧美精品| 亚洲国产精品99久久久久久久久| 91精品国产综合久久久久久漫画| 国产伦精品一区二区三区四区免费 | 欧美私人免费视频| 亚洲一级在线| 欧美日韩亚洲一区在线观看| 懂色av中文字幕一区二区三区| 日韩av电影免费观看高清完整版 | 青青草一区二区三区| 亚洲色图19p| 国产日韩一级二级三级| 欧美一区二区在线视频| 另类天堂av| 亚洲天堂久久| 色综合久久综合| 国产成人啪午夜精品网站男同| 秋霞午夜鲁丝一区二区老狼| 亚洲宅男天堂在线观看无病毒| 中文字幕在线不卡视频| 久久久三级国产网站| 日韩免费视频线观看| 欧美日韩久久不卡| 在线免费视频一区二区| 免费看黄裸体一级大秀欧美| 极品日韩久久| 欧美日韩综合精品| 欧美在线黄色| 成人一区二区三区在线观看| 国内成+人亚洲+欧美+综合在线| 视频一区中文字幕| 亚洲地区一二三色| 亚洲国产欧美在线人成| 一区二区三区自拍| 亚洲人成网站影音先锋播放| 中文字幕欧美日韩一区| 国产日韩影视精品| 久久青草欧美一区二区三区| www激情久久| 久久中文娱乐网| 精品国产百合女同互慰| 欧美电影免费观看高清完整版在线观看| 3751色影院一区二区三区| 欧美亚洲日本国产| 色噜噜狠狠色综合中国| 一本色道久久综合亚洲精品按摩| 免费精品视频| 久久亚洲不卡| 在线免费视频一区二区| 欧美亚洲丝袜传媒另类| 欧美日韩国产a| 555夜色666亚洲国产免| 91精品国产免费| 日韩视频一区二区| 精品成人佐山爱一区二区| 精品国产免费久久| 国产亚洲综合性久久久影院| 欧美韩国日本不卡| 一区在线播放视频| 亚洲毛片av在线| 亚洲午夜久久久久久久久电影网| 亚洲一区视频在线观看视频| 无吗不卡中文字幕| 人人狠狠综合久久亚洲| 国产一区二区三区香蕉| 国产成人8x视频一区二区| 成人h动漫精品一区二| 欧美.www| aa国产精品|