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
Exemple #2
0
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
Exemple #3
0
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
Exemple #5
0
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))