文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

怎么用python pygame实现五子棋双人联机

2023-06-30 12:34

关注

这篇文章主要讲解了“怎么用python pygame实现五子棋双人联机”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用python pygame实现五子棋双人联机”吧!

同一局域网内,服务端开启时,另一机器将IP地址HOST改为服务端对应的IP地址、端口号与服务端的保持一致即可实现双人联机。(IP地址查询方式:菜单栏输入cmd,cmd窗口输入ipconfig找到无线网络下的IPv4地址)

服务端:

# -*- coding: utf-8 -*-"""Created on Tue Jun  8 14:03:09 2021@author: Administrator"""import pygameimport sysfrom pygame.locals import *from collections import Counterfrom socket import *from time import ctimeimport jsonimport selectimport socket#界面初始化screen=pygame.display.set_mode((400,450))pygame.display.set_caption('五子棋')pygame.init()#图片导入img_board=pygame.image.load('F:/images/五子棋/chess_board.png')img_bchess=pygame.image.load('F:/images/五子棋/black_chess.jpg')img_wchess=pygame.image.load('F:/images/五子棋/white_chess.jpg')#颜色white=(255,255,255)black=(0,0,0)#用于传送的数据msg=[]#棋盘定义chess_board=[[]]def set_chess_board():    x,y=0,0    while True:        if x==400:            x=0            y+=40            if y<400:                chess_board.append([])        if y==400:            break        chess_board[-1].append([x,y])        x+=40set_chess_board()#棋盘格子是否落子chess_exist=[[0 for i in range(10)]for j in range(10)]#黑白棋子初始化black_chess,white_chess=[],[]#棋子类型chess_kind=1    #1为黑棋,0为白棋wcx,wcy,bcx,bcy=[],[],[],[]   #white_chess_xdef draw_board():    for i in chess_board:        for j in i:            screen.blit(img_board,(j[0],j[1]))            pygame.display.update()#默认棋子类型为1def set_chess():    if event.type==MOUSEBUTTONDOWN:        pos=pygame.mouse.get_pos()        for i in range(len(chess_board)):            for j in range(len(chess_board[i])):                if chess_board[i][j][0]<pos[0]<chess_board[i][j][0]+40 and chess_board[i][j][1]<pos[1]<chess_board[i][j][1]+40:                    if chess_exist[i][j]==0:                        black_chess.append([i,j])                        bcx.append(black_chess[-1][0])                        bcy.append(black_chess[-1][1])                        msg.extend((i,j))                        chess_exist[i][j]=1                        pygame.display.update()                        return 1def draw_chess():    for i in white_chess:        screen.blit(img_wchess,(i[1]*40,i[0]*40))    for i in black_chess:        screen.blit(img_bchess,(i[1]*40,i[0]*40))    pygame.display.update()def row_column_win(x,m,n,chess):    for i in x:        if x[i]>=5:            xy=[]            for j in chess:                if j[m]==i:                    xy.append(j[n])            xy.sort()            count=0            for j in range(len(xy)-1):                if xy[j]+1==xy[j+1]:                    count+=1                else:                    count=0            if count>=4:                return 1def xiejiao_win(chess):    x,y=[],[]    chess.sort()    for i in chess:        x.append(i[0])        y.append(i[1])    c,first,last=0,0,0    for i in range(len(x)-1):        if x[i+1]!=x[i]:            if x[i]+1==x[i+1]:                c+=1                last=i+1            else:                if c<4:                    first=i+1                    c=0                else:                    last=i                    print(last)                    break        else:            last=i+1    if c>=4:        dis=[]        for i in range(first,last+1):            dis.append(x[i]-y[i])        count=Counter(dis)        for i in count:            if count[i]>=5:                return 1        dis=[]        x2=[i*(-1) for i in x]        for i in range(first,last+1):            dis.append(x2[i]-y[i])        count=Counter(dis)        for i in count:            if count[i]>=5:                return 1def gameover():    wcx_count,wcy_count,bcx_count,bcy_count=Counter(wcx),Counter(wcy),Counter(bcx),Counter(bcy)    if row_column_win(wcx_count,0,1,white_chess)==1:        return 0    elif row_column_win(bcx_count,0,1,black_chess)==1:        return 1    elif row_column_win(wcy_count,1,0,white_chess)==1:        return 0    elif row_column_win(bcy_count,1,0,black_chess)==1:        return 1    elif xiejiao_win(white_chess)==1:        return 0    elif xiejiao_win(black_chess)==1:        return 1def draw_text(text,x,y,size):    pygame.font.init()    fontObj=pygame.font.SysFont('SimHei',size )    textSurfaceObj=fontObj.render(text, True, white,black)    textRectObj=textSurfaceObj.get_rect()    textRectObj.center=(x,y)    screen.blit(textSurfaceObj, textRectObj)    pygame.display.update()#定义服务器名称HOST = '0.0.0.0'PORT = 400BUFSIZE = 1024ADDR = (HOST,PORT)#定义服务器属性tcpsersock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)tcpsersock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)  # 对socket的配置重用ip和端口号tcpsersock.bind(ADDR)tcpsersock.listen(1)inputs=[tcpsersock]print(inputs)draw_board()settable=1link=Falsewhile True:    rs,ws,es=select.select(inputs, [], [],0)    for r in rs:        if r is tcpsersock:            link=True            print('new ser')            tcpcliscock, addr = tcpsersock.accept()            inputs.append(tcpcliscock)        else:            data,addr=r.recvfrom(BUFSIZE)            disconnected=not data            draw_text('你的回合',200,420,15)            if disconnected:                inputs.remove(r)                draw_text('对手掉线',200,420,15)                while True:                    for event in pygame.event.get():                        if event.type==QUIT:                            pygame.quit()                            sys.exit()            else:                data=json.loads(data)                settable=1                white_chess.append(data)                wcx.append(data[0])                wcy.append(data[1])    for event in pygame.event.get():        if event.type==QUIT:            pygame.quit()            sys.exit()            tcpsersock.close()        if link==True:            if settable==1:                if set_chess()==1:                    draw_text('对手回合',200,420,15)                    settable=0                    msg1=json.dumps(msg)                    tcpcliscock.sendto(msg1.encode(),ADDR)                    msg=[]           draw_chess()    if gameover()==1:        draw_text('你赢了!',200,420,15)        while True:            for event in pygame.event.get():                if event.type==QUIT:                    pygame.quit()                    sys.exit()    elif gameover()==0:        draw_text('你输了!',200,420,15)        while True:            for event in pygame.event.get():                if event.type==QUIT:                    pygame.quit()                    sys.exit()tcpcliscock.close()tcpsersock.close()

客户端:

# -*- coding: utf-8 -*-"""Created on Tue Jun  8 14:03:09 2021@author: Administrator"""import pygameimport sysfrom pygame.locals import *from collections import Counterfrom socket import *from time import ctimeimport jsonimport selectimport socketimport time#界面初始化screen=pygame.display.set_mode((400,450))pygame.display.set_caption('五子棋')pygame.init()#图片导入img_board=pygame.image.load('F:/images/五子棋/chess_board.png')img_bchess=pygame.image.load('F:/images/五子棋/black_chess.jpg')img_wchess=pygame.image.load('F:/images/五子棋/white_chess.jpg')#颜色white=(255,255,255)black=(0,0,0)#用于传送的数据msg=[]#棋盘定义chess_board=[[]]def set_chess_board():    x,y=0,0    while True:        if x==400:            x=0            y+=40            if y<400:                chess_board.append([])        if y==400:            break        chess_board[-1].append([x,y])        x+=40set_chess_board()#棋盘格子是否落子chess_exist=[[0 for i in range(10)]for j in range(10)]#黑白棋子初始化black_chess,white_chess=[],[]#棋子类型chess_kind=1    #1为黑棋,0为白棋wcx,wcy,bcx,bcy=[],[],[],[]   #white_chess_xdef draw_board():    for i in chess_board:        for j in i:            screen.blit(img_board,(j[0],j[1]))            pygame.display.update()#默认棋子类型为0def set_chess():    if event.type==MOUSEBUTTONDOWN:        pos=pygame.mouse.get_pos()        for i in range(len(chess_board)):            for j in range(len(chess_board[i])):                if chess_board[i][j][0]<pos[0]<chess_board[i][j][0]+40 and chess_board[i][j][1]<pos[1]<chess_board[i][j][1]+40:                    if chess_exist[i][j]==0:                        white_chess.append([i,j])                        wcx.append(white_chess[-1][0])                        wcy.append(white_chess[-1][1])                        msg.extend((i,j))                        chess_exist[i][j]=1                        pygame.display.update()                        return 1def draw_chess():    for i in white_chess:        screen.blit(img_wchess,(i[1]*40,i[0]*40))    for i in black_chess:        screen.blit(img_bchess,(i[1]*40,i[0]*40))    pygame.display.update()def row_column_win(x,m,n,chess):    for i in x:        if x[i]>=5:            xy=[]            for j in chess:                if j[m]==i:                    xy.append(j[n])            xy.sort()            count=0            for j in range(len(xy)-1):                if xy[j]+1==xy[j+1]:                    count+=1                else:                    count=0            if count>=4:                return 1def xiejiao_win(chess):    x,y=[],[]    chess.sort()    for i in chess:        x.append(i[0])        y.append(i[1])    c,first,last=0,0,0    for i in range(len(x)-1):        if x[i+1]!=x[i]:            if x[i]+1==x[i+1]:                c+=1                last=i+1            else:                if c<4:                    first=i+1                    c=0                else:                    last=i                    print(last)                    break        else:            last=i+1    if c>=4:        dis=[]        for i in range(first,last+1):            dis.append(x[i]-y[i])        count=Counter(dis)        for i in count:            if count[i]>=5:                return 1        dis=[]        x2=[i*(-1) for i in x]        for i in range(first,last+1):            dis.append(x2[i]-y[i])        count=Counter(dis)        for i in count:            if count[i]>=5:                return 1def gameover():    wcx_count,wcy_count,bcx_count,bcy_count=Counter(wcx),Counter(wcy),Counter(bcx),Counter(bcy)    if row_column_win(wcx_count,0,1,white_chess)==1:        return 1    elif row_column_win(bcx_count,0,1,black_chess)==1:        return 0    elif row_column_win(wcy_count,1,0,white_chess)==1:        return 1    elif row_column_win(bcy_count,1,0,black_chess)==1:        return 0    elif xiejiao_win(white_chess)==1:        return 1    elif xiejiao_win(black_chess)==1:        return 0def draw_text(text,x,y,size):    pygame.font.init()    fontObj=pygame.font.SysFont('SimHei',size )    textSurfaceObj=fontObj.render(text, True, white,black)    textRectObj=textSurfaceObj.get_rect()    textRectObj.center=(x,y)    screen.blit(textSurfaceObj, textRectObj)    pygame.display.update()#定义客户端名称HOST = '10.203.111.180'PORT = 400BUFSIZE = 1024ADDR = (HOST,PORT)#连接服务器tcpCliSock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)tcpCliSock.connect(ADDR)inputs=[tcpCliSock]draw_board()settable=0while True:    rs,ws,es=select.select(inputs,[],[],0)    for r in rs:        if r is tcpCliSock:            data,addr = r.recvfrom(BUFSIZE)            draw_text('你的回合',200,420,15)            data=json.loads(data)            settable=1            black_chess.append(data)            bcx.append(data[0])            bcy.append(data[1])    for event in pygame.event.get():        if event.type==QUIT:            tcpCliSock.close()            pygame.quit()            sys.exit()        if settable==1:            if set_chess()==1:                draw_text('对手回合',200,420,15)                settable=0                msg1=json.dumps(msg)                tcpCliSock.sendto(msg1.encode(),ADDR)                msg=[]    draw_chess()    if gameover()==1:        draw_text('你赢了!',200,420,15)        while True:            for event in pygame.event.get():                if event.type==QUIT:                    pygame.quit()                    sys.exit()    elif gameover()==0:        draw_text('你输了!',200,420,15)        while True:            for event in pygame.event.get():                if event.type==QUIT:                    pygame.quit()                    sys.exit()

背景:

怎么用python pygame实现五子棋双人联机

黑棋:

怎么用python pygame实现五子棋双人联机

白棋:

怎么用python pygame实现五子棋双人联机

效果演示:

怎么用python pygame实现五子棋双人联机

感谢各位的阅读,以上就是“怎么用python pygame实现五子棋双人联机”的内容了,经过本文的学习后,相信大家对怎么用python pygame实现五子棋双人联机这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯