stupidpythonprojects/simongame/gitter.py

228 lines
6.1 KiB
Python

import pygame
import random
from pygame.locals import *
import tools
import kachel
from maus import *
import eventmanager
import FTGL
import button
#Groesse des Spielfeldes
GITTER_W = 7
GITTER_H = 5
#GitterModi:
MODE_RANDOM = 0
MODE_SHOW = 1
MODE_PLAY = 2
#Werte fuer den Random Mode:
RANDOM_FRAMES = 60 #Anzahl der Frames fuer eine einzelne Sequenz
RANDOM_ELEMENT_RANGE =GITTER_W*GITTER_H/4 #Wie viele Elemente werden Maximal zufaellig aktiviert (muss kleinergleich sein als Gitter_W*Gitter_H)
#Werte fuer den Show Mode:
TIME_FACTOR = 0.9
MIN_STEPTIME = 20
COOLDOWNTIME = 20
class gitter(object):
def __init__(self,size,eManager,mouse,sounds):
self.kachelarray = []
self.size = size
self.eManager = eManager
self.kachelW = size[0]/GITTER_W
self.kachelH = size[1]/GITTER_H
self.sounds = sounds
self.mode = MODE_RANDOM
#Variablen fuer den MODE_RANDOM
self.randomFrame = 0
self.randomSequence = [] #wird auch fuer alle anderen Sequenzen verwendet
self.mausimaus = mouse
for x in range(GITTER_W*GITTER_H):
self.kachelarray.append( kachel.kachel(x%GITTER_W,x//GITTER_W,self.kachelW,self.kachelH))
self.initRandomSequence()
#Variablen fuer den Play Mode:
self.level = 1
self.mistake = False
self.playingStep = 0
self.done = False
#Variablen fuer den Show Mode:
self.curFrame = 0
self.maxFrame = MIN_STEPTIME
self.showing = False
self.cooldown = COOLDOWNTIME
def getIndex(self,pos):
return pos[1]*GITTER_W + pos[0]
def getPos(self,index):
return (index%GITTER_W,index//GITTER_W)
def deactivateAll(self):
for kachel in self.kachelarray:
kachel.deactivate()
def activateAll(self):
for kachel in self.kachelarray:
kachel.activate()
def setLevel(self,level):
self.level = level
def initRandomSequence(self):
self.randomFrame = 0
#alle deaktivieren:
self.deactivateAll()
#erzeuge eine sequenz aus kachelindizies, die 1 bis RANDOM_ELEMENT_RANGE lang ist
self.randomSequence = random.sample(range(GITTER_W*GITTER_H),random.randint(1,RANDOM_ELEMENT_RANGE))
#die in der random sequenz aktivieren:
for i in self.randomSequence:
self.kachelarray[i].activate()
def generatePlaySequence(self,level):
self.randomSequence = random.sample(range(GITTER_W*GITTER_H),level)
def changeMode(self,mode):
self.mode = mode
if mode == MODE_RANDOM:
self.randomFrame = 0
#noch kurz die richtige Loesung zeigen:
self.deactivateAll()
for i in self.randomSequence:
self.kachelarray[i].activate()
elif mode == MODE_SHOW:
self.done = False
self.cooldown = COOLDOWNTIME
self.showing = True
self.generatePlaySequence(self.level) #level sollte also vorher gesetzt werden !!!
self.curFrame = 0
self.maxFrame = MIN_STEPTIME + (TIME_FACTOR*MIN_STEPTIME)*self.level
self.activateAll()
self.sounds[1].play()
elif mode == MODE_PLAY:
self.cooldown = COOLDOWNTIME
self.mistake = False
self.playingStep = 0
self.activateAll()
self.sounds[1].play()
else:
pass #TODO: System fuer einheitliche Fehlermeldungen implementieren
def getMode(self):
return self.mode
def readyToPlay(self):
return not self.showing
def readyToShow(self):
return self.done
def madeMistake(self):
return self.mistake
def inSequence(self,kachel):
for i in range(self.level):
if self.getIndex(kachel.getPos()) == self.randomSequence[i]:
return True
return False
def update(self):
if self.cooldown > 0:
self.cooldown -= 1
if self.cooldown == 0:
self.deactivateAll()
#und die kachel updaten:
for kachel in self.kachelarray:
kachel.update()
else:
for kachel in self.kachelarray:
kachel.deselect()
kPos = kachel.getPos()
mausPos = self.mausimaus.getPos()
mousePressed = self.mausimaus.getState(0) == BUTTON_PRESSED
#WARNUNG: nicht in den verschachtelungen verirren!!!
if not self.mode == MODE_SHOW:
if tools.is2DPointCollision(mausPos,(kPos[0]*kPos[2],kPos[1]*kPos[3],kPos[2],kPos[3])):
if not kachel.isActive:
if mousePressed:
kachel.activate()
if self.mode == MODE_PLAY:
if self.inSequence(kachel):
self.playingStep += 1
self.sounds[0].play()
if self.playingStep == self.level:
self.done = True
else:
self.mistake = True
self.sounds[2].play()
self.done = True
else:
kachel.select()
kachel.update()
if self.mode == MODE_RANDOM:
self.randomFrame += 1
if self.randomFrame > RANDOM_FRAMES:
self.initRandomSequence()
elif self.mode == MODE_SHOW:
self.curFrame +=1
if self.curFrame >= self.maxFrame:
self.showing = False
for i in self.randomSequence:
self.kachelarray[i].activate()
def draw(self):
for kachel in self.kachelarray:
kachel.draw()