class Game: def __init__(self, screen, inClock): #Window variables self.screen = screen self.resolutionX = screen.get_width() self.resolutionY = screen.get_height() self.clock = inClock self.marginHUD = 100 #Game variables self.cellSizeX = 16 self.cellSizeY = 16 self.xCells = int(self.resolutionX / self.cellSizeX) self.yCells = int(self.resolutionY / self.cellSizeY - self.marginHUD / self.cellSizeY) self.cellSizeDivisor = 2 self.cellUpdate = 4 self.deadCells = 0 self.aliveCells = 0 self.infectedCells = 0 self.cellSet = [[Cell]*self.yCells for x in range(self.xCells)] self.dirtyCells = [] self.updateTime = 0 self.updateNumber = 0 self.cellDeathLimit = 35 self.gameState = gameState.MENU_STATE self.player = Character("finalizedmasterchiefsprite.gif", 100, 100, 288, 288, 4, 4, 10, 10) self.level = 1 self.menuList = [] self.enemyList = [] #bool variables self.playerAlive = True self.enemyAlive = True self.enemyAI = True self.bMusic = True self.bTimer = False self.setUpGame = False self.crosInput = False ##music variables pygame.mixer.stop() pygame.mixer.init(44100, -16, 2, 2048) self.soundMaster = GameSound() ##keyboard variables self.keyboard = pygame.key.get_pressed() self.key1 = pygame.K_1 self.key2 = pygame.K_2 self.makeColorArray() self.setUpMouse() self.startMenu() def gamePrint(self, screen, text, xx, yy, color, fontSize): font = pygame.font.SysFont("Courier New",fontSize) ren = font.render(text,1,color) screen.blit(ren, (xx,yy)) def makeColorArray(self): self.colorArray = [] self.colorArray.append(black) self.colorArray.append(darkBlue) self.colorArray.append(blue) self.colorArray.append(green) self.colorArray.append(yellow) self.colorArray.append(orange) self.colorArray.append(red) self.colorArray.append(pink) self.colorArray.append(white) self.colorArray.append(zombie) self.colorArray.append(dead) def initializeGame(self, screen): self.setUpPlayer() self.setUpEnemy(screen) self.seedLevel(); self.gameState = gameState.PLAY_STATE def setUpPlayer(self): self.playerAlive = True self.player = Character("finalizedmasterchiefsprite.gif", 100, 100, 288, 288, 4, 4, 10, 10) self.player.set_animation_delay(100) self.player.play(True) def setUpEnemy(self, screen): self.enemyList = [] enemy = Enemy("Zombie.gif", screen.get_width() - 100, screen.get_height() - 100, 288, 288, 4, 4, self.enemyAI) self.enemyList.append(enemy) if self.level > 2: enemy = Enemy("Zombie.gif", screen.get_width() - 100, screen.get_height() - 700, 288, 288, 4, 4, True) self.enemyList.append(enemy) if self.level > 4: enemy = Enemy("Zombie.gif", screen.get_width() / 2, screen.get_height() / 2, 288, 288, 4, 4, True) self.enemyList.append(enemy) for enemy in self.enemyList: enemy.set_animation_delay(100) enemy.play(True) def setUpMouse(self): pygame.mouse.set_visible(False) self.crosshair = MouseCrosshair(Point2D(50, 50), Point2D(30, 30), "crosshair.bmp", 60, 30, 2, 1) self.crosshair.set_image_color_key(255, 255, 255) self.crosshair.set_animation_delay(200) self.crosshair.play(True) def seedLevel(self): for index1 in range(self.xCells): for index2 in range(self.yCells): self.cellSet[index1][index2] = Cell() for x in range(100): index1 = random.randint(0, self.xCells - 1) index2 = random.randint(0, self.yCells - 1) life = random.randint(1,8) self.cellSet[index1][index2].makeAlive() def incrementLevel(self, screen): self.level += 1 self.initializeGame(screen) def startMenu(self): self.gameState = gameState.MENU_STATE keypress = pygame.key.get_pressed() screen = pygame.display.set_mode((self.resolutionX, self.resolutionY)) self.menuList.append(MenuObject(Point2D(350, 380), 60, 35, "start")) self.menuList.append(MenuObject(Point2D(500, 700), 60, 35, "quit")) self.menuList.append(MenuObject(Point2D(60, 750), 60, 35, "music", True)) self.menuList.append(MenuObject(Point2D(115, 750), 70, 35, "music", False)) def updateMenu(self, screen): self.gamePrint(self.screen, "Start!", 350, 380, white, 30) self.gamePrint(self.screen, "Quit!", 500, 700, white, 30) self.gamePrint(self.screen, "Music?", 70, 700, white, 36) self.gamePrint(self.screen, "On", 60, 750, white, 30) self.gamePrint(self.screen, "Off", 115, 750, white, 30) if(pygame.mouse.get_pressed() == (0,0,1)): mouseX = pygame.mouse.get_pos()[0] mouseY = pygame.mouse.get_pos()[1] for menu in self.menuList: if mouseX > menu.upperLeft.x and mouseX < menu.lowerRight.x: if mouseY > menu.upperLeft.y and mouseY < menu.lowerRight.y: self.selectOption(menu.type, menu, screen) msElapsed = self.clock.tick(30) self.crosshair.update(screen) pygame.display.update() for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit(); sys.exit(); def selectOption(self, menuType, item, screen): if menuType == "start": self.initializeGame(screen); if menuType == "quit": pygame.quit(); sys.exit(); elif menuType == "music": self.bMusic = item.value def checkPlayerWalkingOnCells(self): indexX = int(self.player.upperLeft.x / self.cellSizeX) indexY = int(self.player.upperLeft.y / self.cellSizeY) while(indexX < self.player.lowerRight.x / self.cellSizeX): while(indexY < self.player.lowerRight.y / self.cellSizeY): if(self.checkX(indexX) and self.checkY(indexY)): if(self.cellSet[indexX][indexY].bIsInfected == True): self.cellSet[indexX][indexY].cureInfection() self.player.score += 10 indexY += 1 indexX += 1 def checkEnemyWalkingOnCells(self): for enemy in self.enemyList: if enemy.health > 0: indexX = int(enemy.upperLeft.x / self.cellSizeX) indexY = int(enemy.upperLeft.y / self.cellSizeY) while (indexX < enemy.lowerRight.x / self.cellSizeX): while (indexY < enemy.lowerRight.y / self.cellSizeY): if (self.checkX(indexX) and self.checkY(indexY)): if (self.cellSet[indexX][indexY].getLife() == 8): self.cellSet[indexX][indexY].makeZombie() indexY += 1 indexX += 1 def update(self, screen): if self.bMusic == True: if pygame.mixer.get_busy() == False: self.playSong() if self.gameState == gameState.PLAY_STATE: if self.updateNumber >= self.cellUpdate: self.updateNeighbors() self.updateNumber = 0 else: self.updateNumber += 1 self.player.update(screen, self.enemyList) self.checkPlayerWalkingOnCells(); if self.playerAlive != True: self.gameOver(); else: self.checkPlayerWalkingOnCells() for enemy in self.enemyList: enemy.update(screen, self.player) self.checkEnemyWalkingOnCells() self.updateCells() self.countCells() #random creations of gliders self.randomlyCreateGliders() elif self.gameState == gameState.MENU_STATE: self.updateMenu(screen) elif self.gameState == gameState.GAME_OVER: keypress = pygame.key.get_pressed() if keypress[pygame.K_SPACE]: self.initializeGame(screen) elif self.gameState == gameState.WIN_STATE: keypress = pygame.key.get_pressed() if keypress[pygame.K_SPACE]: self.incrementLevel(screen) def drawHUD(self, screen): #----CELLS ALIVE----# color = white if self.aliveCells < 1: color = red elif self.aliveCells < 100: color = orange gameText = "Cells Alive: " + str(self.aliveCells) self.gamePrint(screen, gameText, 5, 700, color, 12) #----CELLS DEAD----# color = white if self.deadCells >= 25: color = red elif self.deadCells >= 10: color = orange gameText = "Cells Dead: " + str(self.deadCells) + "/" + str(self.cellDeathLimit) self.gamePrint(screen, gameText, 5, 750, color, 12) #----INFECTED CELLS----# color = white if self.infectedCells >= 10: color = red gameText = "Cells Infected: " + str(self.infectedCells) self.gamePrint(screen, gameText, 150, 700, color, 12) #----LEVEL----# color = white gameText = "Level: " + str(self.level) self.gamePrint(screen, gameText, 150, 750, color, 12) #----PLAYER HP----# tempY = 700 if self.player.health < 40: color = red elif self.player.health < 60: color = orange else: color = white gameText = "Health: " + str(self.player.health) self.gamePrint(screen, gameText, 300, tempY, color, 12) #----PLAYER SCORE----# color = white gameText = "Score: " + str(self.player.score) self.gamePrint(screen, gameText, 400, tempY, color, 12) tempY += 50 if self.gameState == gameState.GAME_OVER: color = red gameText = "GAME OVER!" gameText1 = ("Press space to start a new game") self.gamePrint(screen, gameText, 350, 380, color, 32) self.gamePrint(screen, gameText1, 330, 410, color, 12) elif self.gameState == gameState.WIN_STATE: color = green gameText = "You win!" self.gamePrint(screen, gameText, 350, 380, color, 32) def levelWin(self): self.gameState = gameState.WIN_STATE def countCells(self): if self.bTimer == False: self.time = pygame.time.get_ticks() self.bTimer = True else: if self.time < pygame.time.get_ticks(): self.deadCells = 0 self.aliveCells = 0 self.infectedCells = 0 self.bTimer = False for indexX in range(self.xCells): for indexY in range(self.yCells): cell = self.cellSet[indexX][indexY] if cell.bDead == True: self.cellDeath() elif cell.getLife() == 8: self.aliveCells += 1 elif cell.getLife() == 9: self.infectedCells +=1 if self.aliveCells == 0: self.gameOver() if self.infectedCells <= 0: enemyAlive = False for enemy in self.enemyList: if enemy.health >= 0: enemyAlive = True if enemyAlive == False: self.levelWin() def cellDeath(self): self.deadCells += 1 if self.deadCells >= self.cellDeathLimit: self.gameOver() def draw(self, screen): for indexX in range(self.xCells): for indexY in range(self.yCells): if (self.cellSet[indexX][indexY].getLife() != 0): color = self.colorArray[int(self.cellSet[indexX][indexY].getLife())] pygame.draw.rect(screen, color, (indexX * self.cellSizeX, indexY * self.cellSizeY, self.cellSizeX / self.cellSizeDivisor, self.cellSizeY / self.cellSizeDivisor)) if self.player.health > 0: self.player.draw(screen) for enemy in self.enemyList: if enemy.health > 0: enemy.draw(screen) def updateCells(self): for indexX in range(self.xCells): for indexY in range(self.yCells): self.cellSet[indexX][indexY].update() def updateNeighbors(self): self.dirtyCells = [] for indexX in range(self.xCells): for indexY in range(self.yCells): if self.cellSet[indexX][indexY].bConsidered == True: self.updateCell(indexX, indexY) for x in range(0,len(self.dirtyCells), 2): self.updateCell(self.dirtyCells[x], self.dirtyCells[x+1]) def updateCell(self, indexX, indexY): examinedCell = self.cellSet[indexX][indexY] if examinedCell.bIsInfected != True and examinedCell.bDead == False: examinedCell.bChecked = True cellsNear = 0 for xDistance in range(3): for yDistance in range(3): x = indexX + xDistance - 1 y = indexY + yDistance - 1 if (xDistance == 1 and yDistance == 1): doNothing = True else: if (self.checkX(x) and self.checkY(y)): cellBeingChecked = self.cellSet[x][y] if cellBeingChecked.getLife() == 8: cellsNear += 1 elif cellBeingChecked.bIsInfected == True: examinedCell.addInfection() if examinedCell.getLife() == 8 and cellBeingChecked.bConsidered == False: cellBeingChecked.bConsidered = True self.dirtyCells.append(x) self.dirtyCells.append(y) examinedCell.setNeighbors(cellsNear) def checkX(self,x): if x >= 0 and x <= self.xCells - 1: return True else: return False def checkY(self,y): if y >= 0 and y <= self.yCells - 1: return True else: return False def gameOver(self): self.gameState = gameState.GAME_OVER def playSong(self): self.soundMaster.sound1.play() def randomlyCreateGliders(self): toBeCreated = random.randint(0, 50) if toBeCreated == 0: index1 = random.randint(10,self.xCells - 11) index2 = random.randint(10,self.yCells - 11) self.cellSet[index1 + 1][index2 + 1].makeAlive() self.cellSet[index1 + 1][index2 + 2].makeAlive() self.cellSet[index1 + 2][index2 + 2].makeAlive() self.cellSet[index1 + 2][index2 + 3].makeAlive() self.cellSet[index1 + 3][index2 + 2].makeAlive() self.cellSet[index1 + 5][index2 + 1].makeAlive() self.cellSet[index1 + 6][index2 + 1].makeAlive() self.cellSet[index1 + 6][index2 + 2].makeAlive() self.cellSet[index1 + 7][index2 + 1].makeAlive() elif toBeCreated == 1: index1 = random.randint(10,self.xCells - 11) index2 = random.randint(10,self.yCells - 11) self.cellSet[index1 + 1][index2 + 1].makeAlive() self.cellSet[index1 + 1][index2 + 2].makeAlive() self.cellSet[index1 + 2][index2 + 1].makeAlive() self.cellSet[index1 + 2][index2 + 3].makeAlive() self.cellSet[index1 + 3][index2 + 1].makeAlive() elif toBeCreated == 2: index1 = random.randint(10,self.xCells - 11) index2 = random.randint(10,self.yCells - 11) self.cellSet[index1 + 2][index2 + 1].makeAlive() self.cellSet[index1 + 3][index2 + 1].makeAlive() self.cellSet[index1 + 1][index2 + 2].makeAlive() self.cellSet[index1 + 3][index2 + 2].makeAlive() self.cellSet[index1 + 3][index2 + 3].makeAlive() elif toBeCreated == 3: index1 = random.randint(10,self.xCells - 11) index2 = random.randint(10,self.yCells - 11) self.cellSet[index1 + 2][index2 + 1].makeAlive() self.cellSet[index1 + 1][index2 + 3].makeAlive() self.cellSet[index1 + 2][index2 + 3].makeAlive() self.cellSet[index1 + 3][index2 + 3].makeAlive() self.cellSet[index1 + 3][index2 + 2].makeAlive() elif toBeCreated == 4: index1 = random.randint(10,self.xCells - 11) index2 = random.randint(10,self.yCells - 11) self.cellSet[index1 + 1][index2 + 1].makeAlive() self.cellSet[index1 + 1][index2 + 2].makeAlive() self.cellSet[index1 + 1][index2 + 3].makeAlive() self.cellSet[index1 + 2][index2 + 3].makeAlive() self.cellSet[index1 + 3][index2 + 2].makeAlive()