initial commit
This commit is contained in:
147
02_gameOfLife/Main.py
Normal file
147
02_gameOfLife/Main.py
Normal file
@ -0,0 +1,147 @@
|
||||
#!/usr/bin/python
|
||||
import pygame
|
||||
import random
|
||||
from OpenGL.GL import *
|
||||
from OpenGL.GLU import *
|
||||
from pygame.locals import *
|
||||
|
||||
video_flags = OPENGL | HWSURFACE | DOUBLEBUF | FULLSCREEN
|
||||
|
||||
pygame.init()
|
||||
|
||||
dinfo = pygame.display.Info();
|
||||
|
||||
livingSpaceWidth = 48
|
||||
livingSpaceHeight = 27
|
||||
|
||||
creatureW = dinfo.current_w/(livingSpaceWidth)
|
||||
creatureH = dinfo.current_h/(livingSpaceHeight)
|
||||
|
||||
FPS = 40
|
||||
|
||||
livingSpace = []
|
||||
|
||||
def resize((width, height)):
|
||||
if height == 0:
|
||||
height = 1
|
||||
glViewport(0, 0, width, height)
|
||||
glMatrixMode(GL_PROJECTION)
|
||||
glLoadIdentity()
|
||||
glOrtho(0.0, livingSpaceWidth * creatureW, livingSpaceHeight * creatureH, 0.0, -6.0, 0.0)
|
||||
glMatrixMode(GL_MODELVIEW)
|
||||
glLoadIdentity()
|
||||
|
||||
def init():
|
||||
glClearColor(0.0, 0.0, 0.0, 0.0)
|
||||
|
||||
def initLivingSpace():
|
||||
for x in range(livingSpaceWidth):
|
||||
livingSpace.append([])
|
||||
for y in range(livingSpaceHeight):
|
||||
if random.randint(0,1) ==1:
|
||||
livingSpace[x].append(1000)
|
||||
else:
|
||||
livingSpace[x].append(0)
|
||||
|
||||
def isAlive(x,y):
|
||||
return livingSpace[x][y] == 1000
|
||||
|
||||
def draw():
|
||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
|
||||
glLoadIdentity()
|
||||
glTranslatef(0.0,0.0,3.0)
|
||||
|
||||
|
||||
glBegin(GL_QUADS)
|
||||
for column in range(livingSpaceWidth):
|
||||
for row in range(livingSpaceHeight):
|
||||
if livingSpace[column][row] != 0:
|
||||
health = float(float(livingSpace[column][row])/1000.0)
|
||||
|
||||
glColor4f(health*(float(column)/float(livingSpaceWidth)),
|
||||
health*(float(livingSpaceWidth-column)/float(livingSpaceWidth)),
|
||||
health*(float(row)/float(livingSpaceHeight)),1.0)
|
||||
x = column * creatureW
|
||||
y = row * creatureH
|
||||
|
||||
glVertex3f(x,y,0.0)
|
||||
glVertex3f(x + creatureW-1.0,y,0.0)
|
||||
glVertex3f(x+creatureW-1,y+creatureH-1,0.0)
|
||||
glVertex3f(x,y+creatureH-1,0.0)
|
||||
|
||||
glEnd()
|
||||
|
||||
def getNeighborCount(x,y):
|
||||
count = 0
|
||||
|
||||
xpn = (x + 1) % livingSpaceWidth
|
||||
ypn = (y + 1) % livingSpaceHeight
|
||||
# nach unten hin ist keine ausnahmebehandlung noetig,
|
||||
# da python bei negativen indizes automatisch die liste von hinten
|
||||
# durchlaeuft
|
||||
|
||||
# Vorsicht: boolscher Wert wird hier als Int genutzt!
|
||||
count += isAlive(x,ypn)
|
||||
count += isAlive(xpn,ypn)
|
||||
count += isAlive(xpn,y)
|
||||
count += isAlive(xpn,y-1)
|
||||
count += isAlive(x,y-1)
|
||||
count += isAlive(x-1,y-1)
|
||||
count += isAlive(x-1,y)
|
||||
count += isAlive(x-1,ypn)
|
||||
|
||||
return count
|
||||
|
||||
def calculateNextGeneration():
|
||||
neighborCount = []
|
||||
for column in range(livingSpaceWidth):
|
||||
neighborCount.append([])
|
||||
for row in range(livingSpaceHeight):
|
||||
neighborCount[column].append(getNeighborCount(column,row))
|
||||
|
||||
for column in range(livingSpaceWidth):
|
||||
for row in range(livingSpaceHeight):
|
||||
if 2 <= neighborCount[column][row] <= 3:
|
||||
if neighborCount[column][row] == 3:
|
||||
livingSpace[column][row] = 1000
|
||||
if not isAlive(column,row):
|
||||
livingSpace[column][row] = float(livingSpace[column][row])/1.2
|
||||
|
||||
else:
|
||||
livingSpace[column][row] = float(livingSpace[column][row])/1.2
|
||||
|
||||
if livingSpace[column][row] < 20:
|
||||
livingSpace[column][row] = 0
|
||||
|
||||
def main():
|
||||
|
||||
pygame.display.set_mode((dinfo.current_w,dinfo.current_h),video_flags)
|
||||
|
||||
initLivingSpace()
|
||||
resize((dinfo.current_w,dinfo.current_h))
|
||||
init()
|
||||
|
||||
clock = pygame.time.Clock()
|
||||
|
||||
frames = 0
|
||||
|
||||
#Hauptschleife:
|
||||
while True:
|
||||
|
||||
|
||||
ticktime = clock.tick(FPS)
|
||||
#print ticktime
|
||||
event = pygame.event.poll()
|
||||
if event.type == QUIT or (event.type == KEYDOWN and event.key == K_ESCAPE):
|
||||
break
|
||||
|
||||
|
||||
draw()
|
||||
|
||||
pygame.display.flip()
|
||||
calculateNextGeneration()
|
||||
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
Reference in New Issue
Block a user