en forum


 Правила(обновени на 11.05.2008)   Търсене   Потребители   Потребителски групи   Регистрирайте сеРегистрирайте се 
 ПрофилПрофил   Влезте, за да видите съобщенията сиВлезте, за да видите съобщенията си   ВходВход 

Tic Tac Toe


 
Създайте нова тема   Напишете отговор    Информатика Форуми -> Ruby, Python, Scheme, Smalltalk
Предишната тема :: Следващата тема  
Автор Съобщение
pavelludiq



Регистриран на: 10 Dec 2007
Мнения: 673
Местожителство: Shumen
Репутация: 70.2
гласове: 17

МнениеПуснато на: Thu Aug 21, 2008 3:12 pm    Заглавие: Tic Tac Toe Отговорете с цитат

Беше им скучно и за това си начатках една дървена версия на морски шах. Кодът е 79 реда с коментарите и празните редове и има някой много красиви и някой много грозни части в него. това е още версия 1, така че не се смейте на грозните части, а на коментарите им Very Happy Коментирал съм кода, така че трябва да разберете лесно как бачка, ако имате въпроси питайте.

Код:

from itertools import cycle

#matricata v koqto shte se vodi igrata, spisuk s 3 spisuka, s po 3 elementa
matrix=[[[], [], []], [[], [], []], [[], [], []]]

#vseki red e suotveten element ot matrix
row1=matrix[0]
row2=matrix[1]
row3=matrix[2]

#vsqka kolona e spisuk sus suotvetnite elementi ot suotvetnite redove
col1=[x[0] for x in matrix]
col2=[x[1] for x in matrix]
col3=[x[2] for x in matrix]

#diagonalite sa suotvetno purvia, vtoria i tretia elementi
#ot purvia, vtoria i tretia red i obratno za vtoria diagonal
diag1=[matrix[0][0],matrix[1][1],matrix[2][2]]
diag2=[matrix[2][0],matrix[1][1],matrix[0][2]]

#spisuk s vsichki vuzmozhni pechelivshi troiki, rcd=redici,colono,diagonali
rcd=(row1,row2,row3,col1,col2,col3,diag1,diag2)

#syzdavame dva iteratora, koito shte vurtqt stoinostite suoyvetno
#na player-ite i symbolite im, za tova importnahme cycle()
playerr=cycle(('player 1','player 2'))
symbb = cycle(('X','O'))
counter=0

#proverqva dali elementite sa pechelivshi
def good(x):
    if x[0]==x[1]==x[2]:
        return True
    else:
        return False

#proverqva dali v spisukut ima pechelivshi elementi
def win(x):
    for i in x:
        if good(i):
            return True
        else:
            return False

#priema za vhod coordinati i vkarva v matricata suotvetnia symbol X ili O
def turn(player,symb):
    #Sledvashtia red cod trqbva da napravi spisuk sus coordinatite
    #No vhodut e string, za tova purvo se razdelq i se premahva ','
    #posle seprevrushtat s int i tova e tsqloto list comprehention za da stane spisuk
    #s map() nqmashe da e mnogo po krasivo
    #Fucking Ugly VVVV
    vhod=[int(x) for x in tuple(raw_input("%s coordinati? " % player).split(','))]
    if matrix[vhod[0]][vhod[1]] == []:
        matrix[vhod[0]][vhod[1]]=symb
    else:
        print"error"
        inp(symb)

#printira matritsata v user friendly format :D
def printmatrix(matrix):
    for x in matrix:
        print x

#main-a
def mainloop(playerr,symbb,counter):
    while counter < 9:
        #player i symb se smenqt s vseki tsikul, zashtoto playerr i symbb sa iteratori
        #i se reduvat stoinostite im s vseki .next() metod
        player=playerr.next()
        symb = symbb.next()
        turn(player,symb)
        printmatrix(matrix)
        if win(rcd) == True:
            print '%s wins' % player
            break
        counter+=1

if __name__=='__main__':
    mainloop(playerr,symbb,counter)


играта се играе със следните координати за полетата:

Код:


[[0,0],[0,1],[0,2]]
[[1,0],[1,1],[1,2]]
[[2,0],[2,1],[2,2]]



enjoy Very Happy

пп А, да, понеже съм тъп и не знам как да програмирам изкуствен интерект ви трябва някой друг с който да играете Very Happy
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение Посетете сайта на потребителя
Реклама







Пуснато на:     Заглавие:

Върнете се в началото
steliyan



Регистриран на: 25 Oct 2006
Мнения: 75

Репутация: 12.5

МнениеПуснато на: Thu Aug 21, 2008 5:39 pm    Заглавие: Отговорете с цитат

Хаха, моя е по-къс (кода, де). Laughing Всъщност самия той е по-дълъг (кода, бе), все пак е писан на C++, без помощни библиотеки (освен iostream Very Happy). Естествено без коментари, без проверка за координати, така че бъдете възпитани, моля. Razz

Доколкото ти разбирам кода, използвам същия алгоритъм.

Код:
#include <iostream>
using namespace std;

char grid[9] = {'-', '-', '-', '-', '-', '-', '-', '-', '-'};
int win[8][3] = {0,1,2, 3,4,5, 6,7,8, 0,3,6, 1,4,7, 2,5,8, 0,4,8, 2,4,6};

void init()
{
   for(int i = 0; i < 9; i++)
      grid[i] = '-';
}

void output()
{
   system("CLS");

   for(int i = 0; i < 3; i++)
   {
      for(int j = 0; j < 3; j++)
         cout << grid[i*3 + j] << ' ';
      cout << endl;
   }
}

bool checkmove(int x, int y)
{
   return (grid[x*3 + y] == '-');
};

bool checkwinner()
{
   for(int i = 0; i < 8; i++)
      if(grid[win[i][0]] != '-' && (grid[win[i][0]] == grid[win[i][1]]) && (grid[win[i][1]] == grid[win[i][2]]))
         return 1;

   return 0;
};

int main()
{
   bool player = 0, winner = 0;
   int moves = 0, x, y;

   while(true)
   {
      output();
      
      if(moves == 9 || winner)
         break;

      cout << "Player " << player+1 << endl;

      do
      {
         cout << "Enter coords (x y): ";
         cin >> x >> y;
      }
      while(!checkmove(x, y));

      if(player)
         grid[x*3 + y] = 'X';
      else
         grid[x*3 + y] = 'O';

      moves++;
      player = !player;
      winner = checkwinner();
   }

   if(!winner)
      cout << endl << "Draw" << endl;
   else
      cout << endl << "Winner is Player " << !player+1 << endl;
}
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
Synaptic



Регистриран на: 06 Sep 2007
Мнения: 345

Репутация: 32.5Репутация: 32.5Репутация: 32.5
гласове: 6

МнениеПуснато на: Thu Aug 21, 2008 5:56 pm    Заглавие: Отговорете с цитат

Имаше един руби код за морски шах. Можеше да играеш с-у машината, на няколко трудности. Ще се опитам да го потърся, за да го ползвате, ако искате да си добавите "изкуствен интелект".
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
pavelludiq



Регистриран на: 10 Dec 2007
Мнения: 673
Местожителство: Shumen
Репутация: 70.2
гласове: 17

МнениеПуснато на: Thu Aug 21, 2008 6:00 pm    Заглавие: Отговорете с цитат

Намерих поне 3 python игри с изкуствен интелект, може да постна кода им по късно.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение Посетете сайта на потребителя
RGT



Регистриран на: 13 Apr 2008
Мнения: 132
Местожителство: Плевен
Репутация: 15.1Репутация: 15.1
гласове: 2

МнениеПуснато на: Fri Aug 22, 2008 12:02 am    Заглавие: Отговорете с цитат

При морския шах самата реализация не е нищо особено. По-интересно за мен е да си направиш генетичен алгоритъм, който се учи сам и колкото повече играе, толкова по-добър става...
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение Посетете сайта на потребителя
pavelludiq



Регистриран на: 10 Dec 2007
Мнения: 673
Местожителство: Shumen
Репутация: 70.2
гласове: 17

МнениеПуснато на: Fri Aug 22, 2008 6:10 am    Заглавие: Отговорете с цитат

Като науча пролог, ще го направя Very Happy демек няма да е тази година
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение Посетете сайта на потребителя
steliyan



Регистриран на: 25 Oct 2006
Мнения: 75

Репутация: 12.5

МнениеПуснато на: Fri Aug 22, 2008 7:14 am    Заглавие: Отговорете с цитат

Остави пролога, чети тука: http://www.ocf.berkeley.edu/~yosenl/extras/alphabeta/alphabeta.html
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
Baronov



Регистриран на: 08 Sep 2008
Мнения: 29

Репутация: 8.7Репутация: 8.7Репутация: 8.7Репутация: 8.7Репутация: 8.7Репутация: 8.7Репутация: 8.7Репутация: 8.7
гласове: 2

МнениеПуснато на: Mon Sep 08, 2008 10:55 am    Заглавие: Отговорете с цитат

RGT написа:
При морския шах самата реализация не е нищо особено. По-интересно за мен е да си направиш генетичен алгоритъм, който се учи сам и колкото повече играе, толкова по-добър става...


Генетичен алгоритъм за морски шах не ти трябва. То има само 3^9 ситуации. Да ги сметнеш и да напишеш непобедим алгоритъм не е особено трудно.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
RGT



Регистриран на: 13 Apr 2008
Мнения: 132
Местожителство: Плевен
Репутация: 15.1Репутация: 15.1
гласове: 2

МнениеПуснато на: Mon Sep 08, 2008 2:37 pm    Заглавие: Отговорете с цитат

Baronov написа:
Генетичен алгоритъм за морски шах не ти трябва. То има само 3^9 ситуации. Да ги сметнеш и да напишеш непобедим алгоритъм не е особено трудно.

То тва е ясно... Ама с генетичен алгоритъм е по-интересно Wink Пък и все от някъде тряа се почне, ако почнеш с шахмат, сигурно направо ще ти идва да си теглиш ножа...
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение Посетете сайта на потребителя
pavelludiq



Регистриран на: 10 Dec 2007
Мнения: 673
Местожителство: Shumen
Репутация: 70.2
гласове: 17

МнениеПуснато на: Mon Sep 08, 2008 4:30 pm    Заглавие: Отговорете с цитат

http://en.wikipedia.org/wiki/Computer_Go да не говорим за Go кво ти идва да си направиш Very Happy
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение Посетете сайта на потребителя
pavelludiq



Регистриран на: 10 Dec 2007
Мнения: 673
Местожителство: Shumen
Репутация: 70.2
гласове: 17

МнениеПуснато на: Fri Sep 26, 2008 9:10 pm    Заглавие: Отговорете с цитат

В горния код има един много сериозен бъг. Основната идея в него е да се създаде един глобален обект matrix(в случая е списък, но имах същия успех и със хеш таблица), чието състояние да се променя, и при всяка промяна, да се проверява, дали състоянието отговаря на определени изисквания, за да се прекрати играта(печеливш или равен). На идея това е супер, дори си мислех че работи. Горния код НЕ работи, проблемът се крие в списакът с елементите(редове, колони, диагонали). Проблемът е че редовете(row1,row2,row3) са просто указатели към списъци, докато другите(col1,col2,col3,diag1,diag2) са копия на обектите в тези списъци, т.е. те представляват нещо като снимки на състоянието на матрицата от определен момент(момента на създаването им) от там на татък не се променят, а матрицата се променя, а точно промените ни интересуват. Като резултат, програмата работи привидно, но може да победите само със 3-ка по хоризонталните редове. Ето версия 2, със един доста грозен хак, който решава проблема, просто при всяка промяна на матрицата, ще се правят копия на елементите, за да имаме моментна снимка на състоянието. Все още мисля върху алтернативи. Написал съм къде има промени. Ето кода:


Код:
from itertools import cycle

matrix=[[[], [], []], [[], [], []], [[], [], []]]

def printmatrix(matrix):
    for x in matrix:
        print x

#hack, vremenno reshenie
def refresh():
    row1=matrix[0]
    row2=matrix[1]
    row3=matrix[2]
    col1=[x[0] for x in matrix]
    col2=[x[1] for x in matrix]
    col3=[x[2] for x in matrix]
    diag1=[matrix[i][i] for i in xrange(3)]
    diag2=[matrix[i][m] for (i,m) in zip((2,1,0),xrange(3))]
    #nai groznata chast:
    global rcd
    rcd=(col1,col2,col3,row1,row2,row3,diag1,diag2)

#preimenuvano ot good na same
def same(lst):
    if lst[0]==lst[1]==lst[2]:
        return True
    else:
        return False

def win(x):
    for i in x:
        if same(i):
            #maluk hack, koito propusnah predi, []=[]=[],
            #sledovatelno pecheliat, no ne biva da stava taka
            if [] not in i:
                return True
    return False

playerr=cycle(('player 1','player 2'))
symbb = cycle(('X','O'))
counter=0

#izpolzvame hash za koordinotite, za po lesen interface
#po kusno hash-ut shte stane matritsata, vmesto vlojen spisuk,
#shte spesti niakolko znaka i shte povishi chetimosta
coor={'1':(0,0),'2':(0,1),'3':(0,2),
      '4':(1,0),'5':(1,1),'6':(1,2),
      '7':(2,0),'8':(2,1),'9':(2,2)}

def turn(player,symb):

    vhod=raw_input("%s, pozicia1-9? " % player)
    #hash-a napravi tozi kod po krasiv
    x,y=coor[vhod]
    if matrix[x][y] == []:
        matrix[x][y]=symb
    else:
        print"error"

def mainloop(playerr,symbb,counter):
    while counter < 9:
        player=playerr.next()
        symb = symbb.next()
        turn(player,symb)
        refresh()
        printmatrix(matrix)
        if win(rcd) == True:
            print '%s wins' % player
            break
        counter+=1
    #biah zabravil da dobavia tozi red predi
    else: print 'raven'

if __name__=='__main__':
    mainloop(playerr,symbb,counter)
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение Посетете сайта на потребителя
pavelludiq



Регистриран на: 10 Dec 2007
Мнения: 673
Местожителство: Shumen
Репутация: 70.2
гласове: 17

МнениеПуснато на: Mon Sep 29, 2008 7:39 pm    Заглавие: Отговорете с цитат

Дълго мислих как да пренапиша играта, така че да е малко по функционална, след като я преправих във стила на функционалното програмиране определено я опростих до някъде, спестих 10-тина реда, и мисля че се получи сравнително добре. Използвах няколко прости трика, за да опростя кода на места, например използвах речник вместо списък, за да не ми се налага да използвам после и друг речник за помощ при интерфейса, което определено опрости кода, тази функция good(), която преименувах на same(), сега изчезна, задачанта и се поема от win(), mainloop(), е пренаписана в рекурсивен вариант, защото исках да премахна нуждата от глобални променливи, които да не са функции, за целта и rcd, от списък е направен на функция която връща редица(това премахва нуждата от функцията refresh(), също така премахнах нуждата от импортирането на cycle() функцията, с която да сменям стойностите на player и symb, вместо това използвам проста редица, и в зависимост дали counter%2 връща 0 или 1, имамесъответно player1,X и player2,O. това също опростява нещата малко. Лично съм доста горд от това, от грозна процедурна програма, с императивни примеси, стана красива функционална програма. Без коментарите е само 45 реда, докато преди беше около 60(първата е 58, втората версия е 61 мисля). Можех да спестя и още редове, но за четимост съм ги разделил на няколко реда. Рамносметката е 4 прости функции, и една средно сложна. Ето кода:

Код:

#poneje matricata e hash, printiraneto i e malko po osobeno
def printmatrix(matrix):
    for x in [['1','2','3'],['4','5','6'],['7','8','9']]:
        print matrix[x[0]],matrix[x[1]],matrix[x[2]]

#vrushta redica s redovete, kolonite i diagonalite
def rcd_gen(matrix):
    return ((matrix['1'],matrix['2'],matrix['3']),
            (matrix['4'],matrix['5'],matrix['6']),
            (matrix['7'],matrix['8'],matrix['9']),
            (matrix['1'],matrix['4'],matrix['7']),
            (matrix['2'],matrix['5'],matrix['8']),
            (matrix['3'],matrix['6'],matrix['9']),
            (matrix['1'],matrix['5'],matrix['9']),
            (matrix['7'],matrix['5'],matrix['3']))

def win(rcd):
    for i in rcd:
        if i[0]==i[1]==i[2]:
            if [] not in i:
                return True
    return False

def turn(player,symb,matrix):
    vhod=raw_input("%s, pozicia1-9? " % player)
    if matrix[vhod] == []:
        matrix[vhod]=symb
    else:
        print"error"

#recursvna funkcia, funky nomer
def mainloop(player,symb,matrix,counter):
    if counter < 9:
        #vika turn() sus suotvetnite stoinosti na player i symb,
        #ako counter e 0 ili chetno tova sa suotvetno player1 i X,
        #za necetni stoinosti no counter, tova sa player2 i O
        turn(player[counter%2],symb[counter%2],matrix)
        printmatrix(matrix)
        #na win se podava kato argument rcd, generiran ot rcd_gen()
        if win(rcd_gen(matrix)) == True:
            print '%s wins' % player[counter%2]
        else:
            #recursivno povicvane, voodoo...
            mainloop(player,symb,matrix,counter+1)
    else: print 'raven'

if __name__=='__main__':
    #vmesto da syzdavame globalni imena za argumentite, napravo gi podavame, FP rules!!!
    mainloop(('player1','player2'),
             (' X',' O'),
             {'1':[],'2':[],'3':[],
              '4':[],'5':[],'6':[],
              '7':[],'8':[],'9':[]},
             0)



Ако има въпроси и предложения, питайте.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение Посетете сайта на потребителя
Реклама







Пуснато на:     Заглавие:

Върнете се в началото
Покажи мнения от преди:   
Създайте нова тема   Напишете отговор    Информатика Форуми -> Ruby, Python, Scheme, Smalltalk Часовете са според зоната GMT + 2 Часа
Страница 1 от 1

 
Идете на:  
Не Можете да пускате нови теми
Не Можете да отговаряте на темите
Не Можете да променяте съобщенията си
Не Можете да изтривате съобщенията си
Не Можете да гласувате в анкети
You cannot attach files in this forum
Може да сваляте файлове от този форум
Copyright © 2007-2010 math10.com.   изработка на сайт