└── dominoes.py /dominoes.py: -------------------------------------------------------------------------------- 1 | import random 2 | 3 | 4 | class Game: 5 | def __init__(self): 6 | self.domino_set = [] 7 | self.stock_pieces = [] 8 | self.computer_pieces = [] 9 | self.player_pieces = [] 10 | self.domino_snake = [] 11 | self.status = '' 12 | self.domino_score = {} 13 | 14 | def ai_move(self, comp_pieces, dom_snake): 15 | temp_list = comp_pieces + dom_snake 16 | comp_pieces_rating = {} 17 | for i in range(0, 7): 18 | self.domino_score[i] = sum(x.count(i) for x in temp_list) 19 | for domino in comp_pieces: 20 | if self.domino_score[domino[0]] != self.domino_score[domino[1]]: 21 | comp_pieces_rating[tuple(domino)] = self.domino_score[domino[0]] + self.domino_score[domino[1]] 22 | else: 23 | comp_pieces_rating[tuple(domino)] = self.domino_score[domino[0]] 24 | comp_pieces_rating_sorted = dict(sorted(comp_pieces_rating.items(), key=lambda x: x[1], reverse=True)) 25 | return comp_pieces_rating_sorted 26 | 27 | def game_initiate(self): 28 | for i in range(7): 29 | for j in range(7): 30 | if [j, i] not in self.domino_set: 31 | self.domino_set.append([i, j]) 32 | while True: 33 | random.shuffle(self.domino_set) 34 | self.stock_pieces = self.domino_set[:14] 35 | self.computer_pieces = self.domino_set[14:21] 36 | self.player_pieces = self.domino_set[21:] 37 | computer_max = 0 38 | player_max = 0 39 | 40 | for i in range(7): 41 | if self.computer_pieces[i][0] == self.computer_pieces[i][1]: 42 | if computer_max < self.computer_pieces[i][0]: 43 | computer_max = self.computer_pieces[i][0] 44 | if self.player_pieces[i][0] == self.player_pieces[i][1]: 45 | if player_max < self.player_pieces[i][0]: 46 | player_max = self.player_pieces[i][0] 47 | 48 | if computer_max > player_max: 49 | status = 'player' 50 | self.domino_snake.append([computer_max, computer_max]) 51 | self.computer_pieces.remove([computer_max, computer_max]) 52 | return self.stock_pieces, self.computer_pieces, self.player_pieces, self.domino_snake, status 53 | elif player_max > computer_max: 54 | status = 'computer' 55 | self.domino_snake.append([player_max, player_max]) 56 | self.player_pieces.remove(([player_max, player_max])) 57 | return self.stock_pieces, self.computer_pieces, self.player_pieces, self.domino_snake, status 58 | 59 | def game_step(self, status=''): 60 | if status == '': 61 | stock_pieces, computer_pieces, player_pieces, domino_snake, status = self.game_initiate() 62 | 63 | print(70*'=') 64 | print(f'Stock size: {len(self.stock_pieces)}') 65 | print(f'Computer pieces: {len(self.computer_pieces)}\n') 66 | 67 | if len(self.domino_snake) > 6: 68 | begin = self.domino_snake[:3] 69 | end = self.domino_snake[-3:] 70 | print(*begin, '...', *end, sep='') 71 | else: 72 | print(*self.domino_snake, sep='') 73 | 74 | print(f'\nYour pieces:') 75 | for i in range(len(self.player_pieces)): 76 | print(f'{i+1}:{self.player_pieces[i]}') 77 | if not (self.domino_snake[0][0] == self.domino_snake[len(self.domino_snake)-1][1] and sum(x.count(self.domino_snake[0][0]) for x in self.domino_snake) == 8): 78 | if status == 'computer': 79 | input('Status: Computer is about to make a move. Press Enter to continue...') 80 | computer_pieces_score = self.ai_move(self.computer_pieces, self.domino_snake) 81 | items = iter(computer_pieces_score.items()) 82 | while True: 83 | try: 84 | item = next(items) 85 | if len(self.computer_pieces) and len(self.player_pieces): 86 | index_ = self.computer_pieces.index(list(item[0])) 87 | if self.domino_snake[-1][1] in self.computer_pieces[index_]: 88 | if self.domino_snake[-1][1] == self.computer_pieces[index_][0]: 89 | self.domino_snake.append(self.computer_pieces.pop(index_)) 90 | break 91 | elif self.domino_snake[-1][1] == self.computer_pieces[index_][1]: 92 | temp_item = self.computer_pieces.pop(index_) 93 | self.domino_snake.append(temp_item[::-1]) 94 | break 95 | elif self.domino_snake[0][0] in self.computer_pieces[index_]: 96 | if self.domino_snake[0][0] == self.computer_pieces[index_][1]: 97 | self.domino_snake.insert(0, self.computer_pieces.pop(index_)) 98 | break 99 | elif self.domino_snake[0][0] == self.computer_pieces[index_][0]: 100 | self.domino_snake.insert(0, self.computer_pieces.pop(index_)[::-1]) 101 | break 102 | elif not len(self.player_pieces): 103 | return 'player_won' 104 | 105 | except StopIteration: 106 | if len(self.stock_pieces): 107 | self.computer_pieces.append(self.stock_pieces.pop()) 108 | break 109 | if not len(self.player_pieces): 110 | return 'player_won' 111 | self.status = 'player' 112 | elif status == 'player': 113 | print(f'Status: It\'s your turn to make a move. Enter your command.') 114 | while True: 115 | try: 116 | next_step = int(input()) 117 | if len(self.computer_pieces) and len(self.player_pieces): 118 | if next_step > 0: 119 | if self.domino_snake[-1][1] in self.player_pieces[next_step - 1]: 120 | if self.domino_snake[-1][1] == self.player_pieces[next_step - 1][0]: 121 | self.domino_snake.append(self.player_pieces.pop(next_step - 1)) 122 | elif self.domino_snake[-1][1] == self.player_pieces[next_step - 1][1]: 123 | self.domino_snake.append(self.player_pieces.pop(next_step - 1)[::-1]) 124 | else: 125 | raise Exception 126 | elif next_step < 0: 127 | if self.domino_snake[0][0] in self.player_pieces[abs(next_step) - 1]: 128 | if self.domino_snake[0][0] == self.player_pieces[abs(next_step) - 1][1]: 129 | self.domino_snake.insert(0, self.player_pieces.pop(abs(next_step) - 1)) 130 | elif self.domino_snake[0][0] == self.player_pieces[abs(next_step) - 1][0]: 131 | self.domino_snake.insert(0, self.player_pieces.pop(abs(next_step) - 1)[::-1]) 132 | else: 133 | raise Exception 134 | elif next_step == 0 and len(self.stock_pieces): 135 | self.player_pieces.append(self.stock_pieces.pop()) 136 | elif not len(self.computer_pieces): 137 | return 'computer_won' 138 | elif not len(self.player_pieces): 139 | return 'player_won' 140 | break 141 | except (ValueError, IndexError): 142 | print('Invalid input. Please try again.') 143 | except Exception: 144 | print('Illegal move. Please try again.') 145 | self.status = 'computer' 146 | elif len(self.computer_pieces) and len(self.player_pieces): 147 | return 'draw' 148 | return self.status 149 | 150 | 151 | if __name__ == '__main__': 152 | my_game = Game() 153 | status_ext = my_game.game_step() 154 | while True: 155 | if status_ext == 'player': 156 | status_ext = my_game.game_step('player') 157 | elif status_ext == 'computer': 158 | status_ext = my_game.game_step('computer') 159 | elif status_ext == 'computer_won': 160 | print('Status: The game is over. The computer won!') 161 | break 162 | elif status_ext == 'player_won': 163 | print('Status: The game is over. You won!') 164 | break 165 | elif status_ext == 'draw': 166 | print('Status: The game is over. It\'s a draw!') 167 | break 168 | --------------------------------------------------------------------------------