nn.py 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. '''
  2. * This file is part of the Chinchon (https://notabug.org/alkeon/chinchon.
  3. * Copyright (c) 2020 Alejandro "alkeon" Castilla.
  4. *
  5. * This program is free software: you can redistribute it and/or modify
  6. * it under the terms of the GNU General Public License as published by
  7. * the Free Software Foundation, version 3.
  8. *
  9. * This program is distributed in the hope that it will be useful, but
  10. * WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  12. * General Public License for more details.
  13. *
  14. * You should have received a copy of the GNU General Public License
  15. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  16. '''
  17. from deck import Deck
  18. from hand import Hand
  19. from player import Player, debug
  20. from random import shuffle
  21. from copy import deepcopy
  22. def is_int(string):
  23. try:
  24. int(string)
  25. return True
  26. except ValueError:
  27. return False
  28. '''
  29. Check if one player has more than 99 points(loser player)
  30. '''
  31. def has_loser(points):
  32. i = 0
  33. is_loser = False
  34. while(i < len(points)):
  35. if(points[i] >= 100):
  36. is_loser = True
  37. print('Player ' + str(i) + ' has ' + str(points[i]) + ' points')
  38. i += 1
  39. return is_loser
  40. '''
  41. Distribute 7 cards to every player
  42. '''
  43. def distribute_cards(list_of_players, deck):
  44. position = 0
  45. new_list_of_players = list()
  46. while(position < len(list_of_players)):
  47. hand = Hand()
  48. i = 0
  49. while(i < deck.size() and i < 7):
  50. hand.insert(0, deck.get(i))
  51. i += 1
  52. while(i > 0):
  53. deck.pop(0)
  54. i -= 1
  55. new_list_of_players.append(Player(hand,
  56. list_of_players[position].get_mode(), list_of_players[position].get_hard_mode()))
  57. position += 1
  58. return new_list_of_players
  59. def shuffle_reversed_cards(deck, reversed_deck):
  60. top_card = reversed_deck.get(0)
  61. deck.add_cards(reversed_deck.get_cards()[1:])
  62. deck.shuffle()
  63. reversed_deck.clear()
  64. reversed_deck.insert(0, top_card)
  65. '''
  66. Main algorithm for game.
  67. One time flag is used for limit how many games will be played
  68. '''
  69. def original(one_time):
  70. is_hard_mode, number_of_players, list_of_players = game_options()
  71. points = [0] * number_of_players
  72. is_first_game = True
  73. if not one_time:
  74. is_first_game = False
  75. i = 0
  76. while(not has_loser(points) and one_time == is_first_game):
  77. deck = Deck()
  78. card = deck.get_top_and_pop()
  79. list_of_one_card = list()
  80. list_of_one_card.append(card)
  81. player_with_cards = list()
  82. reversed_deck = Deck(list_of_one_card)
  83. player_with_cards = distribute_cards(list_of_players, deck)
  84. list_of_players = deepcopy(player_with_cards)
  85. selected_number_player = 0
  86. choice = 0
  87. while(choice != 2 and selected_number_player < len(list_of_players)):
  88. print(reversed_deck.get(0))
  89. player = list_of_players[selected_number_player]
  90. if(player.mode == 2 or debug):
  91. print('your hand')
  92. print(player)
  93. print(player.return_hand().calculate_points())
  94. choice = player.choose_option(deck, reversed_deck)
  95. if(choice != 2):
  96. i += 1
  97. if(deck.size() <= 5):
  98. shuffle_reversed_cards(deck, reversed_deck)
  99. selected_number_player += 1
  100. if(selected_number_player >= len(list_of_players)):
  101. selected_number_player = 0
  102. iterator = 0
  103. while(iterator < len(list_of_players)):
  104. print(list_of_players[iterator].return_hand())
  105. points[iterator] += list_of_players[iterator].return_hand().calculate_points()
  106. iterator += 1
  107. if one_time:
  108. is_first_game = False
  109. '''
  110. Ask user AI difficulty, number of players and which players are human or AI.
  111. '''
  112. def game_options():
  113. is_hard_mode_string = input('0.- Easy mode\n1.- Hard mode\n')
  114. is_hard_mode = int()
  115. if(is_int(is_hard_mode_string)):
  116. is_hard_mode = int(is_hard_mode_string)
  117. else:
  118. is_hard_mode = 0
  119. player_string = input('Number of players (max 6) ')
  120. number_of_players = int()
  121. if(is_int(player_string)):
  122. number_of_players = int(player_string)
  123. else:
  124. number_of_players = 2
  125. if(number_of_players > 6 or number_of_players < 2): number_of_players = 6
  126. list_of_players = list()
  127. iterator = 0
  128. while(iterator < number_of_players):
  129. hand = Hand()
  130. string = input('1.- AI\n2.- Human\n')
  131. if(is_int(string)):
  132. list_of_players.append(Player(hand, int(string), is_hard_mode))
  133. else:
  134. list_of_players.append(Player(hand, 2, is_hard_mode))
  135. iterator += 1
  136. return is_hard_mode, number_of_players, list_of_players
  137. if __name__ == "__main__":
  138. decision_s = input('1.- One time game\n2.- Original\n')
  139. decision = int()
  140. if(is_int(decision_s)):
  141. decision = int(decision_s)
  142. else:
  143. decision = 1
  144. if(decision == 1):
  145. original(True)
  146. else:
  147. original(False)