class test_food(TestCase): def setUp(self): self.food = Food() def test__init__success(self): """010A - Test __init__ success""" self.assertIsNotNone(self.food) def test__init__failure(self): """010B - Test __init__ failure""" with self.assertRaises(TypeError): self.falcon = Food("Falcon", 100) with self.assertRaises(TypeError): self.falcon = Food(Food(Food(Food(Food(Food(Food())))))) with self.assertRaises(TypeError): self.falcon = Food(345) def test_get_pos(self): """070A - test obj spawns""" self.assertIsNotNone(self.food.get_pos) @mock.patch('food.Food.draw_on_display') def test_draw_on_display(self, mock_draw_func): """080A - test food is drawn on display""" self.food.draw_on_display() self.assertTrue(mock_draw_func.called) def test_new_food(self): """90A - test new food spawns food in a new position""" self.food.new_food([0,0]) self.assertNotEqual(self.food.get_pos,[0,0])
class Game(): def __init__(self): self.ROOT = tk.Tk() self.ROOT.withdraw() self.DISPLAY = pygame.display.set_mode( (500, 500)) # FIXME make window size adjustable # initalizes objects/game pygame.init() # creates game pygame.font.init() # gets pygame fonts self.snake = Snake() # creates snake self.clock = pygame.time.Clock() # fps setter self.food = Food() # creates food self.scores = dict() pygame.display.set_caption('Snake Game') # Temporary window: fifty 10 by 10 squares # TEXT FONTS self.menu_buttons = pygame.font.SysFont("comicsansms", 20) # Sound Files self.lose_sound = pygame.mixer.Sound("sound/game_loss.wav") self.food_collect_sound = pygame.mixer.Sound("sound/food_collect.wav") self.hee_heed = False # Image Files self.michael_img = pygame.image.load("images/michael.png") self.game = True self.food.new_food(self.snake.get_pos[0] ) # spawns food at a random location not on snake # Global Variables self.screen = "menu" self.restart = True self.target_url = "http://localhost:1337" self.difficulty = "" self.score = 0 self.hunger = 0 # time since last meal def upload(self): if path.exists("db.txt"): # FIXME file = open("db.txt", "r") csvlist = file.readlines() print(csvlist) if csvlist != []: for person in csvlist[:-1]: data = {} data["player"] = person.split(",")[0] data["score"] = int("".join( list(person.split(",")[1])[:-1])) data["difficulty"] = person.split(",")[2][:-1].capitalize() response = requests.post(self.target_url + "/Player/AddScore", data=data) print(response.text) data = {} data["player"] = csvlist[-1].split(",")[0] data["score"] = int(csvlist[-1].split(",")[1]) data["difficulty"] = self.difficulty.capitalize() response = requests.post(self.target_url + "/Player/AddScore", data=data) print(response) messagebox.showinfo("Success!", f"Scores have been uploaded") file.close() remove("db.txt") else: messagebox.showinfo("FAILURE!", f"No new Scores") return "" else: messagebox.showinfo("FAILURE!", f"No new Scores") return "" def button(self, msg, x, y, w, h, color, click_color, text_color, font, action=None): mouse = pygame.mouse.get_pos() if x + w > mouse[0] > x and y + h > mouse[1] > y: pygame.draw.rect(self.DISPLAY, click_color, (x, y, w, h)) for event in pygame.event.get(): if event.type == pygame.MOUSEBUTTONDOWN: return action() else: pygame.draw.rect(self.DISPLAY, color, (x, y, w, h)) text = font.render(msg, True, text_color) text_rect = text.get_rect() text_rect.center = (x + w // 2, y + h // 2) self.DISPLAY.blit(text, text_rect) def record_score(self, name, score): if path.exists("db.txt"): file = open("db.txt", "r") csvlist = file.readlines() for line in csvlist: item = line.split(",") self.scores[item[0]] = item[1] if name in self.scores: if int(self.scores[name]) >= int(score): file.close() return False else: file.close() self.scores[name] = self.score file = open("db.txt", "w") for key in self.scores: file.write( f"\n{key},{int(self.scores[key])},{self.difficulty}" ) csvlist.pop(0) file.close() return True else: file.close() file = open("db.txt", "a") file.write(f"\n{name},{int(score)},{self.difficulty}") file.close() return True else: file = open("db.txt", "w") file.write(f"{name},{int(score)},{self.difficulty}") file.close() return True def menu_action(self): self.screen = "menu" def record_action(self): name = simpledialog.askstring(title="Test", prompt="What's your Name?:") if name is not None: if name != '': try: int(name) messagebox.showinfo("Invalid.", "The name you entered is invalid.") except ValueError: if self.record_score(name, self.score): messagebox.showinfo( "Success", f"Score of {int(self.score)} recorded for player {name}!" ) self.screen = "menu" return "success" else: messagebox.showinfo( "Failure", f"{name} already has a higher score than {int(self.score)}." ) else: messagebox.showinfo("Invalid.", "The name you entered is invalid.") return "menu" def calculate_score(self, ate=False): multiplier = 0 if self.difficulty == "easy": multiplier = 5 elif self.difficulty == "medium": multiplier = 7.5 elif self.difficulty == "hard": multiplier = 10 if not ate: self.hunger += 1 self.score = self.score - self.hunger else: self.hunger = 0 self.score = self.score + 1000 * multiplier * ( len(self.snake.get_pos[0]) / 10 + 1) if self.score <= 0: self.score = 0 def easy_action(self): self.food = Food() self.snake = Snake() self.DISPLAY.fill([0, 0, 0]) self.food.new_food(self.snake.get_pos[0]) self.snake.draw_on_display(self.DISPLAY) self.food.draw_on_display(self.DISPLAY) self.difficulty = "easy" self.screen = "game" def medium_action(self): self.food = Food() self.snake = Snake() self.DISPLAY.fill([0, 0, 0]) self.food.new_food(self.snake.get_pos[0]) self.snake.draw_on_display(self.DISPLAY) self.food.draw_on_display(self.DISPLAY) self.difficulty = "medium" self.screen = "game" def hard_action(self): self.food = Food() self.snake = Snake() self.DISPLAY.fill([0, 0, 0]) self.food.new_food(self.snake.get_pos[0]) self.snake.draw_on_display(self.DISPLAY) self.food.draw_on_display(self.DISPLAY) self.difficulty = "hard" self.screen = "game" def check_for_death(self): if any(self.snake.get_pos[1] == part for part in self.snake.get_pos[0][1:]): # check if head is on body part this frame return True return False def center(self, score): center = 240 while score >= 10: score /= 10 center -= 4 return center def play(self): while self.game is True: if self.screen == "game": for event in pygame.event.get(): # Arrow key inputs if event.type == pygame.KEYDOWN: if event.key == pygame.K_LEFT: self.snake.left() if event.key == pygame.K_RIGHT: self.snake.right() if event.key == pygame.K_UP: self.snake.up() if event.key == pygame.K_DOWN: self.snake.down() if event.type == pygame.QUIT: pygame.quit() # snake.debug() #debug info if self.check_for_death(): # snake will die next round self.screen = "lose" if self.snake.get_pos[1] == self.food.get_pos: # pygame.mixer.Sound.play(food_collect_sound) self.snake.move( ate=True) # makes snake longer if snake on food self.calculate_score(ate=True) self.food.new_food(self.snake.get_pos[0]) else: self.calculate_score() self.snake.move() self.DISPLAY.fill([0, 0, 0]) self.button(str(int(self.score)), self.center(self.score), 0, 50, 50, [0, 0, 0], [0, 0, 0], [255, 255, 255], self.menu_buttons) self.snake.draw_on_display(self.DISPLAY) self.food.draw_on_display(self.DISPLAY) pygame.display.flip() elif self.screen == "lose": self.DISPLAY.fill([0, 0, 0]) if not self.hee_heed: # hee hee is the loss sound # pygame.mixer.Sound.play(lose_sound) self.hee_heed = True self.button("Menu", 150, 150, 70, 35, [70, 102, 255], [90, 120, 255], [255, 255, 255], self.menu_buttons, self.menu_action) self.button("Record score!", 250, 250, 175, 35, [70, 102, 255], [90, 120, 255], [255, 255, 255], self.menu_buttons, self.record_action) self.button(f"Score: {int(self.score)}", 200, 200, 50, 35, [0, 0, 0], [0, 0, 0], [255, 255, 255], self.menu_buttons) pygame.display.flip() for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() exit() elif self.screen == "menu": self.score = 0 self.DISPLAY.fill([0, 0, 0]) response = self.button("EASY!", 75, 150, 100, 35, [70, 102, 255], [90, 120, 255], [255, 255, 255], self.menu_buttons, self.easy_action) response2 = self.button("MEDIUM!", 210, 150, 100, 35, [70, 102, 255], [90, 120, 255], [255, 255, 255], self.menu_buttons, self.medium_action) response3 = self.button("HARD!", 345, 150, 100, 35, [70, 102, 255], [90, 120, 255], [255, 255, 255], self.menu_buttons, self.hard_action) if path.exists("db.txt"): self.button("Upload Scores", 184, 250, 150, 35, [70, 102, 255], [90, 120, 255], [255, 255, 255], self.menu_buttons, self.upload) if response == "game": # simple menu system self.screen = "game" pygame.display.flip() # idk why but with out the code at the bottom, it crashes for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() exit() if self.screen != "game": self.clock.tick(200) else: if self.difficulty == "easy": self.clock.tick(10) elif self.difficulty == "medium": self.clock.tick(15) elif self.difficulty == "hard": self.clock.tick(20) else: self.clock.tick(1)