diff --git a/tictactoe-v2.1.1.py b/tictactoe-v2.1.1.py new file mode 100644 index 0000000..9d4156a --- /dev/null +++ b/tictactoe-v2.1.1.py @@ -0,0 +1,242 @@ +# algorithm steps +# +# prerequisites +# 01 clear the screen +# 02 allow a user to determine the size of the playfield +# 03 allow a user to enter names of two players +# +# 1 clear the screen +# 2 print the current state of the game +# 3 allow for one player or the other to insert coords +# 4 place an 'o' or an 'x' to the coresponding coords +# 5 check if the game should end (if someone won) +# 5.1 if yes -> end the game +# 5.2 if no -> jump to step 1 + +import os + +konec = 0 +kdoHraje = 0 +error = 0 +def init(): + global konec, kdoHraje + + # prerequisite 01 -> clear the screen + clearScreen() + + # prerequisite 02 -> allow a user to determine the size of the playfield + size = 0 + while size == 0: + try: + size = int(input("Velikost hraciho pole (n*n): ")) + except ValueError: + clearScreen() + continue + + + # prerequisite 03 -> allow a user to enter names of two players + jmeno1 = input("Jmeno jednoho hrace: ") + jmeno2 = input("Jmeno druheho hrace: ") + + pole = [] + temp = [] + for i in range(size): + for j in range(size): + temp.append(' ') + pole.append(temp) + temp = [] + + while konec == 0: + herniKolo(pole, jmeno1, jmeno2) + +def clearScreen(): + if os.name == "posix": + os.system("clear") + if os.name == "nt": + os.system("cls") + + +def vypisHru(pole, jmeno1, jmeno2): + global error + + if error == 1: + print("Neplatna hodnota policka") + error = 0 + print(jmeno1, "(o) vs", jmeno2, "(x)") + for i in range(len(pole)): + for j in range(len(pole)): + print(f"[{pole[i][j]}]", end=" ") + print(" ") + +def check(pole): + # horizontal checking + # 0 is for when 'o's win and 1 is for when 'x's win + o = x = 0 + for i in range(len(pole)): + for j in range(len(pole)): + if pole[i][j] == 'o': + o += 1 + if pole[i][j] == 'x': + x += 1 + if o >= 3: + return 0 + elif x >= 3: + return 1 + + # vertical checking + o = x = 0 + for i in range(len(pole)): + for j in range(len(pole)): + if pole[j][i] == 'o': + o += 1 + if pole[j][i] == 'x': + x += 1 + if o >= 3: + return 0 + elif x >= 3: + return 1 + + # diagonal checking + for i in range(len(pole)): + for j in range(len(pole)): + if pole[i][j] == 'o': + # only 6 possibilities, so the program will try all of them + try: + if pole[i-1][j-1] == 'o' and pole[i-2][j-2] == 'o': + return 0 + except IndexError: + continue + try: + if pole[i-1][j+1] == 'o' and pole[i-2][j+2] == 'o': + return 0 + except IndexError: + continue + try: + if pole[i+1][j-1] == 'o' and pole[i+2][j-2] == 'o': + return 0 + except IndexError: + continue + try: + if pole[i+1][j+1] == 'o' and pole[i+2][j+2] == 'o': + return 0 + except IndexError: + continue + try: + if pole[i-1][j-1] == 'o' and pole[i+1][j+1] == 'o': + return 0 + except IndexError: + continue + try: + if pole[i-1][j+1] == 'o' and pole[i+1][j-1] == 'o': + return 0 + except IndexError: + continue + + for i in range(len(pole)): + for j in range(len(pole)): + if pole[i][j] == 'x': + try: + if pole[i-1][j-1] == 'x' and pole[i-2][j-2] == 'x': + return 1 + except IndexError: + continue + try: + if pole[i-1][j+1] == 'x' and pole[i-2][j+2] == 'x': + return 1 + except IndexError: + continue + try: + if pole[i+1][j-1] == 'x' and pole[i+2][j-2] == 'x': + return 1 + except IndexError: + continue + try: + if pole[i+1][j+1] == 'x' and pole[i+2][j+2] == 'x': + return 1 + except IndexError: + continue + try: + if pole[i-1][j-1] == 'x' and pole[i+1][j+1] == 'x': + return 1 + except IndexError: + continue + try: + if pole[i-1][j+1] == 'x' and pole[i+1][j-1] == 'x': + return 1 + except IndexError: + continue + + # draw checking + # 2 is for when a draw occurs + pocet = 0 + for i in range(len(pole)): + for j in range(len(pole)): + if pole[i][j] == 'o' or pole[i][j] == 'x': + pocet += 1 + if pocet == len(pole)*len(pole): + return 2 + +def herniKolo(pole, jmeno1, jmeno2): + global konec, kdoHraje, error + + # step 1 -> clear the screen + # + # cross-platform (Windows, Unix-like OSs) + clearScreen() + + # step 2 -> print the current state of the game + vypisHru(pole, jmeno1, jmeno2) + + # step 3 -> allow for one player or the other to insert coords + rada = sloupec = 0 + while rada == sloupec == 0: + try: + rada, sloupec = map(int, input().split()) + except ValueError: + clearScreen() + vypisHru(pole, jmeno1, jmeno2) + continue + + # step 4 -> place an 'o' or an 'x' to the coresponding coords + # + # only if there isn't another symbol present and the coords are valid + # the 'o' or 'x' is determined by the kdoHraje variable + # - if it is 0, then an 'o' is placed, if it is 1, an 'x' is placed instead + # the rows and columns are marked 1, 2 and 3, not 0, 1 and 2 as the indexes + # for better user experience + try: + if pole[rada-1][sloupec-1] == ' ' and 1 <= rada <= len(pole) and 1 <= sloupec <= len(pole): + if kdoHraje == 0: + pole[rada-1][sloupec-1] = 'o' + kdoHraje = 1 + elif kdoHraje == 1: + pole[rada-1][sloupec-1] = 'x' + kdoHraje = 0 + except IndexError: + error = 1 + + # step 5 -> check if the game should end (if someone won) + vyherce = check(pole) + + if vyherce == 0: + # step 5.1 -> if yes -> end the game + clearScreen() + print("Vyhralo o!") + vypisHru(pole, jmeno1, jmeno2) + konec = 1 + # step 5.2 -> if no -> jump to step 1 + + if vyherce == 1: + clearScreen() + print("Vyhralo x!") + vypisHru(pole, jmeno1, jmeno2) + konec = 1 + + if vyherce == 2: + clearScreen() + print("Remiza!") + vypisHru(pole, jmeno1, jmeno2) + konec = 1 + +if __name__ == "__main__": + init() \ No newline at end of file