From e3f3a2239dd34f6bda7ccc6fe47ca4464ca69288 Mon Sep 17 00:00:00 2001 From: Julien Mattiussi Date: Fri, 8 Jun 2018 11:36:39 +0200 Subject: [PATCH 01/11] Players can choose name and they can replay a party --- src/game/game.py | 33 ++++++++++++++++++++++----------- src/game/state.py | 6 +++--- src/game/tests/test_players.py | 3 ++- src/game/tools.py | 8 ++++++++ src/game/ui.py | 23 ++++++++++++++++++++--- 5 files changed, 55 insertions(+), 18 deletions(-) diff --git a/src/game/game.py b/src/game/game.py index 7d4a1a0..31ea553 100644 --- a/src/game/game.py +++ b/src/game/game.py @@ -5,7 +5,7 @@ from .piece import Piece from .turn import Turn from .state import State -from .tools import GRID_SIZE, PIECES_NUMBER +from .tools import GRID_SIZE, PIECES_NUMBER, Players from .ui import UIRender @@ -15,6 +15,11 @@ class Game: def start(self): game_state = State() + ui = UIRender() + + ui.clear_terminal() + Players.player1_name = ui.prompt_player_name(1, Players.player1_name) + Players.player2_name = ui.prompt_player_name(2, Players.player2_name) initial_state = "" try: @@ -28,18 +33,24 @@ def start(self): if (len(game_state.message) > 0): game_state.message += """\nValid sample : --state='{"grid" : {"A2": 10,"C1":3,"D1":12},"turn" :{"player" : 1,"selected" : 7}}'""" - ui = UIRender() - while not game_state.check_draw(): - if game_state.check_winner(): - break - ui.display_game(game_state) - if not game_state.is_selected_piece(): - ui.prompt_piece_selection(game_state) - game_state.switch_player() + replay = True + while replay: + + while not game_state.check_draw(): + if game_state.check_winner(): + break ui.display_game(game_state) - ui.prompt_piece_location(game_state) + if not game_state.is_selected_piece(): + ui.prompt_piece_selection(game_state) + game_state.switch_player() + ui.display_game(game_state) + ui.prompt_piece_location(game_state) + + ui.display_game(game_state) + replay = ui.prompt_restart() - ui.display_game(game_state) + if replay: + game_state = State() def parse_state_from_args(self, argv): if 'quarto.py' in argv[0]: diff --git a/src/game/state.py b/src/game/state.py index 9c9624b..3503841 100644 --- a/src/game/state.py +++ b/src/game/state.py @@ -1,6 +1,6 @@ from .turn import Turn from .piece import Piece -from .tools import GRID_SIZE, PIECES_NUMBER, EMPTY_POSITION, get_coordinates +from .tools import GRID_SIZE, PIECES_NUMBER, EMPTY_POSITION, get_coordinates, Players class State: @@ -69,9 +69,9 @@ def switch_player(self): def check_winner(self): if self.check_raws_winning() or self.check_columns_winning() or self.check_diags_winning(): if self.game_turn.player_one_active: - player_name = "Player 1" + player_name = Players.player1_name else: - player_name = "Player 2" + player_name = Players.player2_name self.message = player_name + " WINNNNS !!!!!!\n" return True return False diff --git a/src/game/tests/test_players.py b/src/game/tests/test_players.py index 9f36cfd..6b78d64 100644 --- a/src/game/tests/test_players.py +++ b/src/game/tests/test_players.py @@ -1,6 +1,7 @@ import unittest from ..turn import Turn from ..ui import UIRender +from ..tools import Players class TestPlayersMethods(unittest.TestCase): @@ -16,7 +17,7 @@ def test_init_game_turn_should_start_without_selected_piece(self): def test_players_to_string_should_create_the_reference_string(self): game_turn = Turn() players_display = UIRender().players_to_string(game_turn) - reference_string = "=> Player 1 <= Player 2 " + reference_string = "=> " + Players.player1_name + " <= " + Players.player2_name + " " self.assertEqual(players_display, reference_string) diff --git a/src/game/tools.py b/src/game/tools.py index 8a50306..a22363f 100644 --- a/src/game/tools.py +++ b/src/game/tools.py @@ -3,6 +3,14 @@ EMPTY_POSITION = '.' +class Players: + + """Definition of the users names:""" + + player1_name = "Sasha" + player2_name = "Regis" + + def get_coordinates(position): """Convert a postion of format 'A3' into coordinates x= 0 and y = 2 in the grid""" if len(position) != 2: diff --git a/src/game/ui.py b/src/game/ui.py index b45c500..98f3b32 100644 --- a/src/game/ui.py +++ b/src/game/ui.py @@ -6,7 +6,7 @@ from .piece import pieces_list_definition from .turn import Turn from .state import State -from .tools import GRID_SIZE, PIECES_NUMBER +from .tools import GRID_SIZE, PIECES_NUMBER, Players class UIRender: @@ -40,6 +40,23 @@ def prompt_piece_location(self, game_state): print("\nGame aborted") exit() + def prompt_player_name(self, player_id, default_name): + try: + name = input("Player " + str(player_id) + ", what is your name (" + default_name + " if empty) ? ") + if len(name) > 0: + return name + return default_name + except KeyboardInterrupt: + print("\nGame aborted") + exit() + + def prompt_restart(self): + try: + return input("Let's play another party ? (o/n) ") == 'o' + except KeyboardInterrupt: + print("\nGame aborted") + exit() + def piece_to_string(self, piece_id): piece_display = str(piece_id) pieces = list(filter(lambda x: x.id == piece_id, pieces_list_definition)) @@ -111,8 +128,8 @@ def selected_piece_to_string(self, piece_number, game_turn): return " " + str(piece_number) + " " def players_to_string(self, game_turn): - player_1 = self.selected_player_to_string('Player 1', game_turn.player_one_active) - player_2 = self.selected_player_to_string('Player 2', not game_turn.player_one_active) + player_1 = self.selected_player_to_string(Players.player1_name, game_turn.player_one_active) + player_2 = self.selected_player_to_string(Players.player2_name, not game_turn.player_one_active) return player_1 + " " + player_2 def selected_player_to_string(self, player_name, selected): From cc6cd9c8da724ee4ab03f660ef83ac3da90c956c Mon Sep 17 00:00:00 2001 From: Julien Mattiussi Date: Fri, 8 Jun 2018 11:49:50 +0200 Subject: [PATCH 02/11] Graphic adjustment --- src/game/tools.py | 4 ++-- src/game/ui.py | 5 +---- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/game/tools.py b/src/game/tools.py index a22363f..9f1e97f 100644 --- a/src/game/tools.py +++ b/src/game/tools.py @@ -7,8 +7,8 @@ class Players: """Definition of the users names:""" - player1_name = "Sasha" - player2_name = "Regis" + player1_name = "Player 1" + player2_name = "Player 2" def get_coordinates(position): diff --git a/src/game/ui.py b/src/game/ui.py index 98f3b32..247c49b 100644 --- a/src/game/ui.py +++ b/src/game/ui.py @@ -79,8 +79,6 @@ def piece_to_string(self, piece_id): if pieces[0].light_color: piece_display = "\033[47m" + piece_display - else: - piece_display = "\033[100m" + piece_display return ' ' + piece_display + " \033[0m" @@ -108,7 +106,6 @@ def pieces_to_string(self, remaining_pieces, game_turn): if piece_id >= 10: display_string += ' ' display_string += ' . ' - display_string += ' ' display_string += '\n' for piece_id in range(1, PIECES_NUMBER + 1): @@ -119,7 +116,7 @@ def pieces_to_string(self, remaining_pieces, game_turn): if piece_id >= 10: display_string += ' ' display_string += ' ' - display_string += ' ' + display_string += ' ' return display_string def selected_piece_to_string(self, piece_number, game_turn): From bb3ecfff44d110cff1c2db2f7039533731f81679 Mon Sep 17 00:00:00 2001 From: Julien Mattiussi Date: Fri, 8 Jun 2018 12:02:30 +0200 Subject: [PATCH 03/11] Review for players name --- src/game/game.py | 15 ++++++++------- src/game/tests/test_players.py | 5 +++-- src/game/tools.py | 6 ++++++ src/game/ui.py | 20 ++++++++++---------- 4 files changed, 27 insertions(+), 19 deletions(-) diff --git a/src/game/game.py b/src/game/game.py index 31ea553..57e50c3 100644 --- a/src/game/game.py +++ b/src/game/game.py @@ -16,10 +16,11 @@ class Game: def start(self): game_state = State() ui = UIRender() + players = Players() ui.clear_terminal() - Players.player1_name = ui.prompt_player_name(1, Players.player1_name) - Players.player2_name = ui.prompt_player_name(2, Players.player2_name) + players.change_player_name(1, ui.prompt_player_name(1, players.player1_name)) + players.change_player_name(2, ui.prompt_player_name(2, players.player2_name)) initial_state = "" try: @@ -39,14 +40,14 @@ def start(self): while not game_state.check_draw(): if game_state.check_winner(): break - ui.display_game(game_state) + ui.display_game(game_state, players) if not game_state.is_selected_piece(): - ui.prompt_piece_selection(game_state) + ui.prompt_piece_selection(game_state, players) game_state.switch_player() - ui.display_game(game_state) - ui.prompt_piece_location(game_state) + ui.display_game(game_state, players) + ui.prompt_piece_location(game_state, players) - ui.display_game(game_state) + ui.display_game(game_state, players) replay = ui.prompt_restart() if replay: diff --git a/src/game/tests/test_players.py b/src/game/tests/test_players.py index 6b78d64..f88b9fb 100644 --- a/src/game/tests/test_players.py +++ b/src/game/tests/test_players.py @@ -16,8 +16,9 @@ def test_init_game_turn_should_start_without_selected_piece(self): def test_players_to_string_should_create_the_reference_string(self): game_turn = Turn() - players_display = UIRender().players_to_string(game_turn) - reference_string = "=> " + Players.player1_name + " <= " + Players.player2_name + " " + players = Players() + players_display = UIRender().players_to_string(game_turn, players) + reference_string = "=> " + players.player1_name + " <= " + players.player2_name + " " self.assertEqual(players_display, reference_string) diff --git a/src/game/tools.py b/src/game/tools.py index 9f1e97f..890bb3c 100644 --- a/src/game/tools.py +++ b/src/game/tools.py @@ -10,6 +10,12 @@ class Players: player1_name = "Player 1" player2_name = "Player 2" + def change_player_name(self, player_id, player_name): + if player_id == 1: + self.player1_name = player_name + if player_id == 2: + self.player2_name = player_name + def get_coordinates(position): """Convert a postion of format 'A3' into coordinates x= 0 and y = 2 in the grid""" diff --git a/src/game/ui.py b/src/game/ui.py index 247c49b..faffbe5 100644 --- a/src/game/ui.py +++ b/src/game/ui.py @@ -6,14 +6,14 @@ from .piece import pieces_list_definition from .turn import Turn from .state import State -from .tools import GRID_SIZE, PIECES_NUMBER, Players +from .tools import GRID_SIZE, PIECES_NUMBER class UIRender: """Definition of the user interface and the interactions:""" - def prompt_piece_selection(self, game_state): + def prompt_piece_selection(self, game_state, players): while True: try: piece = int(input("Choose the next piece of the opponent : ")) @@ -22,12 +22,12 @@ def prompt_piece_selection(self, game_state): game_state.message = "You must choose a number available in the list" except ValueError: game_state.message = "You have to type number between 1 and " + str(PIECES_NUMBER) - self.display_game(game_state) + self.display_game(game_state, players) except KeyboardInterrupt: print("\nGame aborted") exit() - def prompt_piece_location(self, game_state): + def prompt_piece_location(self, game_state, players): while True: try: position = input("Choose the position to place your piece : ") @@ -35,7 +35,7 @@ def prompt_piece_location(self, game_state): return except ValueError: game_state.message = "You have to type a free coordinate using this format : 'A1'" - self.display_game(game_state) + self.display_game(game_state, players) except KeyboardInterrupt: print("\nGame aborted") exit() @@ -124,9 +124,9 @@ def selected_piece_to_string(self, piece_number, game_turn): return "[" + str(piece_number) + "]" return " " + str(piece_number) + " " - def players_to_string(self, game_turn): - player_1 = self.selected_player_to_string(Players.player1_name, game_turn.player_one_active) - player_2 = self.selected_player_to_string(Players.player2_name, not game_turn.player_one_active) + def players_to_string(self, game_turn, players): + player_1 = self.selected_player_to_string(players.player1_name, game_turn.player_one_active) + player_2 = self.selected_player_to_string(players.player2_name, not game_turn.player_one_active) return player_1 + " " + player_2 def selected_player_to_string(self, player_name, selected): @@ -137,7 +137,7 @@ def selected_player_to_string(self, player_name, selected): def clear_terminal(self): subprocess.call(["printf", "'\033c'"]) - def display_game(self, game_state): + def display_game(self, game_state, players): self.clear_terminal() print() print("\033[32;1mWelcome to Quarto-Py\033[0m") @@ -145,7 +145,7 @@ def display_game(self, game_state): print() print(self.grid_to_string(game_state.grid)) print() - print(self.players_to_string(game_state.game_turn)) + print(self.players_to_string(game_state.game_turn, players)) print() print(self.pieces_to_string(game_state.remaining_pieces, game_state.game_turn)) print() From bd316891cdd8bd9c3f3e251f2bf8b3043232308f Mon Sep 17 00:00:00 2001 From: Julien Mattiussi Date: Fri, 8 Jun 2018 12:04:19 +0200 Subject: [PATCH 04/11] Review for ending message --- src/game/ui.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/game/ui.py b/src/game/ui.py index faffbe5..49b7b64 100644 --- a/src/game/ui.py +++ b/src/game/ui.py @@ -52,7 +52,7 @@ def prompt_player_name(self, player_id, default_name): def prompt_restart(self): try: - return input("Let's play another party ? (o/n) ") == 'o' + return input("Let's play again ? (o/n) ") == 'o' except KeyboardInterrupt: print("\nGame aborted") exit() From 1cd649663c61e5bbcfddb8d11e0f9c93d2ac4508 Mon Sep 17 00:00:00 2001 From: Julien Mattiussi Date: Fri, 8 Jun 2018 12:09:41 +0200 Subject: [PATCH 05/11] Review for player names creation --- src/game/tools.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/game/tools.py b/src/game/tools.py index 890bb3c..a8bebb6 100644 --- a/src/game/tools.py +++ b/src/game/tools.py @@ -7,8 +7,9 @@ class Players: """Definition of the users names:""" - player1_name = "Player 1" - player2_name = "Player 2" + def __init__(self, initial_state=""): + self.player1_name = "Player 1" + self.player2_name = "Player 2" def change_player_name(self, player_id, player_name): if player_id == 1: From c7ec3e3f9401412ce5b8c017fe12b34a03c931ec Mon Sep 17 00:00:00 2001 From: Julien Mattiussi Date: Fri, 8 Jun 2018 12:14:36 +0200 Subject: [PATCH 06/11] Fix for winner name --- src/game/game.py | 2 +- src/game/state.py | 6 +++--- src/game/tests/test_grid.py | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/game/game.py b/src/game/game.py index 57e50c3..c028229 100644 --- a/src/game/game.py +++ b/src/game/game.py @@ -38,7 +38,7 @@ def start(self): while replay: while not game_state.check_draw(): - if game_state.check_winner(): + if game_state.check_winner(players): break ui.display_game(game_state, players) if not game_state.is_selected_piece(): diff --git a/src/game/state.py b/src/game/state.py index 3503841..09c76b5 100644 --- a/src/game/state.py +++ b/src/game/state.py @@ -66,12 +66,12 @@ def check_position_availability(self, x, y): def switch_player(self): self.game_turn.player_one_active = not self.game_turn.player_one_active - def check_winner(self): + def check_winner(self, players): if self.check_raws_winning() or self.check_columns_winning() or self.check_diags_winning(): if self.game_turn.player_one_active: - player_name = Players.player1_name + player_name = players.player1_name else: - player_name = Players.player2_name + player_name = players.player2_name self.message = player_name + " WINNNNS !!!!!!\n" return True return False diff --git a/src/game/tests/test_grid.py b/src/game/tests/test_grid.py index 39ed680..1856e69 100644 --- a/src/game/tests/test_grid.py +++ b/src/game/tests/test_grid.py @@ -1,6 +1,6 @@ import unittest from ..state import State -from ..tools import GRID_SIZE, EMPTY_POSITION +from ..tools import GRID_SIZE, EMPTY_POSITION, Players from ..game import Game from ..ui import UIRender from ..piece import Piece @@ -131,7 +131,7 @@ def test_win_on_grid(self): "D4":4},"turn" :{"player" : 1}}"""] initial_state = Game().parse_state_from_args(arg) game_state.import_state_from_dictionary(initial_state) - self.assertTrue(game_state.check_winner()) + self.assertTrue(game_state.check_winner(Players())) def test_place_piece_is_placed_at_good_position(self): game_state = State() From 158b658c8765f7ab58d1ba6feb74ee1352dd3a2d Mon Sep 17 00:00:00 2001 From: Julien Mattiussi Date: Fri, 8 Jun 2018 12:17:31 +0200 Subject: [PATCH 07/11] Display winner score --- src/game/state.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/game/state.py b/src/game/state.py index 09c76b5..b4d0760 100644 --- a/src/game/state.py +++ b/src/game/state.py @@ -72,7 +72,7 @@ def check_winner(self, players): player_name = players.player1_name else: player_name = players.player2_name - self.message = player_name + " WINNNNS !!!!!!\n" + self.message = player_name + " WINNNNS !!!!!! (with a score of " + str(len(self.remaining_pieces)) + ")\n" return True return False From f1df8134a3ace9e02ac8033d93fe743f0d83e264 Mon Sep 17 00:00:00 2001 From: Julien Mattiussi Date: Fri, 8 Jun 2018 13:28:26 +0200 Subject: [PATCH 08/11] Module refctoring for plyers --- src/game/game.py | 3 ++- src/game/players.py | 14 ++++++++++++++ src/game/state.py | 3 ++- src/game/tests/test_players.py | 2 +- src/game/tools.py | 15 --------------- src/game/ui.py | 4 ++-- 6 files changed, 21 insertions(+), 20 deletions(-) create mode 100644 src/game/players.py diff --git a/src/game/game.py b/src/game/game.py index c028229..ef4a35e 100644 --- a/src/game/game.py +++ b/src/game/game.py @@ -5,7 +5,8 @@ from .piece import Piece from .turn import Turn from .state import State -from .tools import GRID_SIZE, PIECES_NUMBER, Players +from .tools import GRID_SIZE, PIECES_NUMBER +from .players import Players from .ui import UIRender diff --git a/src/game/players.py b/src/game/players.py new file mode 100644 index 0000000..ba46058 --- /dev/null +++ b/src/game/players.py @@ -0,0 +1,14 @@ +class Players: + + """Definition of the users names:""" + + def __init__(self, initial_state=""): + self.player1_name = "Player 1" + self.player2_name = "Player 2" + + def change_player_name(self, player_id, player_name): + if player_id == 1: + self.player1_name = player_name + if player_id == 2: + self.player2_name = player_name + diff --git a/src/game/state.py b/src/game/state.py index b4d0760..6acf065 100644 --- a/src/game/state.py +++ b/src/game/state.py @@ -1,6 +1,7 @@ from .turn import Turn from .piece import Piece -from .tools import GRID_SIZE, PIECES_NUMBER, EMPTY_POSITION, get_coordinates, Players +from .tools import GRID_SIZE, PIECES_NUMBER, EMPTY_POSITION, get_coordinates +from .players import Players class State: diff --git a/src/game/tests/test_players.py b/src/game/tests/test_players.py index f88b9fb..72cce52 100644 --- a/src/game/tests/test_players.py +++ b/src/game/tests/test_players.py @@ -1,7 +1,7 @@ import unittest from ..turn import Turn from ..ui import UIRender -from ..tools import Players +from ..players import Players class TestPlayersMethods(unittest.TestCase): diff --git a/src/game/tools.py b/src/game/tools.py index a8bebb6..8a50306 100644 --- a/src/game/tools.py +++ b/src/game/tools.py @@ -3,21 +3,6 @@ EMPTY_POSITION = '.' -class Players: - - """Definition of the users names:""" - - def __init__(self, initial_state=""): - self.player1_name = "Player 1" - self.player2_name = "Player 2" - - def change_player_name(self, player_id, player_name): - if player_id == 1: - self.player1_name = player_name - if player_id == 2: - self.player2_name = player_name - - def get_coordinates(position): """Convert a postion of format 'A3' into coordinates x= 0 and y = 2 in the grid""" if len(position) != 2: diff --git a/src/game/ui.py b/src/game/ui.py index 49b7b64..6cfcd51 100644 --- a/src/game/ui.py +++ b/src/game/ui.py @@ -42,7 +42,7 @@ def prompt_piece_location(self, game_state, players): def prompt_player_name(self, player_id, default_name): try: - name = input("Player " + str(player_id) + ", what is your name (" + default_name + " if empty) ? ") + name = input("Player " + str(player_id) + ", what is your name (" + default_name + " if empty) ? ").strip() if len(name) > 0: return name return default_name @@ -52,7 +52,7 @@ def prompt_player_name(self, player_id, default_name): def prompt_restart(self): try: - return input("Let's play again ? (o/n) ") == 'o' + return input("Let's play again ? (y/n) ") == 'y' except KeyboardInterrupt: print("\nGame aborted") exit() From dc53721c4a1baea675eb20a0712c874089f343e6 Mon Sep 17 00:00:00 2001 From: Julien Mattiussi Date: Fri, 8 Jun 2018 13:35:06 +0200 Subject: [PATCH 09/11] fix tests and lint --- src/game/players.py | 3 +-- src/game/tests/test_grid.py | 3 ++- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/game/players.py b/src/game/players.py index ba46058..67a195c 100644 --- a/src/game/players.py +++ b/src/game/players.py @@ -1,5 +1,5 @@ class Players: - + """Definition of the users names:""" def __init__(self, initial_state=""): @@ -11,4 +11,3 @@ def change_player_name(self, player_id, player_name): self.player1_name = player_name if player_id == 2: self.player2_name = player_name - diff --git a/src/game/tests/test_grid.py b/src/game/tests/test_grid.py index 1856e69..52cc419 100644 --- a/src/game/tests/test_grid.py +++ b/src/game/tests/test_grid.py @@ -1,6 +1,7 @@ import unittest from ..state import State -from ..tools import GRID_SIZE, EMPTY_POSITION, Players +from ..tools import GRID_SIZE, EMPTY_POSITION +from ..players import Players from ..game import Game from ..ui import UIRender from ..piece import Piece From 3686bc09f897ca5d8c0f65aedbd4bcf3385c590b Mon Sep 17 00:00:00 2001 From: Julien Mattiussi Date: Thu, 14 Jun 2018 11:29:26 +0200 Subject: [PATCH 10/11] Add singleiplayer mode (basic for now) --- src/game/game.py | 65 ++++++++++++++++++++++++++++++++++++++------- src/game/network.py | 26 ++++++++++++++++++ src/game/ui.py | 11 ++++++++ 3 files changed, 92 insertions(+), 10 deletions(-) create mode 100644 src/game/network.py diff --git a/src/game/game.py b/src/game/game.py index ef4a35e..cdb3390 100644 --- a/src/game/game.py +++ b/src/game/game.py @@ -8,6 +8,7 @@ from .tools import GRID_SIZE, PIECES_NUMBER from .players import Players from .ui import UIRender +from .network import call_api class Game: @@ -20,8 +21,16 @@ def start(self): players = Players() ui.clear_terminal() - players.change_player_name(1, ui.prompt_player_name(1, players.player1_name)) - players.change_player_name(2, ui.prompt_player_name(2, players.player2_name)) + players_count = ui.prompt_playing_mode() + if players_count == 1 : + players.change_player_name(1, ui.prompt_player_name(1, players.player1_name)) + players.change_player_name(2, "Computer") + elif players_count == 0 : + players.change_player_name(1, "Computer 1") + players.change_player_name(2, "Computer 2") + elif players_count == 2 : + players.change_player_name(1, ui.prompt_player_name(1, players.player1_name)) + players.change_player_name(2, ui.prompt_player_name(2, players.player2_name)) initial_state = "" try: @@ -37,16 +46,48 @@ def start(self): replay = True while replay: - - while not game_state.check_draw(): - if game_state.check_winner(players): - break - ui.display_game(game_state, players) - if not game_state.is_selected_piece(): - ui.prompt_piece_selection(game_state, players) + if players_count == 0: + game_state.game_turn.selected_piece = 1 + while not game_state.check_draw(): + ui.display_game(game_state, players) + + if call_api(game_state) == False: + game_state.message += "Error, server didn't respond : Game end" + break game_state.switch_player() + if game_state.check_winner(players): + break + elif players_count == 1: + while not game_state.check_draw(): + if game_state.check_winner(players): + break ui.display_game(game_state, players) - ui.prompt_piece_location(game_state, players) + if not game_state.is_selected_piece(): + if not self.is_computer_turn(players_count, game_state): + ui.prompt_piece_selection(game_state, players) + game_state.switch_player() + ui.display_game(game_state, players) + elif self.is_computer_turn(players_count, game_state): + game_state.switch_player() + ui.display_game(game_state, players) + if self.is_computer_turn(players_count, game_state): + if call_api(game_state) == False: + game_state.message += "Error, server didn't respond : Game end" + break + if game_state.check_winner(players): + break + else: + ui.prompt_piece_location(game_state, players) + elif players_count == 2: + while not game_state.check_draw(): + if game_state.check_winner(players): + break + ui.display_game(game_state, players) + if not game_state.is_selected_piece(): + ui.prompt_piece_selection(game_state, players) + game_state.switch_player() + ui.display_game(game_state, players) + ui.prompt_piece_location(game_state, players) ui.display_game(game_state, players) replay = ui.prompt_restart() @@ -67,3 +108,7 @@ def parse_state_from_args(self, argv): raise ValueError("[The state to load is not wellformed] : Ignored") return parameter + + def is_computer_turn(self, players_count, game_state): + return players_count == 0 \ + or (players_count == 1 and not game_state.game_turn.player_one_active) diff --git a/src/game/network.py b/src/game/network.py new file mode 100644 index 0000000..fb390f4 --- /dev/null +++ b/src/game/network.py @@ -0,0 +1,26 @@ +import requests +import json +from .state import State + + + + +def call_api(state): + print("call_api") + + url = 'http://localhost:8080/suggestMove' + post_fields = "{\"Grid\":" + str(state.grid).replace(".","0") .replace("'","") + ", \"Piece\":" + str(state.game_turn.selected_piece) + "}" + + try: + r = requests.post(url, data=post_fields) + if r.status_code == 200: + new_computer_state = json.loads(r.text) + computer_piece = state.game_turn.selected_piece + state.grid[new_computer_state["Move"][0]][new_computer_state["Move"][1]] = computer_piece + state.remaining_pieces.remove(computer_piece) + state.game_turn.selected_piece = new_computer_state["Piece"] + return True + except (TypeError, ValueError, UnboundLocalError): + return False + return False + diff --git a/src/game/ui.py b/src/game/ui.py index 6cfcd51..dae1a1c 100644 --- a/src/game/ui.py +++ b/src/game/ui.py @@ -57,6 +57,17 @@ def prompt_restart(self): print("\nGame aborted") exit() + def prompt_playing_mode(self): + + try: + players_count = input("How many players : (0, 1 or 2, default is 1) ") + if players_count in ['0','1','2']: + return int(players_count) + return 1 + except KeyboardInterrupt: + print("\nGame aborted") + exit() + def piece_to_string(self, piece_id): piece_display = str(piece_id) pieces = list(filter(lambda x: x.id == piece_id, pieces_list_definition)) From 8354051306a437a006fff24926d039c9b568c9e4 Mon Sep 17 00:00:00 2001 From: JulienM Date: Thu, 5 Jul 2018 16:38:24 +0200 Subject: [PATCH 11/11] fix docker --- Dockerfile | 1 + requirements.txt | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index ce6f5f3..1b9fbcf 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,6 @@ FROM python:3 RUN mkdir /code WORKDIR /code +ADD ./ /code RUN pip install -r requirements.txt diff --git a/requirements.txt b/requirements.txt index a8e7b5b..0d86898 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1 +1,2 @@ -pycodestyle \ No newline at end of file +pycodestyle +requests \ No newline at end of file