Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Iks Oks u pythonu

[es] :: Python :: Iks Oks u pythonu

[ Pregleda: 3227 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

StefanJer91
Stefan Jeremic
Beograd

Član broj: 121923
Poruke: 160
*.beobug.com.



Profil

icon Iks Oks u pythonu20.11.2006. u 14:31 - pre 178 meseci
Nov sam u pythonu i na ovom forumu. Pretrazivao sam ga u nadi da li cu naci srodnu temu ali nisam uspeo. Naime, hocu da napravim Iks Oks tako da kompjuter bude nepobediv (pod uslovom da covek prvi igra). Primetio sam da kada se 'x' (znak koji koristi covek) stavlja po coskovima jedini spas za 'o' (kompjuterov znak) je da stavi 'o' u sredinu, ili ako je 'x' u sredini onda 'o' mora po coskovima. Evo tabela kako bih lakse objasnio problem:
+-+-+
0|1|2|
+-+-+
3|4|5|
+-+-+
6|7|8|
+-+-+
sada ako se 'x' stavlja na mesta 1,3,5 ili 7 postoji vise mogucnosti za 'o'. Naprimer ako je 'x' na 1 onda 'o' moze biti na 0,2,4,7. Moje pitanje glasi kako da komp zna da se odbrani ali tako da moze da predvidi potez, a ne tako sto cu mu ja reci gde treba da postvi 'o' ako se 'x' nalazi na odredjenoj poziciji, tacnije da mu stvorim neki vid AI. Nadam se da sam bio dovoljno jasan.
The earth teaches us more about ourselves than all the books. Because it resists us. Man discovers himself when he measures himself against the obstacle.
 
Odgovor na temu

StefanJer91
Stefan Jeremic
Beograd

Član broj: 121923
Poruke: 160
*.kalik.info.



Profil

icon Re: Iks Oks u pythonu23.11.2006. u 15:20 - pre 178 meseci
Evo uspeo sam da pronadjem kod na netu. Samo bi bilo lepo ako bineko mogao da mi protumaci odredjene delove koda. Hajde ljudi molim vas ovo mi je bitno.
Code:

def allEqual(list):
    """returns True if all the elements in a list are equal, or if the list is empty."""
    return reduce(lambda x, y: x and y, (x == list[0] for x in list), True)

Empty = ' '
Player_X = 'x'
Player_O = 'o'

class Board:
    """This class represents a tic tac toe board state."""
    def __init__(self):
        """Initialize all members."""
        self.pieces = [Empty]*9
        self.field_names = '123456789'

    def output(self):
        """Display the board on screen."""
        for line in [self.pieces[0:3], self.pieces[3:6], self.pieces[6:9]]:
            print ' '.join(line)

    def winner(self):
        """Determine if one player has won the game. Returns Player_X, Player_O or None"""
        winning_rows = [[0,1,2],[3,4,5],[6,7,8], # vertical
                        [0,3,6],[1,4,7],[2,5,8], # horizontal
                        [0,4,8],[2,4,6]]         # diagonal
        for row in winning_rows:
            if self.pieces[row[0]] != Empty and allEqual([self.pieces[i] for i in row]):
                return self.pieces[row[0]]

    def getValidMoves(self):
        """Returns a list of valid moves. A move can be passed to getMoveName to 
        retrieve a human-readable name or to makeMove/undoMove to play it."""
        return [pos for pos in range(9) if self.pieces[pos] == Empty]

    def gameOver(self):
        """Returns true if one player has won or if there are no valid moves left."""
        return self.winner() or not self.getValidMoves()

    def getMoveName(self, move):
        """Returns a human-readable name for a move"""
        return self.field_names[move]
    
    def makeMove(self, move, player):
        """Plays a move. Note: this doesn't check if the move is legal!"""
        self.pieces[move] = player
    
    def undoMove(self, move):
        """Undoes a move/removes a piece of the board."""
        self.makeMove(move, Empty)

def humanPlayer(board, player):
    """Function for the human player"""
    board.output()
    possible_moves = dict([(board.getMoveName(move), move) for move in board.getValidMoves()])
    move = raw_input("Enter your move (%s): " % (', '.join(sorted(possible_moves))))
    board.makeMove(possible_moves[move], player)

def computerPlayer(board, player):
    """Function for the computer player"""
    t0 = time.time()
    board.output()
    opponent = { Player_O : Player_X, Player_X : Player_O }

    def judge(winner):
        if winner == player:
            return +1
        if winner == None:
            return 0
        return -1

    def evaluateMove(move, p=player):
        try:
            board.makeMove(move, p)
            if board.gameOver():
                return judge(board.winner())
            outcomes = (evaluateMove(next_move, opponent[p]) for next_move in board.getValidMoves())

            if p == player:
                #return min(outcomes)
                min_element = 1
                for o in outcomes:
                    if o == -1:
                        return o
                    min_element = min(o,min_element)
                return min_element
            else:
                #return max(outcomes)
                max_element = -1
                for o in outcomes:
                    if o == +1:
                        return o
                    max_element = max(o,max_element)
                return max_element

        finally:
            board.undoMove(move)

    moves = [(move, evaluateMove(move)) for move in board.getValidMoves()]
    random.shuffle(moves)
    moves.sort(key = lambda (move, winner): winner)
    print "computer move: %0.3f ms" % ((time.time()-t0)*1000)
    print moves
    board.makeMove(moves[-1][0], player)

def game():
    """The game function"""
    b = Board()
    turn = 1
    while True:
        print "%i. turn" % turn
        humanPlayer(b, Player_O)
        if b.gameOver(): 
            break
        computerPlayer(b, Player_X)
        if b.gameOver(): 
            break
        turn += 1

    b.output()
    if b.winner():
        print 'Player "%s" wins' % b.winner()
    else:
        print 'Game over'

if __name__ == "__main__":
    game()

The earth teaches us more about ourselves than all the books. Because it resists us. Man discovers himself when he measures himself against the obstacle.
 
Odgovor na temu

alex
Aleksandar Radulovic
Senior Software Engineer, Spotify
Stockholm, Sweden

Član broj: 71
Poruke: 2194
*.siminn.is.

Jabber: alex@a13x.info
ICQ: -1
Sajt: www.a13x.info


+1 Profil

icon Re: Iks Oks u pythonu23.11.2006. u 15:29 - pre 178 meseci
I nisi bas jasan sta zelis da postignes - Tic-Tac-Toe igra je ima vrlo jednostavnu logiku. Sta tacno zelis da postignes i sta tacno zelis da ti se objasni iz tog koda?


Alex: My favorite site is http://localhost/
R.J. Oppenheimer: "I am become death, destroyer of worlds" (1945 AD)
tweet.13x ||
linkedin.13x
 
Odgovor na temu

StefanJer91
Stefan Jeremic
Beograd

Član broj: 121923
Poruke: 160
*.kalik.info.



Profil

icon Re: Iks Oks u pythonu23.11.2006. u 21:07 - pre 178 meseci
Kako tacno funkcionise allEquial (znam sta funkicja radi ali neshvatam po kom principu). I kako on to proracunava gde treba da stavi iks(koji je to deo koda). Napominjem, jos jednom da sam nov u pythonu (on je inace moj prvi programski jezik) pa ako bi objasnjeneje moglo biti sto jasnije. Hvala, unapred.
Off Topic: Da li je ovaj deo foruma tako malo posecen, mislim vidim da se nova poruka u Python forumu pojavljuje na svakih 5-6 dana...
The earth teaches us more about ourselves than all the books. Because it resists us. Man discovers himself when he measures himself against the obstacle.
 
Odgovor na temu

alex
Aleksandar Radulovic
Senior Software Engineer, Spotify
Stockholm, Sweden

Član broj: 71
Poruke: 2194
*.siminn.is.

Jabber: alex@a13x.info
ICQ: -1
Sajt: www.a13x.info


+1 Profil

icon Re: Iks Oks u pythonu30.11.2006. u 16:52 - pre 178 meseci
1. Kako tacno funkcionise allEqual funkcija?

Komentar same funkcije ti opisuje sta funkcija radi. Ako ti nije jasna sama sintaksa pogledaj dokumentaciju funkcije reduce(). U sustini, funkcija prolazi kroz celu listu
(koja je argument funkcije) i proverava da li su jednaki svi elementi u listi. As simple as that.

2. Klasa Board definise funkciju getValidMoves(), koja vraca listu mogucih poteza. Klasa computerPlayer
koja je u sustini kompjuter implementira evaluateMove() u kojoj proverava svoj sledeci potez. Pazljivijim pregledom te
funkcije moze se videti da algoritam provere i nije nesto posebno ;)

Ukoliko imas specificnijih pitanja, ti pitaj.

Pozdrav,
alex.

[Ovu poruku je menjao alex dana 01.12.2006. u 17:08 GMT+1]
Alex: My favorite site is http://localhost/
R.J. Oppenheimer: "I am become death, destroyer of worlds" (1945 AD)
tweet.13x ||
linkedin.13x
 
Odgovor na temu

StefanJer91
Stefan Jeremic
Beograd

Član broj: 121923
Poruke: 160
217.24.27.*



Profil

icon Re: Iks Oks u pythonu30.11.2006. u 19:25 - pre 178 meseci
Razumem ja sta koja funkcija radi ali ne i po kom principu. Skinuo sam tutorial uz ovaj kod, i u njemu pise isto sto mi i ti kazes, ali dzabe kad nerazumem princip, pa bih te zamolio, ako ti nije problem, da li znas neki sajt sa malo naprednijim tutorialima posto su tutoriali na koje sam ja nailazio uglavnom bili cist uvod u Python-ovu sintaxu tako ada nisam nigde imao detaljniji uvod u lambda, reduce... Tacnije nisam uopste video da se to u nekom tutu spuminje. Unapred hvala!
The earth teaches us more about ourselves than all the books. Because it resists us. Man discovers himself when he measures himself against the obstacle.
 
Odgovor na temu

alex
Aleksandar Radulovic
Senior Software Engineer, Spotify
Stockholm, Sweden

Član broj: 71
Poruke: 2194
*.siminn.is.

Jabber: alex@a13x.info
ICQ: -1
Sajt: www.a13x.info


+1 Profil

icon Re: Iks Oks u pythonu01.12.2006. u 16:07 - pre 178 meseci
Hm.. reduce() funkciju stvarno ne znam kako jednostavnije da ti objasnim. Sto se tice lambda specijalne funkcije, u knjizi Dive into Python ima vrlo lepo objasnjenje na ovom linku.
Alex: My favorite site is http://localhost/
R.J. Oppenheimer: "I am become death, destroyer of worlds" (1945 AD)
tweet.13x ||
linkedin.13x
 
Odgovor na temu

StefanJer91
Stefan Jeremic
Beograd

Član broj: 121923
Poruke: 160
217.24.27.*



Profil

icon Re: Iks Oks u pythonu04.12.2006. u 14:36 - pre 178 meseci
Hvala. Skinuo sam jos pre tu knjigu, ali mi rekose da nije za pocetnike. Pogledacu, i ako negde zapnem, znam gde da trazim pomoc
The earth teaches us more about ourselves than all the books. Because it resists us. Man discovers himself when he measures himself against the obstacle.
 
Odgovor na temu

alex
Aleksandar Radulovic
Senior Software Engineer, Spotify
Stockholm, Sweden

Član broj: 71
Poruke: 2194
*.siminn.is.

Jabber: alex@a13x.info
ICQ: -1
Sajt: www.a13x.info


+1 Profil

icon Re: Iks Oks u pythonu05.12.2006. u 09:42 - pre 178 meseci
Knjiga se ne preporucuje kao prva knjiga za citanje ako zelis da naucis Python. Medjutim, mislim da bilo ko ko je procitao makar Tutorial o Python jeziku moze da krene u citanje Dive Into Python knjige.

Poz,
alex.
Alex: My favorite site is http://localhost/
R.J. Oppenheimer: "I am become death, destroyer of worlds" (1945 AD)
tweet.13x ||
linkedin.13x
 
Odgovor na temu

[es] :: Python :: Iks Oks u pythonu

[ Pregleda: 3227 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.