日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

python網(wǎng)絡(luò)編程之五子棋游戲

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

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

1.數(shù)據(jù)通信協(xié)議

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

下面展示一些 數(shù)據(jù)通信協(xié)議代碼。

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’: #連接服務(wù)器請求 print(’client 連接服務(wù)器!’) label1['text']=’client連接服務(wù)器成功,請你走棋!’ elif a[0]==’exit’: print(’client 對方退出!’) label1['text']=’client對方退出,游戲結(jié)束!’ 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.判斷輸贏的算法

本游戲關(guān)鍵技術(shù)就是判斷輸贏的算法,對于算法實現(xiàn)大致可以分為以下幾個部分:

(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('網(wǎng)絡(luò)五子棋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#發(fā)送消息def sendMessage(pos): global s s.sendto(pos.encode(),(host,port))#退出函數(shù)def callexit(event): pos='exit|' sendMessage(pos) os._exit(0)#走棋函數(shù)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'] = ’對方退出!游戲結(jié)束!’ 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'] = '服務(wù)器走的位置' + 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()#創(chuàng)建UDPs=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)port=8000host=’localhost’pos=’join|’sendMessage(pos)startNewThread()root.mainloop()

2.數(shù)據(jù)通信協(xié)議源代碼:

下面展示一些 數(shù)據(jù)通信協(xié)議源代碼。

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’: #連接服務(wù)器請求 print(’client 連接服務(wù)器!’) label1['text']=’client連接服務(wù)器成功,請你走棋!’ elif a[0]==’exit’: print(’client 對方退出!’) label1['text']=’client對方退出,游戲結(jié)束!’ 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.服務(wù)器端源代碼

客戶端源代碼如下:

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()#走棋函數(shù)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('服務(wù)器走的位置',pos) label1['text']='服務(wù)器走的位置'+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#發(fā)送消息def sendMessage(pos): global s global addr s.sendto(pos.encode(),addr)#退出函數(shù)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:#接受客戶端發(fā)送的消息 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’:#連接服務(wù)器的請求 print(’client 連接服務(wù)器!’) label1['text']=’client連接服務(wù)器成功,請你走棋!’ elif a[0]==’exit’: print(’client對方退出!’) label1['text']=’client對方退出,游戲結(jié)束!’ 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('網(wǎng)絡(luò)五子棋v2.0-服務(wù)器端')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='服務(wù)器端...')label1.pack()button1=Button(root,text='退出游戲')button1.bind('<Button-1>',callexit)button1.pack()#創(chuàng)建UDP SOCKETs=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)s.bind((’localhost’,8000))addr=(’localhost’,8000)startNewThread()root.mainloop()

運行結(jié)果展示:

python網(wǎng)絡(luò)編程之五子棋游戲

所有的都在這里了。

更多有趣的經(jīng)典小游戲?qū)崿F(xiàn)專題,也分享給大家:

C++經(jīng)典小游戲匯總

python經(jīng)典小游戲匯總

python俄羅斯方塊游戲集合

JavaScript經(jīng)典游戲 玩不停

java經(jīng)典小游戲匯總

javascript經(jīng)典小游戲匯總

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

標簽: Python 編程
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲精品乱码| 亚洲一级大片| 国内一区二区三区| 精品一区二区三区中文字幕| 精品一区二区三区视频在线播放| 国产精品a级| 精品国产欧美| 日韩中文影院| 欧美aa国产视频| 另类激情亚洲| 国产欧美日韩免费观看| 成人台湾亚洲精品一区二区 | 亚洲精品一区二区在线播放∴| 精品美女在线视频| 日韩视频网站在线观看| 日韩欧美不卡| 成人久久一区| 蜜桃tv一区二区三区| 久久国产中文字幕| 99久久www免费| 久久婷婷亚洲| 狠狠操综合网| 中文一区一区三区高中清不卡免费| 亚洲爱爱视频| 国产一区亚洲| 日韩影院在线观看| 国产精品97| 国产精品毛片一区二区三区| 亚洲综合二区| 日韩精品三区四区| 国产精品www.| 日本美女一区| 99国产精品久久久久久久成人热| 久久青草久久| 伊人久久亚洲影院| 视频在线观看91| 99香蕉国产精品偷在线观看 | 神马日本精品| 欧美成人综合| 久热精品在线| 一区二区日韩免费看| 蜜臀av一区二区在线免费观看 | 久草免费在线视频| 不卡av一区二区| 天堂成人国产精品一区| 少妇精品在线| 国产一区二区三区四区| 日韩和的一区二在线| 在线日韩一区| 日韩精品一区二区三区中文在线 | 狂野欧美性猛交xxxx| 日本不良网站在线观看| 狠狠色综合网| 亚洲资源网站| 福利一区和二区| 亚洲一区欧美二区| 国产欧美综合一区二区三区| 国产精品yjizz视频网| 丝袜美腿亚洲色图| 国产精品一级| 日韩精品午夜| 亚洲精品美女91| 精品无人区麻豆乱码久久久| 99国产精品久久久久久久| 久久国产生活片100| 最近高清中文在线字幕在线观看1| 黄色亚洲在线| 国产精品videossex久久发布 | 日韩有码av| 久久电影tv| 日产欧产美韩系列久久99| 欧美xxxx中国| 日本久久一区| 精品视频一区二区三区四区五区| 久久精品青草| 国产精品一区二区美女视频免费看| av免费不卡国产观看| 尹人成人综合网| 久久爱www成人| 亚洲免费高清| 亚洲精选久久| 麻豆精品在线播放| 免费在线观看视频一区| av中文字幕在线观看第一页| 伊人久久大香伊蕉在人线观看热v| 欧美男人天堂| 国产美女亚洲精品7777| 午夜在线观看免费一区| 欧美激情亚洲| 日本亚洲欧美天堂免费| 亚洲高清激情| 精品久久久中文字幕| 日韩在线观看一区二区三区| 999久久久亚洲| 精品久久久久中文字幕小说| 青青草伊人久久| 九九综合在线| 日韩不卡手机在线v区| 最新日韩欧美| 久久高清精品| 日韩国产综合| 国内精品伊人| 国产精品chinese| 美女黄网久久| 日本va欧美va瓶| 久久免费大视频| 高潮久久久久久久久久久久久久| 日韩高清一区在线| 久久亚洲二区| 国产精品呻吟| 亚洲特级毛片| 91精品蜜臀一区二区三区在线| 国产欧美另类| 无码日韩精品一区二区免费| 亚洲综合色婷婷在线观看| 午夜亚洲福利在线老司机| 亚洲精品91| 亚洲激情黄色| 国产一区日韩欧美| 久久精品国产亚洲夜色av网站 | 国产亚洲网站| 水野朝阳av一区二区三区| 国产农村妇女精品一区二区| 国产一区视频在线观看免费| 蜜桃国内精品久久久久软件9| 久久久久91| 99精品视频在线| 激情综合自拍| 精品欧美激情在线观看| 精品1区2区3区4区| 一区在线视频观看| 在线日韩电影| 国产手机视频一区二区| 丝袜a∨在线一区二区三区不卡| 免费看黄色91| 人人爱人人干婷婷丁香亚洲| 97久久亚洲| 日韩精选在线| 美女av在线免费看| 国产专区一区| 免费人成在线不卡| 日韩高清不卡在线| 国产精品tv| 欧美男人天堂| 欧美成人精品| 日韩区欧美区| 日韩国产一区二| 国产伦理久久久久久妇女| 久久中文精品| 91亚洲国产| 香蕉精品视频在线观看| 免费在线欧美视频| 日韩中文字幕视频网| 国产精品视频3p| 久久精品一区二区三区中文字幕| 你懂的国产精品永久在线| 99精品在线| 亚洲aa在线| 国产一区二区三区黄网站| 欧美日韩一二| 亚洲免费影院| 日本不卡一区二区| 免费一级欧美片在线观看网站 | 亚洲一区免费| 欧美精品第一区| 欧洲av一区二区| 五月亚洲婷婷 | 国产欧美啪啪| 久久国产影院| 国产农村妇女精品一二区| 日韩视频1区| 极品裸体白嫩激情啪啪国产精品| 日本亚洲欧洲无免费码在线| 成人亚洲一区二区| 一区二区三区午夜视频| 成人精品国产亚洲| 免费在线观看一区二区三区| 开心激情综合| 亚洲欧美日韩综合国产aⅴ| 欧美精品97| 亚洲一区激情| 久久精品日韩欧美| 美女网站久久| 麻豆精品在线播放| 六月婷婷一区| 国产不卡一区| 日韩欧美精品一区二区综合视频| 成人三级高清视频在线看| 激情五月色综合国产精品| 日本精品另类| 国产综合婷婷| 日韩激情一区| 国产精品久久久久久久免费软件 | 亚洲青青久久| 久久久久欧美精品| 久久超级碰碰| 亚洲精品自拍| 欧美精品一区二区三区精品| 久久影视三级福利片| 日本特黄久久久高潮|