From fc31ab5912ccb52450e5615e5a944d3efcccfa20 Mon Sep 17 00:00:00 2001 From: IM23a-bachmannj2 Date: Sun, 2 Feb 2025 09:16:50 +0100 Subject: [PATCH] start of Menu implementation --- README.md | 2 +- assets/font.ttf | Bin 0 -> 82480 bytes assets/menu_background.png | Bin 0 -> 62214 bytes game/game.py | 17 ++++--- game/menu.py | 89 ++++++++++++++++++++++++++++++++----- game/settings.py | 10 +---- game/util.py | 23 ---------- game/util/button.py | 29 ++++++++++++ game/util/control.py | 83 ++++++++++++++++++++++++++++++++++ game/util/util.py | 86 +++++++++++++++++++++++++++++++++++ gamescore.json | 3 ++ main.py | 5 ++- 12 files changed, 296 insertions(+), 51 deletions(-) create mode 100644 assets/font.ttf create mode 100644 assets/menu_background.png delete mode 100644 game/util.py create mode 100644 game/util/button.py create mode 100644 game/util/control.py create mode 100644 game/util/util.py create mode 100644 gamescore.json diff --git a/README.md b/README.md index c8fd9fd..5e5d750 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ This isn't just about coding; it's about building something I love from the grou --- ### **Step 1: Speed and Difficulty Progression** -1. [ ] **Soft Drop**: Implement gradual acceleration when the player holds the down arrow. +1. [x] **Soft Drop**: Implement gradual acceleration when the player holds the down arrow. 2. [x] **Hard Drop**: Allow instant dropping with the spacebar. 3. [ ] **Leveling Up**: - [x] Increase the falling speed after clearing a fixed number of lines. diff --git a/assets/font.ttf b/assets/font.ttf new file mode 100644 index 0000000000000000000000000000000000000000..98044e935e515b6b7c5eb562ea880a7b7dc5179c GIT binary patch literal 82480 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 literal 0 HcmV?d00001 diff --git a/assets/menu_background.png b/assets/menu_background.png new file mode 100644 index 0000000000000000000000000000000000000000..a37ea417217ca1d630601102e0cb88cad1c4f685 GIT binary patch literal 62214 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 F{{vKzG_(K! literal 0 HcmV?d00001 diff --git a/game/game.py b/game/game.py index 3629f77..e60ea59 100644 --- a/game/game.py +++ b/game/game.py @@ -1,7 +1,7 @@ import pygame as pg from game.settings import * from game.game_manager import Grid -from game.util import draw_text, get_fall_interval +from game.util.util import * from game.tetrominos import Tetrominos import game.settings as settings import sys @@ -25,17 +25,20 @@ class Game: self.next_tetromino = Tetrominos(cols, cell_size) self.hold_tetromino = None - self.hold_used = False # Flag to track if hold has been used for the current tetromino + self.hold_used = False self.fall_timer = 0 self.move_timer = 0 self.move_interval = 100 + self.playing = None + def run(self): """Main game loop.""" self.playing = True - if settings.gamestate == False: + if not settings.gamestate: self.game_grid = Grid(rows, cols, cell_size) + settings.game_score = 0 settings.gamestate = True while self.playing: @@ -79,6 +82,8 @@ class Game: if not self.game_grid.check_collision(self.current_tetromino.shape, self.current_tetromino.x - 1, self.current_tetromino.y): self.current_tetromino.move(-1, 0) # Move left self.move_timer = current_time # Reset timer + elif keys[pg.K_DOWN]: + fall_interval = 40 # Handle automatic falling based on timer if current_time - self.fall_timer > fall_interval: @@ -98,9 +103,8 @@ class Game: # Draw the grid and tetromino self.game_grid.draw_grid(self.grid_surface) - self.current_tetromino.draw(self.grid_surface) - self.ghost_tetromino.draw_ghost_tetromino(self.grid_surface) + self.current_tetromino.draw(self.grid_surface) # Draw next and hold previews self.next_surface.fill((0, 0, 0)) @@ -111,7 +115,7 @@ class Game: self.hold_tetromino.draw_next_tetromino(self.hold_surface) # Draw score - draw_text(self.screen, f'Score: {settings.game_score}', 30, self.width - 75, 100, (255, 255, 255)) + draw_text(self.screen, f'Score: {settings.game_score}', get_font(20), self.width - 150, 100, (255, 255, 255)) # Render surfaces self.screen.blit(self.grid_surface, (0, 0)) @@ -155,5 +159,6 @@ class Game: def show_game_over(self): """Handle game over screen.""" + add_score("gamescore.json", settings.game_score) settings.gamestate = False self.playing = False diff --git a/game/menu.py b/game/menu.py index 0337b0a..0cab64f 100644 --- a/game/menu.py +++ b/game/menu.py @@ -1,17 +1,23 @@ import pygame as pg -from game.settings import * import game.settings as setting -from game.util import draw_text +from game.util.button import Button +from game.util.util import * import sys class StartMenu: def __init__(self, screen, clock): + self.menu_running = None self.screen = screen self.clock = clock self.screen_size = self.screen.get_size() + self.mouse_pos = pg.mouse.get_pos() + self.score = load_score("gamescore.json") + + self.option = False + self.options_menu = OptionMenu(self.screen, self.clock) def run(self): self.menu_running = True @@ -22,6 +28,7 @@ class StartMenu: return True def update(self): + self.mouse_pos = pg.mouse.get_pos() for event in pg.event.get(): if event.type == pg.QUIT: @@ -33,17 +40,50 @@ class StartMenu: if event.key == pg.K_ESCAPE: pg.quit() sys.exit() + if event.type == pg.MOUSEBUTTONDOWN: + if self.play.checkForInput(self.mouse_pos): + self.menu_running = False + if self.options.checkForInput(self.mouse_pos): + self.option = True + while self.option: + self.option = self.options_menu.run() + if self.quit.checkForInput(self.mouse_pos): + pg.quit() + sys.exit() def draw(self): - self.screen.fill((0, 0, 0)) + self.screen.blit(get_background(), (0, 0)) + + self.play = Button(image=None, pos=(setting.width // 2, setting.height // 3), text_input="Play", font=get_font(50), base_color=(255, 255, 255), hovering_color=(200, 200, 200)) + self.play.changeColor(self.mouse_pos) + + self.quit = Button(image=None, pos=(setting.width // 2, setting.height // 3 * 2), text_input="Quit", font=get_font(50), base_color=(255, 255, 255), hovering_color=(200, 200, 200)) + self.quit.changeColor(self.mouse_pos) + + self.options = Button(image=None, pos=(setting.width // 2, setting.height // 2), text_input="Options", font=get_font(50), base_color=(255, 255, 255), hovering_color=(200, 200, 200)) + self.options.changeColor(self.mouse_pos) + + draw_text(self.screen, "TETRIS", get_font(30), setting.width // 2, setting.height // 3 - 50, (255, 255, 255)) + + position = 0 + for item in self.score["score"]: + draw_text(self.screen, f"Score: {item}", get_font(30), setting.width // 5, setting.height // 3 - 50 + position, (255, 255, 255)) + position += 50 + + self.play.update(self.screen) + self.options.update(self.screen) + self.quit.update(self.screen) + pg.display.update() + + def draw_options(self): + self.screen.blit(get_background(), (0, 0)) - draw_text(self.screen, "TETRIS", 50, width // 2, HEIGHT // 2 - 50, (255, 255, 255)) - draw_text(self.screen, "Press ENTER to Start", 30, width // 2, HEIGHT // 2 + 50, (200, 200, 200)) pg.display.update() class GameMenu: def __init__(self, screen, clock): + self.menu_running = None self.screen = screen self.clock = clock self.screen_size = self.screen.get_size() @@ -74,10 +114,39 @@ class GameMenu: self.screen.fill((0, 0, 0)) if setting.gamestate: - draw_text(self.screen, "Game Paused", 50, width // 2, HEIGHT // 2 - 50, (255, 255, 255)) - draw_text(self.screen, "Press ESC to Resume", 30, width // 2, HEIGHT // 2 + 10, (200, 200, 200)) + draw_text(self.screen, "Game Paused", get_font(50), setting.width // 2, setting.height // 2 - 50, (255, 255, 255)) + draw_text(self.screen, "Press ESC to Resume", get_font(30), setting.width // 2, setting.height // 2 + 10, (200, 200, 200)) else: - draw_text(self.screen, "Game Over", 50, width // 2, HEIGHT // 2 - 50, (255, 0, 0)) - draw_text(self.screen, "Press Enter to Restart", 30, width // 2, HEIGHT // 2 + 50, (200, 200, 200)) + draw_text(self.screen, "Game Over", get_font(50), setting.width // 2, setting.height // 2 - 50, (255, 0, 0)) + draw_text(self.screen, "Press Enter to Restart", get_font(30), setting.width // 2, setting.height // 2 + 50, (200, 200, 200)) - pg.display.update() \ No newline at end of file + pg.display.update() + +class OptionMenu: + def __init__(self, screen, clock): + self.menu_running = None + self.screen = screen + self.clock = clock + self.screen_size = self.screen.get_size() + + def run(self): + self.menu_running = True + while self.menu_running: + self.clock.tick(60) + self.update() + self.draw() + return False + + def update(self): + for event in pg.event.get(): + if event.type == pg.QUIT: + pg.quit() + sys.exit() + if event.type == pg.KEYDOWN: + if event.key == pg.K_ESCAPE: + self.menu_running = False + + def draw(self): + self.screen.blit(get_background(), (0, 0)) + + pg.display.update() diff --git a/game/settings.py b/game/settings.py index 8f98a97..2d5d3d7 100644 --- a/game/settings.py +++ b/game/settings.py @@ -1,15 +1,8 @@ -# Variables - -#screen size -global height, width -height, width = 600, 450 +width, height = 0, 0 #grid surface g_height, g_width = 600, 300 -#start surface size -HEIGHT, WIDTH = 600, 300 - #score game_score = 0 @@ -19,5 +12,4 @@ cell_size = 30 fps = 60 -global gamestate # Add game state variable gamestate = True diff --git a/game/util.py b/game/util.py deleted file mode 100644 index c596760..0000000 --- a/game/util.py +++ /dev/null @@ -1,23 +0,0 @@ -import pygame - -def get_fall_interval(score): - """ - Calculate the fall interval based on the current score. - """ - base_interval = 1000 # Base interval in milliseconds - decrease_per_1000_points = 50 # Decrease in ms per 1000 points - min_interval = 100 # Minimum interval in milliseconds - - # Calculate the fall interval - interval = base_interval - (score // 400) * decrease_per_1000_points - - # Ensure the interval doesn't go below the minimum - return max(interval, min_interval) - -#game states -def draw_text(surface, text, size, x, y, color): - """Utility function to render text onto a surface.""" - font = pygame.font.Font(None, size) # Use default font - text_surface = font.render(text, True, color) - text_rect = text_surface.get_rect(center=(x, y)) - surface.blit(text_surface, text_rect) \ No newline at end of file diff --git a/game/util/button.py b/game/util/button.py new file mode 100644 index 0000000..794f693 --- /dev/null +++ b/game/util/button.py @@ -0,0 +1,29 @@ +class Button(): + def __init__(self, image, pos, text_input, font, base_color, hovering_color): + self.image = image + self.x_pos = pos[0] + self.y_pos = pos[1] + self.font = font + self.base_color, self.hovering_color = base_color, hovering_color + self.text_input = text_input + self.text = self.font.render(self.text_input, True, self.base_color) + if self.image is None: + self.image = self.text + self.rect = self.image.get_rect(center=(self.x_pos, self.y_pos)) + self.text_rect = self.text.get_rect(center=(self.x_pos, self.y_pos)) + + def update(self, screen): + if self.image is not None: + screen.blit(self.image, self.rect) + screen.blit(self.text, self.text_rect) + + def checkForInput(self, position): + if position[0] in range(self.rect.left, self.rect.right) and position[1] in range(self.rect.top, self.rect.bottom): + return True + return False + + def changeColor(self, position): + if position[0] in range(self.rect.left, self.rect.right) and position[1] in range(self.rect.top, self.rect.bottom): + self.text = self.font.render(self.text_input, True, self.hovering_color) + else: + self.text = self.font.render(self.text_input, True, self.base_color) \ No newline at end of file diff --git a/game/util/control.py b/game/util/control.py new file mode 100644 index 0000000..46a83aa --- /dev/null +++ b/game/util/control.py @@ -0,0 +1,83 @@ +import pygame, sys +from util import write_save + +class Controls_Handler(): + def __init__(self, save): + self.save_file = save + self.curr_block = save["current_profile"] + self.controls = self.save_file["controls"][str(self.curr_block)] + self.setup() + + def update(self, actions): + if self.selected: self.set_new_control() + else: self.navigate_menu(actions) + + def render(self, surface): + self.draw_text(surface, "Control Profile " + str(self.curr_block+1) , 20, pygame.Color((0,0,0)), 480 / 2, 270/8) + self.display_controls(surface, self.save_file["controls"][str(self.curr_block)]) + if self.curr_block == self.save_file["current_profile"]: self.draw_text(surface, "*" , 20, pygame.Color((0,0,0)), 20, 20) + + def navigate_menu(self, actions): + # Move the cursor up and down + if actions["Down"]: self.curr_index = (self.curr_index + 1) % (len(self.save_file["controls"][str(self.curr_block)]) + 1) + if actions["Up"]: self.curr_index = (self.curr_index - 1) % (len(self.save_file["controls"][str(self.curr_block)]) + 1) + # Switch between profiles + if actions["Left"]: self.curr_block = (self.curr_block -1) % len(self.save_file["controls"]) + if actions["Right"]: self.curr_block = (self.curr_block +1) % len(self.save_file["controls"]) + # Handle Selection + if actions["Action1"] or actions["Start"]: + # Set the current profile to be the main one + if self.cursor_dict[self.curr_index] == "Set": + self.controls = self.save_file["controls"][str(self.curr_block)] + self.save_file["current_profile"] = self.curr_block + write_save(self.save_file) + else: + self.selected = True + + def set_new_control(self): + selected_control = self.cursor_dict[self.curr_index] + done = False + while not done: + for event in pygame.event.get(): + if event.type == pygame.QUIT: + done = True + pygame.quit() + sys.exit() + elif event.type == pygame.KEYDOWN: + if event.key == pygame.K_ESCAPE: + done = True + pygame.quit() + sys.exit() + elif event.key not in self.save_file["controls"][str(self.curr_block)].values(): + self.save_file["controls"][str(self.curr_block)][selected_control] = event.key + write_save(self.save_file) + self.selected = False + done = True + + def display_controls(self,surface, controls): + color = (255,13,5) if self.selected else (255,250,239) + pygame.draw.rect(surface, color, (80 , 270/4 - 10 + (self.curr_index*30), 320, 20) ) + i = 0 + for control in controls: + self.draw_text(surface, control + ' - ' + pygame.key.name(controls[control]),20, + pygame.Color((0,0,0)), 480 / 2, 270/4 + i) + i += 30 + self.draw_text(surface, "Set Current Profile",20, pygame.Color((0,0,0)), 480 / 2, 270/4 + i) + + def setup(self): + self.selected = False + self.font = pygame.font.Font("RetroFont.ttf", 20) + self.cursor_dict = {} + self.curr_index = 0 + i = 0 + for control in self.controls: + self.cursor_dict[i] = control + i += 1 + self.cursor_dict[i] = "Set" + + def draw_text(self,surface, text, size, color, x, y): + text_surface = self.font.render(text, True, color, size) + text_surface.set_colorkey((0,0,0)) + text_rect = text_surface.get_rect() + text_rect.center = (x, y) + surface.blit(text_surface, text_rect) \ No newline at end of file diff --git a/game/util/util.py b/game/util/util.py new file mode 100644 index 0000000..222c141 --- /dev/null +++ b/game/util/util.py @@ -0,0 +1,86 @@ +import pygame +import json, os + +# calculate fall speed + +def get_fall_interval(score): + """ + Calculate the fall interval based on the current score. + """ + base_interval = 1000 # Base interval in milliseconds + decrease_per_1000_points = 50 # Decrease in ms per 1000 points + min_interval = 100 # Minimum interval in milliseconds + + # Calculate the fall interval + interval = base_interval - (score // 400) * decrease_per_1000_points + + # Ensure the interval doesn't go below the minimum + return max(interval, min_interval) + +# Draw text simplified + +def draw_text(surface, text, font, x, y, color): + """Utility function to render text onto a surface.""" + text_surface = font.render(text, True, color) + text_rect = text_surface.get_rect(center=(x, y)) + surface.blit(text_surface, text_rect) + +def get_font(size): + return pygame.font.Font("assets/font.ttf", size) + +def get_background(): + return pygame.image.load('assets/menu_background.png') + +#For the Leaderboard + +def load_score(filename): + """Load JSON data only if the file is not empty.""" + if os.path.exists(filename) and os.path.getsize(filename) > 0: # Check if file exists & not empty + with open(filename, "r") as file: + return json.load(file) + return {} + +def add_score(filename, score): + if os.path.exists(filename): + with open(os.path.join(os.getcwd(), filename), "w") as file: + json.dump(score, file) + +# For keybinds (control.py) + +def load_existing_save(savefile): + with open(os.path.join(savefile), 'r+') as file: + controls = json.load(file) + return controls + +def write_save(data): + with open(os.path.join(os.getcwd(),'save.json'), 'w') as file: + json.dump(data, file) + +def load_save(): + try: + # Save is loaded + save = load_existing_save('save.json') + except: + # No save file, so create one + save = create_save() + write_save(save) + return save + + +def create_save(): + new_save = { + "controls":{ + "0" :{"Left": pygame.K_a, "Right": pygame.K_d, "Up": pygame.K_w, "Down": pygame.K_s, + "Start": pygame.K_RETURN, "Action1": pygame.K_SPACE}, + "1" :{"Left": pygame.K_a, "Right": pygame.K_d, "Up": pygame.K_w, "Down": pygame.K_s, + "Start": pygame.K_RETURN, "Action1": pygame.K_SPACE} + }, + "current_profile": 0 + } + + return new_save + +def reset_keys(actions): + for action in actions: + actions[action] = False + return actions \ No newline at end of file diff --git a/gamescore.json b/gamescore.json new file mode 100644 index 0000000..f09e7a1 --- /dev/null +++ b/gamescore.json @@ -0,0 +1,3 @@ +{ + "score": [1000, 700, 500, 6000, 5000] +} \ No newline at end of file diff --git a/main.py b/main.py index 7c4db22..4068ca7 100644 --- a/main.py +++ b/main.py @@ -2,14 +2,15 @@ import pygame from game.menu import StartMenu, GameMenu from game.game import Game -from game.settings import width, height +import game.settings as setting def main(): running = True pygame.init() - screen = pygame.display.set_mode((width, height)) + screen = pygame.display.set_mode((0, 0), pygame.FULLSCREEN) + setting.width, setting.height = pygame.display.get_window_size() clock = pygame.time.Clock() pygame.display.set_caption("Tetris")