python pygame实现五子棋双人联机
作者:-小黄怪- 发布时间:2022-04-12 22:41:04
标签: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 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()
背景:
黑棋:
白棋:
效果演示:
来源:https://blog.csdn.net/qq_41890466/article/details/117792912
0
投稿
猜你喜欢
- 服务器响应HTTP的类型ContentType大全,使用方法:<% Response.ContentType =&
- isset($var); //为false 没有定义没有定义为假 $var = ''
- MySQL 数据(字段)类型在创建表的时候,要明确定义字段对应的数据类型。MySQL 主要的数据类型分为数值类型、字符串(文本)类型、时间日
- IE6这个东东在前端开发者的眼中恐怕都是一个恶梦之地,我说它万恶想来没人反对吧。依据现在卡当网的访问统计数据来看,从IE6来的访问量还是占到
- 本文试图从iPhone的角度结合一些iPhone平台项目的设计经验提炼出iPhone平台的一些优秀设计思路,以供大家在做移动互联网设备设计时
- 记得从ymPrompt2.0的时候自己就遇到过在IE下有时会莫名其妙的提示“无法打开Internet站点 已终止操作”,这样的一个错误很让人
- ASP错误大全 Microsoft VBScript语法错误(0x800A03E9)-->内存不足 Microsoft VBScript语法
- 它解析并马上执行动态的SQL语句或非运行时创建的PL/SQL块.动态创建和执行SQL语句性能超前,EXECUTE IMMEDIATE的目标在
- 好记星不如烂笔头,适时的总结梳理知识让人更轻松愉快。今天总结下学习和开发中遇到的JavaScript执行顺序的问题,今天挖个坑,以后会慢慢填
- getattr函数(1)使用 getattr 函数,可以得到一个直到运行时才知道名称的函数的引用。>>> li = [&q
- 基本用法#初始化%h为空数组 %h={};#用数组初始化%h为a=>1,b=>2 %h=('a',1
- 行业首页改版的缘故,为了让我们设计师可以更好的了解需求、了解我们的用户,和部门的用研童鞋一起讨论决定使用电话来进行用户访谈,以此来了解用户。
- 1.func Fields(s string) []string,这个函数的作用是按照1:n个空格来分割字符串最后返回的是[]string的
- check.asp 代码如下:<% '''''''''
- 我们通常会通过单击按钮的操作,将定义好的内容直接复制到剪贴板对于用户来说点了按钮直接【Ctrl】+【V】就可以了。其实该功能的核心原理就是用
- 在Oracle本地数据库端执行赋权dbuser帐号SQL> grant create database link to dbuser;
- 本文实例讲述了PHP版微信小店接口开发方法。分享给大家供大家参考,具体如下:首先 大家可以去下一份小店开发的 API接口 因为 下面所有的
- 一、事件捕捉(Event Capture)的实现问题首先在说这件事前,先感谢一下Realazy。 W3C DOM Level2的事
- 生成一列sum_age 对age 进行累加df['sum_age'] = df['age'].cumsum(
- 由于新云CMS系统,网站底部“版权信息”字段在数据库中是“文本”类型,有250个字符的限制。想在这里给加网站统计代码,因为字数限制的原因,就