class Game: def __init__(self): self.bump_audio = BUMP_AUDIO self.over_img = OVER_IMG self.init_game() def init_game(self): # 游戏结束 self.over = False # 创建滚动地图对象 self.bg = RollBackground() # 创建恐龙对象 self.dinosaur = Dinosaur() # 创建障碍物组合 self.obstacles = ObstacleGroup() def process_event(self): for event in pygame.event.get(): if event.type == QUIT: sys.exit(0) elif event.type == KEYDOWN and event.key == K_SPACE: if self.over: self.init_game() else: self.dinosaur.jump() def start(self): while True: self.process_event() if not self.over: self.update_window() if self.dinosaur.collide(self.obstacles): self.over = True self.game_over() self.dinosaur.show_score() pygame.display.update() set_fps(30) def update_window(self): self.bg.update() self.dinosaur.update() self.obstacles.update() def game_over(self): self.bump_audio.play() x = (SCREEN_WIDTH - self.over_img.get_width()) // 2 y = (SCREEN_HEIGHT - self.over_img.get_height()) // 2 SCREEN.blit(self.over_img, (x, y))
class Game(object): def __init__(self): self.score = 0 self.cont_enemies_x_level = 0 self.level = 0 self.over = False self.pause = False self.messages = [] self.sprites_list = pygame.sprite.Group() self.walls_list = pygame.sprite.Group() self.enemies_list = pygame.sprite.Group() self.define_borders() self.grown = Grown() self.sprites_list.add(self.grown.objects_list) self.dino = Dinosaur() self.dino.walls = self.walls_list self.sprites_list.add(self.dino) self.last_timestamp = time.time() self.next_level_timestamp = time.time() def define_borders(self): # BORDER LEFT wall = Wall(0, 0, 2, SCREEN_Y_GAME) self.walls_list.add(wall) self.sprites_list.add(wall) # BORDER TOP wall = Wall(2, 0, SCREEN_X_GAME, 2) self.walls_list.add(wall) self.sprites_list.add(wall) # BORDER RIGHT wall = Wall(SCREEN_X_GAME, 0, 2, SCREEN_Y_GAME) self.walls_list.add(wall) self.sprites_list.add(wall) # BORDER BOTTOM wall = Wall(0, SCREEN_Y_GAME - 2, SCREEN_X_GAME, 2) self.walls_list.add(wall) self.sprites_list.add(wall) def event_handler(self): for event in pygame.event.get(): if event.type == pygame.QUIT: return True if event.type == pygame.KEYDOWN: if self.over: self.reset_game() if event.key == pygame.K_p: self.pause = not self.pause if not self.pause: if event.key == pygame.K_UP: self.dino.jump() if event.key == pygame.K_DOWN: self.dino.stand_down() if event.type == pygame.KEYUP: if not self.pause: if event.key == pygame.K_DOWN: self.dino.stand_up() return False def run(self): if not self.over: self.sprites_list.update() self.check_level() if self.pause: self.scroll_scene(0) else: self.scroll_scene(SPEED[self.level]) self.increment_score() self.calculate_next_enemy() self.check_dino_impacted() def pause_game(self, screen): font = pygame.font.SysFont("serif", 25) text = font.render("Pause", True, BLACK) center_x = (SCREEN_X_GAME // 2) - (text.get_width() // 2) center_y = (SCREEN_Y_GAME // 2) - (text.get_height() // 2) screen.blit(text, [center_x, center_y]) self.last_timestamp = time.time() def reset_game(self): self.score = 0 self.cont_enemies_x_level = 0 self.over = False self.level = 0 self.last_timestamp = time.time() self.enemies_list.empty() sprites_list_temp = pygame.sprite.Group() sprites_list_temp.add(enemy for enemy in self.sprites_list if enemy.__module__ != 'enemy' and enemy.__module__ != 'dinosaur') self.sprites_list = sprites_list_temp self.dino = Dinosaur() self.dino.walls = self.walls_list self.sprites_list.add(self.dino) def check_level_old(self): """ deprecated. Not used """ next_level = int((self.score // SCORE_X_LEVEL)) self.level = next_level if next_level <= len(SPEED) - 1 else len(SPEED) - 1 def check_level(self): if self.cont_enemies_x_level > ENEMIES_X_LEVEL[self.level]: next_level = self.level + 1 if next_level <= len(SPEED) - 1: self.level = next_level self.cont_enemies_x_level = 0 self.next_level_timestamp = time.time() def check_dino_impacted(self): if self.dino.impacted: self.over = True def log(self, message): """ Only for development propose """ self.messages.append(message) def increment_score(self): tot_enemies = len(self.enemies_list) tmp_enemies_list = pygame.sprite.Group() tmp_enemies_list.add(enemy for enemy in self.enemies_list if not enemy.removable) num_enemies = len(tmp_enemies_list) self.enemies_list = tmp_enemies_list self.score += (tot_enemies - num_enemies) self.cont_enemies_x_level += (tot_enemies - num_enemies) def add_enemy_to_lists(self, enemy): self.enemies_list.add(enemy) self.sprites_list.add(enemy) self.dino.enemies_list.add(enemy) self.grown.objects_list.add(enemy) def calculate_next_enemy(self): wait = random.uniform(RANGE_TIME_NEXT_ENEMY[self.level][0], RANGE_TIME_NEXT_ENEMY[self.level][1]) if time.time() - self.last_timestamp > wait: self.last_timestamp = time.time() result = random.choices(range(len(TYPE_ENEMY)), WEIGHTS_ENEMY[self.level]) self.create_enemy(TYPE_ENEMY[result[0]]) def create_enemy(self, enemy_type): self.add_enemy_to_lists(Enemy(enemy_type['x'], enemy_type['y'], enemy_type['w'], enemy_type['h'])) def scroll_scene(self, scroll_x): for element in self.grown.objects_list: element.scroll_x = scroll_x def display_frame(self, screen): screen.fill(WHITE) self.display_score(screen) self.display_log(screen) self.display_level(screen) if self.over: self.display_game_over(screen) if self.pause: self.pause_game(screen) self.sprites_list.draw(screen) pygame.display.flip() def display_game_over(self, screen): font = pygame.font.SysFont("serif", 25) text = font.render("Game Over", True, BLACK) center_x = (SCREEN_X_GAME // 2) - (text.get_width() // 2) center_y = (SCREEN_Y_GAME // 2) - (text.get_height() // 2) screen.blit(text, [center_x, center_y]) def display_score(self, screen): font = pygame.font.SysFont("serif", 25) text = font.render("Score: " + str(int(self.score)), True, BLACK) x = SCREEN_X_GAME - text.get_width() - 20 screen.blit(text, [x, 10]) def display_changes(self, screen): """ Only for development purpose """ font = pygame.font.SysFont("serif", 25) text1 = font.render("Change X: " + str(self.dino.change_x), True, BLACK) x = 10 screen.blit(text1, [x, 10]) text2 = font.render("Change Y: " + str(self.dino.change_y), True, BLACK) x = text1.get_width() + 20 screen.blit(text2, [x, 10]) def display_cords(self, screen): """ Only for development purpose """ font = pygame.font.SysFont("serif", 25) text1 = font.render("RECT X: " + str(self.dino.rect.x), True, BLACK) x = 10 screen.blit(text1, [x, 40]) text2 = font.render("RECT Y: " + str(self.dino.rect.y), True, BLACK) x = text1.get_width() + 20 screen.blit(text2, [x, 40]) def display_level(self, screen): if time.time() - self.next_level_timestamp < 0.5 or (time.time() - self.next_level_timestamp > 1 and time.time() - self.next_level_timestamp < 1.5): color = WHITE else: color = BLACK font = pygame.font.SysFont("serif", 25) txt_level = font.render("Level: ", True, BLACK) num_level = font.render(str(self.level + 1), True, color) screen.blit(txt_level, [20, 10]) screen.blit(num_level, [20 + txt_level.get_width(), 10]) def display_log(self, screen): font = pygame.font.SysFont("serif", 10) y = 0 for message in reversed(self.messages): text = font.render(message, True, BLACK) x = SCREEN_X_GAME + 10 screen.blit(text, [x, y]) y += 12
def main(): # 初始化 pygame.init() screen = pygame.display.set_mode((WIDTH, HEIGHT)) pygame.display.set_caption("Dinosaur Game Race") clock = pygame.time.Clock() # 得分 score = 0 # 加载一些素材 ## jump_sound = pygame.mixer.Sound("./music/jump.wav") ## jump_sound.set_volume(6) ## die_sound = pygame.mixer.Sound("./music/die.wav") ## die_sound.set_volume(6) ## pygame.mixer.init() ## pygame.mixer.music.load("./music/bg_music.mp3") ## pygame.mixer.music.set_volume(0.6) ## pygame.mixer.music.play(-1) font = pygame.font.Font('/Users/wanyiyang/Desktop/pygame/simkai.ttf', 20) # 实例化 dinosaur = Dinosaur(WIDTH, HEIGHT) scene = Scene(WIDTH, HEIGHT) plants = pygame.sprite.Group() pteras = pygame.sprite.Group() # 产生障碍物事件 GenPlantEvent = pygame.constants.USEREVENT + 0 pygame.time.set_timer(GenPlantEvent, 4500) GenPteraEvent = pygame.constants.USEREVENT + 1 pygame.time.set_timer(GenPteraEvent, 15000) # 游戏是否结束了 running = True # 是否可以产生障碍物flag flag_plant = False flag_ptera = False t0 = time.time() # 主循环 while running: for event in pygame.event.get(): if event.type == QUIT: sys.exit() pygame.quit() if event.type == GenPlantEvent: flag_plant = True if event.type == GenPteraEvent: if score > 50: flag_ptera = True key_pressed = pygame.key.get_pressed() if key_pressed[pygame.K_SPACE]: dinosaur.is_jumping = True ## jump_sound.play() screen.fill(BACKGROUND) time_passed = time.time() - t0 t0 = time.time() # 场景 scene.move() scene.draw(screen) # 小恐龙 dinosaur.is_running = True if dinosaur.is_jumping: dinosaur.be_afraid() dinosaur.jump(time_passed) dinosaur.draw(screen) # 障碍物-植物 if random.random() < sigmoid(score) and flag_plant: plant = Plant(WIDTH, HEIGHT) plants.add(plant) flag_plant = False for plant in plants: plant.move() if dinosaur.rect.left > plant.rect.right and not plant.added_score: score += 1 plant.added_score = True if plant.rect.right < 0: plants.remove(plant) continue plant.draw(screen) # 障碍物-飞龙 if random.random() < sigmoid(score) and flag_ptera: if len(pteras) > 1: continue ptera = Ptera(WIDTH, HEIGHT) pteras.add(ptera) flag_ptera = False for ptera in pteras: ptera.move() if dinosaur.rect.left > ptera.rect.right and not ptera.added_score: score += 5 ptera.added_score = True if ptera.rect.right < 0: pteras.remove(ptera) continue ptera.draw(screen) # 碰撞检测 if pygame.sprite.spritecollide(dinosaur, plants, False) or pygame.sprite.spritecollide( dinosaur, pteras, False): ## die_sound.play() running = False # 显示得分 score_text = font.render("Score: " + str(score), 1, (0, 0, 0)) screen.blit(score_text, [10, 10]) pygame.display.flip() clock.tick(60) res = show_gameover(screen) return res
white = 255,255,255 while True: #gameLoop it draws the frames of the game t = pygame.time.get_ticks() #Get current time deltaTime = (t-lastFrame)/1000.0 #Find difference in time and then convert it to seconds lastFrame = t #set lastFrame as the current time for next frame. for event in pygame.event.get(): #Check for events if event.type == pygame.QUIT: pygame.quit() #quits quit() if event.type == pygame.KEYDOWN: #If user uses the keyboard if event.key == pygame.K_SPACE: #If that key is space dinosaur.jump() #Make dinosaur jump gameDisplay.fill(black) dinosaur.update(deltaTime) dinosaur.draw(gameDisplay) for obs in obstacles: obs.update(deltaTime, VELOCITY) obs.draw(gameDisplay) if(obs.checkOver()): lastObstacle += MINGAP+(MAXGAP-MINGAP)*random.random() obs.x = lastObstacle lastObstacle -= VELOCITY*deltaTime
class Game: pygame.init() clock = pygame.time.Clock() width = 1024 height = 500 black = (0, 0, 0) white = (255, 255, 255) display = pygame.display.set_mode((width, height)) gameExit = False cactus = pygame.image.load('img/cactus.png').convert_alpha() pygame.display.set_caption("Teachable Dinosaur") cactus_rect = cactus.get_rect() cactuses = [] counter = 0 camera = cv2.VideoCapture(0) exit = False score = 0 cac = False def __init__(self): from dinosaur import Dinosaur self.dino = Dinosaur() self.model = train.load_model() self.model.load_weights('weights.h5') self.intro() def intro(self): intro = True while intro: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() quit() if event.type == pygame.KEYDOWN: if event.key == pygame.K_SPACE: self.gameloop() self.display.fill(self.white) largeText = pygame.font.Font('freesansbold.ttf', 100) textSurf = largeText.render("Press SPACE to play", True, self.black) textRect = textSurf.get_rect() textRect.center = ((self.width / 2), (self.height / 2)) self.display.blit(textSurf, textRect) pygame.display.update() self.clock.tick(30) def gameloop(self): while not self.gameExit: self.display.fill(self.white) pygame.draw.line(self.display, self.black, (0, self.height - 50), (self.width, self.height - 50)) for event in pygame.event.get(): if event.type == pygame.QUIT: self.gameExit = True if self.counter % (random.randrange(100, 110)) == 0: self.cac = True from cactus import Cactus self.cactuses.append(Cactus()) for c in self.cactuses: c.showCactus() c.hitbox = [c.rect.x, c.rect.y + 5, 41, 45] c.rect.x -= 13 if c.rect.x <= -c.rect.width: self.cactuses = self.cactuses[1:] pic = self.take_photo() result = self.predict(pic) if result == 0: pass else: self.dino.jump() self.dino.updateVariables() self.score += 1 text = pygame.font.Font('freesansbold.ttf', 20) textSurf = text.render("Score: " + str(self.score), True, self.black) self.display.blit(textSurf, [10, 10]) self.dino.show() self.dinoHitbox = pygame.Rect(self.dino.hitbox) pygame.display.update() if self.dino.var > 50: self.dino.var -= 10 if self.collision() and self.cac: self.gameExit = True self.clock.tick(30) self.counter += 1 pygame.quit() self.camera.release() cv2.destroyAllWindows() quit() def take_photo(self): cv2.resizeWindow('image', 300, 350) return_value, image = self.camera.read() cv2.imshow('image', image) im = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) im = Image.fromarray(im) im = im.resize((100, 100)) im = np.array(im) im = np.resize(im, (1, 100, 100, 3)) im = (im.astype(float) - 128) / 128 return im def predict(self, pic): prob = self.model.predict(pic) result = np.argmax(prob) return result def collision(self): for cactus in self.cactuses: if self.dinoHitbox.colliderect(pygame.Rect(cactus.hitbox)): return True return False