Поиск:

Ответ в темуСоздание новой темы Создание опроса
> "Пятнашки", необходим алгоритм этой игры 
:(
    Опции темы
Гость_Гость
Дата 18.8.2005, 07:57 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











smile
  Вверх
_hunter
Дата 18.8.2005, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 24
Всего: 98





--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Guest
Дата 21.8.2005, 16:30 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата
"Пятнашки", необходим алгоритм этой игры


я прошу прощения...

но зачем лезть в программирование, если Вы даже алгоритм для игры в пятнашки придумать не можете???
  Вверх
Гость_Гость
Дата 24.8.2005, 05:36 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Зачем же изобретать велосипед?!
  Вверх
Trotil
Дата 24.8.2005, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 31.7.2005

Репутация: нет
Всего: нет



Потому что изобретение велосипеда - крайне полезное занятие... smile
PM MAIL   Вверх
Guest
Дата 21.10.2005, 12:51 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Нашел в Инете код игры "пятнашки", кое-что добавил, кое-что исправил, но кое-что в нем никак не могу понять.Игра работает не совсем правильно, но как пишет сам автор, что это только пример. Хочу обратиться за помощью к более умудренным опытом.
Код

void fnRandomArray();
void fnDrawArray();
int nArray[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
int nPosition=-1 ;

//---------------------------------------------------------------------------
__fastcall TMainForm::TMainForm(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void fnDrawArray()           //расставляет фишки (панели размер 57х57)
{                            //на панеле Р0 (размер 241*241)

   int i,j,k=0;
   for (i=0; i<=3; i++)
      for(j=0; j<=3; j++)
      {
         if (nArray[k]!=16)
         {
            ((TPanel*)MainForm->Components[nArray[k]])->Left=i*57+7;
            ((TPanel*)MainForm->Components[nArray[k]])->Top=j*57+7;
         }
         k++;
      }
}
//---------------------------------------------------------------------------
void fnRandomArray()     //перемешивает фишки в случайном порядке
{
BOOL flag;

   randomize();
   do
   {
      flag=TRUE;
      for (int i=0; i<=15; i++)
      {
         nArray[i]=random(16)+1;
      }
      for(int i=0; i<15; i++)
      {
         for(int j=i+1; j<=15; j++)
         {
            if(nArray[i]==nArray[j])
            {
               flag=FALSE;
            }
         }
      }
   }
   while(!flag);

}
//---------------------------------------------------------------------------
void __fastcall TMainForm::NewgameClick(TObject *Sender) //начало игры
{
fnRandomArray();
fnDrawArray();
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::P1Click(TObject *Sender)    //ход фишки
{                          //обработчик присваивается всем фишкам (панелям Р1-Р15)
int nPosition=-1;
   BOOL blHorzFlag=TRUE;
   BOOL blVertFlag=TRUE;
                                                          
   for(int i=0; nPosition==-1; i++)              //цикл ?    
   {
      if((((TPanel*)Sender)->ComponentIndex)==nArray[i])  //условие ?
         nPosition=i;                                     //чему равно nPosition ?
   }

   if (nArray[nPosition-1]==16)        //здесь проверка индекс=16 или значение индекса=16?     
   {                        //вверх
      nArray[nPosition-1]=nArray[nPosition];
      nArray[nPosition]=16;
      fnDrawArray();
    
   }
   else
   if (nArray[nPosition+1]==16)             //вниз
   {
      nArray[nPosition+1]=nArray[nPosition];
      nArray[nPosition]=16;
      fnDrawArray();

   }
   else
   if (nArray[nPosition-4]==16)             //влево
   {
      nArray[nPosition-4]=nArray[nPosition];
      nArray[nPosition]=16;
      fnDrawArray();

   }
   else
   if (nArray[nPosition+4]==16)             //вправо
   {
      nArray[nPosition+4]=nArray[nPosition];
      nArray[nPosition]=16;
      fnDrawArray();

   }

   for (int i=0; i<=15; i++)            //проверка
   {
      if(nArray[i]==i+1)
         blVertFlag=blVertFlag&&TRUE;
      else
         blVertFlag=blVertFlag&&FALSE;
   }

   for (int k=0; k<=12; k=k+4)
   for (int i=1; i<=3; i++)
   {
      if(nArray[i+k]==nArray[i+k-1]+4)
         blHorzFlag=blHorzFlag&&TRUE;
      else
        blHorzFlag=blHorzFlag&&FALSE;
   }

     if((blHorzFlag)||(blVertFlag))        
   {

     MessageBox(MainForm->Handle,"We are the champions, my friend!","You win!",MB_OK);
      }
}
//---------------------------------------------------------------------------

Здесь код, в котором непонятные моменты я обозначил вопросами. Все они в ходе фишки. Значение nPosition я попробовал проверить так: добавил на форму Мемо1,а в код добавил
Код

for(int i=0; nPosition==-1; i++)    
  {
      if((((TPanel*)Sender)->ComponentIndex)==nArray[i])  
         {
        nPosition=i;                                     
        Memo1->Lines->Add(IntToStr(nPosition));
     }
   } 

получилось 7128 - не пойму, что за число?
Спасибо!
  Вверх
Artemon
Дата 22.10.2005, 07:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 24.2.2004
Где: Челябинск

Репутация: 7
Всего: 20



Что-бы понять что такое nPosition, нужно досканально изучить алгоритм и код.

P.S.
Впредь пользуйся отладчиком, а не Memo


--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
CatOleg
Дата 22.10.2005, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 14.7.2005
Где: Запорожье

Репутация: нет
Всего: нет



PM MAIL WWW   Вверх
Guest
Дата 23.10.2005, 12:28 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Спасибо и на этом smile
  Вверх
Гость_Гость
Дата 12.11.2005, 13:39 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Мне необходимо реализовать правильное перемешивание фишек(фишки-это панели). Всем панелям (P1-P16) навешен обработчик P1Click. Чтобы программно щелкать по ним на самом деле не нажимая, можно использовать P1Click(а в скобках от P2-P15); Нашел вроде бы подходящий код на Pascale:
Код

var
  ind,Ind2:integer;
begin
    for ind:=0 to 99 do
    begin
    Randomize;
      PanelMoveClick(Controls[15]);
      PanelMoveClick(Controls[14]);
      PanelMoveClick(Controls[13]);
  for ind2:=0 to 9 do
      PanelMoveClick(Controls[random(15)+1]);
      PanelMoveClick(Controls[12]);
      PanelMoveClick(Controls[11]);
      PanelMoveClick(Controls[10]);
      PanelMoveClick(Controls[1]);
      PanelMoveClick(Controls[2]);
      PanelMoveClick(Controls[3]);
      PanelMoveClick(Controls[4]);
      PanelMoveClick(Controls[5]);
      PanelMoveClick(Controls[6]);
      PanelMoveClick(Controls[7]);
      PanelMoveClick(Controls[8]);
      PanelMoveClick(Controls[9]);
    end;
end;

Кажется перемешивается правильно, т.е. не беспорядочно, а именно ходами фишек. Как реализовать это на С++. У меня выходит так:


Код

for (int i=1;i<=99;i++)
{
randomize();
      P1Click(P15);
      P1Click(P14);
      P1Click(P13);
  for (int j=1; j<=9;j++)
   {
      P1Click("P"+IntToStr(random(15)+1));   //вот тут заморочка, как сделать?  :(  
      P1Click(P12);
      P1Click(P11);
      P1Click(P10);
      P1Click(P11);
      P1Click(P1);
      P1Click(P2);
      P1Click(P3);
      P1Click(P4);
      P1Click(P5);
      P1Click(P6);
      P1Click(P7);
      P1Click(P8);
      P1Click(P9);
   }
}

Подскажите плиз что не так, как это сделать, или может можно как нибудь проще?
Заранее благодарю!

  Вверх
Artemon
Дата 12.11.2005, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 24.2.2004
Где: Челябинск

Репутация: 7
Всего: 20



Во - первых : Заведи массив типа TPanel*, в него ты будешь складывать указатели на панели.

Во-вторых : Откуда ты знаешь что это подходящий кусок, если не можешь даже его переписать на C ?

Короче говоря вот тебе приблизительные наброски:
Код


 /* Запоминаем указатели на панели */

 /* Вставляй это например в конструкторе формы */ 

  TPanel* mas[16];
  mas[0] = P1;
  mas[1] = P2;
 ...................
 ...................
 mas[15] = P15;

 /*Конец Запоминаем указатели на панели */

/* Объедини нижеследующий код в ф-ию  */
  int ind, ind2;
  randomize();

  for(ind=0; ind<=99; ind++)
     {
     P1Click( mas[15] );
     P1Click( mas[14] );
     P1Click( mas[13] );
     
     for(ind2=0; ind<=9; ind2++)
        {
        P1Click(mas[random(16)]);
        P1Click( mas[12] );
        P1Click( mas[11] );
        P1Click( mas[10] );
        P1Click( mas[1] );
        P1Click( mas[2] );
        P1Click( mas[3] );
        P1Click( mas[4] );
        P1Click( mas[5] );
        P1Click( mas[6 );
        P1Click( mas[7] );
        P1Click( mas[8] );
        P1Click( mas[9] );
        }
     }



Примерно так, возможны недочеты писал без Buildera


--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
Гость_Гость
Дата 12.11.2005, 23:51 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Что-то не то с массивом, выадает ошибки. smile
  Вверх
Гость_Гость
Дата 14.11.2005, 13:39 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











все понятно, разобрался. Спасибо! smile
  Вверх
Гость_Гость
Дата 5.12.2005, 11:15 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Никак на получается перемешать фишки. В FormCreate фишки стоят правильно, при нажатии Новая игра должны (правильно) перемешаться. Все панели (фишки) как посоветовал Artemon добавил в массив, т.е.


Код

mas[0]=P1; mas[1]=P2;mas[2]=P3;
и т.д. Всем панелям(фишкам) присвоен один обработчик P1Click, в котором описан ход фишки. Как мне осуществить перемешивания фишек, программно щелкая по ним, т.е.


Код

P1Click(mas[14]);
P1Click(mas[3]);
P1Click(mas[5]);
и т.д. с помощью цикла, randoma... Уже не знаю, что и делать. Помогите плиз!
  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0645 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.