Συζήτηση
Γεια χαρά, Επισκέπτης
Όνομα χρήστη: Κωδικός: Να με θυμάσαι
  • Σελίδα:
  • 1
  • 2

ΘΕΜΑ: Παιχνίδι Τρίλιζα 2 Παιχτών

Παιχνίδι Τρίλιζα 2 Παιχτών 7 Χρόνια 6 Μήνες πριν #4507

  • nickpsal
  • Το Άβαταρ του/της nickpsal
  • Αποσυνδεμένος
  • py____
  • Δημοσιεύσεις: 22
  • Ληφθείσες Ευχαριστίες 3
Καλησπέρα είμαι αρχάριος στην Python και έφτιαξα ένα πρόγραμμα σε Python Τρίλιζα 2 Παιχτών. Πως σας φαίνεται????
import random
import time

marker = {'Παίκτης 1': 'X', 'Παίκτης 2': 'O', }

def display_board(board):
print('+
+')
print('|7 |8 |9 |')
print('| ' + board[7] + ' | ' + board[8] + ' | ' + board[9]+' |')
print('| | | |')
print('+
+')
print('|4 |5 |6 |')
print('| ' + board[4] + ' | ' + board[5] + ' | ' + board[6]+' |')
print('| | | |')
print('+
+')
print('|1 |2 |3 |')
print('| ' + board[1] + ' | ' + board[2] + ' | ' + board[3]+' |')
print('| | | |')
print('+
+')

def choose_first():
player = ''
arithmos = random.randint(1,2)
if arithmos == 1 :
player = 'Παίκτης 1'
else:
player = 'Παίκτης 2'
return player

def display_score(score):
print ("Το σκόρ είναι {} ".format(score))

def place_marker(board, marker, position):
board[position] = marker


def win_check(board,mark):
if board[1] == board[2] == board[3] == mark :
return True
elif board[4] == board[5] == board[6] == mark :
return True
elif board[7] == board[8] == board[9] == mark :
return True
elif board[7] == board[4] == board[1] == mark :
return True
elif board[8] == board[5] == board[2] == mark :
return True
elif board[9] == board[6] == board[3] == mark :
return True
elif board[7] == board[5] == board[3] == mark :
return True
elif board[9] == board[5] == board[1] == mark :
return True
else:
return False

def board_check(board):
check = False
if board[1] == ' ' or board[2] == ' ' or board[3] == ' ' or board[4] == ' ' or board[5] == ' ' or board[6] == ' ' or board[7] == ' ' or board[8] == ' ' or board[9] == ' ' :
return False
else :
return True


def player_choice(board, turn):
epilogi = ''
epilogi = input("Ποία είναι η κινησή σου? (1-9) : {} ".format(turn))
while True :
if epilogi not in '1 2 3 4 5 6 7 8 9'.split() :
epilogi = input("Ποία είναι η κινησή σου? (1-9) : {} ".format(turn))
continue
else :
if board[int(epilogi)] != ' ' :
print("Πιασμένο Τετράγωνο Ξαναδοκίμασε")
eepilogi = input("Ποία είναι η κινησή σου? (1-9) : {} ".format(turn))
continue
else :
return int(epilogi)



def replay():
epilogi = " "
while epilogi !='y' or epilogi !='Y' or epilogi !='n' or epilogi !='N' :
epilogi = input("Θές να Ξαναπαίξουμε Y/N")
if epilogi == 'y' or epilogi == 'Y':
return True
break
else:
return False
break


def next_player(turn):
if turn == 'Παίκτης 1' :
return 'Παίκτης 2'
else:
return 'Παίκτης 1'

def main():
score = {} # λεξικό με το σκορ των παικτών
print('Αρχίζουμε!\nΓίνεται κλήρωση ', end = '')
for t in range(10):
print(".", flush='True', end=' ')
time.sleep(0.2)
print()
# η μεταβλητή turn αναφέρεται στον παίκτη που παίζει
turn = choose_first()
print("\nΟ " + turn + ' παίζει πρώτος.')
# η μεταβλητή first αναφέρεται στον παίκτη που έπαιξε πρώτος
first = turn
game_round = 1 # γύρος παιχνιδιού
while True:
theBoard = * 10
game_on = True #ξεκινάει το παιχνίδι
while game_on:
display_board(theBoard) #Εμφάνισε την τρίλιζα
# ο παίκτης turn επιλέγει θέση
position = player_choice(theBoard, turn)
# τοποθετείται η επιλογή του
place_marker(theBoard, marker[turn], position)
if win_check(theBoard, marker[turn]): # έλεγχος αν νίκησε
display_board(theBoard)
print('Νίκησε ο '+ turn)
score[turn] = score.get(turn, 0) + 1
game_on = False
# έλεγχος αν γέμισε το ταμπλό χωρίς νικητή
elif board_check(theBoard):
display_board(theBoard)
print('Ισοπαλία!')
game_on = False
else: # αλλιώς συνεχίζουμε με την κίνηση του επόμενου παίκτη
turn = next_player(turn)
if not replay():
ending = ''
if game_round>1 : ending = 'υς'
print("Μετά {} γύρο{}".format(game_round, ending))
display_score(score) # έξοδος ... τελικό σκορ
break
else :
game_round += 1
# στο επόμενο παιχνίδι ξεκινάει ο άλλος παίκτης
turn = next_player(first)
first = turn
main()
Τελευταία διόρθωση: 7 Χρόνια 6 Μήνες πριν από nickpsal.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.
Οι ακόλουθοι χρήστες είπαν "Σε Ευχαριστώ": aliartos3101

Παιχνίδι Τρίλιζα 2 Παιχτών 7 Χρόνια 6 Μήνες πριν #4509

  • babaliaris1
  • Το Άβαταρ του/της babaliaris1
  • Αποσυνδεμένος
  • python
  • Δημοσιεύσεις: 445
  • Ληφθείσες Ευχαριστίες 75
Μπορείς να ξανά βάλεις τον κώδικα μέσα σε code tags? Γιατί έτσι όπως το έβαλες δεν μπορούμε να τον κάνουμε copy paste σε αρχείο (Λείπουν τα κενά). Η διαφορετικά να ανεβάσεις το module κάπου και να μας δώσεις link.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Παιχνίδι Τρίλιζα 2 Παιχτών 7 Χρόνια 6 Μήνες πριν #4510

  • nickpsal
  • Το Άβαταρ του/της nickpsal
  • Αποσυνδεμένος
  • py____
  • Δημοσιεύσεις: 22
  • Ληφθείσες Ευχαριστίες 3
Ελα δες το εδω
repl.it/IZIJ/10
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.
Οι ακόλουθοι χρήστες είπαν "Σε Ευχαριστώ": Κωτούλας, aliartos3101

Παιχνίδι Τρίλιζα 2 Παιχτών 7 Χρόνια 6 Μήνες πριν #4511

  • Theo
  • Το Άβαταρ του/της Theo
  • Αποσυνδεμένος
  • pytho_
  • Δημοσιεύσεις: 249
  • Ληφθείσες Ευχαριστίες 70
Γειά και συγχαρητήρια για το προγραμματακί το βρίσκω οκ και ενδιαφέρον
Μερικές παρατηρήσεις

Έχεις δύο συναρτήσεις με μία γραμμή κώδικα
def display_score(score):
    print ("Το σκόρ είναι {} ".format(score))
 
def place_marker(board, marker, position): 
    board[position] = marker
 
Έγώ δεν θα τις χρησιμοποιούσα από ότι βλέπω χρησιμοποιείς μια φορά την καθεμία
βάλε κατευθείαν στην main τον κορμό τους
 

Επίσης η
def choose_first():
    player = ''
    arithmos = random.randint(1,2)
    if arithmos == 1 :
        player = 'Παίκτης 1'
    else:
        player = 'Παίκτης 2'
    return player
 
 
γιατί όχι μόνο
def choose_first():
  return 'Παίκτης {}'.format(random.randint(1,2))
και αφού φτάσεις εδώ γιατί να το κάνεις συνάρτηση (χρησιμοποιείται επίσης μία φορά νομίζω)


Η συνάρτηση
def board_check(board): 
    check = False
    if board[1] == ' ' or board[2] == ' ' or board[3] == ' ' or board[4] == ' ' or board[5] == ' ' or board[6] == ' ' or board[7] == ' ' or board[8] == ' ' or board[9] == ' '  :
        return False
    else :
        return True
 
μπορεί να γίνει απλή με τη χρήση της all ή any
def board_check(board):
  return all(map(lambda x: x!=' ', board[1:]))
 

και σε αυτή την περίπτωση εφόσον είναι μία σειρά γιατί να την καλέσεις σαν συνάρτηση

Η γραμμή

if epilogi not in '1 2 3 4 5 6 7 8 9'.split() :
δεν χρειάζεται να κάνεις λίστα
κάνεις κατευθείαν
if epilogi not in '123456789':


Θα κοιτάξω και θα σου πώ και άλλες προτάσεις για βελτίωση
Τελευταία διόρθωση: 7 Χρόνια 6 Μήνες πριν από Theo.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.
Οι ακόλουθοι χρήστες είπαν "Σε Ευχαριστώ": Κωτούλας, nickpsal

Παιχνίδι Τρίλιζα 2 Παιχτών 7 Χρόνια 6 Μήνες πριν #4512

  • nickpsal
  • Το Άβαταρ του/της nickpsal
  • Αποσυνδεμένος
  • py____
  • Δημοσιεύσεις: 22
  • Ληφθείσες Ευχαριστίες 3
ναι για την ακρίβεια ήταν άσκηση ετοιμη και εμείς μ΄νοο συμπληρώσαμε τις συναρτησεις υποχρεωτικα πηγαιναν ετσι
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Παιχνίδι Τρίλιζα 2 Παιχτών 7 Χρόνια 6 Μήνες πριν #4513

  • babaliaris1
  • Το Άβαταρ του/της babaliaris1
  • Αποσυνδεμένος
  • python
  • Δημοσιεύσεις: 445
  • Ληφθείσες Ευχαριστίες 75
Πολύ καλό μπράβο!!!
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.
Οι ακόλουθοι χρήστες είπαν "Σε Ευχαριστώ": Κωτούλας

Παιχνίδι Τρίλιζα 2 Παιχτών 7 Χρόνια 6 Μήνες πριν #4514

  • Theo
  • Το Άβαταρ του/της Theo
  • Αποσυνδεμένος
  • pytho_
  • Δημοσιεύσεις: 249
  • Ληφθείσες Ευχαριστίες 70
στo
return ..
break
που χρησιμοποιείς το break δεν χρειάζεται το return επιστρέφει την τιμή και η συνάρτηση τελειώνει

Αντί αυτό
def player_choice(board, turn): 
    epilogi = ''
    epilogi = input("Ποία είναι η κινησή σου? (1-9) : {} ".format(turn))
    while True :
        if epilogi not in '1 2 3 4 5 6 7 8 9'.split() :
            epilogi = input("Ποία είναι η κινησή σου? (1-9) : {} ".format(turn))
            continue
        else :
            if board[int(epilogi)] != ' ' :
                print("Πιασμένο Τετράγωνο Ξαναδοκίμασε")
                epilogi = input("Ποία είναι η κινησή σου? (1-9) : {} ".format(turn))
                continue
            else :
                return int(epilogi)
αυτό
def player_choice(board, turn): 
  while True :
    epilogi = input("Ποία είναι η κινησή σου? (1-9) : {} ".format(turn))
    if epilogi not in list('123456789'):
      continue
    elif board[int(epilogi)] != ' ':
      print("Πιασμένο Τετράγωνο Ξαναδοκίμασε")
      continue
    else:
      return int(epilogi)
Flat is better than nested.

Επίσης διόρθωσα τον κώδικα μου στο προηγούμενο post ώστε να λειτουργεί

Καλή συνέχεια ελπίζω να βοήθησα
Τελευταία διόρθωση: 7 Χρόνια 6 Μήνες πριν από Theo.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.
Οι ακόλουθοι χρήστες είπαν "Σε Ευχαριστώ": Κωτούλας, aliartos3101, nickpsal

Παιχνίδι Τρίλιζα 2 Παιχτών 7 Χρόνια 6 Μήνες πριν #4515

  • babaliaris1
  • Το Άβαταρ του/της babaliaris1
  • Αποσυνδεμένος
  • python
  • Δημοσιεύσεις: 445
  • Ληφθείσες Ευχαριστίες 75
Επειδή μου άρεσε το έφτιαξα και εγώ :P :
#Author: babaliaris.nikos@gmail.com
#Date  : 7/6/2017
#Name  : Triceza.py
#Python: Python 3.6
 
 
 
 
#Graphics.
graphics ='''+--------------+
+    |    |    +
+--------------+
+    |    |    +
+--------------+
+    |    |    +
+--------------+'''
 
 
#Where to fill positions.
pos = [ [(1,2), (1,7), (1,12)],
        [(3,2), (3,7), (3,12)],
        [(5,2), (5,7), (5,12)],
      ]
 
 
 
 
#===============================Main===============================#
def main():
    '''Start the game.'''
 
    #Create a 2D array.
    array = createArray()
 
    #Positions already used.
    used  = []
 
    #Start playing.
    for i in range(9):
 
        #Repeat.
        repeat = True
 
        while repeat:
 
            #Just some space.
            print("")
 
            #Render the array.
            render(array)
 
            #Player 1.
            if i%2 == 0:
                ch = "O"
                print("\nPlayer 1")
 
            #Player 2.
            else:
                ch = "X"
                print("\nPlayer 2")
 
 
            #Try to read integers.
            try:
                row    = int(input("Give row   : "))
                column = int(input("Give column: "))
                pass
 
            #Failed.
            except ValueError:
                print("You must give integer numbers!")
                continue
 
 
            #The position already in use.
            if (row, column) in used:
                print("The cell["+str(row)+"]["+str(column)+"] is" \
                      " already filled.")
                continue
 
 
            #Fill.
            error = fill(array, row, column, ch)
 
            #An error occured.
            if error != None:
                print(error)
                continue
 
            #Append a used position.
            used.append( (row, column) )
 
            #Check for win.
            answer = checkWin(array)
 
            #Player 1 wins.
            if answer == "O":
                render(array)
                print("\nPlayer 1 wins!")
                input("Press ENTER to exit...")
                return
 
            #Player 1 wins.
            elif answer == "X":
                render(array)
                print("\nPlayer 2 wins!")
                input("Press ENTER to exit...")
                return
 
            #Do not repeat.
            repeat = False
 
 
    #Match is equal.
    print("\nThe match is equal!")
    input("Press ENTER to exit...")
#===============================Main===============================#
 
 
 
 
 
#===========================Create Array===========================#
def createArray():
    '''Create's a 2D Array with the characters of the graphics.'''
 
    #2D Array.
    array = [[]]
 
    #----------Fill the array with the grapics----------#
    counter = 0
    for i, ch in enumerate(graphics):
 
        #If i'm still in a row.
        if ch != "\n":
 
            #Append the character in this column.
            array[counter].append(ch)
            pass
 
        #Else create a new row.
        else:
 
            #Create a new list inside the array.
            array.append([])
 
            #Encrease the counter.
            counter += 1
            pass
    #----------Fill the array with the grapics----------#
 
    return array
#===========================Create Array===========================#
 
 
 
 
 
#==============================Render==============================#
def render(array):
    '''Draw the graphics on the screen.'''
 
    #Print column numbers.
    print("    1    2    3   ")
 
    #Go through the rows.
    for row in range( len(array) ):
        string = ""
 
        #Go through columns.
        for column in range( len(array[row]) ):
            string += array[row][column]
 
        #Create the row 1.
        if row == 1:
            string = "1 "+string
            pass
 
        #Create the row 2.
        elif row == 3:
            string = "2 "+string
            pass
 
        #Create the row 3.
        elif row == 5:
            string = "3 "+string
            pass
 
        #Create other graphics.
        else:
            string = "  "+string
 
        #Print.
        print(string)
#==============================Render==============================#
 
 
 
 
 
#===============================Fill===============================#
def fill(array, x, y, ch):
    '''Fill the graphics with a character.'''
 
    #Check x and y.
    if x < 1 or x > 3 or y < 1 or y > 3:
        return "x and y must be numbers between 1 and 3."
 
    #Get the position of the array.
    x, y = pos[x-1][y-1]
 
    #Fill the array with that character.
    array[x][y] = ch
#===============================Fill===============================#
 
 
 
 
#=============================Check Win============================#
def checkWin(array):
    '''Check if someone won.'''
 
    #Characters.
    chars  = ["O", "X"]
 
    for ch in chars:
 
        #Check row 0.
        if array[ pos[0][0][0]]  [pos[0][0][1] ] == ch and \
           array[ pos[0][1][0]]  [pos[0][1][1] ] == ch and \
           array[ pos[0][2][0]]  [pos[0][2][1] ] == ch:
            return ch
 
        #Check row 1.
        elif array[ pos[1][0][0]]  [pos[1][0][1] ] == ch and \
             array[ pos[1][1][0]]  [pos[1][1][1] ] == ch and \
             array[ pos[1][2][0]]  [pos[1][2][1] ] == ch:
            return ch
 
        #Check row 2.
        elif array[ pos[2][0][0]]  [pos[2][0][1] ] == ch and \
             array[ pos[2][1][0]]  [pos[2][1][1] ] == ch and \
             array[ pos[2][2][0]]  [pos[2][2][1] ] == ch:
            return ch
 
 
        #Check column 0.
        if array[ pos[0][0][0]]  [pos[0][0][1] ] == ch and \
           array[ pos[1][0][0]]  [pos[1][0][1] ] == ch and \
           array[ pos[2][0][0]]  [pos[2][0][1] ] == ch:
            return ch
 
        #Check column 1.
        elif array[ pos[0][1][0]]  [pos[0][1][1] ] == ch and \
             array[ pos[1][1][0]]  [pos[1][1][1] ] == ch and \
             array[ pos[2][2][0]]  [pos[2][2][1] ] == ch:
            return ch
 
        #Check column 2.
        elif array[ pos[0][2][0]]  [pos[0][2][1] ] == ch and \
             array[ pos[1][2][0]]  [pos[1][2][1] ] == ch and \
             array[ pos[2][2][0]]  [pos[2][2][1] ] == ch:
            return ch
 
        #Check diagonal from left to right.
        elif array[ pos[0][0][0]]  [pos[0][0][1] ] == ch and \
             array[ pos[1][1][0]]  [pos[1][1][1] ] == ch and \
             array[ pos[2][2][0]]  [pos[2][2][1] ] == ch:
            return ch
 
        #Check diagonal from right to left.
        elif array[ pos[0][2][0]]  [pos[0][2][1] ] == ch and \
             array[ pos[1][1][0]]  [pos[1][1][1] ] == ch and \
             array[ pos[2][0][0]]  [pos[2][0][1] ] == ch:
            return ch
 
 
    return ""
#=============================Check Win============================#
 
 
 
 
 
#Run the program.
if __name__ == "__main__":
    main()
 
Τελευταία διόρθωση: 7 Χρόνια 6 Μήνες πριν από babaliaris1.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.
Οι ακόλουθοι χρήστες είπαν "Σε Ευχαριστώ": nickpsal

Παιχνίδι Τρίλιζα 2 Παιχτών 7 Χρόνια 6 Μήνες πριν #4516

  • Theo
  • Το Άβαταρ του/της Theo
  • Αποσυνδεμένος
  • pytho_
  • Δημοσιεύσεις: 249
  • Ληφθείσες Ευχαριστίες 70
Θα κάνω και εγώ μία δική μου version και θα την βάλω όταν είναι έτοιμη

Πολύ πιο δύσκολη λόγικη είναι η τρίλιζα με 1 παίχτη και αντίπαλο το computer
Ενοείται ότι το computer δεν πρέπει να χάνει
Αν έχει κανείς κάτι τέτοιο έτοιμο θα ήθελα να το δω γιατί προσπαθώ να το κάνω και έχω μπλέξει
με combinations και χάνομαι κάπου
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Παιχνίδι Τρίλιζα 2 Παιχτών 7 Χρόνια 6 Μήνες πριν #4517

  • nickpsal
  • Το Άβαταρ του/της nickpsal
  • Αποσυνδεμένος
  • py____
  • Δημοσιεύσεις: 22
  • Ληφθείσες Ευχαριστίες 3
Θα το δώ και εγώ αυτό μετα την 1 Ιουλίου που θα ξεμπερδέψω
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Παιχνίδι Τρίλιζα 2 Παιχτών 7 Χρόνια 6 Μήνες πριν #4518

  • Theo
  • Το Άβαταρ του/της Theo
  • Αποσυνδεμένος
  • pytho_
  • Δημοσιεύσεις: 249
  • Ληφθείσες Ευχαριστίες 70
Είχα ένα λάθος σε προηγούμενο σχόλιο μου και το διόρθωσα
το in '1 2 3 4 5 6 7 8 9'.split() είναι το σωστό τελικά
γιατί με το in '123456789' παίρνει ως σωστό οποιοδήποτε slice του

Σχετικά με την checkwin που είναι ένα μεγάλο μακαρόνι μπορεί να γίνει αρκετά μικρή και απλή
αντί λοιπόν
def win_check(board,mark): 
    if board[1] == board[2] == board[3] == mark :
        return True
    elif board[4] == board[5] == board[6] == mark :
        return True
    elif board[7] == board[8] == board[9] == mark :
        return True
    elif board[7] == board[4] == board[1] == mark :
        return True
    elif board[8] == board[5] == board[2] == mark :
        return True
    elif board[9] == board[6] == board[3] == mark :
        return True
    elif board[7] == board[5] == board[3] == mark :
        return True
    elif board[9] == board[5] == board[1] == mark :
        return True
    else:
        return False
αυτό
def win_check(board, marker):
  win_options=('123','456','789','147','258','369','357','159')
  for option in win_options:
    if board[int(option[0])]==board[int(option[1])]==board[int(option[2])]==marker:
      return True
  return False
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.
Οι ακόλουθοι χρήστες είπαν "Σε Ευχαριστώ": Κωτούλας, aliartos3101

Παιχνίδι Τρίλιζα 2 Παιχτών 7 Χρόνια 5 Μήνες πριν #4609

  • Axrst
  • Το Άβαταρ του/της Axrst
  • Αποσυνδεμένος
  • p_____
  • Δημοσιεύσεις: 4
Theo έγραψε:
Πολύ πιο δύσκολη λόγικη είναι η τρίλιζα με 1 παίχτη και αντίπαλο το computer
Ενοείται ότι το computer δεν πρέπει να χάνει
Αν έχει κανείς κάτι τέτοιο έτοιμο θα ήθελα να το δω γιατί προσπαθώ να το κάνω και έχω μπλέξει
με combinations και χάνομαι κάπου

Το έχω κάνει, αλλά δεν το έχω πρόχειρο τώρα να το στείλω άμεσα. Η λογική πάντως του AI, είναι η εξής:
(για την κίνηση του Η/Υ)

1. Πρώτα τσεκάρουμε αν μπορούμε με την επόμενη κίνηση να νικήσουμε και αν ναι, την κάνουμε.
2. Δευτερευόντως, τσεκάρουμε αν πρόκειται να νικήσει ο user με την επόμενη κίνηση του, και τον μπλοκάρουμε.
3. Αλλιώς διαλέγουμε μια από τις ελεύθερες γωνίες (τυχαία) αν υπάρχουν.
4. Μετά διαλέγουμε το κέντρο αν είναι ελεύθερο.
5. Τέλος διαλέγουμε μια από τις ελεύθερες πλευρές αν υπάρχουν.

Θα στείλω και ολοκληρωμένο κώδικα όταν τον βρω.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Παιχνίδι Τρίλιζα 2 Παιχτών 7 Χρόνια 5 Μήνες πριν #4619

  • Theo
  • Το Άβαταρ του/της Theo
  • Αποσυνδεμένος
  • pytho_
  • Δημοσιεύσεις: 249
  • Ληφθείσες Ευχαριστίες 70
Axrst έγραψε:
Theo έγραψε:
Πολύ πιο δύσκολη λόγικη είναι η τρίλιζα με 1 παίχτη και αντίπαλο το computer
Ενοείται ότι το computer δεν πρέπει να χάνει
Αν έχει κανείς κάτι τέτοιο έτοιμο θα ήθελα να το δω γιατί προσπαθώ να το κάνω και έχω μπλέξει
με combinations και χάνομαι κάπου

Το έχω κάνει, αλλά δεν το έχω πρόχειρο τώρα να το στείλω άμεσα. Η λογική πάντως του AI, είναι η εξής:
(για την κίνηση του Η/Υ)

1. Πρώτα τσεκάρουμε αν μπορούμε με την επόμενη κίνηση να νικήσουμε και αν ναι, την κάνουμε.
2. Δευτερευόντως, τσεκάρουμε αν πρόκειται να νικήσει ο user με την επόμενη κίνηση του, και τον μπλοκάρουμε.
3. Αλλιώς διαλέγουμε μια από τις ελεύθερες γωνίες (τυχαία) αν υπάρχουν.
4. Μετά διαλέγουμε το κέντρο αν είναι ελεύθερο.
5. Τέλος διαλέγουμε μια από τις ελεύθερες πλευρές αν υπάρχουν.

Θα στείλω και ολοκληρωμένο κώδικα όταν τον βρω.

Προσπάθησα και το έκανα και γω
Οι κινήσεις περιγράφονται καλύτερα στο wikipedia
en.wikipedia.org/wiki/Tic-tac-toe
στο κομμάτι strategy
1,2 όπως το λες μετά όμως
3.create fork και 4 avoid fork
Ο κώδικας που έχω κάνει δεν είναι πολύ καθαρός κάνει όμως δουλειά
def play_robot(self):
    options=[i for i in range(1,10) if self.board[i]==' ']
 
    #check for win
    for i in options:
      self.board[int(i)]=self.symbol2
      if self.win_check(self.symbol2):
        return
      else:
        self.board[int(i)]=' ' 
 
    #check for loses
    for i in options:
      self.board[int(i)]=self.symbol1
      if self.win_check(self.symbol1):
        self.board[int(i)]=self.symbol2
        return
      else:
        self.board[int(i)]=' '
 
    #Robot tries to make a fork
    for i in options: 
      self.board[int(i)]=self.symbol2
      new_options=[i for i in range(1,10) if self.board[i]==' ']
      ways_to_win=0
      for j in new_options:
        self.board[int(j)]=self.symbol2
        if self.win_check(self.symbol2):
          ways_to_win+=1
        self.board[int(j)]=' '
      if ways_to_win==2:
        return
      else:
        self.board[int(i)]=' '
 
    #avoid fork
    if self.board[5]==self.symbol2 and self.board[1]==self.symbol1 and self.board[9]==self.symbol1 and self.board[2]==' ' and self.board[4]==' ' and self.board[6]==' ' and self.board[8]==' ':
      self.board[2]=self.symbol2
      return
    #avoid fork 
    if self.board[5]==self.symbol2 and self.board[3]==self.symbol1 and self.board[7]==self.symbol1 and self.board[2]==' ' and self.board[4]==' ' and self.board[6]==' ' and self.board[8]==' ':
      self.board[2]=self.symbol2
      return
    for i in options: #Stop players fork not sure if it evers play
      self.board[int(i)]=self.symbol1
      new_options=[i for i in range(1,10) if self.board[i]==' ']
      ways_to_win=0
      for j in new_options:
        self.board[int(j)]=self.symbol1
        if self.win_check(self.symbol1):
          ways_to_win+=1
        self.board[int(j)]=' '
      if ways_to_win==2:
        self.board[int(i)]=self.symbol2
        return
      else:
        self.board[int(i)]=' '
 
    #check for center
    if self.board[5]==' ': 
      self.board[5]=self.symbol2
      return
 
    #check for corner 
    for i in options: 
      if i in (1,3,5,7):
        self.board[i]=self.symbol2
        return
 
    #get random
    self.board[random.choice(options)]=self.symbol2
 

Αμά βρεις τον κώδικά σου βάλε θέλω να δω πως το κάνεις
Στην ουσία κάνω το 1 brute force δοκιμάζοντας όλες τι θέσεις το ίδιο το 2 το ίδιο το 3ο βήμα για το 4 που είναι και το πιο περίπλοκο τσεκάρω τι διαγώνιες. Μετά πάω για κέντρο μετά για γωνία μετά για random
Είναι λίγο χαζό αλλά βαρίεμαι να το βελτιώσω
Μία full version όποιος θέλει να παίξει έχω εδώ
github.com/k33theod/triliza
Αν κάποιος μπορέσει να νικήσει θα χαιρόμουν να μάθω για να διορθώσω τον κώδικα. Το έχω κάνει και σε γραφικό tkinter μόλις είναι πλήρες θα το ανεβάσω
Το αρχείο για τρίλιζα με tkinter στον ίδιο δεσμό tic_tac_toe5.pyw τρέχει με διπλό κλικ
Τελευταία διόρθωση: 7 Χρόνια 5 Μήνες πριν από Theo. Αιτία: Έτοιμο το τκιντερ
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Παιχνίδι Τρίλιζα 2 Παιχτών 7 Χρόνια 5 Μήνες πριν #4620

  • Axrst
  • Το Άβαταρ του/της Axrst
  • Αποσυνδεμένος
  • p_____
  • Δημοσιεύσεις: 4
Το βρήκα. Είναι φτιαγμένο για δοκιμές οπότε δεν έχει τη βέλτιστη σύνταξη, αλλά είναι οκ.
# Τρίλιζα (Tic Tac Toe στα Αγγλικά)
 
import random
 
 
def draw_board(board):
    # Εκτύπωση του board
    # Ορίζουμε το "board" σαν λίστα 10 από stings και αγνοούμε το index 0.
    print('\n')
    print(' 7' + ' '*4 + '|' + '8' + ' '*4 + '|' + '9' + ' '*4)
    print('   ' + board[7] + '  ' + '|' + '  ' + board[8] + '  ' + '|' + '  ' + board[9] + '  ')
    print(' '*6 + '|' + ' '*5 + '|' + ' '*5)
    print(' -----+-----+-----')
    print(' 4' + ' '*4 + '|' + '5' + ' '*4 + '|' + '6' + ' '*4)
    print('   ' + board[4] + '  ' + '|' + '  ' + board[5] + '  ' + '|' + '  ' + board[6] + '  ')
    print(' '*6 + '|' + ' '*5 + '|' + ' '*5)
    print(' -----+-----+-----')
    print(' 1' + ' '*4 + '|' + '2' + ' '*4 + '|' + '3' + ' '*4)
    print('   ' + board[1] + '  ' + '|' + '  ' + board[2] + '  ' + '|' + '  ' + board[3] + '  ')
    print(' '*6 + '|' + ' '*5 + '|' + ' '*5)
    print('\n')
 
 
def player_sign():
    # Ο παίκτης διαλέγει με ποιό γράμμα θα παίξει.
    # Επιστρέφεται μια λίστα με 2 στοιχεία: του παίκτη και του Η/Υ.
    sign = ''
    while not (sign == 'X' or sign == 'O' or sign == 'Χ' or sign == 'Ο'):
        print('Θέλετε να παίξετε με το Χ ή με το Ο;')
        sign = input().upper()
 
    # Το πρώτο στοιχείο της λίστας είναι του παίκτη. Το δεύτερο του Η/Υ.
    if sign == 'X':
        return ['X', 'O']
    else:
        return ['O', 'X']
 
 
def whos_turn():
    # Τυχαία διαλέγουμε ποιος θα παίξει πρώτος.
    if random.randint(0, 1) == 0:
        return 'computer'
    else:
        return 'player'
 
 
def make_move(board, sign, move):
    board[move] = sign
 
 
def win(board, mark): 
    # Η συνάρτηση εξετάζει αν ο παίκτης νίκησε με δεδομένο τον πίνακα και το γράμμα του παίκτη.
    # bo είναι για το board και le για το γράμμα.
    return ((board[7] == mark and board[8] == mark and board[9] == mark) or # Πάνω σειρά
    (board[4] == mark and board[5] == mark and board[6] == mark) or # Μεσαία σειρά
    (board[1] == mark and board[2] == mark and board[3] == mark) or # Κάτω σειρά
    (board[7] == mark and board[4] == mark and board[1] == mark) or # Αριστερή στήλη
    (board[8] == mark and board[5] == mark and board[2] == mark) or # Μεσαία στήλη
    (board[9] == mark and board[6] == mark and board[3] == mark) or # Δεξιά στήλη
    (board[7] == mark and board[5] == mark and board[3] == mark) or # Διαγώνιος 1
    (board[1] == mark and board[5] == mark and board[9] == mark)) # Διαγώνιος 2
 
def copy_board(board):
    # Αντιγράφουμε την λίστα του board και την επιστρέφουμε.
    boardCopy = []
    for i in board:
        boardCopy.append(i)
    return boardCopy
 
def free_space(board, move):
    # Έλεγχος για ελεύθερη κίνηση.
    return board[move] == ' '
 
def player_move(board):
    # Ο παίκτης διαλέγει κίνηση.
    move = ' '
    while move not in '1 2 3 4 5 6 7 8 9'.split() or not free_space(board, int(move)):
        print('Ποιά είναι η επόμενη σας κίνηση; [1-9]: ')
        move = input()
    return int(move)
 
def random_move(board, movesList):
    # Επιστρέφει μια επιτρεπτή κίνηση και None αν δεν υπάρχει τέτοια.
    possibleMoves = []
    for i in movesList:
        if free_space(board, i):
            possibleMoves.append(i)
 
    if len(possibleMoves) != 0:
        return random.choice(possibleMoves)
    else:
        return None
 
def computer_move(board, computerLetter):
    # Με βάση τον πίνακα και το γράμμα του Η/Υ επιστρέφει την κίνηση του.
    if computerLetter == 'X':
        playerLetter = 'O'
    else:
        playerLetter = 'X'
 
    # Εδώ ξεκινά το AI:
    # Έλεγχος αν μπορεί να νικήσει το computer στην επόμενη κίνηση.
    for i in range(1, 10):
        boardCopy = copy_board(board)
        if free_space(boardCopy, i):
            make_move(boardCopy, computerLetter, i)
            if win(boardCopy, computerLetter):
                return i
 
    # Αν ο παίκτης νικάει με επόμενη κίνηση, τότε τον μπλοκάρουμε.
    for i in range(1, 10):
        boardCopy = copy_board(board)
        if free_space(boardCopy, i):
            make_move(boardCopy, playerLetter, i)
            if win(boardCopy, playerLetter):
                return i
 
    # Επιλέγουμε μια από τις γωνίες αν είναι ελεύθερη.
    move = random_move(board, [1, 3, 7, 9])
    if move != None:
        return move
 
    # Επιλογή του κέντρου.
    if free_space(board, 5):
        return 5
 
    # Επιλογή στις πλευρές.
    return random_move(board, [2, 4, 6, 8])
 
def full_board(board):
    # Επιστρέφει True αν ΔΕΝ υπάρχει ελεύθερος χώρος στο board ή False στην αντίθετη περίπτωση.
    for i in range(1, 10):
        if free_space(board, i):
            return False
    return True
 
 
print('Καλωσήρθατε στην Τρίλιζα!')
 
while True:
    # Αρχικοποίηση του board
    theBoard = [' '] * 10
    playerLetter, computerLetter = player_sign()
    turn = whos_turn()
    print('Πρώτος παίζει: ' + turn)
    gameIsPlaying = True
 
    while gameIsPlaying:
        if turn == 'player':
            # Σειρά του Παίκτη.
            draw_board(theBoard)
            move = player_move(theBoard)
            make_move(theBoard, playerLetter, move)
 
            if win(theBoard, playerLetter):
                draw_board(theBoard)
                print('Συγχαρητήρια! Νίκησες.')
                gameIsPlaying = False
            else:
                if full_board(theBoard):
                    draw_board(theBoard)
                    print('Ισοπαλία!')
                    break
                else:
                    turn = 'computer'
 
        else:
            # Σειρά του H/Υ.
            move = computer_move(theBoard, computerLetter)
            make_move(theBoard, computerLetter, move)
 
            if win(theBoard, computerLetter):
                draw_board(theBoard)
                print('Το computer νίκησε! Λυπάμαι αλλά έχασες.')
                gameIsPlaying = False
            else:
                if full_board(theBoard):
                    draw_board(theBoard)
                    print('Ισοπαλία!')
                    break
                else:
                    turn = 'player'
 
    print('Θέλετε να ξαναπαίξετε; (Ναι/Όχι): ')
    if not input().lower().startswith('ν'):
        break
 
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Παιχνίδι Τρίλιζα 2 Παιχτών 7 Χρόνια 5 Μήνες πριν #4621

  • Theo
  • Το Άβαταρ του/της Theo
  • Αποσυνδεμένος
  • pytho_
  • Δημοσιεύσεις: 249
  • Ληφθείσες Ευχαριστίες 70
Η λογική είναι λάθος.
Έστω παίζω πρώτος και παίζω κάτω αριστερά και αυτό επιλέγει επίσης γωνία random πάνω άριστερα εγώ παίζω μετά δεξιά κέντρο και αυτός επιλέγει επίσης γωνία κάτω δεξιά, Παίρνοντας εγώ το κέντρο νικάω γιατί κάνω fork.
και η πιθανότητα να τον νικήσω είναι πολύ μεγάλη 33% την υπολογίζω περίπου.
και μπορώ να νικήσω και αλλιώς
Τελευταία διόρθωση: 7 Χρόνια 5 Μήνες πριν από Theo.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.
  • Σελίδα:
  • 1
  • 2
Συντονιστές: pmav99
Χρόνος δημιουργίας σελίδας: 0.849 δευτερόλεπτα

Μοιράσου το!

Powered by CoalaWeb

Λίστα Ταχυδρομείου