diff --git a/README.md b/README.md index 0ee31b2..d320529 100644 --- a/README.md +++ b/README.md @@ -39,6 +39,7 @@ game = SwimmingSquid( ### 角色升級機制 角色初始等級皆為 1,隨著得分增加升 / 降級。等級將會影響角色長寬與移動速度,各等級對應資料如下: + | Lv| 角色寬度 | 角色高度 |移動速度| | --- | ------- | ------ | ------| | 1 | 30 | 45 |25| diff --git a/levels/001.json b/levels/001.json index f9130fb..b7486f5 100644 --- a/levels/001.json +++ b/levels/001.json @@ -1,5 +1,5 @@ { - "time_to_play": 10, + "time_to_play": 300, "playground_size_w":200, "playground_size_h":200, "score_to_pass": 10, diff --git a/src/game.py b/src/game.py index e7db59b..cbf6641 100644 --- a/src/game.py +++ b/src/game.py @@ -44,6 +44,7 @@ class SwimmingSquid(PaiaGame): self.scene = Scene(width=WIDTH, height=HEIGHT, color=BG_COLOR, bias_x=0, bias_y=0) self._level = level self._level_file = level_file + self._used_file = "" self.foods = pygame.sprite.Group() self.sound_controller = SoundController(sound) self._collision_mode = False @@ -55,6 +56,7 @@ class SwimmingSquid(PaiaGame): try: with open(level_file_path) as f: game_params = LevelParams(**json.load(f)) + self._used_file = level_file_path except: # If the file doesn't exist, use default parameters @@ -64,6 +66,7 @@ class SwimmingSquid(PaiaGame): game_params = LevelParams(**json.load(f)) self._level = 1 self._level_file = "" + self._used_file = "001.json" finally: # set game params self.playground = pygame.Rect( @@ -111,8 +114,8 @@ class SwimmingSquid(PaiaGame): action_2 = "NONE" - self.squid1.update(action_1) - self.squid2.update(action_2) + self.squid1.update(self.frame_count, action_1) + self.squid2.update(self.frame_count, action_2) revise_ball(self.squid1, self.playground) revise_ball(self.squid2, self.playground) # update sprite @@ -235,7 +238,6 @@ class SwimmingSquid(PaiaGame): elif self.is_passed: status = GameStatus.GAME_PASS else: - print("GAME_OVER") status = GameStatus.GAME_OVER return status @@ -248,13 +250,11 @@ class SwimmingSquid(PaiaGame): self.sound_controller.play_fail() self._init_game() - pass def _init_game(self): if path.isfile(self._level_file): # set by injected file self._init_game_by_file(self._level_file) - pass else: level_file_path = os.path.join(LEVEL_PATH, f"{self._level:03d}.json") self._init_game_by_file(level_file_path) @@ -266,7 +266,9 @@ class SwimmingSquid(PaiaGame): self._frame_limit += 600 self._score_to_pass += 50 self._overtime_count += 1 + print("同分延長賽") return False + # print("達成目標分數") return True else: return False @@ -277,12 +279,15 @@ class SwimmingSquid(PaiaGame): if self.squid1.score == self.squid2.score and self._overtime_count < 3: # 延長賽 self._frame_limit += 300 self._overtime_count += 1 + print("超時延長賽") return False else: + print("時間到") return True else: return False + @property def is_running(self): @@ -345,22 +350,26 @@ class SwimmingSquid(PaiaGame): foregrounds = [ ] - star_string_1P = '+' * self.squid1.lv - star_string_2P = '+' * self.squid2.lv toggle_objs = [ - create_text_view_data(f"Timer : {self._frame_count_down:04d}", 705, 50, "#EEEEEE", "20px Consolas BOLD"), - create_text_view_data(f"Goal : {self._score_to_pass:04d} pt", 705, 80, "#EEEEEE", "20px Consolas BOLD"), - create_text_view_data("1P", 705, 130, "#EEEEEE", "22px Consolas BOLD"), - create_text_view_data(f"Lv: {star_string_1P}", 705, 160, "#EEEEEE", "20px Consolas BOLD"), - create_text_view_data(f"To Lv up: {LEVEL_THRESHOLDS[self.squid1.lv - 1]-self.squid1.score :04d} pt", 705, 190, "#EEEEEE", "20px Consolas BOLD"), - create_text_view_data(f"Vel : {self.squid1.vel:4d}", 705, 220, "#EEEEEE", "20px Consolas BOLD"), - create_text_view_data(f"1P Score: {self.squid1.score:04d} pt", 705, 250, "#EEEEEE", "20px Consolas BOLD"), - create_text_view_data("2P", 705, 310, "#EEEEEE", "22px Consolas BOLD"), - create_text_view_data(f"Lv: {star_string_2P}", 705, 340, "#EEEEEE", "20px Consolas BOLD"), - create_text_view_data(f"To Lv up: {LEVEL_THRESHOLDS[self.squid2.lv - 1] - self.squid2.score :04d} pt", 705, - 370, "#EEEEEE", "20px Consolas BOLD"), - create_text_view_data(f"Vel : {self.squid2.vel:4d}", 705, 400, "#EEEEEE", "20px Consolas BOLD"), - create_text_view_data(f"2P Score: {self.squid2.score:04d} pt", 705, 430, "#EEEEEE", "20px Consolas BOLD"), + create_text_view_data(f"Timer:{self._frame_count_down:04d}", 745, 40, "#EEEEEE", "20px Consolas BOLD"), + # create_text_view_data(f"", 785, 80, "#EEEEEE", "18px Consolas BOLD"), + create_text_view_data(f"File :{os.path.basename(self._used_file)}", 745, 80, "#EEEEEE", "20px Consolas BOLD"), + # create_text_view_data(f"File :{self._level_file}", 605, 80, "#EEEEEE", "10px Consolas BOLD"), + create_text_view_data(f"Goal :{self._score_to_pass:04d} pt", 745, 120, "#EEEEEE", "20px Consolas BOLD"), + # create_text_view_data(f"", 785, 140, "#EEEEEE", "18px Consolas BOLD"), + create_image_view_data("squid1", 705, 180, 76, 114), + # create_text_view_data("1P", 705, 130, "#EEEEEE", "22px Consolas BOLD"), + create_text_view_data(f"Lv : {self.squid1.lv}", 785, 180, "#EEEEEE", "16px Consolas BOLD"), + create_text_view_data(f"Next Lv: {LEVEL_THRESHOLDS[self.squid1.lv - 1]-self.squid1.score :04d} pt", 785, 210, "#EEEEEE", "16px Consolas BOLD"), + create_text_view_data(f"Vel : {self.squid1.vel:2d}", 785, 240, "#EEEEEE", "16px Consolas BOLD"), + create_text_view_data(f"Score : {self.squid1.score:04d} pt", 785, 270, "#EEEEEE", "16px Consolas BOLD"), + # create_text_view_data("2P", 705, 310, "#EEEEEE", "22px Consolas BOLD"), + create_image_view_data("squid2", 705, 390, 76, 114), + create_text_view_data(f"Lv : {self.squid2.lv}", 785, 390, "#EEEEEE", "16px Consolas BOLD"), + create_text_view_data(f"Next Lv: {LEVEL_THRESHOLDS[self.squid2.lv - 1] - self.squid2.score :04d} pt", 785, + 420, "#EEEEEE", "16px Consolas BOLD"), + create_text_view_data(f"Vel : {self.squid2.vel:2d}", 785, 450, "#EEEEEE", "16px Consolas BOLD"), + create_text_view_data(f"Score : {self.squid2.score:04d} pt", 785, 480, "#EEEEEE", "16px Consolas BOLD"), ] scene_progress = create_scene_progress_data( diff --git a/src/game_object.py b/src/game_object.py index c524505..4b094b8 100644 --- a/src/game_object.py +++ b/src/game_object.py @@ -1,4 +1,6 @@ import math +import random + import pydantic import pygame.sprite @@ -44,9 +46,27 @@ class Squid(pygame.sprite.Sprite): self.rank = 1 self.angle = 0 self._last_collision = 0 + self._collision_dir = None + self._motion = None - def update(self, motion): + def update(self, frame, motion): # for motion in motions: + self._motion = motion + if frame - self._last_collision <=3: + # 反彈 + if self._collision_dir == "UP": + self.rect.centery += self._vel + elif self._collision_dir == "DOWN": + self.rect.centery -= self._vel + elif self._collision_dir == "LEFT": + self.rect.centerx += self._vel + self.angle = self.ANGLE_TO_RIGHT + elif self._collision_dir == "RIGHT": + self.rect.centerx -= self._vel + self.angle = self.ANGLE_TO_LEFT + else: + self.angle = 0 + return 0 if motion == "UP": self.rect.centery -= self._vel elif motion == "DOWN": @@ -93,10 +113,15 @@ class Squid(pygame.sprite.Sprite): self._lv = new_lv def collision_between_squids(self, collision_score, frame, sound_controller: SoundController): - if frame - self._last_collision > 30: + if frame - self._last_collision > 3: self._score += collision_score self._last_collision = frame sound_controller.play_collision() + if self._motion != "NONE": + self._collision_dir = self._motion + else: + self._collision_dir = random.choice(["UP", "DOWN", "RIGHT", "LEFT"]) + new_lv = get_current_level(self._score)