예제 #1
0
def test_valid_number():
    gb = Gameboard()

    assert gb.valid_number(-3) == False
    assert gb.valid_number(72) == False
    assert gb.valid_number(1) == True
    assert gb.valid_number(0) == True
예제 #2
0
def test_valid_choice():
    gb = Gameboard()

    assert gb.valid_choice("y") == True
    assert gb.valid_choice("Y") == True
    assert gb.valid_choice("n") == True
    assert gb.valid_choice("N") == True

    assert gb.valid_choice("U") == False
예제 #3
0
    def __init__(self):
        # GAME: MAIN VARIABLES
        self.initial_time = time()
        self.level = 0
        self.start = False
        self.game_over = [False, ""]

        # GAMEBOARD
        self.Gameboard = Gameboard()
        self.constants = self.Gameboard.Constants
        self.width = self.constants.width
        self.height = self.constants.height
        self.cell_size = self.constants.cell_size
        self.grid = self.Gameboard.grid

        # SCOREBOARD
        self.scoreboard = Scoreboard()

        # PLATFORMS AND GATES
        self.platforms = self.Gameboard.platforms
        self.entry_gate = self.Gameboard.generate_gate(self.platforms)
        self.exit_gate = self.Gameboard.generate_gate(
            self.platforms, self.entry_gate.row_index, exit_gate=True)

        # TOOLS
        self.user_x = 0
        self.user_y = self.scoreboard.height
        self.cursor_displacement = self.cell_size
        self.tools = {
            "umbrella": [],
            "blocker": [],
            "right_s": [],
            "left_s": []
        }

        # LEMMING
        self.alive = []
        self.saved = []
        self.dead = []
        self.Lemming = Lemming(self.entry_gate.x, self.entry_gate.y,
                               self.platforms)
        self.lemmings_num = self.Lemming.lemmings_num

        # DRAW
        self.Draw = Draw(self.platforms, self.entry_gate, self.exit_gate)

        # PYXEL
        self.pyxel_window_title = "Lemmings"
        pyxel.init(self.width, self.height, caption=self.pyxel_window_title)

        pyxel.load("./assets/resources.pyxres")

        pyxel.run(self.interaction, self.update)
예제 #4
0
def generateMoves(snapshot, isPlayer):
    """
    Crear tableros con nuevos movimientos para evaluar nuevos escenarios
    """
    output = []
    for x in range(3):
        for y in range(3):
            if (snapshot.board[x][y] == "\t"):
                game = Gameboard(snapshot.width, snapshot.height,
                                 snapshot.player, snapshot.opponent)
                game.board = deepcopy(snapshot.board)
                game.addChip(isPlayer, x, y)
                output.append(game)
    return output
예제 #5
0
 def execAction(self, gameboard: Gameboard, actionIndex):
     if actionIndex == 0:
         gameboard.moveUp()
     elif actionIndex == 1:
         gameboard.moveDown()
     elif actionIndex == 2:
         gameboard.moveLeft()
     else:
         gameboard.moveRight()
예제 #6
0
    def getReward(self, gameboard: Gameboard):
        status = gameboard.getGameStatus()

        if status == 0:
            return -1
        if status == -1:
            return -100
        else:
            return 0
예제 #7
0
def test_gameboard_init():
    gb = Gameboard()

    assert len(gb.board) == 2
    assert len(gb.deck.cards) == 50

    # Ensure that the cards displayed are different
    suit_check = gb.board[0].suit != gb.board[1].suit
    rank_check = gb.board[0].rank != gb.board[1].rank
    assert suit_check or rank_check
예제 #8
0
    def execPolicy(self, gameboard: Gameboard, greedy=False):
        epsilon = 0.1
        position = gameboard.getPosition()

        if greedy:
            return self.q_valueTable[position].argmax()
        else:
            if np.random.random() < epsilon:
                return np.random.choice(4)
            else:
                return self.q_valueTable[position].argmax()
 def test_print_board(self):
     global letters
     gb = Gameboard()
     for row in range(gb.length):
         curr_row = ""
         for col in range(gb.length):
             curr_row = curr_row + " " + str(gb.visibleGameboard[row][col])
         if row == 0:
             self.assertEqual(curr_row, "   1 2 3 4 5 6 7 8 9 10")
         else:
             self.assertEqual(
                 curr_row,
                 " {} . . . . . . . . . .".format(letters[row - 1]))
    def test_gameboard(self):
        global letters
        gb = Gameboard()
        self.assertEqual(gb.length, 11)
        self.assertEqual(gb.visibleGameboard[0][0], " ")
        self.assertEqual(gb.invisibleGameboard[0][0], " ")
        for y in range(1, gb.length):
            for x in range(1, gb.length):
                self.assertEqual(gb.visibleGameboard[y][x], ".")
                self.assertEqual(gb.invisibleGameboard[y][x], " ")

        for y in range(1, gb.length):
            self.assertEqual(gb.visibleGameboard[y][0], letters[y - 1])
            self.assertEqual(gb.invisibleGameboard[y][0], letters[y - 1])

        for x in range(1, gb.length):
            self.assertEqual(gb.visibleGameboard[0][x], x)
            self.assertEqual(gb.invisibleGameboard[0][x], x)
예제 #11
0
 def initGameboards(mode, players):
     keyDicts = []
     keyDict0 = {'1': 0, '2': 1, '3': 2, '4': 3, '5': 4}
     keyDict1 = {'6': 0, '7': 1, '8': 2, '9': 3, '0': 4}
     keyDict2 = {'z': 0, 'x': 1, 'c': 2, 'v': 3, 'b': 4}
     keyDict3 = {'n': 0, 'm': 1, ',': 2, '.': 3, '/': 4}
     keyDicts.extend([keyDict0, keyDict1, keyDict2, keyDict3])
     mode.gameboards = []
     for i in range(mode.players):
         if not mode.presetGameboard:
             newBoard = Gameboard(mode.players)
         else:
             newBoard = PresetGameboard(mode.players)
         newBoard.initBoardDimensions(i, mode.width / mode.players,
                                      mode.height)
         newBoard.setKeysDict(keyDicts[i])
         mode.gameboards.append(newBoard)
예제 #12
0
    def __init__(self, platforms, entry_gate, exit_gate):
        self.gameboard = Gameboard()
        self.constants = self.gameboard.Constants

        # DIMENSIONS
        self.width = self.constants.width
        self.height = self.constants.height
        self.cell_size = self.constants.cell_size
        self.grid_columns = self.constants.grid_columns

        # COLORS
        self.BLACK = 0
        self.DARK_BLUE = 1
        self.BROWN = 4
        self.WHITE = 7
        self.GREEN = 11
        self.BLUE = 12

        # MAIN OBJECTS
        self.platforms = platforms
        self.entry_gate = entry_gate
        self.exit_gate = exit_gate
예제 #13
0
		4. If the player cannot make a move as described in rule 2, they can continue to reveal cards until this is possible.
		5. If all the cards have been revealed and there are no more moves avaialble, the game is over.
		6. The goal is to have the least amount of piles once the board reaches such a state as described in rule 5.

		*************************************************
		                  EXAMPLE CARD:

		               [  (SUIT, RANK)  ]

		               C ===> CLUB
		               S ===> SPADE
		               H ===> HEART
		               D ===> DIAMOND

		*************************************************


		*************************************************
		       To Exit Game Early: CTRL + C + Enter
		*************************************************

		\n''')

    gb = Gameboard()

    while True:
        # Display inital state
        gb.display_state()

        # Let player choose next move
        gb.prompt_for_move()
예제 #14
0
				# Remove one of the stepping stones, and return true
				ffNode.items.remove(gs.TILE_STEPPING_STONE)
				return True

	# All other cases:
	else:
		return False

# -------------------------------
# main
# -------------------------------

# Construct scenario

# Gameboard is a list of lists
gameboard = Gameboard()
gameboard.gamemap = []
map_row0 = [' ', '~', '~', '~']
map_row1 = [' ', '*', 'g', '*']
map_row2 = [' ', '*', '*', '*']
map_row3 = [' ', ' ', ' ', ' ']
gameboard.gamemap.append(map_row0)
gameboard.gamemap.append(map_row1)
gameboard.gamemap.append(map_row2)
gameboard.gamemap.append(map_row3)

# Set current position
gameboard.curr_position = { 'x': 0, 'y': 3 }

# Set direction
gameboard.direction = Gameboard.DIRECTION_LEFT
예제 #15
0
from World import World
from Display import Display
from Point import Point
from Gameboard import Gameboard
from RectangleFieldGameboardDisplay import RectangleFieldGameboardDisplay
from WorldDisplay import WorldDisplay

WIDTH = 300
HEIGTH = 300
g = Gameboard(10, 10)
p = RectangleFieldGameboardDisplay(Point(100, 500), HEIGTH, WIDTH)
wd = WorldDisplay(p)
w = World(b)
Display.create_window(600, 600)
Display.set_background()
# p.display(g)
w.display(g)
# world = World(30, 30)
# world1 = World()
# pygame.init()
# x = 500
# y = 100
# handle = pygame.display.set_mode((x, y))
# handle.fill((255, 255, 255))

# pygame.draw.line(handle, (0, 0, 0), (100, 100), (200, 200))
# pygame.draw.line(handle, (0, 255, 0), (100, 100), (100, 200))
# pygame.draw.line(handle, (0, 0, 255), (100, 100), (200, 100))
# pygame.draw.rect(handle, (0, 0, 0), (100, 100, 100, -50), 1)
예제 #16
0
from Gameboard import Gameboard
from Agent import Agent

import numpy as np
import matplotlib.pyplot as plt

agent = Agent()

game_record = []

print('Training agent for {} games'.format(100))
for i in range(100):
    game = Gameboard()

    while game.getGameStatus() == 0:
        firstPosition = game.getPosition()
        actionIndex = agent.execPolicy(game)
        agent.execAction(game, actionIndex)
        newPosition = game.getPosition()
        reward = agent.getReward(game)
        agent.updateTable(firstPosition, newPosition, actionIndex, reward)

    game_record.append(game.getGameStatus())

plt.plot(game_record)
plt.ylabel('Game results')
plt.title('Game record over {} games'.format(100))
plt.show()

print('Testing trained agent for one game')
예제 #17
0
         if level == 1:
             level = EASY
         elif level == 2:
             level = MEDIUM
         else:
             level = HARD
     except KeyboardInterrupt:
         print("Fin abrupto del programa")
         quit()
     except:
         print("Hubo un error, creo que no tecleaste un número")
 # === Ver quien INICIA ===
 print("Voy a lanzar una moneda para ver quien inicia...")
 turn = random.choice(["X", "O"])
 print("Obtuve {}".format(turn))
 game = Gameboard(3, 3, machine, user)
 game.print()
 if turn == machine:
     game.addChip(True, random.randint(0, 2), random.randint(0, 2))
     turn = user
     game.print()
 # === Ciclo del juego entre jugador vs máquina ===
 winner = 0
 while canMove(game.board) and winner == 0:
     if turn == user:
         print("Es TU turno")
         valid = False
         while not valid:
             try:
                 print(
                     "¿Qué FILA seleccionas? [0 (Hasta arriba), 2(Hasta abajo)]"
        return [maxScore, bestMove]
    else:
        minScore = float('inf')
        children = getChildren(snapshot, False)
        for child in children:
            result = minimax(child, depth - 1, True, checkScore, getChildren)
            minScore = min(result[0], minScore)
            if minScore == result[0]:
                bestMove = child.lastMove
        if len(children) == 0:
            if snapshot is not None:
                return [checkScore(snapshot.board, snapshot.getPlayerFormat(), snapshot.getOpponentFormat()), snapshot.lastMove]
            return [checkScore(snapshot, snapshot, snapshot), snapshot]
        return [minScore, bestMove]


if __name__ == "__main__":
    print("==== Tablero 3x3 ====")
    g = Gameboard(3, 3, "X", "O")
    g.addChip(True, 0, 0)
    g.addChip(False, 1, 1)
    g.addChip(False, 2, 2)
    g.addChip(True, 0, 2)
    g.print()
    print("==== MOVIMIENTO ====")
    res = minimax(g, 3, True, evaluate, generateMoves)
    print("Mover la pieza a {1} (Score: {0})".format(res[0], res[1]))
    g.addChip(False, res[1][0], res[1][1])
    g.print()
    print("==== MOVIMIENTO ====")
예제 #19
0
def run():
    players = []
    game_boards = []

    print("""
  Willkommen zu Niko Lehbrink's Schiffe Versenken!
  Nachdem du deinen Spielern Namen gegeben hast, 
  kannst du auswählen, ob dieser Computergeneriert wird,
  oder ob eine reale Person dahinter steckt...

  Die Regeln: 
  Es gibt 5 Boote, die zu verteilen sind oder automatisch verteilt werden.
  Pro Runde darf man einmal schiessen; sobald ein gegnerisches 
  Schiff getroffen wurde, ist der angreifende Spieler nochmal am Zug.
  Ein Treffer wird als rotes """ + Fore.RED + "X" + Style.RESET_ALL +
          """ angezeigt.
  Ein missglückter Schuss ins Wasser wird als blaues """ + Fore.CYAN + "»" +
          Style.RESET_ALL + """ angezeigt.

  Viel Erfolg!

              |    |    |
             )_)  )_)  )_)
            )___))___))___)
           )____)____)_____)
         _____|____|____|____\___
---------\                   /---------
  ^^^^^ ^^^^^^^^^^^^^^^^^^^^^
    ^^^^      ^^^^     ^^^    ^^
         ^^^^      ^^^
  """)

    #  1 bis 3, weil Spielernummer so einfacher ausgegeben wird - statt Spieler 0, wird dadurch Spieler 1 ausgegeben
    for i in range(1, 3):
        while (True):
            name = input("Spieler %s: Bitte Namen eingeben: " % i)
            # Wenn Vor und Nachname eingegeben wird und der zusammengefügte String nicht nur Buchstaben enthält
            if not "".join(name.split()).isalpha():
                announce("invalid_name")
                continue
            break
        while (True):
            print("Welcher Spielertyp soll %s sein?" % name)
            player_type = input(
                "'C' für Computergeneriert, 'M' für Mensch: ").lower()
            if player_type == 'c':
                player = Player(name, get_random_ai_shot)
                gameboard = Gameboard(10, 10, create_random_battleships())
                players.append(player)
                game_boards.append(gameboard)
                break
            elif player_type == 'm':
                # Beim Auswählen eines menschlichen Spielers, ist es möglich die Schiffe automatisch zu platzieren, oder dies händisch zu tun
                player = Player(name, get_human_shot)
                # Bei einmaligen Ausgaben und input-Methoden wurde auf die Benutzung der announce-Methode verzichtet
                print("Möchtest du deine Schiffe selbst platzieren?")
                while (True):
                    create_ships = input(
                        "'J' für selbst generieren, 'N' für Computergeneriert: "
                    ).lower()
                    if create_ships == 'j':
                        gameboard = Gameboard(10, 10, create_own_battleships())
                        break
                    elif create_ships == 'n':
                        gameboard = Gameboard(10, 10,
                                              create_random_battleships())
                        time.sleep(3)
                        break
                    else:
                        announce("no_valid_input")
                        continue
                players.append(player)
                game_boards.append(gameboard)
                break
            else:
                print("Gib einen validen Spielertypen ein!")
                continue

    offensive_index = 0
    time_in_between_turns = 4
    while (True):
        print(
            Fore.LIGHTYELLOW_EX +
            "Wie viele Sekunden sollen zwischen den einzelnen Spielzügen gewartet werden?"
            + Style.RESET_ALL)
        try:
            time_in_between_turns = float(
                input("Eingabe erfolgt als Zahl (Empf.: 4): "))
        except ValueError:
            announce("no_valid_input")
            continue
        break
    while (True):
        # Clear Terminal
        os.system('cls')
        # Immer die Zahl, die der Gegenpart nicht ist
        defensive_index = (offensive_index + 1) % 2

        defensive_board = game_boards[defensive_index]
        offensive_player = players[offensive_index]
        defensive_player = players[defensive_index]

        # Zur eindeutigen Benennung, wessen Feld ab der nächsten Line gezeigt wird
        print("%s's Feld:" % defensive_player.name)
        # Wenn auf True gesetzt, dann sieht man alle Schiffe auf dem Spielfeld
        render(defensive_board, False)
        print("")
        announce("new_turn", {"player": offensive_player.name})

        # Welche Koordinaten als nächstes beschossen werden sollen
        shot_location = offensive_player.shot_function(defensive_board)
        # Clear, damit nun das aktualisierte Board mit kommendem Schuss an gleicher Stelle im Terminal angezeigt wird.
        os.system('cls')
        # Schuss auf die vorher ausgewählten Koordinaten
        hit_battleship = defensive_board.take_shot(shot_location)
        print("%s's Feld:" % defensive_player.name)
        # Wenn auf True gesetzt, dann sieht man alle Schiffe auf dem Spielfeld
        render(defensive_board, False)
        print("")
        # Um die Anzeige etwas nutzerfreundlicher zu machen
        if (offensive_player.shot_function.__name__ != "get_human_shot"):
            announce("new_turn", {"player": offensive_player.name})
            print("")

        announce("shot_location", {"coordinates": shot_location})

        if defensive_board.is_game_over():
            announce("win", {"player": offensive_player.name})
            time.sleep(5)
            break
        if hit_battleship is None:
            # Wenn nicht getroffen, switche die Spieler und der nächste Spieler darf jetzt spielen
            announce("miss", {"player": offensive_player.name})
            offensive_index = defensive_index
        else:
            if hit_battleship.is_destroyed():
                announce(
                    "destroyed", {
                        "player": offensive_player.name,
                        "ship_name": hit_battleship.name
                    })
            else:
                # Wenn ein Hit, aber nicht zerstört
                announce(
                    "hit", {
                        "player": offensive_player.name,
                        "ship_name": hit_battleship.name
                    })
            announce("next_try")
        # Zeit zwischen den einzelnen Spielzügen
        time.sleep(time_in_between_turns)
    def test_hit_and_get_result(self):
        gb1 = Gameboard()
        gb1.invisibleGameboard[1][1] = "X"
        gb1.invisibleGameboard[1][2] = "X"
        gb1.invisibleGameboard[1][3] = "X"

        self.assertEqual(gb1.hit_and_get_result("A1"), "Hit")
        self.assertEqual(gb1.visibleGameboard[1][1], "X")

        self.assertEqual(gb1.hit_and_get_result("A2"), "Hit")
        self.assertEqual(gb1.visibleGameboard[1][2], "X")

        self.assertEqual(gb1.hit_and_get_result("A3"), "Hit")
        self.assertEqual(gb1.visibleGameboard[1][3], "X")

        self.assertEqual(gb1.hit_and_get_result("A4"), "Miss")
        self.assertEqual(gb1.visibleGameboard[1][4], "-")

        self.assertEqual(gb1.hit_and_get_result("F4"), "Miss")
        self.assertEqual(gb1.visibleGameboard[6][4], "-")

        self.assertEqual(gb1.visibleGameboard[1][5], ".")

        self.assertEqual(gb1.visibleGameboard[6][6], ".")

        self.assertEqual(gb1.hit_and_get_result("A11"), "Error")

        self.assertEqual(gb1.hit_and_get_result(""), "Error")

        self.assertEqual(gb1.hit_and_get_result("asdf"), "Error")

        self.assertEqual(gb1.hit_and_get_result("11"), "Error")

        self.assertEqual(gb1.hit_and_get_result("99999999999999999999999999"),
                         "Error")

        self.assertEqual(gb1.hit_and_get_result("A99999999999999999999999999"),
                         "Error")
예제 #21
0
def test_valid_move():
    gb = Gameboard()
    board_state_1 = [Card("S", "A"), Card("S", "2")]
    board_state_2 = [Card("S", "A"), Card("C", "A")]
    board_state_3 = [
        Card("S", "A"),
        Card("C", "2"),
        Card("D", "3"),
        Card("H", "3")
    ]
    board_state_4 = [
        Card("S", "A"),
        Card("C", "2"),
        Card("D", "3"),
        Card("S", "4")
    ]
    board_state_5 = [
        Card("S", "A"),
        Card("C", "2"),
        Card("D", "3"),
        Card("H", "A")
    ]

    gb.board = board_state_1

    assert gb.valid_move(1, 101) == False

    # Test 1 to the right suit move
    assert gb.valid_move(0, 1) == True
    assert gb.valid_move(0, 3) == False  # Out of bounds check

    gb.board = board_state_2

    # Test 1 to the right rank move
    assert gb.valid_move(0, 1) == True
    assert gb.valid_move(0, 3) == False  # Out of bounds check

    gb.board = board_state_3

    # Test with more options and valid 3 to the right
    assert gb.valid_move(0, 1) == False
    assert gb.valid_move(0, 3) == False
    assert gb.valid_move(1, 2) == False
    assert gb.valid_move(2, 3) == True

    gb.board = board_state_4

    # Test valid 3 to the right suit match
    assert gb.valid_move(0, 1) == False
    assert gb.valid_move(1, 3) == False
    assert gb.valid_move(2, 1) == False
    assert gb.valid_move(0, 3) == True

    gb.board = board_state_4

    # Test valid 3 to the right rank match
    assert gb.valid_move(0, 1) == False
    assert gb.valid_move(1, 3) == False
    assert gb.valid_move(2, 3) == False
    assert gb.valid_move(0, 3) == True
예제 #22
0
 def __init__(self):
     self.__game_board = Gameboard(5, 5)
     self.__command = Command()
     self.__ship_list = []  #list of ship objects
예제 #23
0
class Game():
    CIEL = 0, 200, 255
    BLUE = 0, 102, 255
    WHITE = 255, 255, 255
    GREEN = 0, 255, 0
    RED = 255, 0, 0
    YELLOW = 255, 255, 100
    PURPLE = 204, 0, 153
    GRAY = 150, 150, 150
    WIDTH = 1080
    HEIGHT = 720
    WINDOW_WIDTH = WIDTH / 4
    WINDOW_HEIGHT = HEIGHT / 2
    WIDTH_BUTTON = 100

    def __init__(self):
        pygame.init()

    def setLeonardo(self, player, fenetre):
        leonardo = "Leonardo : " + player
        myfont = pygame.font.SysFont("monospace", 12)
        label = myfont.render(leonardo, 1, (0, 0, 0))
        fenetre.blit(label, (540, 375))

    def getMyInventors(self, colour):
        myparse = parse.Parse()
        myteam = myparse.getTeam()
        for team in myteam:
            if (team.color == colour):
                return team.inventors

    def drawButtonNbPlayer(self, fenetre, offset):
        return pygame.draw.rect(fenetre, Game.WHITE,
                                [Game.WIDTH / 5 * offset - Game.WIDTH_BUTTON / 2,
                                 Game.HEIGHT / 3, Game.WIDTH_BUTTON, 50])

    def selectIALevel(self):
        fenetre = pygame.display.set_mode((self.WIDTH, self.HEIGHT))
        fond = pygame.image.load("background.jpg").convert()
        background = pygame.transform.scale(fond, (int(Game.WIDTH), int(Game.HEIGHT)))
        fenetre.blit(background, (0, 0))
        myfont = pygame.font.SysFont("monospace", 52)
        label = myfont.render("Select the difficulty", 1, (0, 0, 0))
        fenetre.blit(label, (Game.WIDTH / 2 - label.get_width() / 2, Game.HEIGHT / 4 - label.get_height()))

        button_IABasic = pygame.draw.rect(fenetre, Game.WHITE,
                                          [Game.WIDTH / 5, Game.HEIGHT / 3, Game.WIDTH_BUTTON, 50])
        button_IAAdvanced = pygame.draw.rect(fenetre, Game.WHITE,
                                             [Game.WIDTH / 5 * 4, Game.HEIGHT / 3, Game.WIDTH_BUTTON, 50])

        myfont = pygame.font.SysFont("monospace", 12)
        labelAI1 = myfont.render(str("AI Basic"), 1, (0, 0, 0))
        labelAI2 = myfont.render(str("AI Advanced"), 1, (0, 0, 0))
        fenetre.blit(labelAI1, (Game.WIDTH / 5 + 10, Game.HEIGHT / 3 + 20))
        fenetre.blit(labelAI2, (Game.WIDTH / 5 * 4 + 10, Game.HEIGHT / 3 + 20))

        pygame.display.flip()
        loop = True
        while loop:

            for i in range(1, 5):
                myfont = pygame.font.SysFont("monospace", 14)
                # label = myfont.render(str(i + 1), 1, (0, 0, 0))
                fenetre.blit(label, (Game.WIDTH / 2 - label.get_width() / 2, Game.HEIGHT / 4 - label.get_height()))

                for event in pygame.event.get():
                    if event.type == pygame.QUIT:
                        continue

                    if event.type == pygame.MOUSEBUTTONDOWN and Game.WIDTH / 5 < event.pos[
                        0] < Game.WIDTH / 5 + Game.WIDTH_BUTTON and Game.HEIGHT / 3 < event.pos[
                        1] < Game.HEIGHT / 3 + 50:
                        print("AI Basic")
                        self.loadSettingMenu()
                        loop = False

                    if event.type == pygame.MOUSEBUTTONDOWN and Game.WIDTH / 5 * 4 < event.pos[
                        0] < Game.WIDTH / 5 * 4 + Game.WIDTH_BUTTON and Game.HEIGHT / 3 < event.pos[
                        1] < Game.HEIGHT / 3 + 50:
                        print("AI Advanced")
                        self.loadSettingMenu()
                        loop = False
            pygame.display.flip()

    def selectIANumber(self, playerColor):
        fenetre = pygame.display.set_mode((self.WIDTH, self.HEIGHT))
        fond = pygame.image.load("background.jpg").convert()
        background = pygame.transform.scale(fond, (int(Game.WIDTH), int(Game.HEIGHT)))
        fenetre.blit(background, (0, 0))
        myfont = pygame.font.SysFont("monospace", 52)
        label = myfont.render("Select max numbers of players  ", 1, (0, 0, 0))
        fenetre.blit(label, (Game.WIDTH / 2 - label.get_width() / 2, Game.HEIGHT / 4 - label.get_height()))

        loop = True

        while loop:

            button_2 = self.drawButtonNbPlayer(fenetre, 1)
            button_3 = self.drawButtonNbPlayer(fenetre, 2)
            button_4 = self.drawButtonNbPlayer(fenetre, 3)
            button_5 = self.drawButtonNbPlayer(fenetre, 4)

            for i in range(1, 5):
                myfont = pygame.font.SysFont("monospace", 14)
                label = myfont.render(str(i + 1), 1, (0, 0, 0))
                fenetre.blit(label, (Game.WIDTH / 5 * i + label.get_width() / 2, Game.HEIGHT / 3))

                nbPlayer = 0

                for event in pygame.event.get():
                    if event.type == pygame.QUIT:
                        loop = False

                    if event.type == pygame.MOUSEBUTTONDOWN and 166 < event.pos[0] < 266 and 240 < event.pos[1] < 290:
                        print("Players :2")
                        self.showGameScreen(playerColor, 2)
                        loop = False

                    if event.type == pygame.MOUSEBUTTONDOWN and 382 < event.pos[0] < 482 and 240 < event.pos[1] < 290:
                        print("Players :3")
                        self.showGameScreen(playerColor, 3)
                        loop = False

                    if event.type == pygame.MOUSEBUTTONDOWN and 598 < event.pos[0] < 698 and 240 < event.pos[1] < 290:
                        print("Players :4")
                        self.showGameScreen(playerColor, 4)
                        loop = False

                    if event.type == pygame.MOUSEBUTTONDOWN and 814 < event.pos[0] < 914 and 240 < event.pos[1] < 290:
                        print("Players :5")
                        self.showGameScreen(playerColor, 5)
                        loop = False

            pygame.display.flip()

    def showGameScreen(self, playerColor, IAnumber):
        clock = pygame.time.Clock()
        fenetre = pygame.display.set_mode((self.WIDTH, self.HEIGHT))
        fond = pygame.image.load("background.jpg").convert()
        background = pygame.transform.scale(fond, (int(Game.WINDOW_WIDTH * 3), int(Game.WINDOW_HEIGHT)))
        fenetre.blit(background, (0, Game.WINDOW_HEIGHT))

        fondCard = pygame.image.load("backgroundCard.png").convert()
        self.setLeonardo("null", fenetre)
        self.loadPlayersBackgrounds(fenetre, fondCard, playerColor, IAnumber)

    # exchanges 2 items of a list

    def exchangeList(self, list, pos1, pos2):
        tmp = list[pos1]
        list[pos1] = list[pos2]
        list[pos2] = tmp
        return list

    # Places the player in the bottom right corner and randomizes other players position

    def placeColors(self, strPlayerColor, IANumber):

        if strPlayerColor == "green":
            playerColor = Game.GREEN
        elif strPlayerColor == "purple":
            playerColor = Game.PURPLE
        elif strPlayerColor == "red":
            playerColor = Game.RED
        elif strPlayerColor == "yellow":
            playerColor = Game.YELLOW
        elif strPlayerColor == "blue":
            playerColor = Game.BLUE

        colorList = [Game.PURPLE, Game.YELLOW, Game.GREEN, Game.BLUE, Game.RED]

        # exchanges 2 positions 60 times => randomizes the list

        for x in range(0, 50):
            pos1 = 0
            pos2 = 0
            while pos1 == pos2:
                pos1 = random.randrange(0, 5, 1)
                pos2 = random.randrange(0, 5, 1)
            colorList = self.exchangeList(colorList, pos1, pos2)

        pos = 0
        for x in range(0, 5):
            if colorList[x] == playerColor:
                pos = x

        if pos != 4:
            colorList = self.exchangeList(colorList, pos, 4)

        for i in range(0, 5 - IANumber):
            colorList.pop(0)

        return colorList

    def fromRGBtoSTRINGList(self, list, size):
        returnList = []
        for i in range(0, size):
            if list[i] == Game.GREEN:
                returnList.append("green")
            elif list[i] == Game.RED:
                returnList.append("red")
            elif list[i] == Game.YELLOW:
                returnList.append("yellow")
            elif list[i] == Game.PURPLE:
                returnList.append("purple")
            elif list[i] == Game.BLUE:
                returnList.append("blue")
        return returnList

    def displayKnowledge(self, myfont, knowledge, fenetre, pos1, pos2):
        label = myfont.render(knowledge, 1, (0, 0, 0))
        fenetre.blit(label, (pos1, pos2))

    def displayInventors(self, intPlayer, colorListString, originPosition, fenetre):

        oneLine = 12
        fonting_space = 40
        knowledge_space = 90
        inventors = self.getMyInventors(colorListString[intPlayer])
        namePos = [originPosition[0] + fonting_space, originPosition[1] + 30]

        myfont = pygame.font.SysFont("bitstreamverasans", 10)
        label1 = myfont.render(str("Age1"), 1, (0, 0, 0))
        label2 = myfont.render(str("Age2"), 1, (0, 0, 0))
        label3 = myfont.render(str("Age3"), 1, (0, 0, 0))
        fenetre.blit(label1, (830, 550))
        fenetre.blit(label2, (870, 550))
        fenetre.blit(label3, (910, 550))

        myfont = pygame.font.SysFont("bitstreamverasans", 12)

        knowledgeLegend = ["Ph :", "Ch :", "Me :", "Ma :", "Vpt :"]

        toAddToI = 5

        for i in range(0, 5):  # display the legend

            label = myfont.render(knowledgeLegend[i], 1, (0, 0, 0))
            if i == 4:
                toAddToI = 6
            fenetre.blit(label, (namePos[0] - 30, namePos[1] + (toAddToI + i) * oneLine))

        myfont = pygame.font.SysFont("bitstreamverasans", 9)

        ownedcard = [["Age1", [namePos[0], -150 + namePos[1] * oneLine]],
                     ["Age2", [namePos[0] + 30, -150 + namePos[1] * oneLine]],
                     ["Age3", [namePos[0] + 60, -150 + namePos[1] * oneLine]]]

        for card in ownedcard:
            label = myfont.render(card[0], 1, (0, 0, 0))
            fenetre.blit(label, card[1])

        for inventor in inventors:

            namePos = [originPosition[0] + fonting_space, originPosition[1] + 30]

            # separates fist and last name into a list

            name = inventor.name.split()

            vPoints = inventor.points

            myfont = pygame.font.SysFont("bitstreamverasans", 9)

            label1 = myfont.render(name[0], 1, (0, 0, 0))
            if len(name) > 1:
                label2 = myfont.render(name[1], 1, (0, 0, 0))
            if len(name) > 2:
                label3 = myfont.render(name[2], 1, (0, 0, 0))

            if len(name) > 0:
                fenetre.blit(label1, (namePos[0], namePos[1]))
            if len(name) > 1:
                fenetre.blit(label2, (namePos[0], namePos[1] + oneLine))
            if len(name) > 2:
                fenetre.blit(label3, (namePos[0], namePos[1] + oneLine * 2))

            fonting_space += 61

            myfont = pygame.font.SysFont("bitstreamverasans", 9)

            startTargetLegend = [["CP", [namePos[0], namePos[1] + 4 * oneLine]],
                                 ["TP", [namePos[0] + 20, namePos[1] + 4 * oneLine]]]

            for legend in startTargetLegend:
                label = myfont.render(legend[0], 1, (0, 0, 0))
                fenetre.blit(label, legend[1])

            for i in range(0, 4):
                self.displayKnowledge(myfont, str(inventor.currentKnowledge[i]),
                                      fenetre, namePos[0], namePos[1] + (5 + i) * 12)
                self.displayKnowledge(myfont, str(inventor.targetKnowledge[i]),
                                      fenetre, namePos[0] + 20, namePos[1] + (5 + i) * 12)

            label = myfont.render(vPoints, 1, (0, 0, 0))
            fenetre.blit(label, (namePos[0], namePos[1] + (7 + i) * oneLine))

    def displayToken(self, fenetre):

        line = 2
        height = int(self.HEIGHT / 4)  # 1/4 of the screen height
        tokenOnBoard = self.gameboard.emplacementOnBoard
        myfonttoken = pygame.font.SysFont("bitstreamverasans", 10)

        i = 0
        for token in tokenOnBoard:
            print(token[1].type)
            if i > 3:
                line = 3

            if token[1].type == "pointReward":
                token1 = myfonttoken.render(str("PT" + str(token[1].level)), 1, (0, 0, 0))
                fenetre.blit(token1, (30 + int((i % 4) * (self.WIDTH / 8)), line * height + 130))

            if token[2].type == "pointReward":
                token2 = myfonttoken.render(str("PT" + str(token[2].level)), 1, (0, 0, 0))
                fenetre.blit(token2, (80 + int((i % 4) * (self.WIDTH / 8)), line * height + 130))

            if token[1].type == "progressReward":
                token1 = myfonttoken.render(str("P" + str(token[1].level)), 1, (0, 0, 0))
                fenetre.blit(token1, (30 + int((i % 4) * (self.WIDTH / 8)), line * height + 130))

            if token[2].type == "progressReward":
                token2 = myfonttoken.render(str("P" + str(token[2].level)), 1, (0, 0, 0))
                fenetre.blit(token2, (80 + int((i % 4) * (self.WIDTH / 8)), line * height + 130))

            if token[1].type == "availabilityReward":
                token1 = myfonttoken.render("CF", 1, (0, 0, 0))
                fenetre.blit(token1, (30 + int((i % 4) * (self.WIDTH / 8)), line * height + 130))
            if token[2].type == "availabilityReward":
                token2 = myfonttoken.render("CF", 1, (0, 0, 0))
                fenetre.blit(token2, (80 + int((i % 4) * (self.WIDTH / 8)), line * height + 130))

            if token[1].type == "additonalKnowledgeReward":
                token1 = myfonttoken.render("DG", 1, (0, 0, 0))
                fenetre.blit(token1, (30 + int((i % 4) * (self.WIDTH / 8)), line * height + 130))
            if token[2].type == "additonalKnowledgeReward":
                token2 = myfonttoken.render("DG", 1, (0, 0, 0))
                fenetre.blit(token2, (80 + int((i % 4) * (self.WIDTH / 8)), line * height + 130))

            if token[1].type == "classificationReward":
                token1 = myfonttoken.render("ST", 1, (0, 0, 0))
                fenetre.blit(token1, (30 + int((i % 4) * (self.WIDTH / 8)), line * height + 130))
            if token[2].type == "classificationReward":
                token2 = myfonttoken.render("ST", 1, (0, 0, 0))
                fenetre.blit(token2, (80 + int((i % 4) * (self.WIDTH / 8)), line * height + 130))

            i += 1

    def displayCards(self, cards, fenetre):

        rectSize = 16
        positions = []
        myfont = pygame.font.SysFont("bitstreamverasans", 10)
        line = 2
        height = int(self.HEIGHT / 4)  # 1/4 of the screen height

        height = int(self.HEIGHT / 4)  # 1/4 of the screen height

        for i in range(0, len(cards)):
            if i > 3:
                line = 3
            positions.append([int(30 + int(i % 4) * (self.WIDTH / 8)), line * height + 30])
            label = myfont.render(cards[i].name, 1, (0, 0, 0))
            classicationlabel = myfont.render(str(cards[i].classification), 1, (0, 0, 0))

            fenetre.blit(label, (30 + int((i % 4) * (self.WIDTH / 8)), line * height + 30))
            fenetre.blit(classicationlabel, (15 + int((i % 4) * (self.WIDTH / 8)), line * height + 130))

        myfont = pygame.font.SysFont("bitstreamverasans", 14)
        knowledgeLegend = ["Ph :", "Ch :", "Me :", "Ma :"]

        for i in range(0, len(cards)):
            heightoffest = 20
            heightknow = 5

            for kn in cards[i].knowledge:
                widthoffset = 0

                for j in range(0, kn):
                    pygame.draw.rect(fenetre, Game.WHITE,
                                     [positions[i][0] + widthoffset, positions[i][1] + heightoffest,
                                      rectSize, rectSize])
                    widthoffset += (rectSize + 2)

                heightoffest += (rectSize + 2)
            if i > 4:
                for i in range(0, 4):
                    heightknow = 20
                    for j in range(0, 4):
                        myfont = pygame.font.SysFont("monospace", 12)
                        label = myfont.render(knowledgeLegend[j], 1, (0, 0, 0))
                        fenetre.blit(label, (positions[i][0] - 25, positions[i][1] + heightknow))
                        heightknow += 19
            else:
                for i in range(i, len(cards) - 4):
                    heightknow = 20
                    for j in range(0, 4):
                        myfont = pygame.font.SysFont("monospace", 12)
                        label = myfont.render(knowledgeLegend[j], 1, (0, 0, 0))
                        fenetre.blit(label, (positions[i][0] - 25, positions[i][1] + heightknow + 178))
                        heightknow += 19

                        # print(cards[0].knowledge)

    def displayButton(self, fenetre, text, posX, posY, sizeX, sizeY, fontSize, color):

        buttonSettings = [posX, posY, sizeX, sizeY]

        pygame.draw.rect(fenetre, color, [posX, posY, sizeX, sizeY])

        myfont = pygame.font.SysFont("bitstreamverasans", fontSize)
        label = myfont.render(text, 1, (0, 0, 0))

        fenetre.blit(label, (posX + 5, int(posY + sizeY / 2 - fontSize / 2)))

        return buttonSettings

    def overButton(self, eventPos, buttonSettings):
        return buttonSettings[0] < eventPos[0] < buttonSettings[0] + buttonSettings[2] and \
               buttonSettings[1] < eventPos[1] < buttonSettings[1] + buttonSettings[3]

    def displayDropList(self, fenetre, buttonSettings, inventors):
        offsetX = buttonSettings[2] + 1
        offsetY = buttonSettings[3]
        oneLine = 0
        boutons = []
        color = Game.WHITE
        for inventor in inventors:
            if inventor.sleep:
                color = Game.GRAY
            else:
                color = Game.WHITE
            self.displayButton(fenetre, inventor.name, buttonSettings[0] + offsetX,
                               buttonSettings[1] + oneLine,
                               110, 15, 10, color)
            boutons.append([buttonSettings[0] + offsetX, buttonSettings[1] + oneLine, 100, 15])
            oneLine += 16

        return boutons

    def displayInventionPossible(self, fenetre, buttonSettings, inventions):
        offsetX = buttonSettings[2] + 1
        offsetY = buttonSettings[3]
        oneLine = 0
        boutons = []
        color = Game.WHITE
        for invention in inventions:
            color = Game.WHITE
            self.displayButton(fenetre, invention[2].name, buttonSettings[0] + offsetX,
                               buttonSettings[1] + oneLine,
                               110, 15, 10, color)
            boutons.append([buttonSettings[0] + offsetX, buttonSettings[1] + oneLine, 100, 15])
            oneLine += 16

        return boutons

    def loadPlayersBackgrounds(self, fenetre, fondCard, playerColor, IANumber):

        dropListDisplayed = False
        dropListActionDisplayed = False
        myInventors = self.getMyInventors(playerColor)
        inventorName = ""
        ActionChoosen = []
        InventorChoosen = []
        hasChoosenAction = False
        CubePosed = False

        # Display Backgrounds for players emplacements
        backgroundCard = pygame.transform.scale(fondCard, (int(Game.WINDOW_WIDTH), int(Game.WINDOW_HEIGHT)))
        fenetre.blit(backgroundCard, (0, 0))
        fenetre.blit(backgroundCard, (int(Game.WINDOW_WIDTH), 0))
        fenetre.blit(backgroundCard, (int(Game.WINDOW_WIDTH * 2), 0))
        fenetre.blit(backgroundCard, (int(Game.WINDOW_WIDTH * 3), 0))
        fenetre.blit(backgroundCard, (int(Game.WINDOW_WIDTH * 3), Game.WINDOW_HEIGHT))

        playerPositions = [[0, 0]]
        if IANumber > 2:
            playerPositions.append([int(Game.WINDOW_WIDTH), 0])
        if IANumber > 3:
            playerPositions.append([int(Game.WINDOW_WIDTH * 2), 0])
        if IANumber > 4:
            playerPositions.append([int(Game.WINDOW_WIDTH * 3), 0])
        playerPositions.append([int(Game.WINDOW_WIDTH * 3), int(Game.WINDOW_HEIGHT)])

        loop = True

        colorList = self.placeColors(playerColor, IANumber)  # Place the player in the bottom right corner and
        # randomize other players position

        white_color = Game.WHITE

        colorListString = self.fromRGBtoSTRINGList(colorList, len(colorList))
        listPlayer = []
        for color in colorListString:
            player = Player.Player("Player", False)
            player.chooseTeam(color)
            listPlayer.append(player)

        # Display the inventors infos
        self.gameboard = Gameboard(1, listPlayer)
        cards = self.gameboard.distribute()
        self.gameboard.newTurn()
        for player in range(0, IANumber):
            self.displayInventors(player, colorListString, playerPositions[player], fenetre)
        self.displayToken(fenetre)
        self.displayCards(cards, fenetre)

        # Top Button
        button1Settings = self.displayButton(fenetre, "PlaceCube",
                                             Game.WIDTH / 2, Game.HEIGHT / 2 + 30, 100, 50, 14, Game.WHITE)
        buttonAddKnowledge = self.displayButton(fenetre, "Add knowledge",
                                                Game.WIDTH / 2, Game.HEIGHT / 10 * 7 + 30, 100, 50, 14, Game.WHITE)

        # Bottom Buttons
        buttonCoffee = self.displayButton(fenetre, "Coffee",
                                          Game.WIDTH / 2, Game.HEIGHT / 10 * 9 + 30, 60, 20, 14, Game.WHITE)
        buttonRecycle = self.displayButton(fenetre, "Recycle",
                                           Game.WINDOW_WIDTH * 2 + Game.WINDOW_WIDTH / 3, Game.HEIGHT / 10 * 9 + 30, 60,
                                           20, 14, Game.WHITE)

        while loop:

            pygame.display.flip()
            # Draw a rectangle outline for each player area

            mouse_xy = pygame.mouse.get_pos()

            player1 = pygame.draw.rect(fenetre, colorList[0], [0, 0, Game.WINDOW_WIDTH - 3, Game.WINDOW_HEIGHT],
                                       5)
            if IANumber > 2:
                player2 = pygame.draw.rect(fenetre, colorList[1],
                                           [Game.WINDOW_WIDTH, 0, Game.WINDOW_WIDTH - 3, Game.WINDOW_HEIGHT],
                                           5)

            if IANumber > 3:
                player3 = pygame.draw.rect(fenetre, colorList[2],
                                           [Game.WINDOW_WIDTH * 2, 0, Game.WINDOW_WIDTH - 3, Game.WINDOW_HEIGHT],
                                           5)

            if IANumber > 4:
                player4 = pygame.draw.rect(fenetre, colorList[3],
                                           [Game.WINDOW_WIDTH * 3, 0, Game.WINDOW_WIDTH - 3, Game.WINDOW_HEIGHT],
                                           5)

            myplayer = pygame.draw.rect(fenetre, colorList[IANumber - 1],
                                        [Game.WINDOW_WIDTH * 3, Game.WINDOW_HEIGHT + 3, Game.WINDOW_WIDTH,
                                         Game.WINDOW_HEIGHT - 5],
                                        5)

            # Draw a rectangle outline representing the gameboard with inventions cards
            board = pygame.draw.rect(fenetre, white_color,
                                     [0, Game.WINDOW_HEIGHT + 5, Game.WINDOW_WIDTH * 3 - 5, Game.WINDOW_HEIGHT - 6],
                                     5)

            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    loop = False
                elif event.type == pygame.MOUSEBUTTONDOWN and dropListActionDisplayed:
                    droplistaction = self.displayInventionPossible(fenetre, button1Settings, inventionListPosssible)
                    for button in droplistaction:
                        if self.overButton(event.pos, button):
                            self.displayInventionPossible(fenetre, button1Settings, inventionListPosssible)
                            clickedAction = inventionListPosssible[int((button[1] - 390) / 16)]
                            ActionChoosen.append(clickedAction[2])
                            print(clickedAction[2].name)
                            print(clickedInventor.name)
                            hasChoosenAction = True
                            dropListActionDisplayed == False
                            CubePosed = True
                            self.Next(clickedAction[2],InventorChoosen)

                elif event.type == pygame.MOUSEBUTTONDOWN:
                    if self.overButton(event.pos, button1Settings):
                        if dropListDisplayed:
                            print("hide droplist")  # TODO
                        else:
                            dropList = self.displayDropList(fenetre, button1Settings, myInventors)
                        dropListDisplayed = not dropListDisplayed
                    inventionListPosssible = []
                    if dropListDisplayed:
                        for button in dropList:
                            if self.overButton(event.pos, button):
                                clickedInventor = self.gameboard.playersOnBoard[len(self.gameboard.playersOnBoard)-1].myTeam.inventors[int((button[1] - 390) / 16)]
                                clickedInventor.sleep = True
                                dropList = self.displayDropList(fenetre, button1Settings, myInventors)
                                print(clickedInventor.name)
                                InventorChoosen.append(clickedInventor)
                                dropListDisplayed = not dropListDisplayed
                                for action in self.gameboard.possibleactions:
                                    dropListDisplayed = False
                                    
                                    if (action[1].name == clickedInventor.name):

                                        inventionListPosssible.append(action)
                                        dropListActionDisplayed = not dropListActionDisplayed

                                print(inventionListPosssible)
                                dropListActionDisplayed = True

                    if event.type == pygame.MOUSEBUTTONDOWN and hasChoosenAction and  Game.WIDTH / 2 + 180 < event.pos[
                                    0] < Game.WIDTH / 2 + 250 and Game.HEIGHT / 10 * 9 + 30 < event.pos[
                                    1] < Game.HEIGHT / 10 * 9 + 50:

                        print(ActionChoosen)

                                # Click on Coffee button
                    if event.type == pygame.MOUSEBUTTONDOWN and Game.WIDTH / 2 < event.pos[
                        0] < Game.WIDTH / 2 + 60 and Game.HEIGHT / 10 * 9 + 30 < event.pos[
                        1] < Game.HEIGHT / 10 * 9 + 50:
                        loopToken = True
                        while loopToken:
                            print(self.gameboard.playersOnBoard[self.gameboard.currentPlayer].myTeam.listTokens)
                            for token in self.gameboard.playersOnBoard[self.gameboard.currentPlayer].myTeam.listTokens:
                                # If the tokenList contain an availabilityReward then it remove this one, and call the awake function on all inventors
                                # Then, it leave the loop
                                if token.type == "availabilityReward":
                                    self.gameboard.playersOnBoard[self.gameboard.currentPlayer].myTeam.listTokens.remove(token)
                                    self.gameboard.awakeCurrentPlayer()
                                    break
                            loopToken = False

                    #         Recycle button
                    if event.type == pygame.MOUSEBUTTONDOWN and Game.WINDOW_WIDTH * 2 + Game.WINDOW_WIDTH / 3 < event.pos[
                        0] < Game.WINDOW_WIDTH * 2 + Game.WINDOW_WIDTH / 3 + 60 and Game.HEIGHT / 10 * 9 + 30 < event.pos[
                        1] < Game.HEIGHT / 10 * 9 + 50:
                        self.gameboard.awakeCurrentPlayer()
                        self.gameboard.newTurn()
                        print("Recycle button yata ! ")

            pygame.display.flip()
            # 10 fps

    def loadSettingMenu(self):

        clock = pygame.time.Clock()
        fenetre = pygame.display.set_mode((self.WIDTH, self.HEIGHT))
        fond = pygame.image.load("background.jpg").convert()
        background = pygame.transform.scale(fond, (int(Game.WIDTH), int(Game.HEIGHT)))
        fenetre.blit(background, (0, 0))

        button_green = pygame.draw.rect(fenetre, Game.GREEN,
                                        [Game.WIDTH / 6 - Game.WIDTH_BUTTON / 2, Game.HEIGHT / 4, Game.WIDTH_BUTTON,
                                         50])
        button_red = pygame.draw.rect(fenetre, Game.RED,
                                      [Game.WIDTH / 6 * 4 - Game.WIDTH_BUTTON / 2, Game.HEIGHT / 4, Game.WIDTH_BUTTON,
                                       50])
        button_blue = pygame.draw.rect(fenetre, Game.BLUE,
                                       [Game.WIDTH / 6 * 2 - Game.WIDTH_BUTTON / 2, Game.HEIGHT / 4, Game.WIDTH_BUTTON,
                                        50])
        button_yellow = pygame.draw.rect(fenetre, Game.YELLOW,
                                         [Game.WIDTH / 6 * 3 - Game.WIDTH_BUTTON / 2, Game.HEIGHT / 4,
                                          Game.WIDTH_BUTTON, 50])
        button_purple = pygame.draw.rect(fenetre, Game.PURPLE,
                                         [Game.WIDTH / 6 * 5 - Game.WIDTH_BUTTON / 2, Game.HEIGHT / 4,
                                          Game.WIDTH_BUTTON, 50])

        myParse = parse.Parse()
        myColor = parse.Parse.getColor(myParse)
        fontcompt = 1

        for item in myColor:
            myfont = pygame.font.SysFont("monospace", 14)
            label = myfont.render(item, 1, (0, 0, 0))
            fenetre.blit(label, (
                (Game.WIDTH / 6 * fontcompt - Game.WIDTH_BUTTON / 2 + label.get_width() / 2, Game.HEIGHT / 4)))
            fontcompt += 1

        myfont = pygame.font.SysFont("monospace", 52)
        # render text
        label = myfont.render("Select a player!", 1, (0, 0, 0))
        fenetre.blit(label, ((Game.WIDTH - label.get_width()) / 2, Game.HEIGHT / 5 - label.get_height()))
        loop = True

        while loop:

            pygame.display.flip()
            mouse_xy = pygame.mouse.get_pos()

            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    loop = False

                if event.type == pygame.MOUSEBUTTONDOWN and 0 < event.pos[0] < 200 and 150 < event.pos[1] < 250:
                    print("Green team")
                    self.getMyTeam("green")
                    self.selectIANumber("green")
                    loop = False
                if event.type == pygame.MOUSEBUTTONDOWN and 200 < event.pos[0] < 400 and 150 < event.pos[1] < 250:
                    print("Blue team")
                    self.getMyTeam("blue")
                    self.selectIANumber("blue")
                    loop = False

                if event.type == pygame.MOUSEBUTTONDOWN and 400 < event.pos[0] < 600 and 150 < event.pos[1] < 250:
                    print("Yellow team")
                    self.getMyTeam("yellow")
                    self.selectIANumber("yellow")
                    loop = False
                if event.type == pygame.MOUSEBUTTONDOWN and 600 < event.pos[0] < 800 and 150 < event.pos[1] < 250:
                    print("Red team")
                    self.getMyTeam("red")
                    self.selectIANumber("red")
                    loop = False

                if event.type == pygame.MOUSEBUTTONDOWN and 800 < event.pos[0] < 1000 and 150 < event.pos[1] < 250:
                    print("Purple team")
                    self.getMyTeam("purple")
                    self.selectIANumber("purple")
                    loop = False

            pygame.display.flip()
            # 10 fps

    def getMyTeam(self, colour):
        myparse = parse.Parse()
        myteams = myparse.getTeam()
        for team in myteams:

            if team.color == colour:
                for inv in team.inventors:
                    print("Inventor added :" + inv.name)
                return team

    def Next(self, Invention, Inventor):
        knowledgeposed = []
        for i in range (0,3):
            if Inventor[0].currentKnowledge[i] !=0:
                knowledgeposed.append(Inventor[0].name)
                knowledgeposed.append(Inventor[0].currentKnowledge[i])
            Invention.knowledgeposed = knowledgeposed
예제 #24
0
from Gameboard import Gameboard

gameboard = Gameboard()

for i in range(10000):
    print("# GAME {} #".format(i))
    gameboard.play_game()

gameboard.get_stats()
예제 #25
0

print("LETTER BOXED SOLVER")

# Gets gameboard from user input and checks validity
while (True):
    board = input("ENTER THE CHARACTERS IN THE GAMEBOARD: ")
    if len(board) != 12:
        print("Gameboard needs to be 12 letters long")
        continue
    for c in board:
        if not c.isalpha():
            print("Gameboard has to consist of letters")
            continue
    break
mainBoard = Gameboard(board)
if input("Type 1 for the smaller dictionary, 2 for the bigger one: ") == 1:
    words = open("words.txt", "r")
else:
    words = open("words_alpha.txt", "r")

# Builds dictionary object and calls recursive algorithm
dict = Dictionary(words, mainBoard)
results = findGameboards(mainBoard)

# Prints solutions which are stored as a dictionary of solutions
# with solution word count as keys
# {"1": [["word1"], ["word2"]], }
solutions = {}
for res in results:
    solWords = res.getWords()
예제 #26
0
 def test_fields_correct_creation(self):
     gameboard = Gameboard(5, 5)
     assert len(gameboard.fields.values()) == 25
     for coordinates, field in gameboard.fields.items():
         assert self.__field_have_correct_position(field, coordinates)
예제 #27
0
    def loadPlayersBackgrounds(self, fenetre, fondCard, playerColor, IANumber):

        dropListDisplayed = False
        dropListActionDisplayed = False
        myInventors = self.getMyInventors(playerColor)
        inventorName = ""
        ActionChoosen = []
        InventorChoosen = []
        hasChoosenAction = False
        CubePosed = False

        # Display Backgrounds for players emplacements
        backgroundCard = pygame.transform.scale(fondCard, (int(Game.WINDOW_WIDTH), int(Game.WINDOW_HEIGHT)))
        fenetre.blit(backgroundCard, (0, 0))
        fenetre.blit(backgroundCard, (int(Game.WINDOW_WIDTH), 0))
        fenetre.blit(backgroundCard, (int(Game.WINDOW_WIDTH * 2), 0))
        fenetre.blit(backgroundCard, (int(Game.WINDOW_WIDTH * 3), 0))
        fenetre.blit(backgroundCard, (int(Game.WINDOW_WIDTH * 3), Game.WINDOW_HEIGHT))

        playerPositions = [[0, 0]]
        if IANumber > 2:
            playerPositions.append([int(Game.WINDOW_WIDTH), 0])
        if IANumber > 3:
            playerPositions.append([int(Game.WINDOW_WIDTH * 2), 0])
        if IANumber > 4:
            playerPositions.append([int(Game.WINDOW_WIDTH * 3), 0])
        playerPositions.append([int(Game.WINDOW_WIDTH * 3), int(Game.WINDOW_HEIGHT)])

        loop = True

        colorList = self.placeColors(playerColor, IANumber)  # Place the player in the bottom right corner and
        # randomize other players position

        white_color = Game.WHITE

        colorListString = self.fromRGBtoSTRINGList(colorList, len(colorList))
        listPlayer = []
        for color in colorListString:
            player = Player.Player("Player", False)
            player.chooseTeam(color)
            listPlayer.append(player)

        # Display the inventors infos
        self.gameboard = Gameboard(1, listPlayer)
        cards = self.gameboard.distribute()
        self.gameboard.newTurn()
        for player in range(0, IANumber):
            self.displayInventors(player, colorListString, playerPositions[player], fenetre)
        self.displayToken(fenetre)
        self.displayCards(cards, fenetre)

        # Top Button
        button1Settings = self.displayButton(fenetre, "PlaceCube",
                                             Game.WIDTH / 2, Game.HEIGHT / 2 + 30, 100, 50, 14, Game.WHITE)
        buttonAddKnowledge = self.displayButton(fenetre, "Add knowledge",
                                                Game.WIDTH / 2, Game.HEIGHT / 10 * 7 + 30, 100, 50, 14, Game.WHITE)

        # Bottom Buttons
        buttonCoffee = self.displayButton(fenetre, "Coffee",
                                          Game.WIDTH / 2, Game.HEIGHT / 10 * 9 + 30, 60, 20, 14, Game.WHITE)
        buttonRecycle = self.displayButton(fenetre, "Recycle",
                                           Game.WINDOW_WIDTH * 2 + Game.WINDOW_WIDTH / 3, Game.HEIGHT / 10 * 9 + 30, 60,
                                           20, 14, Game.WHITE)

        while loop:

            pygame.display.flip()
            # Draw a rectangle outline for each player area

            mouse_xy = pygame.mouse.get_pos()

            player1 = pygame.draw.rect(fenetre, colorList[0], [0, 0, Game.WINDOW_WIDTH - 3, Game.WINDOW_HEIGHT],
                                       5)
            if IANumber > 2:
                player2 = pygame.draw.rect(fenetre, colorList[1],
                                           [Game.WINDOW_WIDTH, 0, Game.WINDOW_WIDTH - 3, Game.WINDOW_HEIGHT],
                                           5)

            if IANumber > 3:
                player3 = pygame.draw.rect(fenetre, colorList[2],
                                           [Game.WINDOW_WIDTH * 2, 0, Game.WINDOW_WIDTH - 3, Game.WINDOW_HEIGHT],
                                           5)

            if IANumber > 4:
                player4 = pygame.draw.rect(fenetre, colorList[3],
                                           [Game.WINDOW_WIDTH * 3, 0, Game.WINDOW_WIDTH - 3, Game.WINDOW_HEIGHT],
                                           5)

            myplayer = pygame.draw.rect(fenetre, colorList[IANumber - 1],
                                        [Game.WINDOW_WIDTH * 3, Game.WINDOW_HEIGHT + 3, Game.WINDOW_WIDTH,
                                         Game.WINDOW_HEIGHT - 5],
                                        5)

            # Draw a rectangle outline representing the gameboard with inventions cards
            board = pygame.draw.rect(fenetre, white_color,
                                     [0, Game.WINDOW_HEIGHT + 5, Game.WINDOW_WIDTH * 3 - 5, Game.WINDOW_HEIGHT - 6],
                                     5)

            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    loop = False
                elif event.type == pygame.MOUSEBUTTONDOWN and dropListActionDisplayed:
                    droplistaction = self.displayInventionPossible(fenetre, button1Settings, inventionListPosssible)
                    for button in droplistaction:
                        if self.overButton(event.pos, button):
                            self.displayInventionPossible(fenetre, button1Settings, inventionListPosssible)
                            clickedAction = inventionListPosssible[int((button[1] - 390) / 16)]
                            ActionChoosen.append(clickedAction[2])
                            print(clickedAction[2].name)
                            print(clickedInventor.name)
                            hasChoosenAction = True
                            dropListActionDisplayed == False
                            CubePosed = True
                            self.Next(clickedAction[2],InventorChoosen)

                elif event.type == pygame.MOUSEBUTTONDOWN:
                    if self.overButton(event.pos, button1Settings):
                        if dropListDisplayed:
                            print("hide droplist")  # TODO
                        else:
                            dropList = self.displayDropList(fenetre, button1Settings, myInventors)
                        dropListDisplayed = not dropListDisplayed
                    inventionListPosssible = []
                    if dropListDisplayed:
                        for button in dropList:
                            if self.overButton(event.pos, button):
                                clickedInventor = self.gameboard.playersOnBoard[len(self.gameboard.playersOnBoard)-1].myTeam.inventors[int((button[1] - 390) / 16)]
                                clickedInventor.sleep = True
                                dropList = self.displayDropList(fenetre, button1Settings, myInventors)
                                print(clickedInventor.name)
                                InventorChoosen.append(clickedInventor)
                                dropListDisplayed = not dropListDisplayed
                                for action in self.gameboard.possibleactions:
                                    dropListDisplayed = False
                                    
                                    if (action[1].name == clickedInventor.name):

                                        inventionListPosssible.append(action)
                                        dropListActionDisplayed = not dropListActionDisplayed

                                print(inventionListPosssible)
                                dropListActionDisplayed = True

                    if event.type == pygame.MOUSEBUTTONDOWN and hasChoosenAction and  Game.WIDTH / 2 + 180 < event.pos[
                                    0] < Game.WIDTH / 2 + 250 and Game.HEIGHT / 10 * 9 + 30 < event.pos[
                                    1] < Game.HEIGHT / 10 * 9 + 50:

                        print(ActionChoosen)

                                # Click on Coffee button
                    if event.type == pygame.MOUSEBUTTONDOWN and Game.WIDTH / 2 < event.pos[
                        0] < Game.WIDTH / 2 + 60 and Game.HEIGHT / 10 * 9 + 30 < event.pos[
                        1] < Game.HEIGHT / 10 * 9 + 50:
                        loopToken = True
                        while loopToken:
                            print(self.gameboard.playersOnBoard[self.gameboard.currentPlayer].myTeam.listTokens)
                            for token in self.gameboard.playersOnBoard[self.gameboard.currentPlayer].myTeam.listTokens:
                                # If the tokenList contain an availabilityReward then it remove this one, and call the awake function on all inventors
                                # Then, it leave the loop
                                if token.type == "availabilityReward":
                                    self.gameboard.playersOnBoard[self.gameboard.currentPlayer].myTeam.listTokens.remove(token)
                                    self.gameboard.awakeCurrentPlayer()
                                    break
                            loopToken = False

                    #         Recycle button
                    if event.type == pygame.MOUSEBUTTONDOWN and Game.WINDOW_WIDTH * 2 + Game.WINDOW_WIDTH / 3 < event.pos[
                        0] < Game.WINDOW_WIDTH * 2 + Game.WINDOW_WIDTH / 3 + 60 and Game.HEIGHT / 10 * 9 + 30 < event.pos[
                        1] < Game.HEIGHT / 10 * 9 + 50:
                        self.gameboard.awakeCurrentPlayer()
                        self.gameboard.newTurn()
                        print("Recycle button yata ! ")

            pygame.display.flip()
예제 #28
0
class App:
    def __init__(self):
        # GAME: MAIN VARIABLES
        self.initial_time = time()
        self.level = 0
        self.start = False
        self.game_over = [False, ""]

        # GAMEBOARD
        self.Gameboard = Gameboard()
        self.constants = self.Gameboard.Constants
        self.width = self.constants.width
        self.height = self.constants.height
        self.cell_size = self.constants.cell_size
        self.grid = self.Gameboard.grid

        # SCOREBOARD
        self.scoreboard = Scoreboard()

        # PLATFORMS AND GATES
        self.platforms = self.Gameboard.platforms
        self.entry_gate = self.Gameboard.generate_gate(self.platforms)
        self.exit_gate = self.Gameboard.generate_gate(
            self.platforms, self.entry_gate.row_index, exit_gate=True)

        # TOOLS
        self.user_x = 0
        self.user_y = self.scoreboard.height
        self.cursor_displacement = self.cell_size
        self.tools = {
            "umbrella": [],
            "blocker": [],
            "right_s": [],
            "left_s": []
        }

        # LEMMING
        self.alive = []
        self.saved = []
        self.dead = []
        self.Lemming = Lemming(self.entry_gate.x, self.entry_gate.y,
                               self.platforms)
        self.lemmings_num = self.Lemming.lemmings_num

        # DRAW
        self.Draw = Draw(self.platforms, self.entry_gate, self.exit_gate)

        # PYXEL
        self.pyxel_window_title = "Lemmings"
        pyxel.init(self.width, self.height, caption=self.pyxel_window_title)

        pyxel.load("./assets/resources.pyxres")

        pyxel.run(self.interaction, self.update)

    def interaction(self):
        """Allows the user to interact with the grid to place tools in the map.
        This function also add the option to quit the program by pressing Q.
        """
        if pyxel.btnp(pyxel.KEY_SPACE):
            # Start the game
            self.start = True
        elif pyxel.btnp(pyxel.KEY_LEFT) and self.user_x > 0:
            # Move to the left
            self.user_x -= self.cursor_displacement
        elif pyxel.btnp(pyxel.KEY_RIGHT) and self.user_x < self.width - 16:
            # Move to the right
            self.user_x += self.cursor_displacement
        elif pyxel.btnp(pyxel.KEY_UP) and self.user_y > 32:
            # Move up
            self.user_y -= self.cursor_displacement
        elif pyxel.btnp(pyxel.KEY_DOWN) and self.user_y < self.height - 16:
            # Move down
            self.user_y += self.cursor_displacement
        elif pyxel.btnp(pyxel.KEY_U):
            # Place an umbrella
            tools = Tools(self.user_x, self.user_y, "umbrella")
            umbrella_x, umbrella_y, umbrella_img = tools.umbrella()

            idx, is_tool = self.same_tool_there(umbrella_x, umbrella_y,
                                                self.tools["umbrella"])

            if is_tool:
                # check if there's the same umbrella already there
                self.tools["umbrella"].pop(idx)
            elif not self.tool_in_tools(umbrella_x, umbrella_y):
                self.tools["umbrella"].append(
                    [umbrella_x, umbrella_y, umbrella_img])

        elif pyxel.btnp(pyxel.KEY_B):
            # Place a blocker
            tools = Tools(self.user_x, self.user_y, "blocker")
            blocker_x, blocker_y, blocker_img = tools.blocker()

            idx, is_tool = self.same_tool_there(blocker_x, blocker_y,
                                                self.tools["blocker"])

            if is_tool:
                # check if there's the same blocker already there
                self.tools["blocker"].pop(idx)
            elif not self.tool_in_tools(blocker_x, blocker_y):
                self.tools["blocker"].append(
                    [blocker_x, blocker_y, blocker_img])
        elif pyxel.btnp(pyxel.KEY_R):
            # Place a right stair
            tools = Tools(self.user_x, self.user_y, "right_stair")
            right_s_x, right_s_y, right_s_right, right_s_img = tools.right_stair(
            )

            if not self.tool_in_tools(right_s_x, right_s_y):
                self.tools["right_s"].append(
                    [right_s_x, right_s_y, right_s_right, right_s_img])
        elif pyxel.btnp(pyxel.KEY_L):
            # Place a left stair
            tools = Tools(self.user_x, self.user_y, "left_stair")
            left_s_x, left_s_y, left_s_left, left_s_img = tools.left_stair()

            if not self.tool_in_tools(left_s_x, left_s_y):
                self.tools["left_s"].append(
                    [left_s_x, left_s_y, left_s_left, left_s_img])
        elif pyxel.btnp(pyxel.KEY_Q):
            # Quit the program
            pyxel.quit()

    def tool_in_tools(self, tool_x, tool_y):
        """Check if the coordinates x and y of the tools coincide
        with some existing ones of any tool"""
        for umbrella in self.tools["umbrella"]:
            # Check if it coincides with an umbrella
            if umbrella[0] == tool_x and umbrella[1] == tool_y:
                return True
        for blocker in self.tools["blocker"]:
            # Check if it coincides with a blocker
            if blocker[0] == tool_x and blocker[1] == tool_y:
                return True
        for right_s in self.tools["right_s"]:
            # Check if it coincides with a right stair
            if right_s[0] == tool_x and right_s[1] == tool_y:
                return True
        for left_s in self.tools["left_s"]:
            # Check if it coincides with a left stair
            if left_s[0] == tool_x and left_s[1] == tool_y:
                return True
        return False

    def same_tool_there(self, tool_x, tool_y, tool_list):
        """The same tool is there"""
        is_tool = False
        idx = 0
        for i in range(len(tool_list)):
            if tool_x == tool_list[i][0] and tool_y == tool_list[i][1]:
                is_tool = True
                idx = i

        return idx, is_tool

    def update(self):
        """Updates the players and draw the game."""
        # LEMMINGS
        if self.start and not self.game_over[0]:
            lemmings = self.Lemming.update_player(self.tools)

            for i in range(len(lemmings)):
                if (lemmings[i].x == self.exit_gate.x
                        and lemmings[i].y == self.exit_gate.y
                        and i not in self.saved):
                    # Lemming saved
                    self.saved.append(i)
                    if i in self.alive:
                        self.alive.remove(i)
                elif lemmings[i].alive and i not in self.alive:
                    # Lemming alive
                    self.alive.append(i)
                elif lemmings[i].alive == False and i not in self.dead:
                    # Lemming dead
                    self.dead.append(i)
                    if i in self.alive:
                        self.alive.remove(i)

        if len(self.saved) == self.lemmings_num:
            self.game_over[0] = True
            self.game_over[1] = "win"
        elif len(self.dead) == self.lemmings_num:
            self.game_over[0] = True
            self.game_over[1] = "lose"

        # SCOREBOARD
        total_alive = len(self.alive)
        total_saved = len(self.saved)
        total_dead = len(self.dead)
        total_stairs = len(self.tools["right_s"]) + len(self.tools["left_s"])
        total_umbrellas = len(self.tools["umbrella"])
        total_blockers = len(self.tools["blocker"])
        self.scoreboard = Scoreboard(self.level, total_alive, total_saved,
                                     total_dead, total_stairs, total_umbrellas,
                                     total_blockers)

        # DRAW
        if self.start and self.game_over[0]:
            self.Draw.draw_game(self.scoreboard, self.Lemming.before_start(),
                                self.user_x, self.user_y, self.tools,
                                self.start, self.game_over[1])
        elif self.start:
            self.Draw.draw_game(self.scoreboard, lemmings, self.user_x,
                                self.user_y, self.tools, self.start)
        else:
            self.Draw.draw_game(self.scoreboard, self.Lemming.before_start(),
                                self.user_x, self.user_y, self.tools,
                                self.start)
예제 #29
0
from Gameboard import Gameboard
from Ship import Ship, Battleship, Destroyer

if __name__ == "__main__":
    gb = Gameboard()
    ships = [Battleship, Destroyer, Destroyer]
    for ship in ships:
        ship(gb).place_ship_on_gameboard()

    resultFromHit = ""
    gb.print_board(1)
    while True:
        inp = input("Enter coordinates (row, col), e.g. A5 = ")
        if inp.lower() == "show":
            gb.refresh_screen()
            print(" \n")
            gb.print_board(2)
        else:
            resultFromHit = gb.hit_and_get_result(inp)

            if Ship.is_any_dead(gb):
                resultFromHit = "Sunk"

            gb.refresh_screen()
            if resultFromHit != "":
                print("*** {} *** \n".format(resultFromHit))

            gb.print_board(1)
            if Ship.AliveShips <= 0:
                print("Well done! You completed the game in {} shots".format(
                    gb.hits))