From 2a6019596054d909781962e2e30d09615d78e9ba Mon Sep 17 00:00:00 2001 From: administrator Date: Tue, 6 Feb 2024 22:28:14 +0100 Subject: [PATCH] Removed pygame-menu and code cleanup Added game class --- data/models/fruit_1_1_scaled.svg | 11 +- data/models/snake_head.svg | 21 +++- modules/GameObject.py | 4 + modules/Game_new.py | 30 +++++ modules/User.py | 1 + pygame-test.py | 202 ++++++++++++++++--------------- 6 files changed, 163 insertions(+), 106 deletions(-) create mode 100644 modules/Game_new.py diff --git a/data/models/fruit_1_1_scaled.svg b/data/models/fruit_1_1_scaled.svg index 4a48ec5..bd5b1b3 100644 --- a/data/models/fruit_1_1_scaled.svg +++ b/data/models/fruit_1_1_scaled.svg @@ -10,6 +10,9 @@ xml:space="preserve" inkscape:version="1.3.2 (091e20e, 2023-11-25, custom)" sodipodi:docname="fruit_1_1_scaled.svg" + inkscape:export-filename="fruit_1_1_scaled_2_orange.png" + inkscape:export-xdpi="6.0476189" + inkscape:export-ydpi="6.0476189" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:xlink="http://www.w3.org/1999/xlink" @@ -63,25 +66,25 @@ inkscape:label="Ebene 1" inkscape:groupmode="layer" id="layer1"> + + diff --git a/modules/GameObject.py b/modules/GameObject.py index 314c834..c0a7337 100644 --- a/modules/GameObject.py +++ b/modules/GameObject.py @@ -1,6 +1,7 @@ import pygame import random as rand + class GameObject(): """TODO Install a body array with positions of mainbody and adders""" @@ -175,6 +176,7 @@ class Player(GameObject_new): self.__snake_body = [[100,100+size], [100,100+size*2], [100,100+size*3], [100,size*5]] super().__init__(name, surface, surface_size, init_pos_x, init_pos_y, visibility) self.__snake = {"head":"data/models/snake_head_1.png", "body":"data/models/snake_body_1.png", "tail":""} + self._startmoving = False __movedirection = {"up":False, "down":False, "left":False, "right":False} @@ -253,6 +255,8 @@ class Player(GameObject_new): image = pygame.image.load(self.__snake["body"]) image = pygame.transform.scale(image, (30,40)) image = pygame.transform.rotate(image, 270) + + surface.blit(image, (0,5)) self._surface.blit(surface, (pos[0], pos[1])) #print((pos[0], pos[1])) diff --git a/modules/Game_new.py b/modules/Game_new.py new file mode 100644 index 0000000..0c2a1fc --- /dev/null +++ b/modules/Game_new.py @@ -0,0 +1,30 @@ +#Behandelt später die Hauptschleife und Klassenobjekte +class Game(): + def __init__(self) -> None: + self.__state = { + "started":False, + "playermove":False, + "win":False, + "lose":False, + "paused":False, + "menu":False + } + + def get_state(self, state): + return self.__state[state] + + def change_state(self, state): + """Toggles the selected game state""" + if(not self.__state[state]): + self.__state[state] = True + else: + self.__state[state] = False + + def scoreboard(self): + pass + + def spawn_fruit(self): + pass + + def spawn_player(self): + pass diff --git a/modules/User.py b/modules/User.py index 0d20d5e..c929de7 100644 --- a/modules/User.py +++ b/modules/User.py @@ -139,6 +139,7 @@ class User: return self.__all_listed_users def checkuserdb(self): + """Checks for existing user, else return false""" cursor = self.__sqlhandle.cursor() rows=cursor.execute("SELECT * FROM user") rows_count =len(list(rows)) diff --git a/pygame-test.py b/pygame-test.py index 37a8258..a2d031c 100644 --- a/pygame-test.py +++ b/pygame-test.py @@ -1,8 +1,8 @@ import pygame import pygame_menu import random as rand -from copy import deepcopy import modules.User as User +import modules.Game_new as Game from modules.GameObject import * pygame.init() @@ -12,47 +12,36 @@ MAINSCREEN = pygame.display.set_mode(MAINSCREEN_SIZE) PLAYGROUND = pygame.Surface((1024,728)) pygame.display.set_caption("Snake_v1") + +WEISS = (255,255,255) +SCHWARZ = (0,0,0) +GRUEN = (0,255,0) +ROT = (255,0,0) + +### FONTS ### + +fonts = { + "font1" : pygame.font.SysFont("times new roman", 18), + "font2" : pygame.font.SysFont("times new roman", 26), + "font3" : pygame.font.SysFont("times new roman", 32), + "font4" : pygame.font.SysFont("times new roman", 48) +} my_font = pygame.font.SysFont('times new roman', 26) my_font2 = pygame.font.SysFont('times new roman', 32) my_font3 = pygame.font.SysFont('times new roman', 46) -WEISS = ( 255, 255, 255) -SCHWARZ = (0,0,0) -GRUEN = (0, 255, 0) -ROT = (255,0,0) +### TEXTLABELS ### +surface_text_noplayer = fonts["font2"].render("Es existiert noch kein Spieler", True, SCHWARZ) +surface_text_inputplayername = fonts["font1"].render("Bitte gib einen Namen ein: ", True, SCHWARZ) + + active = True clock = pygame.time.Clock() -#TODO: Make Grid for running Rect -"""TODO: Add new controlstructure for User-class on first login - Actually buggy if player logsin the first time, because there is no playerselected before there was an insterquery!!! - - Make a live scoreboard - -""" - -#Behandelt später die Hauptschleife und Klassenobjekte -class Game(): - __state = {"win":False, "lose":False, "paused":False} - def __init__(self) -> None: - pass - - def scoreboard(self): - pass - - def spawn_fruit(self): - pass - - def spawn_player(self): - pass #Handles all collided objects an adds it as playerfollower -def start_game(): - menu.disable() - return 0 - def apply_name(input): print(input) if(len(input) <= 0): @@ -65,18 +54,25 @@ def apply_name(input): print(F"Hallo {User.getusername()}, dein letztes Spiel war am: {User.getlastlogin()} mit einem Highscore von: {User.gethighscore()}") - menu.disable() - #TODO: Add function for save name - pass + +surface_menu = pygame.Surface((400, 500)) +surface_menu.fill((244,244,244)) +surface_menu_rect = surface_menu.get_rect() + +def percent_from_screen(base:int, percent:int) -> int: + + perc_hundred = base/100 + + return int(perc_hundred*percent) + + + +game = Game.Game() User = User.User() -menu = pygame_menu.Menu("Snake v1.0", 400, 300,) -menu.add.text_input("Name: ", onreturn=(apply_name)) -menu.add.button('Play', start_game) -menu.add.button('Quit', pygame_menu.events.EXIT) -menu.mainloop(MAINSCREEN) + player = Player("Player", PLAYGROUND, PLAYGROUND.get_size(), 100, 100, size=40) @@ -103,84 +99,94 @@ invert = False counter = 0 -#TESTOBJECT = GameObject_new("Testobjekt", MAINSCREEN, MAINSCREEN_SIZE, 0, 0) -#print(help(TESTOBJECT)) -#TESTOBJECT.printall_attributes() - -#Fenster-Hauptschleife+ +#Fenster-Hauptschleife spawn_fruit = True game_started = False +text = "" + +game.change_state("menu") while active == True: - MAINSCREEN.fill((255,255,255)) + MAINSCREEN.fill((55,148,38)) for event in pygame.event.get(): if (event.type == pygame.QUIT): print("Programm wird geschlossen!") #print(spawned_entities, end="\n") active = False - elif (event.type == pygame.KEYDOWN): - if (event.key == pygame.K_UP): - game_started = True - if(player.get_playermovedirection()["down"] != True): - player.change_direction("up") - elif (event.key == pygame.K_DOWN): - game_started = True - if(player.get_playermovedirection()["up"] != True): - player.change_direction("down") - elif (event.key == pygame.K_RIGHT): - game_started = True - if(player.get_playermovedirection()["left"] != True): - player.change_direction("right") - elif (event.key == pygame.K_LEFT): - game_started = True - if(player.get_playermovedirection()["right"] != True): - player.change_direction("left") - + if(game.get_state("started")): + if (event.type == pygame.KEYDOWN): + if (event.key == pygame.K_UP): + game_started = True + if(player.get_playermovedirection()["down"] != True): + player.change_direction("up") + elif (event.key == pygame.K_DOWN): + game_started = True + if(player.get_playermovedirection()["up"] != True): + player.change_direction("down") + elif (event.key == pygame.K_RIGHT): + game_started = True + if(player.get_playermovedirection()["left"] != True): + player.change_direction("right") + elif (event.key == pygame.K_LEFT): + game_started = True + if(player.get_playermovedirection()["right"] != True): + player.change_direction("left") + + if(game.get_state("menu")): + if(event.type == pygame.KEYDOWN): + print(event.unicode) + text += event.unicode + text_surface_score = my_font.render('Score: '+str(player.get_player_score()), True, (0, 0, 0)) text_surface_player = my_font.render("Player: " + User.getusername(), True, SCHWARZ, None) - PLAYGROUND.fill((255,255,255)) - - MAINSCREEN.blit(text_surface_score, (MAINSCREEN_SIZE[0]/2-text_surface_score.get_size()[0]/2,0)) #Paints the Scoreboard in Top/Center - MAINSCREEN.blit(text_surface_player, (10, 0)) + text_test = my_font.render("Test", True, SCHWARZ, None) - if(spawn_fruit == True): - fruit = Fruit("Fruit", PLAYGROUND, PLAYGROUND.get_size(), init_pos_x=rand.randint(0, PLAYGROUND.get_size()[0]-40), init_pos_y=rand.randint(0, PLAYGROUND.get_size()[1]-40), color=ROT, rect_size=40, score_points=10, sprite=fruits[rand.randint(0, len(fruits)-1)]) - spawn_fruit = False + text_out = my_font.render(text, True, SCHWARZ, None) - if(fruit): - fruit.draw() + + + pygame.draw.line(MAINSCREEN, SCHWARZ, (0,38), (MAINSCREEN_SIZE[0], 38), 2) + + PLAYGROUND.fill((244,244,244)) + PLAYGROUND.blit(text_out, (MAINSCREEN_SIZE[0]/2, MAINSCREEN_SIZE[1]/2)) + #pygame.draw.rect(surface_menu, (0,0,0), (0,0,400,500), 1, 7) + #PLAYGROUND.blit(surface_menu, (20,20)) + + if(User.checkuserdb() == False): + PLAYGROUND.blit(surface_text_noplayer, (MAINSCREEN_SIZE[0]/2 - surface_text_noplayer.get_width()/2, 10)) + PLAYGROUND.blit(surface_text_inputplayername, (MAINSCREEN_SIZE[0]/2 - surface_text_inputplayername.get_width()/2, 40)) - player.draw() - if(game_started == True and player.collide_self() == False): - player.move(40) + if(game.get_state("started")): + MAINSCREEN.blit(text_surface_score, (MAINSCREEN_SIZE[0]/2-text_surface_score.get_size()[0]/2,0)) #Paints the Scoreboard in Top/Center + MAINSCREEN.blit(text_surface_player, (10, 0)) + + if(spawn_fruit == True): + fruit = Fruit("Fruit", PLAYGROUND, PLAYGROUND.get_size(), init_pos_x=rand.randint(0, PLAYGROUND.get_size()[0]-40), init_pos_y=rand.randint(0, PLAYGROUND.get_size()[1]-40), color=ROT, rect_size=40, score_points=10, sprite=fruits[rand.randint(0, len(fruits)-1)]) + spawn_fruit = False - if(player.collide_self()): - game_started == False - gameovertext = my_font2.render("Game Over!", True, SCHWARZ) - if(player.get_player_score() > User.gethighscore()): - User.update_user_highscore(player.get_player_score()) - PLAYGROUND.blit(gameovertext, (MAINSCREEN_SIZE[0]/2-gameovertext.get_size()[0]/2, MAINSCREEN_SIZE[1]/2-gameovertext.get_size()[1]/2)) + if(fruit): + fruit.draw() + + + player.draw() + if(game_started == True and player.collide_self() == False): + player.move(40) + + if(player.collide_self()): + game_started == False + gameovertext = my_font2.render("Game Over!", True, SCHWARZ) + if(player.get_player_score() > User.gethighscore()): + User.update_user_highscore(player.get_player_score()) + PLAYGROUND.blit(gameovertext, (MAINSCREEN_SIZE[0]/2-gameovertext.get_size()[0]/2, MAINSCREEN_SIZE[1]/2-gameovertext.get_size()[1]/2)) - if(player.collide_fruit(fruit.get_rect()) == True and fruit): - player.add_body() - player.inc_score(fruit.get_score_points()) - del fruit - spawn_fruit=True - - #Zeichnet alle Verfolgerobjekte, sofern sie vorliegend sind - #TODO: Follower sollen ab dem zweiten Objekt dem vorangegangenen Objekt folgen und nicht dem player - - #if(colided_objects): - # colided_objects[0].set_position_player(player.get_position(), player.get_playermovedirection(), True) - - #print("Objekt-Koordinaten= X: "+str(rect1.x)+" Y: "+str(rect1.y)+"", end="\r") - - #Displayflip sorgt dafür, dass das Fenster entsprechend der Tickrate aktualisiert wird - #pygame.display.flip() - + if(player.collide_fruit(fruit.get_rect()) == True and fruit): + player.add_body() + player.inc_score(fruit.get_score_points()) + del fruit + spawn_fruit=True MAINSCREEN.blit(PLAYGROUND, (0,40)) pygame.display.flip()