From 2d4be04c27e835ea0f06236d506d3949592682d3 Mon Sep 17 00:00:00 2001 From: ulad Date: Thu, 20 Oct 2022 21:42:36 +0800 Subject: [PATCH 01/15] requirements.txt --- .gitignore | 2 ++ readme.md | 5 +++++ requirements.txt | 1 + 3 files changed, 8 insertions(+) create mode 100644 .gitignore create mode 100644 requirements.txt diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5b4ae2b --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +# Virtual environments +.venv diff --git a/readme.md b/readme.md index 858fbca..d0a0a4b 100644 --- a/readme.md +++ b/readme.md @@ -7,6 +7,11 @@ + Clone it on your local computer OR download in zip format ++ Run + python -m venv .venv (it will create you a virtual environment) + source .venv/bin/activate (it will activate your virtual environment) + pip install -r requirements.txt (it will install necessary packages) + + Extract the file and run the game by following any of the following mentioned methods in [Running](##Running) section diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..b4fe918 --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +pygame==2.1.2 From 491cd26b9dd5ba1dce22812d4e011b91181aec8f Mon Sep 17 00:00:00 2001 From: uladzimir Date: Tue, 1 Nov 2022 07:17:05 +0800 Subject: [PATCH 02/15] tests --- game.py | 233 ++++++++++++++++++++++++++++++++--------------------- helpers.py | 28 +++++++ tests.py | 28 +++++++ 3 files changed, 197 insertions(+), 92 deletions(-) create mode 100644 helpers.py create mode 100644 tests.py diff --git a/game.py b/game.py index b194065..a709dab 100644 --- a/game.py +++ b/game.py @@ -16,7 +16,7 @@ # Score -score_val = 0 +score = 0 scoreX = 5 scoreY = 5 font = pygame.font.Font('freesansbold.ttf', 20) @@ -25,13 +25,13 @@ game_over_font = pygame.font.Font('freesansbold.ttf', 64) -def show_score(x, y): - score = font.render("Points: " + str(score_val), True, (255,255,255)) - screen.blit(score, (x , y )) +def show_score(score, x, y): + score_text = font.render("Points: " + str(score), True, (255,255,255)) + screen.blit(score_text, (x , y )) -def game_over(): +def game_over_display(): game_over_text = game_over_font.render("GAME OVER", True, (255,255,255)) screen.blit(game_over_text, (190, 250)) @@ -42,34 +42,43 @@ def game_over(): # player playerImage = pygame.image.load('data/spaceship.png') -player_X = 370 -player_Y = 523 -player_Xchange = 0 +player = { + "x": 370, + "y": 523 +} + +def reset_player_X(player_X): + if player_X <= 16: + player_X = 16 + elif player_X >= 750: + player_X = 750 + return player_X + # Invader -invaderImage = [] -invader_X = [] -invader_Y = [] -invader_Xchange = [] -invader_Ychange = [] +invaders = [] no_of_invaders = 8 +invaderImage = pygame.image.load('data/alien.png') for num in range(no_of_invaders): - invaderImage.append(pygame.image.load('data/alien.png')) - invader_X.append(random.randint(64, 737)) - invader_Y.append(random.randint(30, 180)) - invader_Xchange.append(1.2) - invader_Ychange.append(50) + invader = { + "x": random.randint(64, 737), + "y": random.randint(30, 180), + "x_change": 1.2, + "y_change": 50 + } + invaders.append(invader) # Bullet # rest - bullet is not moving # fire - bullet is moving bulletImage = pygame.image.load('data/bullet.png') -bullet_X = 0 -bullet_Y = 500 -bullet_Xchange = 0 -bullet_Ychange = 3 -bullet_state = "rest" +bullet = { + "x": 0, + "y": 500, + "y_change": 3, + "state": "rest" +} # Collision Concept def isCollision(x1, x2, y1, y2): @@ -80,19 +89,98 @@ def isCollision(x1, x2, y1, y2): return False -def player(x, y): - screen.blit(playerImage, (x - 16, y + 10)) - +def show_player(player): + screen.blit(playerImage, (player["x"] - 16, player["y"] + 10)) + + +def show_invader(invader): + screen.blit(invaderImage, (invader["x"], invader["y"])) + + +def show_bullet(bullet): + screen.blit(bulletImage, (bullet["x"], bullet["y"])) + bullet["state"] = "fire" + return bullet + +####### + +def event_action(event, bullet, player): + if event.type == pygame.QUIT: + global running + running = False + + # Controling the player movement from the arrow keys + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_LEFT: + player["x"] -= 1.7 + if event.key == pygame.K_RIGHT: + player["x"] += 1.7 + if event.key == pygame.K_SPACE: + # Fixing the change of direction of bullet + bullet = fix_bullet_direction(bullet, player) + #if event.type == pygame.KEYUP: + # player_Xchange = 0 + return bullet, player + +def fix_bullet_direction(bullet, player): + if bullet["state"] is "rest": + bullet["x"] = player["x"] + bullet = show_bullet(bullet) + play_sound('data/bullet.wav') + return bullet + +def play_sound(dir): + sound = mixer.Sound(dir) + sound.play() + +def update_invaders_x(invaders): + for invader in invaders: + invader["x"] += invader["x_change"] + return invaders + +def bullet_movement(bullet): + if bullet["y"] <= 0: + bullet["y"] = 600 + bullet["state"] = "rest" + if bullet["state"] is "fire": + show_bullet(bullet) + bullet["y"] -= bullet["y_change"] + return bullet + +def game_over(invaders, invader, player): + is_game_over = False + if invader["y"] >= 450: + if abs(player["x"]-invader["x"]) < 80: + invaders = remove_invaders(invaders) + game_over_display() + is_game_over = True + return invaders, invader, is_game_over + +def remove_invaders(invaders): + for invader_ in invaders: + invader_["y"] = 2000 + play_sound('data/explosion.wav') + return invaders + +def move_next_line(invader): + if invader["x"] >= 735 or invader["x"] <= 0: + invader["x_change"] *= -1 + invader["y"] += invader["y_change"] + return invader + +def update_score_and_invaders(score, bullet, invader): + score += 1 + bullet["y"] = 600 + bullet["state"] = "rest" + invader["x"] = random.randint(64, 736) + invader["y"] = random.randint(30, 200) + invader["x_change"] *= -1 + return score, bullet, invader + +####### -def invader(x, y, i): - screen.blit(invaderImage[i], (x, y)) -def bullet(x, y): - global bullet_state - screen.blit(bulletImage, (x, y)) - bullet_state = "fire" - # game loop running = True @@ -101,76 +189,37 @@ def bullet(x, y): # RGB screen.fill((0, 0, 0)) for event in pygame.event.get(): - if event.type == pygame.QUIT: - running = False - - # Controling the player movement from the arrow keys - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_LEFT: - player_Xchange = -1.7 - if event.key == pygame.K_RIGHT: - player_Xchange = 1.7 - if event.key == pygame.K_SPACE: - # Fixing the change of direction of bullet - if bullet_state is "rest": - bullet_X = player_X - bullet(bullet_X, bullet_Y) - bullet_sound = mixer.Sound('data/bullet.wav') - bullet_sound.play() - if event.type == pygame.KEYUP: - player_Xchange = 0 - - # adding the change in the player position - player_X += player_Xchange - for i in range(no_of_invaders): - invader_X[i] += invader_Xchange[i] + bullet, player = event_action(event, bullet, player) + + # updating the invaders x-coordinate + invaders = update_invaders_x(invaders) # bullet movement - if bullet_Y <= 0: - bullet_Y = 600 - bullet_state = "rest" - if bullet_state is "fire": - bullet(bullet_X, bullet_Y) - bullet_Y -= bullet_Ychange + bullet = bullet_movement(bullet) # movement of the invader - for i in range(no_of_invaders): + #invaders = invaders_movement(invaders) + for invader in invaders: + #invader, is_game_over = game_over(invader, player) - if invader_Y[i] >= 450: - if abs(player_X-invader_X[i]) < 80: - for j in range(no_of_invaders): - invader_Y[j] = 2000 - explosion_sound = mixer.Sound('data/explosion.wav') - explosion_sound.play() - game_over() - break - - if invader_X[i] >= 735 or invader_X[i] <= 0: - invader_Xchange[i] *= -1 - invader_Y[i] += invader_Ychange[i] + invaders, invader, is_game_over = game_over(invaders, invader, player) + if is_game_over: + break + + invader = move_next_line(invader) + # Collision - collision = isCollision(bullet_X, invader_X[i], bullet_Y, invader_Y[i]) + collision = isCollision(bullet["x"], invader["x"], bullet["y"], invader["y"]) if collision: - score_val += 1 - bullet_Y = 600 - bullet_state = "rest" - invader_X[i] = random.randint(64, 736) - invader_Y[i] = random.randint(30, 200) - invader_Xchange[i] *= -1 - - invader(invader_X[i], invader_Y[i], i) + score, bullet, invader = update_score_and_invaders(score, bullet, invader) + show_invader(invader) # restricting the spaceship so that it doesn't go out of screen - if player_X <= 16: - player_X = 16; - elif player_X >= 750: - player_X = 750 - - + player["x"] = reset_player_X(player["x"]) - player(player_X, player_Y) - show_score(scoreX, scoreY) + show_player(player) + show_score(score, scoreX, scoreY) pygame.display.update() diff --git a/helpers.py b/helpers.py new file mode 100644 index 0000000..f7c86bf --- /dev/null +++ b/helpers.py @@ -0,0 +1,28 @@ +def event_action(event, bullet, player): + if event.type == pygame.QUIT: + global running + running = False + + # Controling the player movement from the arrow keys + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_LEFT: + player["x"] -= 1.7 + if event.key == pygame.K_RIGHT: + player["x"] += 1.7 + if event.key == pygame.K_SPACE: + # Fixing the change of direction of bullet + bullet = fix_bullet_direction(bullet, player) + #if event.type == pygame.KEYUP: + # player_Xchange = 0 + return bullet, player + +def fix_bullet_direction(bullet, player): + if bullet["state"] is "rest": + bullet["x"] = player["x"] + bullet = show_bullet(bullet) + play_sound('data/bullet.wav') + return bullet + +def play_sound(dir): + sound = mixer.Sound(dir) + sound.play() \ No newline at end of file diff --git a/tests.py b/tests.py new file mode 100644 index 0000000..0efd3b9 --- /dev/null +++ b/tests.py @@ -0,0 +1,28 @@ +import pytest +from game import bullet_movement + +def test_bullet_movement(): + bullet1 = { + "y": 0, + "state": "rest" + } + bullet2 = { + "y": 500, + "state": "rest" + } + bullet3 = { + "y": -10, + "state": "fire" + } + bullet4 = { + "y": 500, + "state": "fire" + } + assert bullet_movement(bullet1)["y"] == 600 + assert bullet_movement(bullet1)["state"] == "rest" + assert bullet_movement(bullet2)["y"] == 500 + assert bullet_movement(bullet2)["state"] == "rest" + assert bullet_movement(bullet3)["y"] == 600 + assert bullet_movement(bullet3)["state"] == "rest" + with pytest.raises(Exception) as e_info: + show_bullet(bullet4) From f9602121daaf51a4af6b71440fd122cd051b6128 Mon Sep 17 00:00:00 2001 From: ulad Date: Tue, 1 Nov 2022 21:43:04 +0800 Subject: [PATCH 03/15] commit --- .gitignore | 2 ++ requirements.txt | 8 ++++++++ test_functions.py | 8 ++++++++ tests.py | 28 ---------------------------- 4 files changed, 18 insertions(+), 28 deletions(-) create mode 100644 test_functions.py delete mode 100644 tests.py diff --git a/.gitignore b/.gitignore index 5b4ae2b..26f3795 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ # Virtual environments .venv +# Cache +__pycache__ \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index b4fe918..5ddfdc7 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1 +1,9 @@ +attrs==22.1.0 +exceptiongroup==1.0.0 +iniconfig==1.1.1 +packaging==21.3 +pluggy==1.0.0 pygame==2.1.2 +pyparsing==3.0.9 +pytest==7.2.0 +tomli==2.0.1 diff --git a/test_functions.py b/test_functions.py new file mode 100644 index 0000000..dcd13db --- /dev/null +++ b/test_functions.py @@ -0,0 +1,8 @@ +from game import reset_player_X + + +def test_reset_player_X(): + + assert reset_player_X(0) == 16 + assert reset_player_X(17) == 17 + assert reset_player_X(800) == 750 diff --git a/tests.py b/tests.py deleted file mode 100644 index 0efd3b9..0000000 --- a/tests.py +++ /dev/null @@ -1,28 +0,0 @@ -import pytest -from game import bullet_movement - -def test_bullet_movement(): - bullet1 = { - "y": 0, - "state": "rest" - } - bullet2 = { - "y": 500, - "state": "rest" - } - bullet3 = { - "y": -10, - "state": "fire" - } - bullet4 = { - "y": 500, - "state": "fire" - } - assert bullet_movement(bullet1)["y"] == 600 - assert bullet_movement(bullet1)["state"] == "rest" - assert bullet_movement(bullet2)["y"] == 500 - assert bullet_movement(bullet2)["state"] == "rest" - assert bullet_movement(bullet3)["y"] == 600 - assert bullet_movement(bullet3)["state"] == "rest" - with pytest.raises(Exception) as e_info: - show_bullet(bullet4) From 7fbead7df96c130f615c46434c4141fb1b6703e1 Mon Sep 17 00:00:00 2001 From: ulad Date: Tue, 1 Nov 2022 22:51:23 +0800 Subject: [PATCH 04/15] flake --- __init__.py | 0 game.py | 220 +++++++++--------- helpers.py | 28 --- tests/test_bullet_movement.py | 28 +++ tests/test_event_action.py | 0 tests/test_fix_bullet_direction.py | 0 tests/test_game_over.py | 0 tests/test_isCollision.py | 0 tests/test_move_next_line.py | 0 tests/test_remove_invaders.py | 0 .../test_reset_player_X.py | 1 + tests/test_show_bullet.py | 0 tests/test_update_invaders_x.py | 0 tests/test_update_score_and_invaders.py | 0 14 files changed, 145 insertions(+), 132 deletions(-) create mode 100644 __init__.py delete mode 100644 helpers.py create mode 100644 tests/test_bullet_movement.py create mode 100644 tests/test_event_action.py create mode 100644 tests/test_fix_bullet_direction.py create mode 100644 tests/test_game_over.py create mode 100644 tests/test_isCollision.py create mode 100644 tests/test_move_next_line.py create mode 100644 tests/test_remove_invaders.py rename test_functions.py => tests/test_reset_player_X.py (99%) create mode 100644 tests/test_show_bullet.py create mode 100644 tests/test_update_invaders_x.py create mode 100644 tests/test_update_score_and_invaders.py diff --git a/__init__.py b/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/game.py b/game.py index a709dab..6991cd0 100644 --- a/game.py +++ b/game.py @@ -3,49 +3,18 @@ import math from pygame import mixer -# initializing pygame -pygame.init() - -# creating screen -screen_width = 800 -screen_height = 600 -screen = pygame.display.set_mode((screen_width, screen_height)) - -# caption and icon -pygame.display.set_caption("Welcome to Space Invaders Game by:- styles") - - -# Score -score = 0 -scoreX = 5 -scoreY = 5 -font = pygame.font.Font('freesansbold.ttf', 20) - -# Game Over -game_over_font = pygame.font.Font('freesansbold.ttf', 64) +# FUNCTIONS # def show_score(score, x, y): - score_text = font.render("Points: " + str(score), True, (255,255,255)) - screen.blit(score_text, (x , y )) - + score_text = font.render("Points: " + str(score), True, (255, 255, 255)) + screen.blit(score_text, (x, y)) def game_over_display(): - game_over_text = game_over_font.render("GAME OVER", True, (255,255,255)) + game_over_text = game_over_font.render("GAME OVER", True, (255, 255, 255)) screen.blit(game_over_text, (190, 250)) -# Background Sound -mixer.music.load('data/background.wav') -mixer.music.play(-1) - - -# player -playerImage = pygame.image.load('data/spaceship.png') -player = { - "x": 370, - "y": 523 -} def reset_player_X(player_X): if player_X <= 16: @@ -55,34 +24,8 @@ def reset_player_X(player_X): return player_X -# Invader -invaders = [] -no_of_invaders = 8 -invaderImage = pygame.image.load('data/alien.png') -for num in range(no_of_invaders): - invader = { - "x": random.randint(64, 737), - "y": random.randint(30, 180), - "x_change": 1.2, - "y_change": 50 - } - invaders.append(invader) - - -# Bullet -# rest - bullet is not moving -# fire - bullet is moving -bulletImage = pygame.image.load('data/bullet.png') -bullet = { - "x": 0, - "y": 500, - "y_change": 3, - "state": "rest" -} - -# Collision Concept def isCollision(x1, x2, y1, y2): - distance = math.sqrt((math.pow(x1 - x2,2)) + (math.pow(y1 - y2,2))) + distance = math.sqrt((math.pow(x1 - x2, 2)) + (math.pow(y1 - y2, 2))) if distance <= 50: return True else: @@ -102,7 +45,6 @@ def show_bullet(bullet): bullet["state"] = "fire" return bullet -####### def event_action(event, bullet, player): if event.type == pygame.QUIT: @@ -118,35 +60,39 @@ def event_action(event, bullet, player): if event.key == pygame.K_SPACE: # Fixing the change of direction of bullet bullet = fix_bullet_direction(bullet, player) - #if event.type == pygame.KEYUP: - # player_Xchange = 0 + return bullet, player + def fix_bullet_direction(bullet, player): - if bullet["state"] is "rest": + if bullet["state"] == "rest": bullet["x"] = player["x"] bullet = show_bullet(bullet) play_sound('data/bullet.wav') return bullet + def play_sound(dir): sound = mixer.Sound(dir) sound.play() + def update_invaders_x(invaders): for invader in invaders: invader["x"] += invader["x_change"] return invaders + def bullet_movement(bullet): if bullet["y"] <= 0: bullet["y"] = 600 bullet["state"] = "rest" - if bullet["state"] is "fire": + if bullet["state"] == "fire": show_bullet(bullet) bullet["y"] -= bullet["y_change"] return bullet + def game_over(invaders, invader, player): is_game_over = False if invader["y"] >= 450: @@ -156,18 +102,21 @@ def game_over(invaders, invader, player): is_game_over = True return invaders, invader, is_game_over + def remove_invaders(invaders): for invader_ in invaders: invader_["y"] = 2000 - play_sound('data/explosion.wav') + play_sound('data/explosion.wav') return invaders + def move_next_line(invader): if invader["x"] >= 735 or invader["x"] <= 0: invader["x_change"] *= -1 invader["y"] += invader["y_change"] return invader + def update_score_and_invaders(score, bullet, invader): score += 1 bullet["y"] = 600 @@ -177,49 +126,112 @@ def update_score_and_invaders(score, bullet, invader): invader["x_change"] *= -1 return score, bullet, invader -####### +if __name__ == "__main__": + # INITIALIZE # + pygame.init() -# game loop + # creating screen + screen_width = 800 + screen_height = 600 + screen = pygame.display.set_mode((screen_width, screen_height)) -running = True -while running: + # caption and icon + pygame.display.set_caption("Welcome to Space Invaders Game by:- styles") - # RGB - screen.fill((0, 0, 0)) - for event in pygame.event.get(): - bullet, player = event_action(event, bullet, player) + # Score + score = 0 + scoreX = 5 + scoreY = 5 + font = pygame.font.Font('freesansbold.ttf', 20) - # updating the invaders x-coordinate - invaders = update_invaders_x(invaders) + # Game Over + game_over_font = pygame.font.Font('freesansbold.ttf', 64) - # bullet movement - bullet = bullet_movement(bullet) + # Background Sound + mixer.music.load('data/background.wav') + mixer.music.play(-1) - # movement of the invader - #invaders = invaders_movement(invaders) - for invader in invaders: - #invader, is_game_over = game_over(invader, player) - - invaders, invader, is_game_over = game_over(invaders, invader, player) - if is_game_over: - break - - invader = move_next_line(invader) - - # Collision - collision = isCollision(bullet["x"], invader["x"], bullet["y"], invader["y"]) - if collision: - score, bullet, invader = update_score_and_invaders(score, bullet, invader) - - show_invader(invader) - - - # restricting the spaceship so that it doesn't go out of screen - player["x"] = reset_player_X(player["x"]) + # player + playerImage = pygame.image.load('data/spaceship.png') + player = { + "x": 370, + "y": 523 + } - show_player(player) - show_score(score, scoreX, scoreY) - pygame.display.update() + # Invader + invaders = [] + no_of_invaders = 8 + invaderImage = pygame.image.load('data/alien.png') + for num in range(no_of_invaders): + invader = { + "x": random.randint(64, 737), + "y": random.randint(30, 180), + "x_change": 1.2, + "y_change": 50 + } + invaders.append(invader) + + # Bullet + # rest - bullet is not moving + # fire - bullet is moving + bulletImage = pygame.image.load('data/bullet.png') + bullet = { + "x": 0, + "y": 500, + "y_change": 3, + "state": "rest" + } + # GAME LOOP # + + running = True + while running: + + # RGB + screen.fill((0, 0, 0)) + for event in pygame.event.get(): + bullet, player = event_action(event, bullet, player) + + # updating the invaders x-coordinate + invaders = update_invaders_x(invaders) + + # bullet movement + bullet = bullet_movement(bullet) + + # movement of the invader + for invader in invaders: + + invaders, invader, is_game_over = game_over( + invaders, + invader, + player + ) + if is_game_over: + break + + invader = move_next_line(invader) + + # Collision + collision = isCollision( + bullet["x"], + invader["x"], + bullet["y"], + invader["y"] + ) + if collision: + score, bullet, invader = update_score_and_invaders( + score, + bullet, + invader + ) + + show_invader(invader) + + # restricting the spaceship so that it doesn't go out of screen + player["x"] = reset_player_X(player["x"]) + + show_player(player) + show_score(score, scoreX, scoreY) + pygame.display.update() diff --git a/helpers.py b/helpers.py deleted file mode 100644 index f7c86bf..0000000 --- a/helpers.py +++ /dev/null @@ -1,28 +0,0 @@ -def event_action(event, bullet, player): - if event.type == pygame.QUIT: - global running - running = False - - # Controling the player movement from the arrow keys - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_LEFT: - player["x"] -= 1.7 - if event.key == pygame.K_RIGHT: - player["x"] += 1.7 - if event.key == pygame.K_SPACE: - # Fixing the change of direction of bullet - bullet = fix_bullet_direction(bullet, player) - #if event.type == pygame.KEYUP: - # player_Xchange = 0 - return bullet, player - -def fix_bullet_direction(bullet, player): - if bullet["state"] is "rest": - bullet["x"] = player["x"] - bullet = show_bullet(bullet) - play_sound('data/bullet.wav') - return bullet - -def play_sound(dir): - sound = mixer.Sound(dir) - sound.play() \ No newline at end of file diff --git a/tests/test_bullet_movement.py b/tests/test_bullet_movement.py new file mode 100644 index 0000000..34bc3a2 --- /dev/null +++ b/tests/test_bullet_movement.py @@ -0,0 +1,28 @@ +import pytest +from game import bullet_movement + +def test_bullet_movement(): + bullet1 = { + "y": 0, + "state": "rest" + } + bullet2 = { + "y": 500, + "state": "rest" + } + bullet3 = { + "y": -10, + "state": "fire" + } + bullet4 = { + "y": 500, + "state": "fire" + } + assert bullet_movement(bullet1)["y"] == 600 + assert bullet_movement(bullet1)["state"] == "rest" + assert bullet_movement(bullet2)["y"] == 500 + assert bullet_movement(bullet2)["state"] == "rest" + assert bullet_movement(bullet3)["y"] == 600 + assert bullet_movement(bullet3)["state"] == "rest" + with pytest.raises(Exception) as e_info: + show_bullet(bullet4) \ No newline at end of file diff --git a/tests/test_event_action.py b/tests/test_event_action.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/test_fix_bullet_direction.py b/tests/test_fix_bullet_direction.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/test_game_over.py b/tests/test_game_over.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/test_isCollision.py b/tests/test_isCollision.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/test_move_next_line.py b/tests/test_move_next_line.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/test_remove_invaders.py b/tests/test_remove_invaders.py new file mode 100644 index 0000000..e69de29 diff --git a/test_functions.py b/tests/test_reset_player_X.py similarity index 99% rename from test_functions.py rename to tests/test_reset_player_X.py index dcd13db..7b9c30d 100644 --- a/test_functions.py +++ b/tests/test_reset_player_X.py @@ -1,6 +1,7 @@ from game import reset_player_X + def test_reset_player_X(): assert reset_player_X(0) == 16 diff --git a/tests/test_show_bullet.py b/tests/test_show_bullet.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/test_update_invaders_x.py b/tests/test_update_invaders_x.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/test_update_score_and_invaders.py b/tests/test_update_score_and_invaders.py new file mode 100644 index 0000000..e69de29 From 5177da7cf7dbeed6b767557ba7f3a92a00905a3c Mon Sep 17 00:00:00 2001 From: ulad Date: Tue, 1 Nov 2022 22:52:05 +0800 Subject: [PATCH 05/15] reqs --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 26f3795..c76fb2f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ # Virtual environments .venv # Cache -__pycache__ \ No newline at end of file +__pycache__ +.pytest_cache \ No newline at end of file From d05a36647d249c2791337f1c9e7beb9fbbaffb4d Mon Sep 17 00:00:00 2001 From: ulad Date: Tue, 1 Nov 2022 23:18:51 +0800 Subject: [PATCH 06/15] tasks --- tests/test_update_score_and_invaders.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/test_update_score_and_invaders.py b/tests/test_update_score_and_invaders.py index e69de29..945003d 100644 --- a/tests/test_update_score_and_invaders.py +++ b/tests/test_update_score_and_invaders.py @@ -0,0 +1 @@ +#venneth \ No newline at end of file From d31f9d68835b68f09ecc601438875da38dd8b14c Mon Sep 17 00:00:00 2001 From: ulad Date: Tue, 1 Nov 2022 23:23:38 +0800 Subject: [PATCH 07/15] tasks2 --- tests/test_event_action.py | 1 + tests/test_fix_bullet_direction.py | 1 + tests/test_game_over.py | 1 + tests/test_isCollision.py | 1 + tests/test_move_next_line.py | 1 + tests/test_remove_invaders.py | 1 + tests/test_show_bullet.py | 1 + tests/test_update_invaders_x.py | 1 + 8 files changed, 8 insertions(+) diff --git a/tests/test_event_action.py b/tests/test_event_action.py index e69de29..9352b80 100644 --- a/tests/test_event_action.py +++ b/tests/test_event_action.py @@ -0,0 +1 @@ +# ulad \ No newline at end of file diff --git a/tests/test_fix_bullet_direction.py b/tests/test_fix_bullet_direction.py index e69de29..4cf4ed2 100644 --- a/tests/test_fix_bullet_direction.py +++ b/tests/test_fix_bullet_direction.py @@ -0,0 +1 @@ +#divi \ No newline at end of file diff --git a/tests/test_game_over.py b/tests/test_game_over.py index e69de29..4cf4ed2 100644 --- a/tests/test_game_over.py +++ b/tests/test_game_over.py @@ -0,0 +1 @@ +#divi \ No newline at end of file diff --git a/tests/test_isCollision.py b/tests/test_isCollision.py index e69de29..945003d 100644 --- a/tests/test_isCollision.py +++ b/tests/test_isCollision.py @@ -0,0 +1 @@ +#venneth \ No newline at end of file diff --git a/tests/test_move_next_line.py b/tests/test_move_next_line.py index e69de29..945003d 100644 --- a/tests/test_move_next_line.py +++ b/tests/test_move_next_line.py @@ -0,0 +1 @@ +#venneth \ No newline at end of file diff --git a/tests/test_remove_invaders.py b/tests/test_remove_invaders.py index e69de29..67d33a3 100644 --- a/tests/test_remove_invaders.py +++ b/tests/test_remove_invaders.py @@ -0,0 +1 @@ +#absaar \ No newline at end of file diff --git a/tests/test_show_bullet.py b/tests/test_show_bullet.py index e69de29..67d33a3 100644 --- a/tests/test_show_bullet.py +++ b/tests/test_show_bullet.py @@ -0,0 +1 @@ +#absaar \ No newline at end of file diff --git a/tests/test_update_invaders_x.py b/tests/test_update_invaders_x.py index e69de29..67d33a3 100644 --- a/tests/test_update_invaders_x.py +++ b/tests/test_update_invaders_x.py @@ -0,0 +1 @@ +#absaar \ No newline at end of file From cb63f42131bc74af23d776cbb8abaeb6e221f23f Mon Sep 17 00:00:00 2001 From: DivyamAgarwal01 <77577932+DivyamAgarwal01@users.noreply.github.com> Date: Wed, 2 Nov 2022 05:47:35 +0000 Subject: [PATCH 08/15] Update game.py --- game.py | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/game.py b/game.py index 6991cd0..1a4867c 100644 --- a/game.py +++ b/game.py @@ -23,7 +23,12 @@ def reset_player_X(player_X): player_X = 750 return player_X - +''' +- x1, x2, y1, y2 are of the type 'float' and the function returns a boolean output. +- The function 1) calculates the Eucledian distance between the bullet and the object + 2) checks if the eucledian distance is less than 50 + 3) Returns true or false acorrdingly +''' def isCollision(x1, x2, y1, y2): distance = math.sqrt((math.pow(x1 - x2, 2)) + (math.pow(y1 - y2, 2))) if distance <= 50: @@ -235,3 +240,16 @@ def update_score_and_invaders(score, bullet, invader): show_player(player) show_score(score, scoreX, scoreY) pygame.display.update() + + + + + ''' + Test for the iscollision function: + + def test(num : int, msg : str, func_out, exp_out) : +    if func_out == exp_out : +        print(f"+ TEST [{num}] PASSED") +    else : +        print(f"- TEST [{num}] FAILED; {msg}") + ''' From 0ce428001382f1e5d94c6e10947a2b70c5b49d27 Mon Sep 17 00:00:00 2001 From: ulad Date: Wed, 2 Nov 2022 23:43:40 +0800 Subject: [PATCH 09/15] finished tests --- .gitignore | 4 ++- game.py | 6 ++-- tests/test_bullet_movement.py | 6 ++-- tests/test_event_action.py | 65 ++++++++++++++++++++++++++++++++++- tests/test_reset_player_X.py | 1 - 5 files changed, 74 insertions(+), 8 deletions(-) diff --git a/.gitignore b/.gitignore index c76fb2f..5c74d5b 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,6 @@ .venv # Cache __pycache__ -.pytest_cache \ No newline at end of file +.pytest_cache +# Coverage +.coverage \ No newline at end of file diff --git a/game.py b/game.py index 6991cd0..eb744b2 100644 --- a/game.py +++ b/game.py @@ -47,8 +47,8 @@ def show_bullet(bullet): def event_action(event, bullet, player): + running = True if event.type == pygame.QUIT: - global running running = False # Controling the player movement from the arrow keys @@ -61,7 +61,7 @@ def event_action(event, bullet, player): # Fixing the change of direction of bullet bullet = fix_bullet_direction(bullet, player) - return bullet, player + return bullet, player, running def fix_bullet_direction(bullet, player): @@ -192,7 +192,7 @@ def update_score_and_invaders(score, bullet, invader): # RGB screen.fill((0, 0, 0)) for event in pygame.event.get(): - bullet, player = event_action(event, bullet, player) + bullet, player, running = event_action(event, bullet, player) # updating the invaders x-coordinate invaders = update_invaders_x(invaders) diff --git a/tests/test_bullet_movement.py b/tests/test_bullet_movement.py index 34bc3a2..b82f18f 100644 --- a/tests/test_bullet_movement.py +++ b/tests/test_bullet_movement.py @@ -1,7 +1,9 @@ import pytest from game import bullet_movement + def test_bullet_movement(): + bullet1 = { "y": 0, "state": "rest" @@ -24,5 +26,5 @@ def test_bullet_movement(): assert bullet_movement(bullet2)["state"] == "rest" assert bullet_movement(bullet3)["y"] == 600 assert bullet_movement(bullet3)["state"] == "rest" - with pytest.raises(Exception) as e_info: - show_bullet(bullet4) \ No newline at end of file + with pytest.raises(NameError): + bullet_movement(bullet4) diff --git a/tests/test_event_action.py b/tests/test_event_action.py index 9352b80..8a717b0 100644 --- a/tests/test_event_action.py +++ b/tests/test_event_action.py @@ -1 +1,64 @@ -# ulad \ No newline at end of file +from game import event_action +import pytest + +running = True + + +def test_event_action(): + import pygame + + bullet1 = { + "y": 0, + "state": "rest" + } + bullet2 = { + "y": 500, + "state": "fire" + } + player1 = { + "x": 370, + "y": 523 + } + player2 = { + "x": -100, + "y": 100 + } + + event1 = pygame.event.Event(pygame.QUIT) + event2 = pygame.event.Event(pygame.KEYDOWN, key=pygame.K_LEFT) + event3 = pygame.event.Event(pygame.KEYDOWN, key=pygame.K_SPACE) + event4 = pygame.event.Event(pygame.KEYDOWN, key=pygame.K_RIGHT) + event5 = pygame.event.Event(pygame.KEYDOWN, key=pygame.K_UP) + bullet1_return, player1_return, running = event_action( + event1, + bullet1, + player1 + ) + assert bullet1_return == bullet1 and player1_return == player1 + assert not running + bullet1_return, player1_return, running = event_action( + event2, + bullet1, + player1 + ) + assert bullet1_return == bullet1 + assert player1_return["x"] == 370 - 1.7 + assert running + with pytest.raises(NameError): + event_action(event3, bullet1, player1) + + bullet2_return, player2_return, running = event_action( + event4, + bullet2, + player2 + ) + assert bullet2_return == bullet2 + assert player2_return["x"] == -100 + 1.7 + assert running + bullet2_return, player2_return, running = event_action( + event5, + bullet2, + player2 + ) + assert bullet2_return == bullet2 and player2_return == player2 + assert running diff --git a/tests/test_reset_player_X.py b/tests/test_reset_player_X.py index 7b9c30d..dcd13db 100644 --- a/tests/test_reset_player_X.py +++ b/tests/test_reset_player_X.py @@ -1,7 +1,6 @@ from game import reset_player_X - def test_reset_player_X(): assert reset_player_X(0) == 16 From 010d50477a28cb325518f3c46d65ac0b289ea23c Mon Sep 17 00:00:00 2001 From: ulad Date: Wed, 2 Nov 2022 23:46:40 +0800 Subject: [PATCH 10/15] merge --- game.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/game.py b/game.py index 19ef947..76cda8c 100644 --- a/game.py +++ b/game.py @@ -244,12 +244,12 @@ def update_score_and_invaders(score, bullet, invader): - ''' - Test for the iscollision function: +# ''' +# Test for the iscollision function: - def test(num : int, msg : str, func_out, exp_out) : -    if func_out == exp_out : -        print(f"+ TEST [{num}] PASSED") -    else : -        print(f"- TEST [{num}] FAILED; {msg}") - ''' +# def test(num : int, msg : str, func_out, exp_out) : +#     if func_out == exp_out : +#         print(f"+ TEST [{num}] PASSED") +#     else : +#         print(f"- TEST [{num}] FAILED; {msg}") +# ''' From 8eebd71c4da5c637a9a465ebaf53512024256721 Mon Sep 17 00:00:00 2001 From: ulad Date: Thu, 3 Nov 2022 00:32:24 +0800 Subject: [PATCH 11/15] documented functions --- game.py | 53 +++++++++++++++++++++++++++++++++-- tests/test_bullet_movement.py | 4 +++ 2 files changed, 54 insertions(+), 3 deletions(-) diff --git a/game.py b/game.py index 76cda8c..cf121db 100644 --- a/game.py +++ b/game.py @@ -1,3 +1,4 @@ +from multiprocessing import Event import pygame import random import math @@ -16,7 +17,18 @@ def game_over_display(): screen.blit(game_over_text, (190, 250)) -def reset_player_X(player_X): +def reset_player_X(player_X: float) -> float: + """ + Resets the x-coordinates of the player if outside the screen + + Parameters: + ---- + player_X : Current x-coordinate + + Return: + ---- + player_X : Updated x-coordinate + """ if player_X <= 16: player_X = 16 elif player_X >= 750: @@ -51,7 +63,31 @@ def show_bullet(bullet): return bullet -def event_action(event, bullet, player): +def event_action(event: object, + bullet: dict[str, float], + player: dict[str, float]) -> \ + tuple[dict[str, float], dict[str, float], bool]: + """ + Given an event (key), updates the player and bullet dictionary + + Parameters: + ---- + event : pygame.event.Event(), a representation of a key. + + bullet : bullet associated data dictionary + + player : player associated data dictionary + + Return: + ---- + tuple(bullet, player, running) + + bullet : bullet associated data dictionary + + player : player associated data dictionary + + running : indicator whether to keep running the loop + """ running = True if event.type == pygame.QUIT: running = False @@ -88,7 +124,18 @@ def update_invaders_x(invaders): return invaders -def bullet_movement(bullet): +def bullet_movement(bullet: dict[str, float]) -> dict[str, float]: + """ + Given an event (key), updates the player and bullet dictionary + + Parameters: + ---- + bullet : bullet associated data dictionary + + Return: + ---- + bullet : bullet associated data dictionary + """ if bullet["y"] <= 0: bullet["y"] = 600 bullet["state"] = "rest" diff --git a/tests/test_bullet_movement.py b/tests/test_bullet_movement.py index b82f18f..aa07604 100644 --- a/tests/test_bullet_movement.py +++ b/tests/test_bullet_movement.py @@ -5,11 +5,13 @@ def test_bullet_movement(): bullet1 = { + "x": 45, "y": 0, "state": "rest" } bullet2 = { "y": 500, + "x_change": 1.2, "state": "rest" } bullet3 = { @@ -21,8 +23,10 @@ def test_bullet_movement(): "state": "fire" } assert bullet_movement(bullet1)["y"] == 600 + assert bullet_movement(bullet1)["x"] == 45 assert bullet_movement(bullet1)["state"] == "rest" assert bullet_movement(bullet2)["y"] == 500 + assert bullet_movement(bullet2)["x_change"] == 1.2 assert bullet_movement(bullet2)["state"] == "rest" assert bullet_movement(bullet3)["y"] == 600 assert bullet_movement(bullet3)["state"] == "rest" From 84a8da6e30889ed79502cd78692ac175c46aebae Mon Sep 17 00:00:00 2001 From: Divyam Date: Thu, 3 Nov 2022 03:56:03 +0800 Subject: [PATCH 12/15] Adding test files for fix_bullet and game_over functions --- tests/test_fix_bullet_direction.py | 28 +++++++++++++++++++++++++++- tests/test_game_over.py | 30 +++++++++++++++++++++++++++++- 2 files changed, 56 insertions(+), 2 deletions(-) diff --git a/tests/test_fix_bullet_direction.py b/tests/test_fix_bullet_direction.py index 4cf4ed2..41b24e6 100644 --- a/tests/test_fix_bullet_direction.py +++ b/tests/test_fix_bullet_direction.py @@ -1 +1,27 @@ -#divi \ No newline at end of file +import pytest +from game import fix_bullet_direction + + +def test_fix_bullet_direction(): + bullet1 = { + "x": 45, + "y": 0, + "state": "rest" + } + bullet2 = { + "y": 500, + "x": 0, + "state": "fire" + } + player_one = { + "x": 120, + "state": "rest" + } + player_two = { + "x": 130 , + "state": "rest" + } + assert fix_bullet_direction(bullet1, player_one)["x"] == 120 + assert fix_bullet_direction(bullet2, player_two)["x"] != 130 + + \ No newline at end of file diff --git a/tests/test_game_over.py b/tests/test_game_over.py index 4cf4ed2..99b8d9c 100644 --- a/tests/test_game_over.py +++ b/tests/test_game_over.py @@ -1 +1,29 @@ -#divi \ No newline at end of file +import pytest + +from game import game_over, remove_invaders + +def test_game_over(): + player = { + "x": 150, + "y": 523 + } + new_invader = { + "x": 100, + "y": 500 + } + invaders = [] + no_of_invaders = 8 + for num in range(no_of_invaders): + invader = { + "x": 100, + "y": 500, + "x_change": 1.2, + "y_change": 50 + } + invaders.append(invader) + game_object = game_over(invaders, new_invader, player) + + for invader in game_object[0]: + assert invader["y"] == 2000 + assert game_object[1]["y"] == 500 + assert game_object[2] == True From d355a569d0b580671bffc8f2115a5381c7cb2fb2 Mon Sep 17 00:00:00 2001 From: DivyamAgarwal01 <77577932+DivyamAgarwal01@users.noreply.github.com> Date: Thu, 3 Nov 2022 04:45:25 +0000 Subject: [PATCH 13/15] Update game.py --- game.py | 38 +++++++++++++++++++++++++++++++------- 1 file changed, 31 insertions(+), 7 deletions(-) diff --git a/game.py b/game.py index cf121db..21c11d1 100644 --- a/game.py +++ b/game.py @@ -11,8 +11,20 @@ def show_score(score, x, y): score_text = font.render("Points: " + str(score), True, (255, 255, 255)) screen.blit(score_text, (x, y)) - + def game_over_display(): + """ + Display game-over when the player has lesser than or equal to an 80 point difference from the invader and the invader is above 450 points. + + Parameters: + ---- + N.A + + Display: + ---- + "GAME OVER" in defined font and at approriate position + + """ game_over_text = game_over_font.render("GAME OVER", True, (255, 255, 255)) screen.blit(game_over_text, (190, 250)) @@ -35,12 +47,7 @@ def reset_player_X(player_X: float) -> float: player_X = 750 return player_X -''' -- x1, x2, y1, y2 are of the type 'float' and the function returns a boolean output. -- The function 1) calculates the Eucledian distance between the bullet and the object - 2) checks if the eucledian distance is less than 50 - 3) Returns true or false acorrdingly -''' + def isCollision(x1, x2, y1, y2): distance = math.sqrt((math.pow(x1 - x2, 2)) + (math.pow(y1 - y2, 2))) if distance <= 50: @@ -106,6 +113,23 @@ def event_action(event: object, def fix_bullet_direction(bullet, player): + """ + Given the x coordinate of the player (value), shoots the bullet from that position + + Parameters: + ---- + event : pygame.event.Event(), a representation of a key. + + bullet : bullet associated data dictionary + + player : player associated data dictionary + + Return: + ---- + + bullet : bullet associated data dictionary + + """ if bullet["state"] == "rest": bullet["x"] = player["x"] bullet = show_bullet(bullet) From 505b046f41f25c8ceb916a9aa06e5ea79004306a Mon Sep 17 00:00:00 2001 From: Divyam Date: Thu, 3 Nov 2022 13:45:42 +0800 Subject: [PATCH 14/15] s --- game.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/game.py b/game.py index cf121db..c1bcc56 100644 --- a/game.py +++ b/game.py @@ -4,6 +4,18 @@ import math from pygame import mixer +pygame.init() +screen_width = 800 +screen_height = 600 +screen = pygame.display.set_mode((screen_width, screen_height)) + +bulletImage = pygame.image.load('data/bullet.png') + +mixer.init() +mixer.music.load('data/background.wav') +mixer.music.play(-1) +game_over_font = pygame.font.Font('freesansbold.ttf', 64) + # FUNCTIONS # @@ -95,9 +107,9 @@ def event_action(event: object, # Controling the player movement from the arrow keys if event.type == pygame.KEYDOWN: if event.key == pygame.K_LEFT: - player["x"] -= 1.7 + player["x"] -= 5 if event.key == pygame.K_RIGHT: - player["x"] += 1.7 + player["x"] += 5 if event.key == pygame.K_SPACE: # Fixing the change of direction of bullet bullet = fix_bullet_direction(bullet, player) From 036398b1b470657cccd59f61006e74a4c210f5c2 Mon Sep 17 00:00:00 2001 From: ulad Date: Thu, 3 Nov 2022 19:41:00 +0800 Subject: [PATCH 15/15] m --- tests/test_show_player.py | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 tests/test_show_player.py diff --git a/tests/test_show_player.py b/tests/test_show_player.py new file mode 100644 index 0000000..3c9123d --- /dev/null +++ b/tests/test_show_player.py @@ -0,0 +1,10 @@ +import pygame +from game import show_player + +def test_show_player(): + player = { + "x": 370, + "y": 523 + } + assert show_player(player) == None +