同一局域网内,服务端开启时,另一机器将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,0while True:if x==400:x=0y+=40if y<400:chess_board.append([])if y==400:breakchess_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_xdef 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]=1pygame.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=0for j in range(len(xy)-1):if xy[j]+1==xy[j+1]:count+=1else:count=0if 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,0for i in range(len(x)-1):if x[i+1]!=x[i]:if x[i]+1==x[i+1]:c+=1last=i+1else:if c<4:first=i+1c=0else:last=iprint(last)breakelse:last=i+1if 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 1dis=[]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 0elif row_column_win(bcx_count,0,1,black_chess)==1:return 1elif row_column_win(wcy_count,1,0,white_chess)==1:return 0elif row_column_win(bcy_count,1,0,black_chess)==1:return 1elif xiejiao_win(white_chess)==1:return 0elif 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 = 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=Trueprint('new ser')tcpcliscock, addr = tcpsersock.accept()inputs.append(tcpcliscock)else:data,addr=r.recvfrom(BUFSIZE)disconnected=not datadraw_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=1white_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=0msg1=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,0while True:if x==400:x=0y+=40if y<400:chess_board.append([])if y==400:breakchess_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_xdef 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]=1pygame.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=0for j in range(len(xy)-1):if xy[j]+1==xy[j+1]:count+=1else:count=0if 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,0for i in range(len(x)-1):if x[i+1]!=x[i]:if x[i]+1==x[i+1]:c+=1last=i+1else:if c<4:first=i+1c=0else:last=iprint(last)breakelse:last=i+1if 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 1dis=[]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 1elif row_column_win(bcx_count,0,1,black_chess)==1:return 0elif row_column_win(wcy_count,1,0,white_chess)==1:return 1elif row_column_win(bcy_count,1,0,black_chess)==1:return 0elif xiejiao_win(white_chess)==1:return 1elif 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 = 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=1black_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=0msg1=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实现五子棋双人联机(简约版)相关推荐

  1. 发布:双人联机岛屿争夺游戏 Enemies in the dark

    发布:双人联机岛屿争夺游戏 Enemies in the dark 更新历史 20200302: 首次发布 20200303: 增加了"游戏理念"部分 这几天用Python写了一个 ...

  2. python两人一碰_python运用pygame库实现双人弹球小游戏

    使用python pygame库实现一个双人弹球小游戏,两人分别控制一个左右移动的挡板用来拦截小球,小球会在两板间不停弹跳,拦截失败的一方输掉游戏,规则类似于简化版的乒乓球. 因为是第一次用pygam ...

  3. PYTHON pygame库实战——实现双人弹球小游戏

    PYTHON pygame实战--运用pygame库实现双人弹球小游戏 使用python pygame库实现一个双人弹球小游戏,两人分别控制一个左右移动的挡板用来拦截小球,小球会在两板间不停弹跳,拦截 ...

  4. python弹球游戏双球代码键盘操作_python运用pygame库实现双人弹球小游戏

    使用python pygame库实现一个双人弹球小游戏,两人分别控制一个左右移动的挡板用来拦截小球,小球会在两板间不停弹跳,拦截失败的一方输掉游戏,规则类似于简化版的乒乓球. 因为是第一次用pygam ...

  5. Python实现人机五子棋

    图片和代码资源已经上传到百度云,链接:https://pan.baidu.com/s/1g0OO-8k-GNO9I4ZbFt1AXw 图形界面引用PyQt5,还有socket通信.可以局域网对战,可以 ...

  6. Scratch3.0——助力新进程序员理解程序(难度案例三、五子棋双人对战-电脑需要AI写不出来)

    Scratch3.0--助力新进程序员理解程序(难度案例三.五子棋双人对战-电脑需要AI写不出来) 前言 一般来说,针对6-18岁的少年儿童开展的编程教育,现在,最常见的形式是线上和线下模式相结合的课 ...

  7. python写游戏棋牌游戏_使用python实现简单五子棋游戏

    使用python实现简单五子棋游戏 发布时间:2020-08-29 06:12:30 来源:脚本之家 阅读:73 作者:weixin_42874933 用python实现五子棋简单人机模式的练习过程, ...

  8. python简单网格五子棋_python实现简单五子棋游戏

    本文实例为大家分享了python实现简单五子棋游戏的具体代码,供大家参考,具体内容如下 from graphics import * from math import * import numpy a ...

  9. Python pygame 坦克大战

    Python pygame 坦克大战 import pygame, time, random from pygame.sprite import SpriteSCREEN_WIDTH = 750 SC ...

最新文章

  1. e.V4p.C0/index.php,php-fpm进程在Kubernetes中接收SIGKILL信号
  2. aix oracle 10.2.0.1 升级 10.2.0.4,安装oracle 10.2.0.4 on aix 6.1的不同之处
  3. 日志分析logstash插件-grok详解
  4. C++二维数组new小结(zz)
  5. NC反弹的小demo
  6. JS-逻辑运算符-累加累减-分支循环结构-九九乘法表
  7. asm冗余 oracle_oracle 11.2.0.1 rac 修改asm磁盘组的冗余模式(redundancy mode)为normal
  8. Redis笔记(六)Redis的消息通知
  9. Flash知识点总结
  10. Linux网络端口命名规则,一致性网络设备命名
  11. Luogu P4053 [JSOI2007]建筑抢修
  12. initwithcoder和 initwithframe 区别?
  13. c#明华rf读卡器_深圳明华URF-R330读卡器 M1卡读写程序(C#版)
  14. Excel怎么实现表格数据行间随机打乱排序
  15. Ubuntu20.04环境下samba无法被小米摄像头搜索到的解决方案
  16. nn.Sigmoid torch
  17. 【字典树】字典树的创建(入门详细介绍)
  18. 干货预警!自动化立体仓库电气安全设计
  19. Mongodb入门(CRUD与安装)
  20. 电脑Wallpaper Engine汉化动态壁纸设置工具,支持HTML、MP4

热门文章

  1. 所谓幸福,从来没有答案
  2. Qt Quick的多国语言翻译
  3. CodingGame - Shadows of the Knight - Episode 1思路
  4. 求解Python 爬取百度翻译手机版{errno:997,from:zh,to:en,query:\u4eba\u751f\u82e6\u77ed}怎么办
  5. 【攻防世界】easyphp
  6. 如何把视频的声音转换成音频?
  7. 笔记本电池修复软件BatteryMon
  8. 关于项目需要—工控机及基于UC3846的开关电源设计
  9. 罗克韦尔 Rockwell RSLogix 500 Crack
  10. html抽奖怎么重置,js实现抽奖的两种方法