class Setting(): def __init__(self, media): self.titlefont = pygame.font.SysFont('inkfree', 80) self.title = self.titlefont.render("Setting", True, (255, 255, 255)) self.comment = pygame.font.SysFont('inkfree', 40) self.choose = [1, 0] # 現在の選択されている位置 self.control = Control() self.media = media self.menu_str = [["SIZE", " SMALL", " NORMAL", " BIG", ""], ["STARS", " FEW", " NORMAL", " MANY", "EXIT"], ["SPEED", " SLOW", " NORMAL", " FAST", ""]] def main(self, screen, difficulty, rect_player): # タイトルと設定情報の描画 screen.blit(self.title, (20, 50)) for j, strs in enumerate(self.menu_str): for i, st in enumerate(strs): if i == difficulty[j]: screen.blit( self.comment.render(st + ' <-', True, (255, 255, 255)), (200 + 300 * j, 150 + 50 * i)) else: screen.blit(self.comment.render(st, True, (255, 255, 255)), (200 + 300 * j, 150 + 50 * i)) # コントロール操作 con = self.control.control() if con == 'up': if self.choose[Y] > 0: self.media.button1.play() self.choose[Y] -= 1 elif con == 'down': if self.choose[Y] < len(strs) - 2: self.media.button1.play() self.choose[Y] += 1 elif con == 'left': if self.choose[X] > 0: self.media.button1.play() self.choose[X] -= 1 elif con == 'right': if self.choose[X] < len(self.menu_str) - 1: self.media.button1.play() self.choose[X] += 1 elif con == 'return': if self.choose[Y] == 3: #Exit self.media.kirakira.play() return Mode.MENU else: self.media.button2.play() difficulty[self.choose[X]] = self.choose[Y] + 1 # 最下部を選択していたら中央になるようにする if self.choose[Y] == 3: self.choose[X] = 1 # 実際の画面のサイズに応じた位置にカーソルを移動する rect_player.center = (150 + self.choose[X] * 300, 220 + self.choose[Y] * 50) return Mode.SETTING
class Menu(): def __init__(self, media): self.titlefont = pygame.font.SysFont('inkfree', 80) self.title = self.titlefont.render("Catch a star game!", True, (255, 255, 255)) self.comment = pygame.font.SysFont('inkfree', 40) self.title_menu = [ self.comment.render(st, True, (255, 255, 255)) for st in ["PLAY", "SETTING", "RANKING", "BYE"] ] self.choose = 0 # 現在の選択されている位置 self.control = Control() self.media = media def main(self, screen, difficulty, rect_player): # タイトルと設定情報の描画 screen.blit(self.title, (20, 50)) for i, me in enumerate(self.title_menu): screen.blit(me, (500, 50 * i + 200)) # コントロール操作 con = self.control.control() if con == 'up': if self.choose > 0: self.media.button1.play() self.choose -= 1 elif con == 'down': if self.choose < len(self.title_menu) - 1: self.media.button1.play() self.choose += 1 if con == 'return': if self.choose + 1 == Mode.PLAY: self.media.kirakira.play() self.media.play_bgm(2) rect_player.center = (100, 550) return Mode.PLAY elif self.choose + 1 == Mode.SETTING: self.media.kirakira.play() return Mode.SETTING elif self.choose + 1 == Mode.RANKING: self.media.kirakira.play() return Mode.RANKING elif self.choose + 1 == Mode.BYE: self.media.kirakira.play() return Mode.BYE else: rect_player.center = (450, 220 + self.choose * 50) return Mode.MENU rect_player.center = (450, 220 + self.choose * 50) return Mode.MENU
pygame.display.set_caption("SnakeGame") pygame.display.set_icon(pygame.image.load("images/icon.png")) # Создаём объект классов control = Control() snake = Snake() gui = Gui() food = Food() gui.init_field() food.get_food_position(gui, snake.body) var_speed = 0 while control.flag_game: gui.check_win_lose() control.control() window.fill(pygame.Color('DarkGrey')) gui.draw_indicator(window) gui.draw_level(window) if gui.game == "GAME": snake.draw_snake(window) food.draw_food(window) elif gui.game == "WIN": gui.draw_win(window) elif gui.game == "LOSE": gui.draw_lose(window) if var_speed % 15 == 0 and control.flag_pause and gui.game == "GAME": snake.move(control) snake.check_barrier(gui)
class Play(): def __init__(self, media): self.start_time = time.time() self.star_list = [] # 降ってくる星用のリスト self.get_star = 0 # 取得した星の数 self.titlefont = pygame.font.SysFont('inkfree', 80) self.comment = pygame.font.SysFont('inkfree', 40) self.title = self.titlefont.render("Play", True, (255, 255, 255)) self.result = self.titlefont.render("Result", True, (255, 255, 255)) self.control = Control() self.media = media self.ranking = Ranking(media) self.read_ranking = False # ランキングを読み込んだかどうか self.write_point = False # ランキングに書き込めるかどうか self.eng_chara = [[ 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', ' ' ], [ 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'Back' ]] self.choose = [0, 0] self.your_name = '' def main(self, screen, difficulty, rect_player): # タイトルと設定情報の描画 star_num = self.titlefont.render("Star:{0}".format(self.get_star), True, (255, 255, 255)) lim_time = LIMIT_TIME - int((time.time() - self.start_time)) time_num = self.titlefont.render("Time:{0}".format(lim_time), True, (255, 255, 255)) screen.blit(self.title, (20, 50)) # 終了条件を満たしていたら if lim_time <= 0: screen.blit(self.result, (500, 50)) screen.blit(star_num, (500, 150)) # ランキング情報を1度だけ読み出し順位を確認する if self.read_ranking == False: self.write_point = self.ranking.read_ranking(self.get_star) self.read_ranking = True # ランキングで更新があったら名前を入力させる if self.write_point: screen.blit( self.titlefont.render("New Record!", True, (255, 255, 255)), (430, 250)) # スクリーンキーボードを表示する for i, eng in enumerate(self.eng_chara): for j, chara in enumerate(eng): screen.blit( self.comment.render(chara, True, (255, 255, 255)), (350 + j * 40, 400 + i * 40)) screen.blit(self.comment.render("END", True, (255, 255, 255)), (350 + 220, 400 + 2 * 40)) screen.blit( self.comment.render(self.your_name, True, (255, 255, 255)), (350, 350)) # 名前を表示 # 今自分が選択している位置を四角形で表示 pygame.draw.rect( screen, (255, 255, 0), Rect(350 + 40 * self.choose[X], 410 + 40 * self.choose[Y], 30, 30), 2) self.input_name() else: screen.blit( self.titlefont.render("press enter!", True, (255, 255, 255)), (430, 250)) # エンターを押したら終了するための処理 con = self.control.control() if con == 'return': rect_player.center = (450, 220) self.media.kirakira.play() self.media.play_bgm(1) return Mode.MENU # まだ終了していなかったら(制限時間内なら) else: screen.blit(time_num, (900, 10)) screen.blit(star_num, (900, 100)) ran = random.randint(0, 100) # 生成した乱数が難易度の一定数以内なら星を生成する if ran <= (difficulty[Difficulty.STAR] - 1): self.star_list.append(Star(random.randint(100, 1100), 50)) # 生成された星を描画する for i, star in enumerate(self.star_list): screen.blit(self.media.star, (star.x, star.y)) star.y += 2 # 星を落とす # もしキャラクターと星が重なっていたら星を取得 if star.hit(rect_player, 15 * difficulty[Difficulty.SIZE]): self.star_list.pop(i) self.get_star += 1 self.media.hit.play() # 地面以下なら星を消滅 elif self.star_list[i].y > 600: self.star_list.pop(i) # 横移動用コントロール con = self.control.control2() if con == 'left': if rect_player.centerx > 100: rect_player.center = (rect_player.centerx - difficulty[Difficulty.SPEED], 550) elif con == 'right': if rect_player.centerx < 1100: rect_player.center = (rect_player.centerx + difficulty[Difficulty.SPEED], 550) return Mode.PLAY def input_name(self): # コントロール操作 con = self.control.control() if con == 'up': if self.choose[Y] > 0: self.choose[Y] -= 1 elif con == 'down': if self.choose[Y] < 2: self.choose[Y] += 1 elif con == 'left': if self.choose[X] > 0: self.choose[X] -= 1 elif con == 'right': if self.choose[X] < 13: self.choose[X] += 1 elif con == 'return': if self.choose[Y] == 2 and self.your_name != '': # Exitで名前有 self.media.kirakira.play() # 新しいランキングを書き出す self.ranking.write_ranking(self.your_name) self.write_point = False elif self.choose[Y] == 2 and self.your_name == '': # Exitで名前無 self.media.kirakira.play() self.write_point = False else: # enterした場所にある文字を名前として保存する for i in range(14): for j in range(2): if self.choose[Y] == j and self.choose[X] == i: if self.choose[X] == 13 and self.choose[Y] == 1: self.your_name = self.your_name[0:-1] else: self.your_name += self.eng_chara[j][i] # 一番下ならENDにする if self.choose[Y] == 2: self.choose[X] = 6
class Ranking(): def __init__(self, media): self.titlefont = pygame.font.SysFont('inkfree', 80) self.title = self.titlefont.render("Ranking", True, (255, 255, 255)) self.comment = pygame.font.SysFont('inkfree', 40) self.control = Control() self.media = media self.ranking = [] self.write_point = 0 def main(self, screen, defficulty, rect_player): # タイトルと情報の描画 screen.blit(self.title, (20, 50)) screen.blit(self.comment.render("EXIT", True, (255, 255, 255)), (580, 580)) screen.blit( self.comment.render("Rank Score Name", True, (255, 0, 0)), (450, 0)) try: with open(self.media.ranking_txt) as f: ranking_str = [s.strip() for s in f.readlines()] for i, row in enumerate(ranking_str): score, name = row.split(",") screen.blit( self.comment.render(str(i + 1), True, (255, 255, 255)), (480, 50 + i * 50)) screen.blit( self.comment.render(score, True, (255, 255, 255)), (580, 50 + i * 50)) screen.blit( self.comment.render(name, True, (255, 255, 255)), (715, 50 + i * 50)) except FileNotFoundError: pass # まだファイルが作成されていなければ何も表示しない # exitの位置に常に配置 rect_player.center = (530, 600) # コントロール操作(exitのみ) con = self.control.control() if con == 'return': self.media.kirakira.play() return Mode.MENU return Mode.RANKING def read_ranking(self, get_star): try: with open(self.media.ranking_txt) as f: # テキストからランキング情報を読み込む # ランキングは"socre,name"というカンマ区切りで記述されている ranking_str = [s.strip() for s in f.readlines()] renew_ranking = False if len(ranking_str) != 0: for i, row in enumerate(ranking_str): score, name = row.split(",") if int(score) <= get_star and renew_ranking == False: self.ranking.append((str(get_star) + ",")) renew_ranking = True self.write_point = i self.ranking.append(score + ',' + name) if renew_ranking == False and i != 9: # ランキング最下位にまだ余裕があったら self.ranking.append(str(get_star) + ',') self.write_point = i + 1 renew_ranking = True elif renew_ranking == True and i == 9: # ランキング満員で更新されたら self.ranking.pop(10) # 一番下の人を取り除く else: raise FileNotFoundError # テキストファイルが何も書かれていなかったら except FileNotFoundError: # テキストファイルが存在しないor何も書いていない場合 self.ranking.append(str(get_star) + ',') self.write_point = 0 renew_ranking = True return renew_ranking def write_ranking(self, your_name): self.ranking[self.write_point] += your_name with open(self.media.ranking_txt, 'w') as f: f.write('\n'.join(self.ranking))