Übertragen von Werten zwischen verschiedenen Fenstern in Python mithilfe von MultiprocessingPython

Python-Programme
Guest
 Übertragen von Werten zwischen verschiedenen Fenstern in Python mithilfe von Multiprocessing

Post by Guest »

Ich bin gerade dabei, ein Spiel ähnlich wie Clicker Heroes in Python zu erstellen, wobei ich Pygame und einige andere Module verwende. Das Problem, das ich habe, ist, dass ich keine Werte zwischen zwei verschiedenen Spielschleifen übertragen kann.
Mein Code lautet wie folgt:

Code: Select all

import pygame
import random
from colour import Color
import multiprocessing
from pygame._sdl2 import Window
from multiprocessing import Manager

def game(stats):
pygame.init()
colours = list(Color("red").range_to(Color("green"),100)) # list of 100 colour values from red to green
screen = pygame.display.set_mode((600, 600))
stage = 1
killsleft = 5
hpord = 1+(stage*0.1)
chp = round(10**hpord)
mhp = chp
mdown = False
numFont = pygame.font.SysFont("twcen", 60)
gold = 0
dmg = 1
upgcost = 20
island = pygame.image.load("island.png")
centrex = 300
spacing = 110

while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
if event.type == pygame.MOUSEBUTTONDOWN:
mdown = True
if event.type == pygame.MOUSEBUTTONUP:
mdown = False
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_q:
pygame.quit()

keyspressed = pygame.key.get_pressed()
#while not statsqueue.empty():
#transfer = statsqueue.get()
#gold = transfer[0]
#dmg = transfer[1]

if mdown: # click
chp -= dmg
mdown = False

if chp < 1: # monster ded
killsleft -= 1
chp = round(10**hpord)
mhp = chp
gold += round(chp/3)

if killsleft = upgcost:
#dmg += 1
#gold -= upgcost
#upgcost = round(upgcost*1.1)

screen.fill((200, 200, 200))

for i in range(-2, 3):
stagenum = stage+i
xpos = centrex + (i*spacing)
if i == 0:
fontsize = 80
islandsize = (70, 70)
else:
fontsize = 50
islandsize = (30, 30)

islandpos = (xpos-islandsize[0]//2, 60)  # centre island under stg num

if stage+i-2 >  -2:
screen.blit(pygame.transform.scale(island, islandsize), islandpos)
stgFont = pygame.font.SysFont("twcen", fontsize)
stgsdisplay = stgFont.render(str(stagenum), 1, (0, 0, 0))
stagerect = stgsdisplay.get_rect(center=(xpos, 80))  # centre text
screen.blit(stgsdisplay, stagerect)

healthperc = max(0, min(int((chp / mhp) * 100), 99)) # find current % of mhp that chp is
selectedcolour = colours[healthperc]
chpcolour = tuple(int(c * 255) for c in selectedcolour.rgb) # convert to rgb
pygame.draw.rect(screen, (0, 0, 0), (147, 147, 305, 27), 0, 4) # hp bar outline/back
pygame.draw.rect(screen, chpcolour, (150-(chp/mhp), 150, (chp/mhp)*300, 20), 0, 4) # hp bar
chpdisplay = numFont.render("chp:"+str(chp), 1, (0, 0, 0))
killsdisplay = numFont.render("killsleft:"+str(killsleft), 1, (0, 0, 0))
golddisplay = numFont.render("gold:"+str(gold), 1, (0, 0, 0))
upgcostdisplay = numFont.render("upgcost:"+str(upgcost), 1, (0, 0, 0))
dmgdisplay = numFont.render("dmg:"+str(dmg), 1, (0, 0, 0))
screen.blit(chpdisplay, (0, 200))
screen.blit(dmgdisplay, (0, 350))
screen.blit(killsdisplay, (0, 250))
screen.blit(golddisplay, (0, 400))
screen.blit(upgcostdisplay, (0, 300))
#statsqueue.put((gold, dmg))
pygame.display.flip()

def shop(stats): # stats window
pygame.init()
numFont = pygame.font.SysFont("twcen", 60)
shopwindow = pygame.display.set_mode((300, 200))
pygame.display.set_caption("shop")
gold = 0
shopmdown = False
Window.from_display_module().position = [1100, 200]
upgcost = 20

while True:
shopwindow.fill((255, 255, 255))

gold = stats["gold"]
dmg = stats["dmg"]

for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
if event.type == pygame.MOUSEBUTTONDOWN:
shopmdown = True
if event.type == pygame.MOUSEBUTTONUP:
shopmdown = False

keyspressed = pygame.key.get_pressed()

if shopmdown:
shopmdown = False

if keyspressed[pygame.K_u]: # upg
if gold >= upgcost:
dmg += 1
gold -= upgcost
upgcost = round(upgcost*1.1)
statsqueue.put((gold, dmg))

golddisplay = numFont.render("gold:"+str(gold), 1, (0, 0, 0))

shopwindow.blit(golddisplay, (0, 0))
pygame.display.update()

def main():
multiprocessing.set_start_method("spawn")
statsqueue = multiprocessing.Queue()
manager = Manager()
stats = manager.dict({"gold": 0, "dmg": 1})

gameprocess = multiprocessing.Process(target=game, args=(statsqueue,))
shopprocess = multiprocessing.Process(target=shop, args=(statsqueue,))
gameprocess.start()
shopprocess.start()
gameprocess.join()
shopprocess.join()

if __name__ == "__main__":
main()
Ich habe versucht, eine Statistikwarteschlange zu implementieren, stellte jedoch fest, dass sie immer dann einfror, wenn ich versuchte, Werte zu übertragen. Diese Version versucht, ein Wörterbuch zu verwenden (wie von ChatGPT vorgeschlagen, bitte tun Sie mir nicht weh), aber jetzt treten nur Fehler auf, wenn ich versuche, das Wörterbuch zu verwenden. Da ich außerdem Multiprocessing verwende, werden keine Fehler mehr ausgegeben, damit ich sehen kann, wo ich einen Fehler gemacht habe.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post