Gra online na podstawie pygame i socketów

0

Mam problem że jak połączę się drugim komputerem z server to gra automatycznie zaczyna bardzo lagować (nie zwracajcie uwagi na grafiki ale grafik jeszcze ich nie zrobił)
client:

from random import randint
import pygame
from math import floor

HOST = "192.168.0.100"
PORT = 5555
HEADER = 8

client = s.socket(s.AF_INET, s.SOCK_STREAM)
client.connect((HOST, PORT))

pygame.init()
window = pygame.display.set_mode((1920, 1080))

class Draw_Graund:
    def __init__(self):
        self.image = pygame.image.load("Assets/map.png")
        self.x = 0
        self.y = 0
        self.speed = 8
        self.HEADER = 8

    def tick(self, keys):
        if keys[pygame.K_s]:
            self.y -= self.speed
        if keys[pygame.K_d]:
            self.x -= self.speed
        if keys[pygame.K_w]:
            self.y += self.speed
        if keys[pygame.K_a]:
            self.x += self.speed

    def draw(self):
        window.blit(self.image, (self.x, self.y))

class Tree:
    def __init__(self):
        self.x_cord = randint(0, 5000)
        self.y_cord = randint(0, 5000)
        self.image = pygame.image.load("Assets/gracz.png")
        self.width = self.image.get_width()
        self.height = self.image.get_height()
        self.hitbox = pygame.Rect(self.x_cord, self.y_cord, self.width, self.height)

    def tick(self, x, y):
        self.hitbox = pygame.Rect(self.x_cord + x, self.y_cord + y, self.width, self.height)

    def draw(self, x, y):
        window.blit(self.image, (self.x_cord + x, self.y_cord + y))

class Stone:
    def __init__(self):
        self.x_cord = randint(0, 5000)
        self.y_cord = randint(0, 5000)
        self.image = pygame.image.load("Assets/1 (3).png")
        self.width = self.image.get_width()
        self.height = self.image.get_height()
        self.hitbox = pygame.Rect(self.x_cord, self.y_cord, self.width, self.height)

    def tick(self, x, y):
        self.hitbox = pygame.Rect(self.x_cord + x, self.y_cord + y, self.width, self.height)

    def draw(self, x, y):
        window.blit(self.image, (self.x_cord + x, self.y_cord + y))

class Ship:
    def __init__(self):
        self.x_cord = randint(0, 5000)
        self.y_cord = randint(0, 5000)
        self.image = pygame.image.load("Assets/zwierze.png")
        self.width = self.image.get_width()
        self.height = self.image.get_height()
        self.hitbox = pygame.Rect(self.x_cord, self.y_cord, self.width, self.height)

    def tick(self, x, y):
        self.hitbox = pygame.Rect(self.x_cord + x, self.y_cord + y, self.width, self.height)

    def draw(self, x, y):
        window.blit(self.image, (self.x_cord + x, self.y_cord + y))

class Player:
    def __init__(self):
        self.x_cord = 860
        self.y_cord = 450
        self.stand_img = pygame.image.load("Assets/postać.png")
        self.stand_img_left = pygame.transform.flip(pygame.image.load("Assets/postać.png"), True, False)
        self.width = self.stand_img.get_width()
        self.height = self.stand_img.get_height()
        self.hitbox = pygame.Rect(self.x_cord, self.y_cord, self.width, self.height)
        self.walking = [pygame.image.load(f"Assets/postac_walking{i}.png") for i in range(1, 5)]
        self.walk_left_img = [pygame.transform.flip(pygame.image.load(f"Assets/postac_walking{i}.png"), True, False) for i in range(1, 5)]
        self.index_walking = 0
        self.kierunek = 0
        self.speed = 15
        self.HEADER = 8

    def tick(self, keys):
        self.hitbox = pygame.Rect(self.x_cord, self.y_cord, self.width, self.height)

        if keys[pygame.K_w]:
            self.y_cord -= self.speed
        if keys[pygame.K_a]:
            self.x_cord -= self.speed
        if keys[pygame.K_s]:
            self.y_cord += self.speed
        if keys[pygame.K_d]:
            self.x_cord += self.speed

    def draw(self, keys):
        if keys[pygame.K_s] | keys[pygame.K_a] | keys[pygame.K_d] | keys[pygame.K_w]:
            if self.kierunek == 1:
                window.blit(self.walking[floor(self.index_walking)], (self.x_cord, self.y_cord))
            if self.kierunek == 0:
                window.blit(self.walk_left_img[floor(self.index_walking)], (self.x_cord, self.y_cord))

            self.index_walking += 0.6
            if self.index_walking > 3:
                self.index_walking = 0
        else:
            if self.kierunek == 1:
                window.blit(self.stand_img, (self.x_cord, self.y_cord))
            if self.kierunek == 0:
                window.blit(self.stand_img_left, (self.x_cord, self.y_cord))
        if keys[pygame.K_a]:
            self.kierunek = 0
        if keys[pygame.K_d]:
            self.kierunek = 1

    def send_pos(self):
        pos_x_ready = str(self.x_cord).encode("utf8")
        pos_y_ready = str(self.y_cord).encode("utf8")

        pos_x_header = f"{len(pos_x_ready):<{self.HEADER}}".encode("utf8")
        client.send(pos_x_header + pos_x_ready)

        pos_y_header = f"{len(pos_y_ready):<{self.HEADER}}".encode("utf8")
        client.send(pos_y_header + pos_y_ready)

class Send_eq:
    def __init__(self):
        self.HEADER = 8

    def recv(self):
        drewno_heder = client.recv(self.HEADER).decode("utf8")
        drewno_heder_len = int(drewno_heder)
        self.drewno = client.recv(drewno_heder_len).decode("utf8")

        kamien_heder = client.recv(self.HEADER).decode("utf8")
        kamien_heder_len = int(kamien_heder)
        self.kamien = client.recv(kamien_heder_len).decode("utf8")

        print(self.kamien, self.drewno)

    def send(self, drewno, kamien):
        drewno_send = str(drewno)
        kamien_send = str(kamien)
        drewno_send_ready = drewno_send.encode("utf8")
        kamien_send_ready = kamien_send.encode("utf8")

        drewno_header = f"{len(drewno_send_ready):<{self.HEADER}}".encode("utf8")
        client.send(drewno_header + drewno_send_ready)

        kamien_header = f"{len(kamien_send_ready):<{self.HEADER}}".encode("utf8")
        client.send(kamien_header + kamien_send_ready)

class Draw_client:
    def __init__(self):
        self.HEADER = 8
        self.stand_img = pygame.image.load("Assets/postać.png")

    def recv(self):
        pos_heder_x = client.recv(self.HEADER).decode("utf8")
        pos_heder_len_x = int(pos_heder_x)
        self.pos_x = client.recv(pos_heder_len_x).decode("utf8")

        pos_heder_y = client.recv(self.HEADER).decode("utf8")
        pos_heder_len_y = int(pos_heder_y)
        self.pos_y = client.recv(pos_heder_len_y).decode("utf8")
        print(self.pos_x, self.pos_y)

        postac_heder = client.recv(self.HEADER).decode("utf8")
        postac_heder_len = int(postac_heder)
        self.postac = client.recv(postac_heder_len).decode("utf8")

    def draw(self):
        if self.postac == "yes":
            window.blit(self.stand_img, (int(self.pos_y), int(self.pos_x)))

def main():
    run = True
    draw_graund = Draw_Graund()
    player = Player()
    send_eq = Send_eq()
    draw_client = Draw_client()
    clock = 0
    clock1 = 0
    clock2 = 0
    trees = []
    stones = []
    ships = []
    stone_count = 0
    tree_count = 0
    ship_count = 0
    send_eq.recv()
    drewno = int(send_eq.drewno)
    kamien = int(send_eq.kamien)

    while run:

        send_eq.send(drewno, kamien)
        player.send_pos()
        draw_client.recv()

        keys = pygame.key.get_pressed()
        events = pygame.event.get()

        clock += pygame.time.Clock().tick(360) / 1000
        clock1 += pygame.time.Clock().tick(360) / 100
        clock2 += pygame.time.Clock().tick(360) / 1000
        for event in events:
            if event.type == pygame.QUIT:
                run = False

            if keys[pygame.K_c]:
                run = False

        if tree_count < 100:
            if clock >= 0.001:
                tree_count += 1
                clock = 0
                trees.append(Tree())

        if stone_count < 100:
            if clock1 >= 0.001:
                stone_count += 1
                clock1 = 0
                stones.append(Stone())

        if ship_count < 50:
            if clock2 >= 0.001:
                ship_count += 1
                clock2 = 0
                ships.append(Ship())

        #draw_graund.tick(keys)
        draw_graund.draw()

        player.tick(keys)
        player.draw(keys)

        draw_client.draw()

        for tree in trees:
            tree.tick(draw_graund.x, draw_graund.y)
        for tree in trees:
            tree.draw(draw_graund.x, draw_graund.y)

        for stone in stones:
            stone.draw(draw_graund.x, draw_graund.y)
        for stone in stones:
            stone.tick(draw_graund.x, draw_graund.y)

        for ship in ships:
            ship.tick(draw_graund.x, draw_graund.y)
        for ship in ships:
            ship.draw(draw_graund.x, draw_graund.y)

        for tree in trees:
            if player.hitbox.colliderect(tree.hitbox):
                if pygame.mouse.get_pressed()[0]:
                    trees.remove(tree)
                    drewno += 1

        for stone in stones:
            if player.hitbox.colliderect(stone.hitbox):
                if pygame.mouse.get_pressed()[0]:
                    stones.remove(stone)
                    kamien += 1


        pygame.display.update()

if __name__ == "__main__":
    main()```

server:
```import socket as s
import threading

HOST = "192.168.0.100"
PORT = 5555
HEDER = 8

server = s.socket(s.AF_INET, s.SOCK_STREAM)
server.bind((HOST, PORT))
server.listen(2)

connection = []
connection_str = []

def main(client, adders):
    try:
        foun = False
        only = True

        print(f"Uzyskano połącznie od {adders}")
        connection.append((client))
        connection_str.append((str(client)))

        drewno = open(f"C:/Users/Kamil/Desktop/Server_database#1/{adders[0]}/drewno.txt", "r")
        drewno_send = drewno.read().encode("utf8")

        kamien = open(f"C:/Users/Kamil/Desktop/Server_database#1/{adders[0]}/kamien.txt", "r")
        kamien_send = kamien.read().encode("utf8")

        drewno_header = f"{len(drewno_send):<{HEDER}}".encode("utf8")
        client.send(drewno_header + drewno_send)

        kamien_header = f"{len(kamien_send):<{HEDER}}".encode("utf8")
        client.send(kamien_header + kamien_send)

        while True:
            nick = open(f"C:/Users/Kamil/Desktop/Server_database#1/{adders[0]}/nick.txt", "r")
            nick_read = nick.read()

            drewno_heder_rcv = client.recv(HEDER).decode("utf8")
            drewno_heder_len_rcv = int(drewno_heder_rcv)
            drewno_rcv = client.recv(drewno_heder_len_rcv).decode("utf8")

            kamien_heder_rcv = client.recv(HEDER).decode("utf8")
            kamien_heder_len_rcv = int(kamien_heder_rcv)
            kamien_rcv = client.recv(kamien_heder_len_rcv).decode("utf8")

            #drewno_save = open(f"C:/Users/Kamil/Desktop/Server_database#1/{adders[0]}/drewno.txt", "w")
            #kamien_save = open(f"C:/Users/Kamil/Desktop/Server_database#1/{adders[0]}/kamien.txt", "w")

            #drewno_save.write(drewno_rcv)
            #kamien_save.write(kamien_rcv)

            x_heder = client.recv(HEDER).decode("utf8")
            x_heder_len = int(x_heder)
            x = client.recv(x_heder_len).decode("utf8")

            y_heder = client.recv(HEDER).decode("utf8")
            y_heder_len = int(y_heder)
            y = client.recv(y_heder_len).decode("utf8")

            #print(f"{nick_read}, {adders[0]}: {x} {y}")

            x_ready = x.encode("utf8")
            y_ready = y.encode("utf8")
            len_conn = len(connection_str)

            if foun == False:
                a = len(connection_str)
                for i in range(a):
                    if connection_str[i] == str(client):
                        foun = True

            for f in range(len_conn):
                if not f == i:
                    if only == False:
                        header_x = f"{len(y_ready):<{HEDER}}".encode("utf8")
                        connection[f].send(header_x + y_ready)
                        header_y = f"{len(x_ready):<{HEDER}}".encode("utf8")
                        connection[f].send(header_y + x_ready)
                        yes = "yes".encode("utf8")
                        header_yes = f"{len(yes):<{HEDER}}".encode("utf8")
                        connection[f].send(header_yes + yes)

            if only == True:
                header_x = f"{len(x_ready):<{HEDER}}".encode("utf8")
                client.send(header_x + x_ready)

                header_y = f"{len(y_ready):<{HEDER}}".encode("utf8")
                client.send(header_y + y_ready)

                no = "no".encode("utf8")
                header_no = f"{len(no):<{HEDER}}".encode("utf8")
                client.send(header_no + no)

            if len_conn != 1:
                only = False

    except:
        print(f"Disconnect {adders}")
        connection.remove((client))
        connection_str.remove((str(client)))
        len_conn = len(connection_str)
        if len_conn == 1:
            only = True

def save_client(client, adders):
    id_nick = open(f"C:/Users/Kamil/Desktop/Server_database#1/{adders[0]}/nick.txt", "r")
    id_save = open(f"C:/Users/Kamil/Desktop/Server_database#1/{id_nick.read()}.txt", "w")
    id_save.write(str(client))

while True:
    client, adders = server.accept()

    thread = threading.Thread(target=main, args=(client, adders))
    thread.start()
    thread1 = threading.Thread(target=save_client, args=(client, adders))
    thread1.start() ```

![1 (3).png](https://4programmers.net/uploads/112721/S3tjV6hIN2AtzBardgJYUyVlTx1O9awPDgCJ13EU.png)![2.png](https://4programmers.net/uploads/112721/Z9nv5f5vupgMThS6OoVqEAjDi0k3A12CYuozkH38.png)![gracz.png](https://4programmers.net/uploads/112721/KIiBJU7tsyV2Sf4mAJk2wf7kDq5TzjlLzd53Vv3v.png)![map.png](https://4programmers.net/uploads/112721/ChbPTfHlFI4AWNcDQ768iwuBG3TPpz7sEeXlHWim.png)![postac_walking1.png](https://4programmers.net/uploads/112721/Aq85kvGdJK6ZPLuLQoY1Eq0zxJXWJx8yYgL8vuMP.png)![postac_walking2.png](https://4programmers.net/uploads/112721/QurUe11fU4z3NjW4VbfAVjjvExvunIhH8pxhERVo.png)![postac_walking3.png](https://4programmers.net/uploads/112721/gpyAiyICkiLjUcRGvqm0UgzbkNp63LHpcEor9Uhh.png)![postac_walking4.png](https://4programmers.net/uploads/112721/Ky1WPU6P7vMW5gW98y35E5mnmzP3PvthRbu9M0ON.png)![postać.png](https://4programmers.net/uploads/112721/nWXjuj8cIU2ONEKP7xtCJfk0gAR2yJvfZYzolUKg.png)![zwierze.png](https://4programmers.net/uploads/112721/kaXhXyYlXDEJguTHdyDtOOfGsP85z8bruGnfminB.png)
1

A nie jest tak że masz tam while True bez żadnych sleepów więc jak wchodzi w tą pętlę to masz 100% CPU nagle?

0

Masz tu mega dużo wyzwań :)
Po pierwsze tak jak pisał @Spine, ciągłe operacje na plikach. W ogóle bazy danych realizowane w ten sposób były kilkadziesiąt lat temu. Użyj jakiegoś silnika baz danych. Nie widzę potrzeby ciągłego zapisywania danych do plików, jak już to zapisuj raz na jakiś czas np. co 10 minut.
Zakładasz, że adresy ip są statyczne, a po pierwsze mogą się zmienić, po drugie może być kilka klientów uruchomionych z jednego adresu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1