Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: 6301
Последний выпуск: 19.06.2015

переделать код с С++ на Паскаль ( ну или хотя бы просто алгоритм пояснить)

82K
29 апреля 2012 года
yurka.D11
2 / / 29.04.2012
Код:
/****************************************/
        /* Џа®Ја ¬¬  ¤«п ЁЈал ў Љ « е.        */
        /* ЋЇЁб ­ЁҐ б¬. ў д ©«Ґ kalah.doc   */
        /* ‘®бв®Ёв Ё§ ®¤­®Ј® ¬®¤г«п,      */
        /* § Ј®«®ў®Є - ў д ©«Ґ kalah.c.      */
        /* Љ®¬ЇЁ«ЁагҐвбп ў ’гаЎ® ‘Ё ЎҐ§ Їа®ҐЄв .*/
        /****************************************/

#include <time.h>
#include <stdlib.h>
#include <stdio.h>  /* putchar  */
#include <bios.h>   /* bioskey  */

#include <xm.h>
#include <kbdcodes.h>
#include <kbd.h>

#include "kalah.h"

NODE rootPos, *root;
NODE  wStack[MAXLEVEL];
NODE  bestMove;
int   maxLevel=MAXLEVEL;
int   cL;

                /********************************/
        /* Џа®в®вЁЇл «®Є «м­ле дг­ЄжЁ©.    */
                /********************************/
float ABprune(PNODE p, float alpha, float beta);
PNODE first(PNODE p);   /* ЏҐаўл© Ё§ ­ б«Ґ¤­ЁЄ®ў Ї®§ЁжЁЁ p Ё«Ё NULL,    */
                        /* Ґб«Ё ¤®бвЁЈ­гв ¬ ЄбЁ¬ «м­л© га®ўҐ­м.         */
void retPos(PNODE p);

PNODE next(PNODE p);    /* ЋзҐаҐ¤­®© 室 Ё§ Ї®§ЁжЁЁ p Ё«Ё NULL,         */
                        /* Ґб«Ё ¤®ЇгбвЁ¬ле 室®ў Ў®«миҐ ­Ґв.            */

int scatterStones(int desk[14], int move);
                        /* ‘¤Ґ« вм 室 move Ё§ Ї®§ЁжЁЁ desk.            */

float estimate(PNODE p);/* ‚лзЁб«Ёвм ®жҐ­Єг Ї®§ЁжЁЁ.                    */
int isEmpty(PNODE p);   /* …б«Ё Ї®«п ®¤­®Ј® Ё§ Їа®вЁў­ЁЄ®ў Їгбвл,       */
                        /* ЇаЁ¬Ґ­Ёвм Їа ўЁ«® 1.4 Ё ўҐа­гвм 1.           */
                        /* ‚ Їа®вЁў­®¬ б«гз Ґ ўҐа­гвм 0.                */
void setLocs(void);     /* “бв ­®ўЁвм "нЄа ­­лҐ" Є®®а¤Ё­ вл Ї®«Ґ©.      */
void initialize(void);  /* ‚бпЄЁҐ ­ з «м­лҐ гбв ­®ўЄЁ.                  */


LOCAL float ABprune(PNODE p, float alpha, float beta)
/* Alpha-beta pruning (¬Ґв®¤ Ја ­Ґ© Ё ®жҐ­®Є) Ё§ бв вмЁ „.Љ­гв .        */
/* ‚®§ўа й Ґв ®жҐ­Єг § ¤ ­­®© Ї®§ЁжЁЁ p.                */
{
   float    m, t;
   PNODE    curPos;

   cL++;
   curPos = first(p);       /* …б«Ё г Ї®§ЁжЁЁ p ­Ґв бл­®ўҐ©, */
                /* ўҐа­Ґ¬ NULL.               */
   if(curPos == NULL) {
      cL--;
      return estimate(p);   /* ‡„…‘њ ўл室 Ё§ Їа®жҐ¤гал,       */
   }                /* Є®Ј¤  Ї®§ЁжЁп вҐа¬Ё­ «м­ .        */
   else {
      m = alpha;
      while((curPos != NULL) && (m < beta)) {
         t = -ABprune(curPos, -beta, -m);
         if(t > m)
            m = t;
         curPos = next(p);
      }
   }
   cL--;
   return m;            /* Ђ ‡„…‘њ - ўл室 ¤«п ўбҐе ®бв «м­ле   */
                /* Ї®§ЁжЁ©.              */
}/*ABprune*/

ENTRY int findMove(PNODE p)
{
   PNODE    pcurPos;
   NODE     curPos;
   int      res=0;
   float    t,m;

   cL=0;                        /* —в®Ўл ў®бЇ®«м§®ў вмбп first!         */
   pcurPos = first(p);          /* ‘ЈҐ­ҐаЁа㥬 ЇҐаў®Ј® бл­  p.          */

   if(pcurPos == NULL) {
      return 0;         /* ‡„…‘њ ўл室 Ё§ Їа®жҐ¤гал,       */
   }                /* Є®Ј¤  Ї®§ЁжЁп вҐа¬Ё­ «м­ .        */
   else {
      m = -200;
      while(pcurPos != NULL) {
         cL = -1;               /* "ЏаҐ¤ЇҐаў®Ґ" б®бв®п­ЁҐ га®ў­п.       */
         curPos = wStack[0];    /* ‚®§м¬Ґ¬ Ї®§ЁжЁо Ё§ б⥪ .            */
         t = -ABprune(&curPos, -200, 200);
         if((t > m) || (t == m && random(2))) {
            m = t;
            bestMove = curPos;
            res++;
         }
         wStack[0] = curPos; cL = 0;    /* Џ®«®¦Ё¬ Ї®§ЁжЁо ў б⥪ Ё     */
         pcurPos = next(p);             /* бЈҐ­ҐаЁа㥬 б«Ґ¤гойго.       */
      }
   }
   return res;
}/*findMove*/

LOCAL PNODE first(PNODE p)
{
   if(cL < maxLevel) {
      wStack[cL].extent = 0;
      wStack[cL].move[0] = Aplays(*p) ? -1 : 6;
      return next(p);
   }
   return NULL;
}/*first*/

LOCAL void retPos(PNODE p)
{
   int i;

                      /* ‘­ з «  бЄ®ЇЁа㥬 Ї®§ЁжЁо Ё§ p         */
   memmove(wStack[cL].desk,p->desk,sizeof(p->desk));
                      /* ’ҐЇҐам Їа®¤Ґ« Ґ¬ д®абЁа®ў ­­лҐ е®¤л    */
                      /* ¤® Ї®§ЁжЁЁ, ЇаҐ¤иҐбвўго饩 ⥪г饩.    */
   for(i=0;i<wStack[cL].extent;i++) {
      scatterStones(wStack[cL].desk,wStack[cL].move[i]);
      if (isEmpty(&wStack[cL])) break;
   }
}/*retPos*/

LOCAL PNODE next(PNODE p)
{
   int U = Aplays(*p) ? 6 : 13;
   int move,t;
        /**** Ќ ©¤Ґ¬ ®зҐаҐ¤­®© 室.   ****/
   retPos(p); /* Џ®бва®Ё¬ Ї®§ЁжЁо ¤® ®зҐаҐ¤­®Ј® 室 .     */
                         /* Ќ ©¤Ґ¬ ¤®ЇгбвЁ¬л© е®¤.         */
   move = wStack[cL].move[wStack[cL].extent];
   while(++move < U && wStack[cL].desk[move] == 0);
   wStack[cL].move[wStack[cL].extent] = move;

   if(move == U)
      return (wStack[cL].extent-- == 0) ? NULL : next(p);
   else {       /* move < U */
      t = scatterStones(wStack[cL].desk,move);
      if(t) {
         if(isEmpty(&wStack[cL]))
            return &wStack[cL];
         else { /* 1.2. (!) */
            wStack[cL].move[++wStack[cL].extent] =
                    Aplays(*p) ? -1 : 6;
            return next(p);
         }
      }
      else
         return &wStack[cL];
   }
}/*next*/

#define INC(i)          i++;                                    \
      if (move < 6 /* •®¤ ЁЈа®Є  A */ &&                        \
          i == 13  /* ‘®ЎЁа Ґ¬бп Є« бвм ў Є « е ЁЈа®Є  B */     \
          ||                                                    \
          move > 6 /* •®¤ ЁЈа®Є  B */ &&                        \
          i == 14  /* „®и«Ё ¤® Є®­ж  ¬ ббЁў  */) i = 0;         \
      else                                                      \
      if (move > 6 /* •®¤ ЁЈа®Є  B */ &&                        \
          i == 6   /* Џа®ЇгбвЁ¬ Є « е ЁЈа®Є  A */) i++;

LOCAL int scatterStones(int desk[14], int move)
{
   int i, fin=0, stones;

   i = move;
   stones = desk[i];            /* Љ®«ЁзҐбвў® а бЇаҐ¤Ґ«пҐ¬ле Є ¬­Ґ©     */
   desk[i] = 0;
   while(stones--) {                            /* ђ §«®¦Ё¬ Є ¬гиЄЁ:    */
      INC(i);                            /* “ўҐ«ЁзЁ¬ i Ё                */
      desk[i]++;                         /* Ї®«®¦Ё¬ ®зҐаҐ¤­®© Є ¬г襪.  */
   }
                             /*** Џа ўЁ«® 1.3: ***/
                             /* •®¤ § Є®­зЁ«бп ­  ‘‚Ћ…Њ Їгб⮬ Ї®«Ґ.    */
   if(desk[i] == 1 && desk[12-i] > 0 &&      /* Џ®«Ґ ­ Їа®вЁў ­ҐЇгбв®. */
      ((move < 6 &&                          /* •®¤ ЁЈа®Є  A            */
         i < 6) ||                           /* Ё Є®­зЁ«Ё ­  ҐЈ® Ї®«Ґ.  */
       (move > 6 &&                          /* •®¤ ЁЈа®Є  B            */
        i > 6 && i < 13))) {                 /* Ё Є®­зЁ«Ё ­  ҐЈ® Ї®«Ґ.  */
      desk[move<6? 6:13] += desk[i] + desk[12-i];
      desk[i] = desk[12-i] = 0;
   }
        /*** ‘®®ЎйЁ¬ ® ⮬, зв® ­г¦­® ЇаЁ¬Ґ­Ёвм Їа ўЁ«® 1.2. ***/
   if (move < 6 && i == 6 || move > 6 && i == 13) fin = 1;
   return fin;
}/*scatterStones*/

#undef INC

LOCAL float estimate(PNODE p)
/* ‚лзЁб«Ёвм ®жҐ­Єг Ї®§ЁжЁЁ.         */
{
    float value;
    value  = p->desk[6] - p->desk[13];
/*    value += 17.3/(37.5 - p->desk[6]) -
                        17.3/(37.5 - p->desk[13]) + 1.72;*/
    if(!Aplays(*p))
       value = -value;
    return value;
}/*estimate*/

LOCAL int isEmpty(PNODE p)
{
   int i,fin;
                                /*** Џа ўЁ«® 1.4. ***/
   fin = 1;
   for(i=0;i<6;i++) if(p->desk[i]) fin = 0;
   if(fin) {
      for(i=7;i<13;i++) {
         p->desk[13] += p->desk[i]; p->desk[i] = 0;
      }
      return 1;
   }
   fin = 1;
   for(i=7;i<13;i++) if(p->desk[i]) fin = 0;
   if(fin)
      for(i=0;i<6;i++) {
         p->desk[6] += p->desk[i]; p->desk[i] = 0;
      }
   return fin;
}/*isEmpty*/

/**********************************************************************/
/*       ‚‚Ћ„ •Ћ„Ђ ЏЋ‹њ‡Ћ‚Ђ’…‹џ                                       */
/**********************************************************************/

#include <conio.h>  /* gotoxy   */

ENTRY int getMove(void)
{
   int ch, move;

   while(1) {           /* –ЁЄ« ўў®¤  ­ ¦ вЁп Ї®«м§®ў вҐ«п */
      gotoxy(1,1);
      printf("‚ўҐ¤Ё 室:         "); gotoxy(12,1);
      if((ch = bioskey(0)) == KBD_NORMAL(ESC))       /* ¦¤Ґ¬ ­ ¦ вЁп     */
     exit(-1);          /* ­ ¦ в <ESC> - ўлў «Ёў Ґ¬бп ў „Ћ‘  */
      putchar(ch);
      move = kbd_ascii(ch) - '0';       /* Љ®¤Ёа㥬 ­ ¦ вЁҐ     */
      if (move < 0 || move > 5 || root->desk[move] == 0 ) {
         putchar('\a');         /* Ќ ¦ в® ­Ґ в® - "Јг¤­Ґ¬" Ё   */
         continue;          /* Ї®¤®¦¤Ґ¬ б«Ґ¤го饣® ­ ¦ вЁп */
      }
      break;                /* ‡¤Ґбм - ўл室 Ё§ жЁЄ«  */
   }
   return move;
}/*getMove*/

/**************************************************************************/
/*      “‘’ЂЌЋ‚ЉЂ ЉЋЋђ„€ЌЂ’ € ЌЂ—Ђ‹њЌЋ‰ ЏЋ‡€–€€                           */
/**************************************************************************/

int x[14],y[14];    /* Љ®®а¤Ё­ вл Ї®«Ґ© ­  нЄа ­Ґ.   */

LOCAL void setLocs(void)
{
   int i;

   for (i=0; i < 6; i++) {      /* ®ЇаҐ¤Ґ«Ґ­ЁҐ Є®®а¤Ё­ в    */
      y[i] = 20;            y[i+7] = 15;
      x[i] = 8+9*(i+1);     x[i+7] = 71-9*(i+1);
   }
   x[6] = 7+9*7; x[13] = 71-9*7;
   y[6] = 18;    y[13] = 18;
}/*setLocs*/

ENTRY void drawScreen(void)
{
   int i;

   for(i=0;i<14;i++) {
      gotoxy (x[i],y[i]);
      printf ("%2d",root->desk[i]);
   }
}/*drawScreen*/

LOCAL void initialize(void)
{
   int i;

   randomize();
   clrscr();
   root = &rootPos;
   for(i=0; i < 6;i++)
      root->desk[i] = root->desk[i+7] = 6;
   root->desk[6] = root->desk[13] = 0;

   setLocs();
   for(i=6;i<=72;i++) {
      gotoxy(i,14) ; printf("-");
      gotoxy(i,21); printf("-");
   }
   for(i=1;i<=6;i++) {
      gotoxy(9*i+9,22); printf("%d",i-1);
      gotoxy(9*i+9,13); printf("%d",13-i);
   }
   drawScreen();
}/*initialize*/

NODE gameA[100];
NODE gameB[100];
int gameLength=0;

void main(void)
{
   int i,k,done=0;
   FILE *file;

   initialize();
                /* ‚ нв®© ўҐабЁЁ ЇҐаўл© 室 ¤Ґ« Ґв Їа®Ја ¬¬ ,           */
                /* Ї®н⮬㠯®бва®Ё¬ "ЇаҐ¤ЇҐаў®Ґ" б®бв®п­ЁҐ:             */
                /* ЇаЁвў®аЁ¬бп, зв® ЇҐаўл© 室 㦥 ᤥ« ­ - ЁЈа®Є®¬ B.  */
   rootPos.extent = 0; rootPos.move[0] = 13;
   while(!done) {

      for(k=0;k!=-1;) {
         rootPos.move[k] = getMove();
         gameA[gameLength].extent = k+1;
         gameA[gameLength].move[k] = rootPos.move[k];
         if(scatterStones(rootPos.desk, rootPos.move[k])) k++;
         else k = -1;
         drawScreen();
         if(isEmpty(root)) {
            done = 1;
            break;
         }
      }
      if(!done) {

         if(!findMove(root)) {
            drawScreen();
            break;
         }
         gameB[gameLength].extent = bestMove.extent+1;
         for(k=0;k<=bestMove.extent;k++) {
            gameB[gameLength].move[k] = bestMove.move[k];
            gotoxy(1,1); clreol();
            printf("Џ®©¤г б Ї®«п ");
            for(i=k;i<=bestMove.extent;i++)
               printf(" %2d",bestMove.move[i]);
            bioskey(0);
            scatterStones(rootPos.desk,bestMove.move[k]);
            drawScreen();
            if(isEmpty(root)) {
               done = 1;
               break;
            }
         }

         gameLength++;
      }
   }
   drawScreen();

   file = fopen("lastGame.klh","wt");
   gotoxy(1,1);
   for(i=0; i<gameLength; i++) {
      printf("\n%3d) A:",i+1);
      fprintf(file,"\n%2d) A:",i+1);
      for(k=0; k<gameA[i].extent;k++) {
         printf(" %2d",gameA[i].move[k]);
         fprintf(file," %2d",gameA[i].move[k]);
      }
      printf("\t\tB:");
      fprintf(file,"\t\tB:");
      for(k=0; k<gameB[i].extent;k++) {
         printf(" %2d",gameB[i].move[k]);
         fprintf(file," %2d",gameB[i].move[k]);
      }
   }
   fprintf(file,"\n\nЉ ¬­Ґ© Ї® ®Є®­з ­ЁЁ ЁЈал:\n"
            "\tў Є « еҐ Ђ - %d\n"
            "\tў Є « еҐ B - %d\n",
                rootPos.desk[6],rootPos.desk[13]);
   fclose(file);
}/*main*/
277
29 апреля 2012 года
arrjj
1.7K / / 26.01.2011
Пздц.
465
29 апреля 2012 года
QWERYTY
595 / / 25.03.2012
Да круто. А у меня в голове появился вопрос пока я просматривал код:
Ты уверен что тебе именно этот код нужен???

Ладно если без шуток попробуй перекодировать коментарии, например с этим возможно справится перекодировщик Артемия Лебедева.(Мне пару раз помагал когда начиналась бычка с кодировками).
Пытайся сразу несколько коментариев переводить, я так понимаю должны расти шансы на успех. С одного символа(крайний вариант) сложно перекодировщику понять о чём идет реч и удовлетворительный ли результат.
Видимо нужен сам исходник, а не копи паста сохраненная в блокноте или ещё где, т.к. информация на этом этапе уже может быть потеряна.

Что делать то пытаетесь? Может вам из этого кода процентов 20 нужно.
445
29 апреля 2012 года
Meander
487 / / 04.09.2011
Можешь скопировать этот ПЗДЦ в блокнот, сохранить и открыть с помощью MS WORD. Но и после этой нехитрой операции тебе не станет все ясно, кроме того, что это алгоритм какой то игры (типа ГО), так как речь идет о неких камушках и игроках. Но если ты знаешь, название этой игры то можешь поискать ее описание в WEB, кванте, или в программировании игр и головоломок. Если же тебе это все известно, и вопрос лишь в переводе кода с Си на Паскаль. То ройся в справочниках по Си и ищи соответствия. Учитывая огромное количество выложенных алгоритмов на Паскале, не удевлюсь, если ты отыщешь готовый вариант.
82K
29 апреля 2012 года
yurka.D11
2 / / 29.04.2012
Спасибо что отозвались)
правила игры я знаю. мне необходимо для написания курсовой. Язык си я не знаю пытаюсь реализацию сделать на паскале.
часть уже сделал что понял. Мне нужно разобрать помочь из данной программы понять как ходы совершаются и как компьютер выбирает наилучший ход.
445
29 апреля 2012 года
Meander
487 / / 04.09.2011
Во-первых, главная функция это
 
Код:
void main(void)
{
//.........
}
Здесь все происходит и из нее вызываются все описанные ранее функции.
Но главное цикл в котором чередуется :
1. Оценка позиции
2. Ход игрока В (компьютер)
3. Ход игрока А (человек)
Во-вторых алгорим основан на анализе дерева разбора
для понимания как он происходит нужно знать устройство
структур NODE - узел, PNODE - первичный узел (видимо).
Дело в том, что в приведенном коде они используются как типы (созданные пользователем),
а операции производятся над переменными этих типов. Но в данном коде
они не определены, а определены в каком то из файлов :
xm.h, kbdcodes.h, kbd.h или kalah.h.
Так что там надо посмотреть. А из комментариев ясно какая функция за что отвечает.
465
30 апреля 2012 года
QWERYTY
595 / / 25.03.2012
Делай по порядку. Вот эти инклуды я так понимаю тебе нужно будет переписать в .pas файлы и добавить их в секцию uses в этом файле.
бери строчка за строчкой и переделывай.


 
Код:
#include "kalah.h"

NODE rootPos, *root;
NODE  wStack[MAXLEVEL];
NODE  bestMove;
int   maxLevel=MAXLEVEL;  - как я понимаю глобальные переменные
int   cL;

ты же пишешь в первом попавшемся var до implementation


 
Код:
rootPos, *root: NODE; // *root вот с этим розберись
wStack[MAXLEVEL]: NODE; // чё там за NODE такой? И так, и так можно.
bestMove: NODE;
maxLevel: int := MAXLEVEL; - integer но должно и так прокатить, делфя хавает много типов из си
cL: int;  // как я понимаю глобальные переменные
Дальше поехал после implementation


Код:
LOCAL float ABprune(PNODE p, float alpha, float beta)
/* Alpha-beta pruning (¬Ґв®¤ Ја Ґ© Ё ®жҐ®Є) Ё§ бв вмЁ „.Љгв .        */
/* ‚®§ўа й Ґв ®жҐЄг § ¤ ®© Ї®§ЁжЁЁ p.                */
{
   float    m, t;
   PNODE    curPos;

   cL++;
   curPos = first(p);       /* …б«Ё г Ї®§ЁжЁЁ p Ґв бл®ўҐ©, */
                /* ўҐаҐ¬ NULL.               */
   if(curPos == NULL) {
      cL--;
      return estimate(p);   /* ‡„…‘њ ўл室 Ё§ Їа®жҐ¤гал,       */
   }                /* Є®Ј¤  Ї®§ЁжЁп вҐа¬Ё «м .        */
   else {
      m = alpha;
      while((curPos != NULL) && (m < beta)) {
         t = -ABprune(curPos, -beta, -m);
         if(t > m)
            m = t;
         curPos = next(p);
      }
   }
   cL--;
   return m;            /* Ђ ‡„…‘њ - ўл室 ¤«п ўбҐе ®бв «мле   */
                /* Ї®§ЁжЁ©.              */
}/*ABprune*/
ты же пишешь

Код:
function ABprune(p: PNODE ;alpha: float; beta: float): float; //и добавляй везде stdcall;
//еси по умолчанию у тебя не так.
var
m, t: float;
curPos: PNODE;
begin
  //cL++;???
  cL := cL + 1;
  curPos := first(p);// Это я не понял, если не компилится ищешь аналог в делфи
  if curPos = NIL then
  begin
    cL := cL - 1;
    result := estimate(p); //то же самое
    Exit;
    end
  else
  m := alpha;
  while (curPos <> NIL) and (m < beta) do
  begin
    t := -ABprune(curPos, -beta, -m);
    if t > m then m := t;
    curPos := next(p);
    end;
  end;
  cL := cL - 1;
  result := m;
end;
И поехал в том же духе. Конечно с первого раза как правило не компилится у тех кто не шарит и в си и в паскале(чёто мне паскаль алгол напоминает), а ты смотри на сообщения компилятора. Делфи компилятор как правило вполне конкретно указывает что и где ему не нравится
465
30 апреля 2012 года
QWERYTY
595 / / 25.03.2012
А файлы kbdcodes.h и kbd.h случайно не связанны с клавиатурой? Если это так, не могли бы вы их мне как нибудь передать?
465
04 мая 2012 года
QWERYTY
595 / / 25.03.2012
maxLevel: int := MAXLEVEL; - Вот тут я может погорячился, сам так не делал.
Но если не канает напиши что при создании формы:
maxLevel := MAXLEVEL;
92K
28 января 2014 года
stasence
1 / / 28.01.2014
Помогите пожалуста ))))))
procedure TForm1.Button1Clіck(Sender: TObject);
begіn
іf OpenDіalog1.Execute then
begіn
MedіaPlayer1.FіleName := OpenDіalog1.FіleName;
MedіaPlayer1.Open;
end;
end;

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог