Крестики-Нолики всё возможные варианты ходов.

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by ZnikiR, 18 Mar 2010.

  1. ZnikiR

    ZnikiR Member

    Joined:
    14 Jan 2009
    Messages:
    117
    Likes Received:
    21
    Reputations:
    -5
    В общем тупо задался целью,написать прогу.
    Но что-то никак не могу придумать алгоритм.
    В общем идея такая.
    Написать программу,которая просчитает и отобразить пошагово всё возможные ходы игры крестики-нолики 3х3.
    Меня инттересуют именно всё варианты ходов.
    Но вот уже 4 день ничего в голосу не идет.
     
  2. AGENTWPC74

    AGENTWPC74 Member

    Joined:
    11 Nov 2009
    Messages:
    201
    Likes Received:
    37
    Reputations:
    5
    ходов может быть 9х9=81 вариант ходов
    если не ошибаюсь . вот и пиши алгоритм. если крестик в ячке 1 то нолик ставлю ы ячейку 2
     
  3. BrainDeaD

    BrainDeaD Elder - Старейшина

    Joined:
    9 Jun 2005
    Messages:
    774
    Likes Received:
    292
    Reputations:
    214
    ошибаешься.

    начать, думаю с того, что в игре существуют два вида пермутаций:
    1) 5 крестиков и 4 нолика
    2) 4 крестика и 5 ноликов
     
  4. ZnikiR

    ZnikiR Member

    Joined:
    14 Jan 2009
    Messages:
    117
    Likes Received:
    21
    Reputations:
    -5
    Нет это просто зависит от того кто первый ходит.
    У меня тут мысли,просто есть 3 варианта первого хода,всё остальные ему идентичны.
    Представим матрицу 3х3
    Значит первый ход может быть 1х1 2х2 или 1х2,остальное это всё одно и тоже.
    Вот я и думаю.Как отсекать похожие комбинации.
     
  5. Delimiter

    Delimiter Banned

    Joined:
    8 Apr 2005
    Messages:
    317
    Likes Received:
    173
    Reputations:
    12
    вызвать функцию :) все варианты естественно включают и одинаковые .....

    варианты хода считаются разными на том основании что ходы делаются в разное время (что в теории игр не означает эквивалентными вариантами)
    Code:
    int a[3][3];
    int step(int mode)
    {
      int i,j,fl;
      for(i=0,fl=0;i<3;i++)
        for(j=0;j<3;j++)
        {
            if(a[i][j]==0)
            {
                a[i][j]=mode;
                step(mode*(-1));
                a[i][j]=0;
                fl=1;
            }
        }
       if(fl==0)
       {
           printf("\r\n===================\r\n");
           for(i=0;i<3;i++)
           {
              printf("*---*---*---*\r\n");
              for(j=0;j<3;j++)
              {
                 switch(a[i][j])
                 {
                    case 0:
                           printf("|   ");
                           break;
                    case 1:
                           printf("| X ");
                           break;
                    case -1:
                          printf("| O ");
                           break;
                 }
              }
              printf("|\r\n");
           }  
            printf("*---*---*---*\r\n");
       }
    return 0;
    }
    
    
    
    а если тебе нужны все варианты ... то эта задача к теории игр вооообще не относится
    представь себе что имеешь 10 битовое число ,то тебе нужно всего лишь выбрать все комбинации где количество битов 1 равно количеству 0 .... это заваулированное условие твоей задачи ...
     
    #5 Delimiter, 18 Mar 2010
    Last edited: 18 Mar 2010
  6. BrainDeaD

    BrainDeaD Elder - Старейшина

    Joined:
    9 Jun 2005
    Messages:
    774
    Likes Received:
    292
    Reputations:
    214
    я думал нужны ВСЕ возможные комбинации.
     
  7. -Gory King-

    -Gory King- Banned

    Joined:
    26 Jun 2009
    Messages:
    247
    Likes Received:
    23
    Reputations:
    15
    бля только что 2 голоса проиграл((
     
  8. ZnikiR

    ZnikiR Member

    Joined:
    14 Jan 2009
    Messages:
    117
    Likes Received:
    21
    Reputations:
    -5
    Да именно из-за приложения http://vkontakte.ru/app1741517 этим занялся.
    В обычном варианте выиграть вообще не вариант,вот и решил посмотреть возможные варианты.
     
  9. ZnikiR

    ZnikiR Member

    Joined:
    14 Jan 2009
    Messages:
    117
    Likes Received:
    21
    Reputations:
    -5
    2 Delimiter Это мы получаем сразу итог,но я думаю про последовательно каждый щаг.
     
  10. Delimiter

    Delimiter Banned

    Joined:
    8 Apr 2005
    Messages:
    317
    Likes Received:
    173
    Reputations:
    12
    хааааааааа ... ноу проблем
    Code:
    int a[3][3];
    int step(int mode)
    {
      int i,j,k,l,fl;
      for(i=0,fl=0;i<3;i++)
        for(j=0;j<3;j++)
        {
            if(a[i][j]==0)
            {
                a[i][j]=mode;
           printf("\r\n===================\r\n");
           for(k=0;k<3;k++)
           {
              printf("*---*---*---*\r\n");
              for(l=0;l<3;l++)
              {
                 switch(a[k][l])
                 {
                    case 0:
                           printf("|   ");
                           break;
                    case 1:
                           printf("| X ");
                           break;
                    case -1:
                          printf("| O ");
                           break;
                 }
              }
              printf("|\r\n");
           }  
            printf("*---*---*---*\r\n");
    
                step(mode*(-1));
                a[i][j]=0;
                fl=1;
            }
        }
    return 0;
    }
    
    может тебе лучче сразу програмку которая играет написать?
     
    #10 Delimiter, 18 Mar 2010
    Last edited: 18 Mar 2010
  11. ZnikiR

    ZnikiR Member

    Joined:
    14 Jan 2009
    Messages:
    117
    Likes Received:
    21
    Reputations:
    -5
    Спасибо, интересно самому попробовать.
     
  12. Delimiter

    Delimiter Banned

    Joined:
    8 Apr 2005
    Messages:
    317
    Likes Received:
    173
    Reputations:
    12
    анализируй после каждого хода а не ЛИНИЯ ли.... и возвращай если противник -100
    если ты 100.... на каждом уровне действует МИНИМАКСНАЯ модель (каждый выбирает лучший для себя ход!)
     
  13. ZnikiR

    ZnikiR Member

    Joined:
    14 Jan 2009
    Messages:
    117
    Likes Received:
    21
    Reputations:
    -5
    Не понял что тут делается.

    И каким образом он выбирает из массива значения 0,1,-1
     
  14. Delimiter

    Delimiter Banned

    Joined:
    8 Apr 2005
    Messages:
    317
    Likes Received:
    173
    Reputations:
    12
    тут записывается в массив то что сейчас нужно ставить
    возможные варианты 1 и -1
     
  15. ZnikiR

    ZnikiR Member

    Joined:
    14 Jan 2009
    Messages:
    117
    Likes Received:
    21
    Reputations:
    -5
    Понял,но не всё.
    Надо всё пропустить через себя,не такой я быстрый и опытный.
    Но понял что ты хочешь,попробую сам переделать.
    Результат позже выложу
     
  16. Delimiter

    Delimiter Banned

    Joined:
    8 Apr 2005
    Messages:
    317
    Likes Received:
    173
    Reputations:
    12
    удачи!
     
  17. ViLKaa

    ViLKaa Member

    Joined:
    24 Jul 2009
    Messages:
    41
    Likes Received:
    7
    Reputations:
    5
    если приложение на голоса с компом..то там нельзя выиграть у компа)
    всевремя ничья.
     
  18. Delimiter

    Delimiter Banned

    Joined:
    8 Apr 2005
    Messages:
    317
    Likes Received:
    173
    Reputations:
    12
    да в игре на доске 3х3 .... при правильной игре обоих игроков всегда НИЧЬЯ!
     
    1 person likes this.
  19. ZnikiR

    ZnikiR Member

    Joined:
    14 Jan 2009
    Messages:
    117
    Likes Received:
    21
    Reputations:
    -5
    Там несколько вариантов игры,есть на проигрыш и на ничью.Хочу посмотреть реально ли при игре в эти режимы выиграть!
     
  20. St0nX

    St0nX Elder - Старейшина

    Joined:
    19 May 2007
    Messages:
    257
    Likes Received:
    46
    Reputations:
    0
    __tp://slil.ru/28820273 На QT писал когда то под Linux