pygame-the game of live

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
ceddy
User
Beiträge: 79
Registriert: Mittwoch 25. August 2010, 12:01

Hi, ich habe heute versucht "the game of live" in python umzusetzen, jedoch hab ich noch folgende probleme:
1. Das Spielfeld wird um 90 grad gedreht
2. Irgendwie wird nur die 2 folge generation richtig berechnet

Ich habe dafür 2 Spielfelder erstellt, eins aus dem die aktuelle Situation gelesen wird(self.feld.felder[x][y]) und eins wo die änderungen für die folge generationen eingetragen werden(self.feld.felderz[x][y]) am ende wird self.feld.felder[x][y] mit self.feld.feldzer[x][y] abgeglichen.
Ich weis der Code ist ziemlich undordentlich und nicht kommentiert, das liegt daran, dass ich das ganze nur aus langeweile gemacht hab;)
ich hoffe jemand kann mir helfen;)

gameoflive.py:

Code: Alles auswählen

import sys
sys.path.append("lbl")
import pygame
import spielfeld
from pygame.locals import *

class Main:
	def __init__(self):
		pygame.init()
		self.screen = pygame.display.set_mode((300,300))
		self.clock=pygame.time.Clock()
		self.gray = (64, 64, 64)
		self.blue=(44,102,250)
		self.feld=spielfeld.Spielfeld()
		
	def loop(self):
		self.background = pygame.Surface(self.screen.get_size())
		self.background = self.background.convert()
		self.background.fill((44,102,250))
		
		while 1:
			for event in pygame.event.get():
				if event.type == pygame.QUIT:
					sys.exit()
			self.clock.tick(1)
			self.screen.blit(self.background, (0, 0))
			
			for x in range (30):
				for y in range(30):
					if self.feld.felder[x][y]==1:
						rect=pygame.Rect(10*x,10*y,10,10)
						pygame.draw.rect(self.screen,self.gray,rect)
					else:
						rect=pygame.Rect(10*x,10*y,10,10)
						pygame.draw.rect(self.screen,self.blue,rect)
					
			for x in range(30):
				for y in range(30):
					nachbarn=0
					try:
						if self.feld.felder[x-1][y]==1:
							nachbarn=nachbarn+1
					except:
							nachbarn=nachbarn
					try:
						if self.feld.felder[x+1][y]==1:
							nachbarn=nachbarn+1
					except:
							nachbarn=nachbarn
					try:
						if self.feld.felder[x][y-1]==1:
							nachbarn=nachbarn+1
					except:
							nachbarn=nachbarn
					try:
						if self.feld.felder[x][y+1]==1:
							nachbarn=nachbarn+1
					except:
							nachbarn=nachbarn
					try:
						if self.feld.felder[x-1][y-1]==1:
							nachbarn=nachbarn+1
					except:
							nachbarn=nachbarn
					try:
						if self.feld.felder[x+1][y-1]==1:
							nachbarn=nachbarn+1
					except:
							nachbarn=nachbarn
					try:
						if self.feld.felder[x-1][y+1]==1:
							nachbarn=nachbarn+1
					except:
							nachbarn=nachbarn
					try:
						if self.feld.felder[x+1][y+1]==1:
							nachbarn=nachbarn+1
					except:
							nachbarn=nachbarn
							
					if (self.feld.felder[x][y]==0) and  (nachbarn==3):
						self.feld.felderz[x][y]=1
					if(self.feld.felder[x][y]==0) and  (nachbarn<>3):
						self.feld.felderz[x][y]=0
					if (self.feld.felder[x][y]==1) and (nachbarn<2):
						self.feld.felderz[x][y]=0
					if (self.feld.felder[x][y]==1) and ((nachbarn==2) or (nachbarn==3)):
						self.feld.felderz[x][y]=1
					if (self.feld.felder[x][y]==1)and(nachbarn>3):
						self.feld.felderz[x][y]=0
			self.feld.felder=self.feld.felderz
		
					
						
							
			
			
			pygame.display.flip()
			
if __name__ == "__main__":
	MainWindow = Main()
  	MainWindow.loop()
spielfeld.py:

Code: Alles auswählen


class Spielfeld():
	def __init__(self):
		self.felder=[[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]]
		self.felderz=[[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]]
		self.felder[0]= [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
		self.felder[1]= [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
		self.felder[2]= [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
		self.felder[3]= [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
		self.felder[4]= [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
		self.felder[5]= [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
		self.felder[6]= [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
		self.felder[7]= [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
		self.felder[8]= [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
		self.felder[9]= [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
		self.felder[10]=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
		self.felder[11]=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
		self.felder[12]=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
		self.felder[13]=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
		self.felder[14]=[0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
		self.felder[15]=[0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
		self.felder[16]=[0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
		self.felder[17]=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
		self.felder[18]=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
		self.felder[19]=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
		self.felder[20]=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
		self.felder[21]=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
		self.felder[22]=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
		self.felder[23]=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
		self.felder[24]=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
		self.felder[25]=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
		self.felder[26]=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
		self.felder[27]=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
		self.felder[28]=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
		self.felder[29]=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]

		self.felderz[0]= [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
		self.felderz[1]= [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
		self.felderz[2]= [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
		self.felderz[3]= [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
		self.felderz[4]= [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
		self.felderz[5]= [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
		self.felderz[6]= [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
		self.felderz[7]= [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
		self.felderz[8]= [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
		self.felderz[9]= [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
		self.felderz[10]=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
		self.felderz[11]=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
		self.felderz[12]=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
		self.felderz[13]=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
		self.felderz[14]=[0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
		self.felderz[15]=[0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
		self.felderz[16]=[0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
		self.felderz[17]=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
		self.felderz[18]=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
		self.felderz[19]=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
		self.felderz[20]=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
		self.felderz[21]=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
		self.felderz[22]=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
		self.felderz[23]=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
		self.felderz[24]=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
		self.felderz[25]=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
		self.felderz[26]=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
		self.felderz[27]=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
		self.felderz[28]=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
		self.felderz[29]=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

Das Problem liegt in dieser Zeile:

Code: Alles auswählen

self.feld.felder=self.feld.felderz
Hier wird keine Kopie von `self.feld.felderz` erstellt, sondern die Liste nur an einen neuen Namen gebunden. In diesem Fall musst du von `felderz` eine tiefe Kopie mittels `copy.deepcopy` erstellen, oder in einer Schleife alle Werte einzeln kopieren. Python erstellt Niemals automatisch Kopien, es wird immer nur mit Referenzen gearbeitet. Wenn du das verinnerlich hast, dann fallen dir solche Problemchen schneller auf.

Noch zu deinem Code, geordnet nach Auftreten, nicht nach Wichtigkeit:
- Deine Main-Klasse ist überflüssig, hier würde es eine Funktion auch tun
- Entscheide dich für deutsche oder englische Bezeichner, vermische aber nicht beide Sprachen
- `gray` ist ein ganz schlechter Name. Was ist, wenn die Farbe mal nicht mehr grau ist. Willst du dann alle Vorkommnisse anpassen? Erzeuge besser Namen die die Bedeutung angeben und nicht den Inhalt.
- Schau dir mal PEP8 an; Einrückung 4 Leerzeichen und keine Tabs, Leerzeichen bei Zuweisungen und noch mehr
- Das Modul `spielfeld` scheint überflüssig zu sein. Das passt sicher hier in das Modul besser hinein
- Um Tupel zu erstellen brauchst du keine Klammern, es reichen Kommas
- Benutze Konstanten für Auflösung, Farben, etc.
- `loop` ist wieder so ein nichtssagender Name
- `while 1` solltest du als `while True` schreiben
- Doppelten Code solltest du zusammenfassen oder in eine Funktion auslagern. Du hast zum Beispiel zweimal

Code: Alles auswählen

rect=pygame.Rect(10*x,10*y,10,10)
pygame.draw.rect(self.screen,self.gray,rect)
Wobei sich hier nur die Farbe unterscheidet. Warum bindest du nicht die Farbe an eine Variable und rufst die beiden oberen Zeilen dann damit auf?
- Du kannst direkt über Listen iterieren. Wenn du `for x in range(...)` benutzt, dann machst du im allgemeinen etwas falsch. Wenn du tatsächlich den Index brauchst, dann verwende `enumerate`. 30 sollte hier auch unbedingt eine Konstante sein, damit du die Spielfeldgröße leicht ändern kannst
- Die ganzen

Code: Alles auswählen

try:
    if self.feld.felder[x-1][y]==1:
    nachbarn=nachbarn+1
except:
    nachbarn=nachbarn
sind gleich an mehreren Stellen verkehrt: sie kommen so häufig vor, warum fasst du sie nicht in einer Schleife zusammen? Wenn du anfängst Code abzuschreiben oder zu kopieren, dann machst du immer etwas falsch. Ein `except` welches alles abfängt bringt dir mehr Fehler als es nützt. Gib immer an, welche Ausnahme du genau behandeln möchtest. Andernfalls versteckst du vielleicht Fehler und findest diese nicht mehr. `nachbarn = nachbarn` tut genau nichts.
- `self.feld.felder` und `self.feld.felderz` finde ich verwirrend. Warum so kryptische Namen und warum der Umweg über `feld`?
- Zum Füllen deines Spielfelds: Dir sind for-Schleifen doch bekannt, warum nutzt du sie nicht. List Comprehensions sind auch recht praktisch.
- Wenn du schon verschachtelte Listen auf deinem Weg erzeugst, dann so:

Code: Alles auswählen

data = [
    [1, 2, 3, 4],
    [5, 6, 7, 8]]
Sebastian
Das Leben ist wie ein Tennisball.
ceddy
User
Beiträge: 79
Registriert: Mittwoch 25. August 2010, 12:01

Vielen Dank, daran hat es wirklich gelegen, jetzt funktioniert es

ceddy
Antworten