Exemplo n.º 1
0
def main(window):
    sys.excepthook = onexception
    logging.basicConfig(filename='app.log',
                        format='%(name)s - %(levelname)s - %(message)s',
                        level=logging.INFO)

    renderer = Renderer()
    gameloop = GameLoop(renderer)
    gameloop.start()
Exemplo n.º 2
0
 def build_essentials(self):
     """A method which resets important objects for loading a different level
     """
     self.load_level_list()
     self.load_level()
     self.gui = Gui((640, 360))
     self.add_healthbars()
     self.renderer = Renderer(self.display, self.level, self.gui)
     self.game_loop = GameLoop(self.level, self.renderer, self.event_queue,
                               self.clock, CELL_SIZE, self.gui, self.mixer)
Exemplo n.º 3
0
    def play(self):

        pygame.init()

        display = pygame.display.set_mode((800, 700))
        display.fill((230, 210, 170))
        pygame.display.set_caption("TETRIS")

        gameloop = GameLoop(display)

        font = pygame.font.SysFont("comicsans", 60, bold=True)
        title = font.render("TETRIS", 1, (210, 150, 75))
        font = pygame.font.SysFont("comicsans", 30)
        next_piece = font.render("NEXT PIECE:", 1, (210, 150, 75))
        high_score = font.render("HIGH SCORE:", 1, (210, 150, 75))
        font = pygame.font.SysFont("comicsans", 40)
        score = font.render(gameloop.hscore, 1, (210, 150, 75))

        display.blit(title, (250, 50))
        display.blit(next_piece, (600, 100))
        display.blit(high_score, (10, 100))
        display.blit(score, (10, 150))

        gameloop.handle_events()
Exemplo n.º 4
0
    def loop_switch(self, next_loop: str):
        """
        this function chooses the next current_loop based on it's input

        Args:
            next_loop: string that tells the mainloop the next subloop
        """

        if next_loop == "gameloop":

            self.current_loop = GameLoop()

        elif next_loop == "startloop":

            self.current_loop = StartLoop()

        elif next_loop == "scoreloop":

            self.current_loop = ScoreLoop()

        elif next_loop == "exit":

            self.running = False
Exemplo n.º 5
0
 def setUp(self):
     self.gameloop = GameLoop()
Exemplo n.º 6
0
def create_gameloop():
    player = Player(-2019)
    levels = (create_level_0(), create_level_1(), create_level_2(), create_level_3())
    return GameLoop(player, levels, 1, create_tut_lev(), create_won_lev(), create_lost_lev())
Exemplo n.º 7
0
'''Reaction/Memory Light Game main module

There are two main parts to the program: The game loop, found in the gameloop module, and the
webapp code, using the Flask framework, found in this module.
'''

from queue import Empty, Queue
from flask import Flask, render_template
from flask_json import FlaskJSON, as_json
from gameloop import GameLoop
from player import Player

events_queue = Queue()
game = GameLoop((
    Player('One', buttons=(24, 18), led=(17, 27, 22)),
    Player('Two', buttons=(21, 20), led=(2, 3, 4)),
    Player('Three', buttons=(16, 12), led=(26, 19, 13)),
), events_queue)
app = Flask(__name__)
json = FlaskJSON(app)


def names_and_scores():
    sorted_players = list(game.players)
    sorted_players.sort(key=lambda player: player.wins, reverse=True)
    return [[
        p.name, p.wins,
        p.fastest_ms() or '',
        p.mean_ms() or '',
        p.slowest_ms() or ''
    ] for p in sorted_players]
Exemplo n.º 8
0
def Menu(score_list):
    pygame.init()
    pygame.mixer.init()
    menu = pygame.display.set_mode((WIDTH, HEIGHT))
    pygame.display.set_caption("Carrot Time")
    pygame.event.set_blocked(pygame.MOUSEMOTION)
    menu_image = pygame.image.load(os.path.join(IMG_FOLDER,
                                                "menu.png")).convert()
    menu_image = pygame.transform.scale(menu_image, (WIDTH, HEIGHT))
    click_sound = pygame.mixer.Sound(os.path.join(SOUND_FOLDER, "click.wav"))
    click_sound.set_volume(1)
    big_font = pygame.font.SysFont("Arial", 30, False, False)
    mini_font = pygame.font.SysFont("Arial", 15, False, False)
    menu.fill(WHITE)
    menu.blit(menu_image, (0, 0))

    # create three buttons
    Button(menu, "Start", YELLOW, 50, 310, 100, 50)
    Button(menu, "High Scores", YELLOW, 50, 370, 100, 50)
    Button(menu, "Quit", RED, 50, 430, 100, 50)

    intro = True
    while intro:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                intro = False
                pygame.quit()
            if event.type == pygame.MOUSEBUTTONDOWN:
                cur = pygame.mouse.get_pos()
                # button 1
                if 50 < cur[0] < 150 and 310 < cur[1] < 360:
                    click_sound.play()
                    Button(menu, "Start", ORANGE, 50, 310, 100, 50)
                    pygame.display.update()
                    GameLoop(score_list)
                # button 2
                if 50 < cur[0] < 150 and 370 < cur[1] < 420:
                    click_sound.play()
                    Button(menu, "High Scores", ORANGE, 50, 370, 100, 50)
                    pygame.display.update()
                    # get the first 10 high scores
                    leng = len(score_list)
                    if leng < 10:
                        while len(score_list) < 10:
                            score_list.append(0)
                        for s in score_list:
                            print(s)
                    if leng >= 10:
                        for i in range(10):
                            print(score_list[i])
                    # display 10 high scores
                    e = True
                    while e:
                        pygame.draw.rect(menu, ORANGE, (0, 200, WIDTH, 200))
                        title = big_font.render("High Scores", False, BLACK)
                        rect = title.get_rect()
                        rect.center = (WIDTH / 2 - 10, 220)
                        menu.blit(title, rect)
                        text = mini_font.render("Back? Y/N", False, BLACK)
                        rect = text.get_rect()
                        rect.center = (WIDTH / 2 - 10, 380)
                        menu.blit(text, rect)

                        t1 = mini_font.render(str(score_list[0]), False, BLACK)
                        rect = t1.get_rect()
                        rect.center = (200, 250)
                        menu.blit(t1, rect)

                        t2 = mini_font.render(str(score_list[1]), False, BLACK)
                        rect = t2.get_rect()
                        rect.center = (200, 270)
                        menu.blit(t2, rect)

                        t3 = mini_font.render(str(score_list[2]), False, BLACK)
                        rect = t3.get_rect()
                        rect.center = (200, 290)
                        menu.blit(t3, rect)

                        t4 = mini_font.render(str(score_list[3]), False, BLACK)
                        rect = t4.get_rect()
                        rect.center = (200, 310)
                        menu.blit(t4, rect)

                        t5 = mini_font.render(str(score_list[4]), False, BLACK)
                        rect = t5.get_rect()
                        rect.center = (200, 330)
                        menu.blit(t5, rect)

                        t6 = mini_font.render(str(score_list[5]), False, BLACK)
                        rect = t6.get_rect()
                        rect.center = (270, 250)
                        menu.blit(t6, rect)

                        t7 = mini_font.render(str(score_list[6]), False, BLACK)
                        rect = t7.get_rect()
                        rect.center = (270, 270)
                        menu.blit(t7, rect)

                        t8 = mini_font.render(str(score_list[7]), False, BLACK)
                        rect = t8.get_rect()
                        rect.center = (270, 290)
                        menu.blit(t8, rect)

                        t9 = mini_font.render(str(score_list[8]), False, BLACK)
                        rect = t9.get_rect()
                        rect.center = (270, 310)
                        menu.blit(t9, rect)

                        t10 = mini_font.render(str(score_list[9]), False,
                                               BLACK)
                        rect = t10.get_rect()
                        rect.center = (270, 330)
                        menu.blit(t10, rect)

                        pygame.display.update()

                        for event in pygame.event.get():
                            if event.type == pygame.QUIT:
                                pygame.quit()
                            elif event.type == pygame.KEYDOWN:
                                if event.key == pygame.K_y:
                                    Menu(score_list)
                                if event.key == pygame.K_n:
                                    e = False
                # button 3
                if 50 < cur[0] < 150 and 430 < cur[1] < 480:
                    click_sound.play()
                    Button(menu, "Quit", ORANGE, 50, 430, 100, 50)
                    pygame.display.update()
                    pygame.quit()
        pygame.display.update()
    pygame.quit()
Exemplo n.º 9
0
 def setUp(self):
     self.tetris = Tetris()
     self.display = pygame.display.set_mode((800, 700))
     self.gameloop = GameLoop(self.display)
     self.blocks = Blocks()
Exemplo n.º 10
0
class TestTetris(unittest.TestCase):
    def setUp(self):
        self.tetris = Tetris()
        self.display = pygame.display.set_mode((800, 700))
        self.gameloop = GameLoop(self.display)
        self.blocks = Blocks()

    def test_board_setup_is_right(self):
        correct_ans = []
        for i in range(35):
            row = []
            for j in range(15):
                row.append((255, 255, 255))
            correct_ans.append(row)
        self.gameloop.setup_board()
        self.assertEqual(self.gameloop.board, correct_ans)

    def test_board_setup_is_right_with_blocks(self):
        self.gameloop.blocks_on_board[(0, 1)] = (0, 255, 0)
        self.gameloop.blocks[(0, 2)] = (0, 255, 0)
        correct_ans = []
        for i in range(35):
            row = []
            for j in range(15):
                row.append((255, 255, 255))
            correct_ans.append(row)
        correct_ans[1][0] = (0, 255, 0)
        correct_ans[2][0] = (0, 255, 0)
        self.gameloop.setup_board()
        self.assertEqual(self.gameloop.board, correct_ans)

    def test_block_is_the_right_shape(self):
        block = self.gameloop.block
        if block in self.blocks.blocks:
            return True

    def test_block_is_the_right_color(self):
        block = self.gameloop.block
        if block[0]["color"] in self.blocks.blocks[0]["color"]:
            return True

    def test_block_position_is_right(self):
        block = self.gameloop.block
        self.gameloop.setup_board()
        if (block[0], block[1]) in self.gameloop.board:
            return True

    def test_is_block_at_the_tetris_board(self):
        board = [(j, i) for i in range(len(self.gameloop.board))
                 for j in range(len(self.gameloop.board[i]))]
        if (self.gameloop.block[1], self.gameloop.block[2]) in board:
            return True

    def test_block_is_moving_down(self):
        block = self.gameloop.block
        self.gameloop.block_moves("down")
        self.assertEqual((block[1], block[2]), (0, 1))
        self.assertEqual(self.gameloop._can_move(), True)

    def test_block_is_moving_right(self):
        block = self.gameloop.block
        self.gameloop.block_moves("right")
        self.assertEqual((block[1], block[2]), (1, 0))

    def test_block_is_moving_left(self):
        block = self.gameloop.block
        self.gameloop.block_moves("left")
        self.assertEqual((block[1], block[2]), (-1, 0))

    def test_block_doesnt_move_past_left_border(self):
        self.gameloop.block = [self.blocks.square, 0, 0]
        for i in range(20):
            self.gameloop.block_moves("left")
            self.gameloop._can_move()
        self.assertEqual(self.gameloop.filled_in[0][0], 0)

    def test_block_doesnt_move_past_right_border(self):
        self.gameloop.block = [self.blocks.square, 0, 0]
        for i in range(20):
            self.gameloop.block_moves("right")
            self.gameloop._can_move()
        self.assertEqual(self.gameloop.filled_in[0][0], 13)

    def test_block_doesnt_move_too_far(self):
        self.gameloop.block = [self.blocks.square, 0, 0]
        for i in range(25):
            self.gameloop.block_moves("down")
            self.gameloop._can_move()
        self.assertEqual(self.gameloop._can_move(), False)

    def test_block_doesnt_overlap_with_other_block(self):
        self.gameloop.blocks_on_board[(0, 2)] = (0, 0, 0)
        self.gameloop.filled_in.append((0, 1))
        self.assertEqual(self.gameloop._can_move(), False)

    def test_block_stop_works(self):
        self.gameloop.blocks[(0, 2)] = (0, 0, 0)
        self.gameloop.block_stop()
        self.assertEqual(self.gameloop.blocks_on_board[(0, 2)],
                         self.gameloop.blocks[(0, 2)])

    def test_block_rotate_rotates(self):
        block = self.gameloop.block
        self.gameloop.block_rotate()
        self.assertEqual(block[0]["shape"][1],
                         block[0]["shape"][self.gameloop.rotation])

    def test_block_rotate_work_with_multiple_rotations(self):
        self.gameloop.block = [self.blocks.stick, 0, 0]
        self.gameloop.block_rotate()
        self.gameloop.block_rotate()
        self.assertEqual(self.gameloop.rotation, 0)

    def test_clear_row_works(self):
        for i in range(len(self.gameloop.board[34])):
            self.gameloop.board[34][i] = (0, 255, 0)
        self.gameloop.clear_row()
        correct_ans = []
        for i in range(len(self.gameloop.board[34])):
            correct_ans.append((255, 255, 255))
        self.assertEqual(correct_ans, self.gameloop.board[0])

    def test_score_changes(self):
        for i in range(len(self.gameloop.board[34])):
            self.gameloop.board[34][i] = (0, 255, 0)
        self.gameloop.clear_row()
        self.assertEqual(10, self.gameloop.score)

    def test_changes_pieces(self):
        self.gameloop.block_stop()
        self.assertEqual(True, self.gameloop.get_new_block)

    def test_change_block_works(self):
        self.gameloop.get_new_block = True
        old_next_block = self.gameloop._next_block
        self.gameloop.change_block()
        self.assertEqual(self.gameloop.block, old_next_block)
        self.assertEqual(self.gameloop.get_new_block, False)
Exemplo n.º 11
0
class Main:
    """The main game class, in charge of loading levels and handling
    features which are outside the game loop

    Attributes:
        display: a pygame display object
        level_list: list of levels
        level_id: id of the current level
        level: Level object
        event_queue: EventQueue object
        clock: a pygame clock object
        mixer: a mixer object
    """
    def __init__(self):
        """Class constructor. Loads everything into memory
        """
        self.display = pg.display.set_mode((640, 360))
        pg.display.set_caption("Crawler")
        pg.init()
        self.level_list = None
        self.gui = Gui((640, 360))
        self.level_id = 0
        self.level = None
        self.event_queue = EventQueue()
        self.clock = Clock()
        self.renderer = Renderer(self.display, self.level, self.gui)
        self.mixer = Mixer()
        self.mixer.load_track(0)
        self.mixer.set_volume(0.3)
        self.game_loop = None
        self.menu_loop = MenuLoop(self.renderer, self.event_queue, self.clock)

        self.start_menu()

    def load_level_list(self):
        """Resets the level list from database
        """
        self.level_list = DB_CONNECTION.get_map_data()

    def build_essentials(self):
        """A method which resets important objects for loading a different level
        """
        self.load_level_list()
        self.load_level()
        self.gui = Gui((640, 360))
        self.add_healthbars()
        self.renderer = Renderer(self.display, self.level, self.gui)
        self.game_loop = GameLoop(self.level, self.renderer, self.event_queue,
                                  self.clock, CELL_SIZE, self.gui, self.mixer)

    def load_level(self):
        """Loads a different level into memory
        """
        self.level = Level(self.level_list[self.level_id], CELL_SIZE)

    def add_healthbars(self):
        """A method which adds health bars for all entities in a level
        """
        for enemy in self.level.enemies:
            self.gui.set_health_bar(enemy)
        self.gui.set_player_health_bar(self.level.player)

    def load_level_id(self):
        """A method which fetches the level id of a saved game from a database
        """
        data = DB_CONNECTION.get_player_data()
        if data:
            self.level_id = data[2]

    def load_player_data(self):
        """Loads a save game from a database
        """
        data = DB_CONNECTION.get_player_data()
        if data:
            self.level.player.current_health = data[0]
            self.level.player.inventory = data[1]
        self.gui.set_player_health_bar(self.level.player)

    def store_player_data(self):
        """A method which stores player data into a database
        """
        DB_CONNECTION.store_player_data(self.level.player, self.level_id)

    def start_menu(self):
        """Method which starts a menu loop and is the backbone of the game
        """
        state = self.menu_loop.start()
        if state != -1:
            if state == 0:
                DB_CONNECTION.reset_player_data()
                self.level_id = 0
                self.build_essentials()
            if state == 1 and not self.level:
                self.load_level_id()
                self.build_essentials()
                self.load_player_data()
            self.run()

    def run(self):
        """Method which starts the main game loop
        """
        self.mixer.play_music(loops=-1)
        state = self.game_loop.start()
        if state == 1:
            self.start_menu()
        if state == 3:
            self.level_id += 1
            if self.level_id == len(self.level_list):
                self.level_id = 0
            self.store_player_data()
            self.build_essentials()
            self.load_player_data()
            self.run()
        if state == 4:
            DB_CONNECTION.reset_player_data()
            self.__init__()