import pygame, sys, os from pygame.locals import * from eduGames import * import random class Concentrate(Game): def __init__(self, screen, uiMgr, sndMgr, screenMgr, path): Game.__init__(self, screen, uiMgr, sndMgr, screenMgr, path) self.currentQuestionIndex = 0 self.pairs = None self.finished = False self.firstSelectedCard = None self.secondSelectedCard = None self.waitingFrames = 0 self.solved = 0 self.cards = [] self.faceDownImage = "" self.soundsDir = "" #set by Games class later self.mustRandom = self.settings["mustRandom"] self.xMargin = 0 self.yMargin = 0 self.mustRemoveCards = False self.background1Path = "" self.background2Path = "" self.isHelp = False self.preFinished = False self.successSound = "" def readInfo(self): self.faceDownImage = os.path.join(self.resourcesDir, "_BackFace.png") self.alert = os.path.join(self.soundsDir,"chord.ogg") fileName = os.path.join(self.path, self.settings["infoFile"]) puzzleFile = open(fileName, "r") fileText = puzzleFile.read() puzzleFileReader = Reader(self.resourcesDir, self.soundsDir) puzzleFile.close() pairs = puzzleFileReader.read(fileText) self.background1Path = puzzleFileReader.background1 self.background2Path = puzzleFileReader.background2 self.background = None return pairs def initializeGameData(self): self.pairs = self.readInfo() self.buildCardControls() (widthOfCards, heightOfCards) = self.showCardControls() if self.background1Path != "" and self.background2Path != "": self.background = ImageControl(self, 0, 0,self.background1Path, "", 1) difX = self.background.getWidth() - self.settings["cardsPerRow"]*widthOfCards difY = self.background.getHeight() - self.settings["cardsPerRow"]*heightOfCards xBackground = self.settings["initialX"] - (difX/2) yBackground = self.settings["initialY"] - (difY/2) self.background.setX(xBackground) self.background.setY(yBackground) self.background.setLayer(7) self.getUiMgr().addControl(self.background) self.successSound = os.path.join(self.soundsDir, "bing.ogg") def buildCardControls(self): for pair in self.pairs: first = CardControl(self, pair.firstImage, self.faceDownImage) second = CardControl(self, pair.secondImage, self.faceDownImage) first.pair = pair second.pair = pair first.type = "card" second.type = "card" first.setLayer(4) second.setLayer(4) self.cards.append(first) self.cards.append(second) def showCardControls(self): if self.mustRandom: random.shuffle(self.cards) cardsPerRow = self.settings["cardsPerRow"] initialX = self.settings["initialX"] + self.xMargin x = initialX y = self.settings["initialY"] + self.yMargin counter = 1 modelCard = None for control in self.cards: if modelCard is None: modelCard = control if counter > cardsPerRow and counter%cardsPerRow == 1: y = y + (counter%cardsPerRow)*control.getWidth() x = initialX control.setX(x) control.setY(y) self.getUiMgr().addControl(control) x = x + control.getWidth() counter = counter + 1 return (modelCard.getWidth(), modelCard.getHeight()) def on_mouse_button_down(self, clickedControl): if clickedControl.type == "card": if clickedControl.faceDown: if self.firstSelectedCard is None: self.firstSelectedCard = clickedControl self.firstSelectedCard.turn() self.getSoundMgr().addSoundForPlayback(self.firstSelectedCard.pair.audio, True) elif self.secondSelectedCard is None: self.secondSelectedCard = clickedControl self.secondSelectedCard.turn() self.getSoundMgr().addSoundForPlayback(self.secondSelectedCard.pair.audio, True, True) def updateState(self): if self.waitingFrames <= 0: if not self.firstSelectedCard is None and not self.secondSelectedCard is None: if self.firstSelectedCard.pair == self.secondSelectedCard.pair: self.solved += 1 self.mustRemoveCards = True self.waitingFrames = self.settings["waitingFrames"] self.getSoundMgr().addSoundForPlayback(self.successSound, False, True) else: self.waitingFrames = self.settings["waitingFrames"] else: self.waitingFrames = self.waitingFrames - 1 if self.waitingFrames == 0: if self.solved == len(self.pairs): if not self.background is None: self.getUiMgr().removeControl(self.background) self.background = ImageControl(self, self.background.getX(), self.background.getY(),self.background2Path, "", 1) self.getUiMgr().addControl(self.background) if not self.preFinished: if self.settings.has_key("waitingFramesOnEnd"): self.waitingFrames = self.settings["waitingFramesOnEnd"] else: self.waitingFrames = self.settings["waitingFrames"] self.preFinished = True self.getSoundMgr().addSoundForPlayback(os.path.join(self.soundsDir, "Twinkle.ogg")) else: self.finished = True if not self.isHelp: self.saveAsDone() return elif self.mustRemoveCards: self.getUiMgr().removeControl(self.firstSelectedCard) self.getUiMgr().removeControl(self.secondSelectedCard) self.firstSelectedCard = None self.secondSelectedCard = None self.mustRemoveCards = False else: self.firstSelectedCard.turn() self.secondSelectedCard.turn() self.firstSelectedCard = None self.secondSelectedCard = None class Reader: def __init__(self, resourcesDir, soundsDir): self.resourcesDir = resourcesDir self.soundsDir = soundsDir self.background1 = "" self.background2 = "" def read(self, puzzlesDefinition): lines = puzzlesDefinition.splitlines() currentPair = None pairs = [] for line in lines: line = line.strip() if line == "": continue elif line.startswith("#"): continue elif line.startswith("BACKGROUND:"): lineParts = line.split(":") self.background1 = os.path.join(self.resourcesDir, lineParts[1]) self.background2 = os.path.join(self.resourcesDir, lineParts[2]) else: data = line.split() pair = Pair(data[0], data[1], data[2], data[3], self.resourcesDir, self.soundsDir) pairs.append(pair) return pairs class Pair: def __init__(self, firstImage, secondImage, audio, text, resourcesDir, soundsDir): self.firstImage = os.path.join(resourcesDir, firstImage) self.secondImage = os.path.join(resourcesDir,secondImage) self.audio = os.path.join(soundsDir,audio) self.text = text class CardControl(Control): def __init__(self, game, faceUpImage, faceDownImage): Control.__init__(self, game, 0, 0, 0, 0, "", 0) self.faceUpImage = Image(faceUpImage) self.faceDownImage = Image(faceDownImage) self.image = self.faceDownImage self.faceDown = True self.changedState = False self.setWidth(self.image.getWidth()) self.setHeight(self.image.getHeight()) def show(self, surface): self.image.show(surface, (self.getX(),self.getY())) def update(self): Control.update(self) if not self.changedState: return if self.faceDown: self.image = self.faceDownImage else: self.image = self.faceUpImage self.changedState = False def turn(self): if self.faceDown: self.faceDown = False else: self.faceDown = True self.changedState = True self.markChanges()