用python如何制作五子棋双人版联机游戏呢
Admin 2022-09-16 群英技术资讯 635 次浏览
同一局域网内,服务端开启时,另一机器将IP地址HOST改为服务端对应的IP地址、端口号与服务端的保持一致即可实现双人联机。(IP地址查询方式:菜单栏输入cmd,cmd窗口输入ipconfig找到无线网络下的IPv4地址)
服务端:
# -*- coding: utf-8 -*- """ Created on Tue Jun 8 14:03:09 2021 @author: Administrator """ import pygame import sys from pygame.locals import * from collections import Counter from socket import * from time import ctime import json import select import 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+=40 set_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_x def draw_board(): for i in chess_board: for j in i: screen.blit(img_board,(j[0],j[1])) pygame.display.update() #默认棋子类型为1 def 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 1 def 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 1 def 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 1 def 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 1 def 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 = 400 BUFSIZE = 1024 ADDR = (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=1 link=False while 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 pygame import sys from pygame.locals import * from collections import Counter from socket import * from time import ctime import json import select import socket import 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+=40 set_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_x def draw_board(): for i in chess_board: for j in i: screen.blit(img_board,(j[0],j[1])) pygame.display.update() #默认棋子类型为0 def 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 1 def 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 1 def 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 1 def 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 0 def 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 = 400 BUFSIZE = 1024 ADDR = (HOST,PORT) #连接服务器 tcpCliSock = socket.socket(socket.AF_INET,socket.SOCK_STREAM) tcpCliSock.connect(ADDR) inputs=[tcpCliSock] draw_board() settable=0 while 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()
背景:
黑棋:
白棋:
效果演示:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
天我们来了解一下关于pandas数值排序的内容,对于筛选和排序是Excel中使用频率最多的功能,下面我们就来看看pandas怎样实现一列和多列的数值排序,感兴趣的朋友就继续往下看吧。
这篇文章主要为大家介绍了pyspark自定义UDAF函数调用报错问题解决,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
这篇文章介绍了Python中的文件系统模块pathlib库,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
这篇文章主要介绍了Python实战之实现康威生命游戏,文中有非常详细的代码示例,对正在学习python的小伙伴们有非常好的帮助,需要的朋友可以参考下
这篇文章主要介绍了如何利用python实现图片转化字符画,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008