Python 在线多人游戏开发教程 Day04#区分自己和别的玩家

 
Python 在线多人游戏开发教程 Day01#做一个可以移动的方块 

Python 在线多人游戏开发教程 Day02#做一个server 和 network

Python 在线多人游戏开发教程 Day03#两个client直接可以相互移动方块

Python 在线多人游戏开发教程 Day04#区分自己和别的玩家

Python 在线多人游戏开发教程 Day05#石头剪刀布游戏

效果图

client.py

import pygame
from network import Network
 
width = 500
height = 500
win = pygame.display.set_mode((width, height))
pygame.display.set_caption("client")
 
clientNumber = 0
 
 
class Player():
    def __init__(self, x, y, width, height, color):
        self.color = color
        self.y = y
        self.x = x
        self.height = height
        self.width = width
        self.rect = (x, y, width, height)
        self.vel = 3
 
    def draw(self, win):
        pygame.draw.rect(win, self.color, self.rect)
 
    def move(self):
        keys = pygame.key.get_pressed()
 
        if keys[pygame.K_LEFT]:
            self.x -= self.vel
 
        if keys[pygame.K_RIGHT]:
            self.x += self.vel
 
        if keys[pygame.K_UP]:
            self.y -= self.vel
 
        if keys[pygame.K_DOWN]:
            self.y += self.vel
 
        self.update()
 
    def update(self):
        self.rect = (self.x, self.y, self.width, self.height)
 
 
def read_pos(str):
    str = str.split(",")
    return int(str[0]), int(str[1])
 
 
def make_pos(tup):
    return str(tup[0]) + "," + str(tup[1])
 
 
def redrawWindow(win, player, player2):
    win.fill((255, 255, 255))
    player.draw(win)
    player2.draw(win)
    pygame.display.update()
 
 
def main():
    run = True
    n = Network()
    startPos = read_pos(n.getPos())
    p = Player(startPos[0], startPos[1], 100, 100, (0, 255, 255))
    p2 = Player(0, 0, 100, 100, (255,0,0))
    clock = pygame.time.Clock()
 
    while run:
        clock.tick(60)
 
        p2Pos = read_pos(n.send((make_pos((p.x, p.y)))))
        p2.x = p2Pos[0]
        p2.y = p2Pos[1]
        p2.update()
 
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                run = False
                pygame.quit()
 
        p.move()
        redrawWindow(win, p, p2)
 
main()

network.py

import socket
import struct
 
 
class Network:
    def __init__(self):
        self.client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.server = "10.99.81.223"
        self.port = 5555
        self.addr = (self.server, self.port)
        self.pos = self.connect()
 
    def getPos(self):
        return self.pos
 
    def connect(self):
        try:
            self.client.connect(self.addr)
            return self.client.recv(2048).decode()
        except:
            pass
 
    def send(self, data):
        try:
            self.client.send(str.encode(data))
            return self.client.recv(2048).decode()
        except socket.error as e:
            print(e)

server.py

import socket
import os
from _thread import *
import sys
 
server = "10.99.81.223"  # 需要查看本机IP
port = 5555
 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 
try:
    s.bind((server, port))
 
except socket.error as e:
    str(e)
 
s.listen(2)  # 想要的数量
print("等待连接,服务启动")
 
 
def read_pos(str):
    str = str.split(",")
    return int(str[0]), int(str[1])
 
 
def make_pos(tup):
    return str(tup[0]) + "," + str(tup[1])
 
pos = [(0, 0), (100, 100)]
 
def threaded_client(conn, player):  # 在后台运行
    print(player)
    conn.send(str.encode(make_pos(pos[player])))
    reply = ""
    while True:
        try:
            data = read_pos(conn.recv(2048).decode())
            pos[player] = data
 
            if not data:
                print("未连接")
                break
            else:
                if player == 1:
                    reply = pos[0]
                else:
                    reply = pos[1]
 
                print("接收到:", data)
                print("发送出:", reply)
 
            conn.sendall(str.encode(make_pos(reply)))
        except:
            break
 
    print("失去连接")
    conn.close()
 
currentPlayer = 0
while True:
    conn, addr = s.accept()  # 接受来的任何连接
    print("连接至:", addr)
 
    start_new_thread(threaded_client, (conn, currentPlayer))
    currentPlayer += 1


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值