Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/Concentrate.py
diff options
context:
space:
mode:
Diffstat (limited to 'Concentrate.py')
-rw-r--r--Concentrate.py223
1 files changed, 223 insertions, 0 deletions
diff --git a/Concentrate.py b/Concentrate.py
new file mode 100644
index 0000000..909d6ab
--- /dev/null
+++ b/Concentrate.py
@@ -0,0 +1,223 @@
+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()
+
+
+