# IB113, skupina 05 # 4. domácí úkol # termín udevzdání 28.11.2019 12:00 # Za úkoly lze získat až 35 bodů. Vypracovávejte je samostatně. # Úlohy na sebe navazují, doporučuji řešit v pořadí. # Řešení pište přímo do tohoto souboru. Neměňte při tom názvy funkcí, # ani jejich parametry. Soubor uložte pod jménem 'du02_JMENO.py' do # odevzdávárny předmětu IB113 do složky 'Skupina_5/DU04' v IS. # v případě nejasností pište na xlux()fi.muni.cz # PRAVIDLA HRY # Napis hru blokovani, viz http://www.papg.com/show?2XMX # vypis se musi shodovat se vzorovym vypisem # UKOL 01: Implementujte jak hru člověka proti počítači (20 bodu) # UKOL 02: Vytvor dve automaticke strategie (10 bodu) # UKOL 03: Napiste jednu slozitejsi strategii (5 bodu) # Za kazdou dalsi ziskas bonusove body # RADY # Rada 1: Otestujte si, že program korektně funguje na obdélníkových plánech. # TODO: UKOL 01 # 20 bodu # vytvor blokovaci hru, kterou mohou hrat dva hraci proti sobe # soucasti je vypis aktualniho stavu hry a komunikace s hraci # Hra musi byt robustni proti spatnemu vstupu. def print_board(board): """ 2 body vytiskni hraci pole dle vzoru nize :param board: 2D list """ # TODO: dopln funcionalitu print('ERR: Tisk pole zatím není implementován.') def end_of_game(board): """ 3 body True pokud uz na hracim planu nezbyva zadne volne pole :param board: 2D list :return: bool """ # TODO: dopln funkcionalitu print('ERR: Kontrola ukončení hry není implementována.') return True def write_symbol(x, y, board, symbol): """ 2 body Zapise symbol 'symbol' na souradnice herniho planu x, y :param x: cislo radku :param y: cislo sloupce :param board: hraci plan :param symbol: symbol 'x' nebo 'o' :return: None """ # TODO: dopln funkcionalitu print('ERR: Zapis znaku není implementován.') def is_empty(x, y, board): """ 3 body Zkontroluje, zda dane pole je prazdne (netahlo se na nej, neni blokovane) :param x: cislo radku :param y: cislo sloupce :param board: hraci pole :return: True, pokud je mozne na pole hrat """ # TODO: dopln funkcionalitu print('ERR: Kontrola tahu neni implementovana.') def human_player(board, symbol): """ funkce umoznuje hrat BLOCK GAME lidskemu hraci Nejprve vypise hraci pole a nabidne hraci zadat souradnice jeho tahu. Kazdy tah zkontroluje zda je validni. Funkce nesmi spadnout s chybou, pokud hrac chce hrat na pole, ktere je jiz blokovane, ktere je mimo hraci plan nebo zada misto souradnic nahodny sled znaku. Pri nevalidnim vstupu funkce popise problem a necha hrace hrat znovu. :param board: instance hraciho planu pred tahem :param symbol: identifikacni znak hrace :return: None """ # TODO: dopln funkcionalitu print('ERR: Hra lidskeho hráče zatím není implementována.') # TODO: UKOL 02 # 10 bodu # implementuj strategie random a first available # kazdou strategii si lze zahrat s lidskym hracem pomoci funkce def ai_first_available(board, symbol): """ strategie, volici dalsi tah jako prvni volne pole pri pruchodu hraciho planu po radcich :param board: instance hraciho planu pred tahem :param symbol: identifikacni znak hrace :return: None """ pass def ai_random(board, char): """ strategie, voli dalsi tah nahodne :param board: instance hraciho planu pred tahem :param char: identifikacni znak hrace :return: None """ pass # TODO: UKOL 03 # 5 bodu # implementuj jednu dalsi AI, za vice AI dostanes bonusove body def ai_max_impact(board, symbol): """ tahne na souradnice, na kterych zablokuje co nejvice poli :param board: instance hraciho planu pred tahem :param symbol: identifikacni znak hrace :return: None """ pass def ai_last_shot(board, symbol): """ pokud je moze v tomto kole zvitezit, zvitezi, jinak hraje nahodne :param board: instance hraciho planu pred tahem :param symbol: identifikacni znak hrace :return: None """ pass def ai_my(board, symbol): """ vlastni vyhravajici strategie :param board: instance hraciho planu pred tahem :param symbol: identifikacni znak hrace :return: None """ pass def block_game(length, height, player1=human_player, player2=human_player): """ funkce spusti jednu instanci BLOCK GAME funkce prijima ruzne strategie hry, zakladni strategii je interakce s lidskym hracem hraci plan je instanci teto funkce, kazda strategie, pokud je zavolana, zmeni stav planu funkce tiskne informace o hre, pokud je nastaveny parametr output na True :param length: delka hraciho planu, od 1 do 9 :param height: vyska hraciho planu, od 1 do 9 :param player1: strategie prvniho hrace :param player2: strategie druheho hrace :return: pocet odehranych kol example: cast vypisu hry 6 x 5 ctvrte kolo, na tahu je hrac 'x' vypis noveho stavu hraciho planu na zacatku pateho kola: ... ROUND 4 player 'x' 1 2 3 4 5 +-----------+ 1 | . # # # . | 2 | # # o # . | 3 | x # # # # | 4 | # # . # o | 5 | . . . # # | 6 | . . . . . | +-----------+ first coordinate: >? 6 second coordinate: >? 1 ROUND 5 player 'o' 1 2 3 4 5 +-----------+ 1 | . # # # . | 2 | # # o # . | 3 | x # # # # | 4 | # # . # o | 5 | # # . # # | 6 | x # . . . | +-----------+ first coordinate: >? | ... """ board = [['.' for _ in range(height)] for _ in range(length)] symbols = ['x', 'o'] players = [player2, player1] game_round = 0 symbol = symbols[0] # cyklus hry # hráči se střídají, dokud není konec hry while not end_of_game(board): # rozhodnutí, jaký hraje hráč a jaký má symbol game_round += 1 symbol = symbols[game_round % 2] player = players[game_round % 2] # vytištění informací o probíhajícím kole print() print('ROUND {}'.format(game_round)) # hra hráče # úprava hracího plánu board = player(board, symbol) # tisk aktuálního stavu hracího pole print_board(board) print(f'player {symbol} won') print('end of the game') return game_round if __name__ == '__main__': block_game(5, 6)