Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Пятнашки (отмена хода), Функция отмены хода 
:(
    Опции темы
dbepka
  Дата 17.6.2009, 08:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте программирую совсем недавно и многое в этом непонимаю, но хочется. У меня вопрос как можно реализовать функцию отмены хода в игре? Листинг кода основных пропроцедур выкладываю ниже. 

Код

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include "Unit3.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
int up[] =      {0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1};
int down[] =    {1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0};
int left[] =    {0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1};
int right[] =   {1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,0};
AnsiString S[] = {"1","2","3","4","5","6","7","8","9","10","11","12","13","14","15"," "};
int Count = 0; //Счётчик ходов равен 0
int MaxCount = 300; //Максимум ходов 300
int Pressing = false;
int Old;
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Action(TObject *Sender)
{
int i,j;
AnsiString buf = "Исчерпано максимальное количество ходовю\nХотите начать заново?";
 i = dynamic_cast<TButton *>(Sender)->Tag;
 if(N15->Checked){      //Если включена опция Перестановка фишек
          if(Pressing){
                       AnsiString c;
                       c = S[Old]; S[Old] = S[i]; S[i] = c;
                       Pressing = false;  draw();
                       }
          else {Pressing = true; Old = i;}
          return;
          }
 j = analysis(i);
 switch(j)
 {
  case 0 : break;
  case 1 : S[i-4] = S[i]; S[i] = " "; break;
  case 2 : S[i+4] = S[i]; S[i] = " "; break;
  case 3 : S[i-1] = S[i]; S[i] = " "; break;
  case 4 : S[i+1] = S[i]; S[i] = " "; break;
 }
 draw();
 analysis_victory();
 if(j != 0) { Count++; Label1->Caption = "Кол-во ходов: " + IntToStr(Count);
              if(Count == MaxCount){
                 if(MessageDlg(buf,mtConfirmation,TMsgDlgButtons()<< mbYes << mbNo,0) == mrNo)
                    Close();
                 else Restart();}
             }
}
int     TForm1::analysis(int i)
{
        if(S[i] == " ") return(0); //Если нажимаем на пустую кнопку, в case записывается 0.
        if(up[i] == 1) {if(S[i-4] == " ") return(1);} //Проверка можно ли сделать движение вверх.
        if(down[i] == 1) {if(S[i+4] == " ") return(2);} //Проверка можно ли сделать движение вниз
        if(left[i] == 1) {if(S[i-1] == " ") return(3);}  //Проверка можно ли сделать движение влево.
        if(right[i] == 1) {if(S[i+1] == " ") return(4);} //Проверка можно ли сделать движение вправо.
        return(0);
}

void    TForm1::draw(void)
{
int j;
for(int i = 0; i < ComponentCount; i++)
 {
  if(dynamic_cast<TButton *>(Components[i]))
   {
    j = dynamic_cast<TButton *>(Components[i])->Tag;
    dynamic_cast<TButton *>(Components[i])->Caption = S[j];
   }
 }
}

void TForm1::analysis_victory(void)
{
int j = true;
AnsiString buf = "Вы победили.\nХотите сыграть еще?";
for(int i=0; i<15; i++)
 {
  if(S[i] != IntToStr(i+1)) j = false;
 }
 if(j)
  {
   if(Application->MessageBox(buf.c_str(),"ПОБЕДА",MB_YESNO + MB_ICONEXCLAMATION) == IDYES)
    {
     Restart();
    }
    else Close();
  }
}


PM MAIL   Вверх
jonie
Дата 17.6.2009, 08:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

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



http://ru.wikipedia.org/wiki/Command
про этот паттерн почитайте


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
azesmcar
Дата 17.6.2009, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



Можно еще через стэк функторов. При каждой операции добавлять в стэк функтор, реализующий обратную операцию. При откате доставать функтор из стэка и выполнять. Тут только одна операция как я понимаю, думаю
можно просто добавить Unexecute в
Цитата(jonie @  17.6.2009,  08:27 Найти цитируемый пост)
http://ru.wikipedia.org/wiki/Command

Правда не вижу как он впишется в ваш монилитный код smile 


Это сообщение отредактировал(а) azesmcar - 17.6.2009, 10:32
PM   Вверх
dbepka
Дата 17.6.2009, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А можно это показать на примере в С++? Или можно реализовать это с помощью того же массива?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

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

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

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

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


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

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


 




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


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

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