CLI Tic-Tac-Toe w Pythonie

5
ShreddedPumpkin 2020-05-23 03:36.

Czy jest jakiś sposób, żebym mógł sprawić, że moja deska Tic-Tac-Toe była bardziej estetyczna?

Czy jest coś, co mogę poprawić poza wyglądem tablicy?

from AskUser import ask_user as As
from random import randint
Choice = 0
Player1 = None
Player2 = None

#Introduction
def intro():
    global Choice
    while True:
        Choice = As("Press 1 for Multiplayer\nPress 2 for Single player: ", int)
        if Choice != (1 or 2):
            print("Invalid Input")
            continue
        else:
            break
    return Choice

#Players
def choosenplayer():
        # Defines whos going first
    if Choice == 1:
        def whofirst():
            global q
            q = randint(1, 2)
            if q == 1:
                print(f"Player 1 ({Player1}) is going first")
            else:
                print(f"Player 2 ({Player2}) is going first")
        # Defines the player
        while True:
            global Player2
            global Player1
            Player = As("Press 1 if you want to be 'X'\nPress 2 if you want to be 'O': ", int)
            if Player == 1:
                Player1 = "X"
                Player2 = "O"
                break
            elif Player == 2:
                Player1 = "O"
                Player2 = "X"
                break
            else:
                print("Invalid Input")
                continue
        print(f"Player 1 is {Player1}, Player 2 is {Player2}")
        whofirst()
        return Player1 and Player2

board = list (range(0,9))
#Initialise The Tic Tac Toe Board
def t_Board():
    print(f"| {board[0]} | {board[1]} | {board[2]} |\n_____________")
    print(f"| {board[3]} | {board[4]} | {board[5]} |\n_____________")
    print(f"| {board[6]} | {board[7]} | {board[8]} |")

#Stops the game if theres a win
def stops_board():
    if (board[0] == board[1] == board[2]) or (board[3] == board[4] == board[5]) or (
    board[6] == board[7] == board[8]) or (board[0] == board[3] == board[6]) or (
    board[1] == board[4] == board[7]) or (board[2] == board[5] == board[8]) or (
    board[0] == board[4] == board[8]) or (board[2] == board[4] == board[6]):
        return True

#Ask for X User input
x_data = []
def xuser_input():
    def over_ride():
        global x
        while True:
            x = As("Player X, Please enter a number to place: ",int)
            if board[x] == "X" or board[x] == "O":
                print("You can't place here, it is already used")
                continue
            else:
                break
    while True:
        over_ride()
        if (x > 10) or (x < 0):
            print("Input must be Bigger than 0 and Smaller than 9")
            continue
        try:
            board[x] = "X"
            x_data.append(x)
        except (IndexError):
            print("Invalid input")
            continue
        t_Board()
        break
#Ask for Y User input
O_data = []
def yuser_input():
    def over_rideo():
        global O
        while True:
            O = As("Player O, Please enter a number to place: ",int)
            if board[O] == "X" or board[O] == "O":
                print("You can't place here, it is already used")
                continue
            else:
                break
    while True:
        over_rideo()
        if (O > 10) or (O < 0):
            print("Input must be Bigger than 0 and Smaller than 9")
            continue
        try:
            board[O] = "O"
            O_data.append(O)
        except (IndexError):
            print("Invalid input")
            continue
        t_Board()
        break

print("Welcome to TicTacToe simulator")
intro()
choosenplayer()
t_Board()
if ((q == 1) and (Player1 == "X")) or ((q == 2) and (Player2 =="X")):
    for i in range(5):
        xuser_input()
        if stops_board():
            print(f"Congrats X, You are the winner")
            break
        if i == 4:
            print("This is a tie")
            break
        yuser_input()
        if stops_board():
            print(f"Congrats Y, You are the winner")
            break


elif ((q == 1) and (Player1 == "O")) or ((q == 2) and (Player2 == "O")):
    for i in range(5):
        yuser_input()
        if stops_board():
            print(f"Congrats O, You are the winner")
            break
        if i == 4:
            print("This is a tie")
            break
        xuser_input()
        if stops_board():
            print(f"Congrats X, You are the winner")
            break

To jest Asfunkcja

def ask_user(message, type_= str, valid=lambda x: True, invalid_message="Invalid"):
    while True:
        try:
            user_input = type_(input(message))
        except (ValueError, TypeError):
            print("Invalid input")
            continue
        if valid(user_input):
            return user_input
        else:
            print(invalid_message)

Ten kod jest w pełni funkcjonalny, ale tylko dla lokalnego trybu wieloosobowego. Na razie nie ma jeszcze żadnej sztucznej inteligencji.

2 answers

1
Joel V 2020-05-24 04:41.

Sprawdź moduł pyinputplus. Jest to dobre rozwiązanie, gdy prosisz użytkownika o konkretne dane wejściowe, na przykład gdy chcesz, aby użytkownik odpowiedział „tak” lub „nie”, albo w Twoim przypadku „X” lub „O”.

Więc w takim przypadku zrobiłbyś coś takiego:

from pyinputplus import *

inputChoice(('X', 'O'))

Który zwróci:

Please select one of: X, O

Alternatywnie, jako drugi argument metody inputChoice (), możesz wpisać ciąg znaków zachęty:

from pyinputplus import *

inputChoice(('X', 'O'), 'Please enter your letter: X or O)

Który zwróci:

Please enter your letter: X or O

Dane wejściowe będą działać jako pętla while, dopóki jedna z podanych opcji nie zostanie wprowadzona (wielkość liter nie jest domyślnie brana pod uwagę, chociaż myślę, że można to zmienić w argumentach funkcji). Jeśli wprowadzono nieprawidłowy wybór, kod zwróci (zakładając, że wprowadzono „x”)

'x' is not a valid choice.

pyinputplus i jego różne funkcje są świetne, gdy wymagają określonego wkładu użytkownika, ponieważ zapobiega konieczności umieszczania kilku instrukcji if / elif / else w pętli while. Oszczędza dużo czasu.

1
Jan Kuiken 2020-06-23 06:59.

Twoje pierwsze pytanie „czy tablica może być bardziej estetyczna” jest subiektywne, ale wolałbym, tylko dla znaków ASCII, coś takiego:

 X | O | 2 
---+---+---
 3 | X | 5  
---+---+---
 6 | 7 | O 

Ale możesz uczynić to jeszcze bardziej fantazyjnym, używając znaków do rysowania w pudełku Unicode , możesz je skopiować i wkleić ze strony Wikipedii `` Znak do rysowania pudełek '' :

 X │ O │ 2 
───┼───┼───
 3 │ X │ 5  
───┼───┼───
 6 │ 7 │ O 

Kilka innych uwag:

  • Funkcja ask_usermogłaby być równie dobra w pliku głównym, a zmiana jej nazwy w instrukcji import na Asnie czyni jej użycia jaśniejszym.
  • Możesz użyć głównej klauzuli ochronnej, aby wskazać między innymi, gdzie zaczyna się główna część kodu, zobacz na przykład to pytanie StackOverflow i zawarte w nim linki.
  • Pomyśl o bardziej opisowych nazwach funkcji, na przykład t_Boardbyłyby lepiej nazwane print_board.

MORE COOL STUFF

Jana Duggar: Wszystko, co powiedziała o miłości i jej 5-letnie okno na znalezienie „jednego”

Jana Duggar: Wszystko, co powiedziała o miłości i jej 5-letnie okno na znalezienie „jednego”

Jana Duggar otwarcie mówiła o swoich poszukiwaniach miłości. Oto wszystko, co powiedziała na ten temat i jej pięcioletnie okno na małżeństwo.

Sam Heughan dokładnie wie, co weźmie z zestawu „Outlander” - „Czuję się, jakbym był Jamiem, kiedy je zakładam”

Sam Heughan dokładnie wie, co weźmie z zestawu „Outlander” - „Czuję się, jakbym był Jamiem, kiedy je zakładam”

Gwiazda „Outlandera”, Sam Heughan, niedawno ujawnił, co zabierze z planu, aby upamiętnić Jamiego Frasera, rolę, która uczyniła go gwiazdą.

Piosenka wczesnych Beatlesów, która była jednym z „najbardziej ekscytujących występów” zespołu, według Insidera Fab Four

Piosenka wczesnych Beatlesów, która była jednym z „najbardziej ekscytujących występów” zespołu, według Insidera Fab Four

„She Loves You” została napisana w godzinę, nagrana w jeden dzień i była piosenką The Beatles z jednym z ich najlepszych wykonań w karierze.

Dolly Parton pomogła swojej „inwalidzkiej” babci, gdy żadne inne wnuki by tego nie zrobiły - ona też zrobiła jej psikusa

Dolly Parton pomogła swojej „inwalidzkiej” babci, gdy żadne inne wnuki by tego nie zrobiły - ona też zrobiła jej psikusa

Dolly Parton i jej babcia Bessie miały szczególny związek. Babcia Parton była bardzo chora, ale to nie powstrzymało Dolly przed zrobieniem jej psikusa.

Jakie jest najtwardsze drewno na świecie?

Jakie jest najtwardsze drewno na świecie?

Można by pomyśleć, że dąb lub hikora są wytrzymałe, ale jeśli chodzi o najtwardsze drewno na świecie, to nawet się do nich nie zbliżają.

10 najstraszniejszych stworzeń morskich kryjących się w głębinach oceanu

10 najstraszniejszych stworzeń morskich kryjących się w głębinach oceanu

Ocean jest pełen piękna, ale kryje też jedne z najstraszniejszych stworzeń morskich na świecie. Wiele z nich czai się głęboko pod powierzchnią oceanu, w mrocznym, podciśnieniowym świecie głębin morskich.

10 najlepszych zaklęć miecza w grze Minecraft

10 najlepszych zaklęć miecza w grze Minecraft

Jeśli walczysz z wrogimi mobami lub przygotowujesz się do scenariuszy PvP, znajomość najlepszych zaklęć miecza w Minecrafcie może dać ci znaczną przewagę. Zaklinanie mieczy pozwala zadawać większe obrażenia, zwiększać liczbę przedmiotów wypadających z potworów i wydłużać trwałość miecza.

13 krajów socjalistycznych, które wyglądają zupełnie inaczej

13 krajów socjalistycznych, które wyglądają zupełnie inaczej

Kiedy ludzie mówią o krajach socjalistycznych, często wyobrażają sobie pełną kontrolę rządu i brak własności prywatnej. Jednak w praktyce gospodarki socjalistyczne są bardzo zróżnicowane.

Podsumowanie Niedźwiedzia: Czy Marcus jest najmilszym, najłagodniejszym i najszczerszym mężczyzną w Chicago?

Podsumowanie Niedźwiedzia: Czy Marcus jest najmilszym, najłagodniejszym i najszczerszym mężczyzną w Chicago?

W „Children” pojawia się epizod ze znanym nazwiskiem i kilka druzgocących wiadomości

Czy za 9800 dolarów „zapakowałbyś ich” do tej siedmiomiejscowej Toyoty RAV4 z 2008 roku?

Czy za 9800 dolarów „zapakowałbyś ich” do tej siedmiomiejscowej Toyoty RAV4 z 2008 roku?

Uważa się, że ten RAV4 jest w doskonałym stanie i jest przygotowany do gry w muzyczne krzesła.

Furgonetka dostawcza Amazon zapala się w wyniku ognistej eksplozji podczas letnich upałów w Houston

Furgonetka dostawcza Amazon zapala się w wyniku ognistej eksplozji podczas letnich upałów w Houston

Na nagraniu z drona uchwycono strażaków, którzy najwyraźniej walczyli o ugaszenie pożaru.

Marvel's Black Panther Show będzie najważniejszym serialem animowanym w historii

Marvel's Black Panther Show będzie najważniejszym serialem animowanym w historii

Eyes of Wakanda jest bezpośrednio powiązany z MCU, a także aktualizacje X-Men '97, What If..., Daredevil i nie tylko.

Aktorzy serialu Laguna Beach: Gdzie są teraz?

Aktorzy serialu Laguna Beach: Gdzie są teraz?

„Laguna Beach” opowiadało o życiu licealistów Lauren Conrad, Kristin Cavallari, Stephena Collettiego i innych w połowie lat 2000. Oto, gdzie obecnie znajdują się członkowie obsady reality show MTV.

Historia randek Avy Gardner: spojrzenie wstecz na małżeństwa i romanse ikony Hollywood

Historia randek Avy Gardner: spojrzenie wstecz na małżeństwa i romanse ikony Hollywood

Ava Gardner była żoną Mickeya Rooneya i Franka Sintry, a także spotykała się z kilkoma innymi gwiazdami Hollywood. Oto spojrzenie wstecz na historię randek Avy Gardner.

Kim jest żona Johna Cleese'a? Wszystko o Jennifer Wade

Kim jest żona Johna Cleese'a? Wszystko o Jennifer Wade

John Cleese poślubił swoją żonę Jennifer Wade w 2012 roku. Oto wszystko, co warto wiedzieć o żonie Johna Cleese'a, Jennifer Wade.

Posiadłość Kim Zolciak-Biermann i Kroy Biermann List w Gruzji na sprzedaż w Splicie

Posiadłość Kim Zolciak-Biermann i Kroy Biermann List w Gruzji na sprzedaż w Splicie

Gwiazda „Prawdziwych gospodyń domowych z Atlanty” i jej były mąż, zawodowy zawodnik NFL, po raz pierwszy kupili rozległą rezydencję Alpharetta w 2012 roku.

zaimki są bardzo przerażające

Uderzyło mnie to nagle, jak to często bywa. Znowu jest w połowie <Nie, nie ten w Pacyfiku, bordowy, ten na karnawale> Każdy nagłówek jest głośny…..

3 sprawdzone sposoby na poprawę umiejętności pisania

Korzyści płynące z pisania i strategie, które Ci w tym pomogą

3 sprawdzone sposoby na poprawę umiejętności pisania

W 2022 roku, wraz z wydaniem GPT-3, umiejętność pisania wydaje się tracić na znaczeniu. Dzięki sztucznej inteligencji osoby o słabym pisaniu mogą również generować wysokiej jakości personel.

Powolna erozja: ujawnianie sposobów, w jakie ludzie marnują swoje kariery

Powolna erozja: ujawnianie sposobów, w jakie ludzie marnują swoje kariery

W dzisiejszym dynamicznym i konkurencyjnym świecie kariera odgrywa znaczącą rolę w rozwoju osobistym, stabilności finansowej i ogólnej satysfakcji z życia. Jednak wiele osób wpada w nieustający cykl stagnacji i niezadowolenia, stopniowo marnując swoje życie zawodowe.

Co wpływa na podcast?

Co wpływa na podcast?

W zeszłym tygodniu zauważyłem komunikat prasowy, wysłany za pośrednictwem PressGazette (brytyjski serwis informacyjny). W artykule ogłoszono, że Acast, skandynawska firma hostingowa i reklamowa podcastów, będzie przewodzić konsorcjum „prawdopodobnie najbardziej wpływowych” wydawców podcastów.

Language