Модераторы: volvo877, Snowy, MetalFan
  

Поиск:

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


Новичок



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

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



Прога на паскале для игры в шашки.
Сильно не пинайте, знаю только основы.
Не успел сделать возможность бить несколько шашек и "дамок" тоже нет.
Вот что хотел спросить: как можно улучшить "искусственный интелект" (процедура StartAI) ну и вообще услышать рекомендации в написании.
Код

USES
    Crt,Graph;
TYPE
    CharMas=ARRAY [1..8,1..8] OF Char;
{---------------------------------------------------------------------------}
PROCEDURE BarDraw (BarX,BarY:Integer; FillColor:Char; VAR BarMas:CharMas);
BEGIN
     IF FillColor='B' THEN
        BEGIN
             BarMas[BarX,BarY]:=FillColor;
             SetFillStyle(SolidFill,Black);
        END
            ELSE
                BEGIN
                     BarMas[BarX,BarY]:=FillColor;
                     SetFillStyle(SolidFill,White);
                END;
     Bar(BarX*50,BarY*50,BarX*50+50,BarY*50+50);
END;
{---------------------------------------------------------------------------}
PROCEDURE CircleDraw (CircleX,CircleY:Integer; FillColor:Char; VAR CircleMas:CharMas);
BEGIN
     IF FillColor='D' THEN
        BEGIN
             CircleMas[CircleX,CircleY]:=FillColor;
             SetFillStyle(SolidFill,DarkGray);
             SetColor(DarkGray);
        END
           ELSE
               BEGIN
                    CircleMas[CircleX,CircleY]:=FillColor;
                    SetFillStyle(SolidFill,LightCyan);
                    SetColor(LightCyan);
               END;
     FillEllipse(CircleX*50+25,CircleY*50+25,20,20);
END;
{---------------------------------------------------------------------------}
PROCEDURE DeskField;
BEGIN
     SetColor(White);
     MoveTo(50,50);
     LineTO(450,50);
     LineTo(450,450);
     LineTo(50,450);
     LineTo(50,50);
END;
{---------------------------------------------------------------------------}
PROCEDURE NumbersSymbols;
VAR
   NumRep,Num4Sym:Integer;
   SymRep:Char;
BEGIN
     Num4Sym:=0;
     FOR SymRep:='1' TO '8' DO
         BEGIN
              Num4Sym:=Num4Sym+1;
              OutTextXY(470,Num4Sym*50+25,SymRep);
         END;
     Num4Sym:=0;
     FOR SymRep:='H' DOWNTO 'A' DO
         BEGIN
              Num4Sym:=Num4Sym+1;
              OutTextXY(Num4Sym*50+25,30,SymRep);
         END;
END;
{---------------------------------------------------------------------------}
{---------------------------------------------------------------------------}
{---------------------------------------------------------------------------}
PROCEDURE ReCheck(Crd1,Crd2:Char; VAR Err1:Boolean; VAR No1:Integer);
VAR
   T1,T2:Integer;
   K,L:Char;
   LT,L1:Integer;
BEGIN
     T1:=Ord(Crd1);
     T2:=Ord(Crd2);
     No1:=0;
     LT:=0;
     FOR K:='1' TO '8' DO
         BEGIN
              IF Crd1=K THEN No1:=1
                 ELSE IF Crd2=K THEN No1:=2;
         END;
     IF No1=1 THEN
     FOR L:='H' DownTO 'A' DO
         BEGIN
              L1:=Ord(L);
              IF (T2=L1) OR (T2=L1+32) THEN LT:=LT+1;
         END
         ELSE IF No1=2 THEN
              FOR L:='H' DownTO 'A' DO
                  BEGIN
                       L1:=Ord(L);
                       IF (T1=L1) OR (T1=L1+32) THEN LT:=LT+1;
                  END
              ELSE IF No1=0 THEN Err1:=False;
     IF LT<>0 THEN Err1:=True
        ELSE Err1:=False;
END;
{---------------------------------------------------------------------------}
PROCEDURE CharToInteger(Y1,X1:Char; VAR Ynew,Xnew:Integer);
VAR
   R,Ytemp,Xtemp,E:Integer;
   D:Char;
BEGIN
     R:=0;
     Ytemp:=Ord(Y1);
     FOR D:='H' DownTO 'A' DO
         BEGIN
              R:=R+1;
              IF (Ytemp=Ord(D)) OR (Ytemp=(Ord(d))+32) THEN Ynew:=R
         END;
     Xtemp:=Ord(X1);
     FOR E:=1 TO 8 DO
         IF (E=Xtemp-48) THEN Xnew:=E;
END;
{---------------------------------------------------------------------------}
PROCEDURE Moving (MasXs,MasYs,MasXf,MasYf:Integer;
                  VAR DeskMas:CharMas; DeskColor:Char;
                  VAR Err1:Boolean);
BEGIN
     Err1:=True;
     IF DeskMas[MasXs,MasYs]<>DeskColor THEN Err1:=False;
     IF DeskMas[MasXf,MasYf]<>'B' THEN Err1:=False;
     IF (DeskColor='L') AND (MasYs<MasYf) THEN Err1:=False
        ELSE IF (DeskColor='D') AND (MasYs>MasYf) THEN Err1:=False;
     IF Err1=True THEN
        BEGIN
             SetFillStyle(SolidFill,Black);
             DeskMas[MasXs,MasYs]:='B';
             Bar(MasXs*50+5,MasYs*50+5,MasXs*50+45,MasYs*50+45);
             IF DeskColor='L' THEN
                BEGIN
                     DeskMas[MasXf,MasYf]:='L';
                     SetFillStyle(SolidFill,LightCyan);
                     SetColor(LightCyan);
                END
                    ELSE
                        BEGIN
                             DeskMas[MasXf,MasYf]:='D';
                             SetFillStyle(SolidFill,DarkGray);
                             SetColor(DarkGray);
                        END;
             FillEllipse(MasXf*50+25,MasYf*50+25,20,20);
        END;
END;
{---------------------------------------------------------------------------}
PROCEDURE Fighting (MasXs,MasYs,MasXf,MasYf:Integer;
                    VAR DeskMas:CharMas; DeskColor:Char;
                    VAR Err1:Boolean; VAR BlackBlocks,WhiteBlocks:Integer);
BEGIN
     Err1:=True;
     IF DeskMas[MasXs,MasYs]<>DeskColor THEN Err1:=False;
     IF DeskMas[MasXf,MasYf]<>'B' THEN Err1:=False;
     IF DeskMas[(MasXf+MasXs) DIV 2,(MasYs+MasYf) DIV 2]=DeskColor THEN Err1:=False;
     IF DeskMas[(MasXf+MasXs) DIV 2,(MasYs+MasYf) DIV 2]='B' THEN Err1:=False;
     IF Err1=True THEN
        BEGIN
             SetFillStyle(SolidFill,Black);
             DeskMas[MasXs,MasYs]:='B';
             DeskMas[(MasXs+MasXf) DIV 2,(MasYs+MasYf) DIV 2]:='B';
             Bar(MasXs*50+5,MasYs*50+5,MasXs*50+45,MasYs*50+45);
             Bar((MasXs+MasXf)*25+5,(MasYs+MasYf)*25+5,
                 (MasXs+MasXf)*25+45,(MasYs+MasYf)*25+45);
             IF DeskColor='L' THEN
                BEGIN
                     BlackBlocks:=BlackBlocks-1;
                     DeskMas[MasXf,MasYf]:='L';
                     SetFillStyle(SolidFill,LightCyan);
                     SetColor(LightCyan);
                END
                   ELSE
                       BEGIN
                            WhiteBlocks:=WhiteBlocks-1;
                            DeskMas[MasXf,MasYf]:='D';
                            SetFillStyle(SolidFill,DarkGray);
                            SetColor(DarkGray);
                       END;
             FillEllipse(MasXf*50+25,MasYf*50+25,20,20);
        END;
END;
{---------------------------------------------------------------------------}
PROCEDURE StartAI(VAR CharMatrix:CharMas; VAR Bblocks,Wblocks:Integer);
VAR
   X,Y:Integer;
   RepBool:Boolean;
   RepInt,RandInt:Integer;
   Plus,Minus:Integer;
BEGIN
     Randomize;
     RepBool:=False;
     RepInt:=0;
     REPEAT
           RepInt:=RepInt+1;
           X:=Random(8);
           Y:=Random(8);
           IF (CharMatrix[X,Y]='D') AND (RepInt<513) THEN
              BEGIN
                   IF (CharMatrix[X+1,Y+1]='L') AND (CharMatrix[X+2,Y+2]='B') THEN
                                              Fighting(X,Y,X+2,Y+2,CharMatrix,'D',RepBool,Bblocks,Wblocks)
                      ELSE IF (CharMatrix[X-1,Y+1]='L') AND (CharMatrix[X-2,Y+2]='B') THEN
                                              Fighting(X,Y,X-2,Y+2,CharMatrix,'D',RepBool,Bblocks,Wblocks)
                           ELSE IF (CharMatrix[X+1,Y-1]='L') AND (CharMatrix[X+2,Y-2]='B') THEN
                                              Fighting(X,Y,X+2,Y-2,CharMatrix,'D',RepBool,Bblocks,Wblocks)
                                ELSE IF (CharMatrix[X-1,Y-1]='L') AND (CharMatrix[X-2,Y+2]='B') THEN
                                              Fighting(X,Y,X-2,Y-2,CharMatrix,'D',RepBool,Bblocks,Wblocks);
              END
                  ELSE IF (CharMatrix[X,Y]='D') AND (RepInt>512) AND (RepInt<1025)THEN
                      BEGIN
                           IF (CharMatrix[X-1,Y+1]='B') AND (CharMatrix[X-2,Y+2]<>'L') AND (CharMatrix[X,Y+2]<>'L') AND
                              (CharMatrix[X-2,Y]<>'L') THEN Moving(X,Y,X-1,Y+1,CharMatrix,'D',RepBool)
                              ELSE IF (CharMatrix[X+1,Y+1]='B') AND (CharMatrix[X+2,Y+2]<>'L') AND (CharMatrix[X,Y+2]<>'L') AND
                                   (CharMatrix[X+2,Y]<>'L') THEN Moving(X,Y,X+1,Y+1,CharMatrix,'D',RepBool);
                      END
                         ELSE IF (CharMatrix[X,Y]='D') AND (RepInt>1024) AND (RepInt<1537) THEN
                              BEGIN
                                   IF (CharMatrix[X+1,Y+1]='B') AND (CharMatrix[X+2,Y+2]='B') AND (CharMatrix[X,Y+2]='L') AND
                                      (CharMatrix[X+2,Y]='D') THEN Moving(X,Y,X+1,Y+1,CharMatrix,'D',RepBool)
                                      ELSE IF (CharMatrix[X-1,Y+1]='B')AND(CharMatrix[X-2,Y+2]='B')AND(CharMatrix[X,Y+2]='L')
                                      AND (CharMatrix[X-2,Y]='D') THEN Moving(X,Y,X-1,Y+1,CharMatrix,'D',RepBool);
                              END
                                  ELSE IF (CharMatrix[X,Y]='D') AND (RepInt>1536) AND (RepInt<2049) THEN
                                       BEGIN
                                            IF CharMatrix[X+1,Y+1]='B' THEN Plus:=1;
                                            IF CharMatrix[X-1,Y+1]='B' THEN Minus:=1;
                                            IF Plus=Minus THEN
                                               BEGIN
                                                    RandInt:=Random(2);
                                                    IF RandInt=1 THEN Moving(X,Y,X-1,Y+1,CharMatrix,'D',RepBool)
                                                       ELSE Moving(X,Y,X+1,Y+1,CharMatrix,'D',RepBool);
                                               END;
                                       END;
     UNTIL RepBool=True;
END;
{---------------------------------------------------------------------------}
VAR
   MasOfChar:CharMas;
   MasX,MasY,MasRep:Integer;
   Driver,Mode:Integer;
   NumberOfBlack,NumberOfWhite,NumberOfColor:Integer;
   BarColor,CircleColor,BlockColor:Char;
   Err:Boolean;
   No:Integer;
   Xs,Ys,Xf,Yf:Integer;
   StartCord1,StartCord2,FinishCord1,FinishCord2:Char;
BEGIN
     ClrScr;
     Driver:=Detect;
     InitGraph(Driver,Mode,'');
     MasRep:=0;
     FOR MasY:=1 TO 8 DO
         FOR MasX:=1 TO 9 DO
             BEGIN
                  MasRep:=MasRep+1;
                  IF MasX<>9 THEN
                     BEGIN
                          IF MasRep MOD 2<>0 THEN BarColor:='W'
                             ELSE BarColor:='B';
                          BarDraw(MasX,MasY,BarColor,MasOfChar);
                     END;
             END;
     MasRep:=0;
     FOR MasY:=1 TO 3 DO
         FOR MasX:=1 TO 9 DO
             BEGIN
                  MasRep:=MasRep+1;
                  IF (MasX<>9) AND (MasRep MOD 2=0) THEN
                     BEGIN
                          CircleColor:='D';
                          CircleDraw(MasX,MasY,CircleColor,MasOfChar);
                     END;
             END;
     MasRep:=0;
     FOR MasY:=6 TO 8 DO
         FOR MasX:=1 TO 9 DO
             BEGIN
                  MasRep:=MasRep+1;
                  IF (MasX<>9) AND (MasRep MOD 2=1) THEN
                     BEGIN
                          CircleColor:='L';
                          CircleDraw(MasX,MasY,CircleColor,MasOfChar);
                     END;
             END;
     DeskField;
     NumbersSymbols;
     NumberOfColor:=0;
     NumberOfBlack:=12;
     NumberOfWhite:=12;
     REPEAT
           NumberOfColor:=NumberOfColor+1;
           IF NumberOfColor MOD 2=1 THEN
           BEGIN
           BlockColor:='L';
           StartCord1:=ReadKey;
           StartCord2:=ReadKey;
           ReCheck(StartCord1,StartCord2,Err,No);
           IF (Err=True) AND (No=2) THEN CharToInteger(StartCord1,StartCord2,Xs,Ys)
              ELSE IF (Err=True) AND (No=1) THEN CharToInteger(StartCord2,StartCord1,Xs,Ys);
           FinishCord1:=ReadKey;
           FinishCord2:=ReadKey;
           ReCheck(FinishCord1,FinishCord2,Err,No);
           IF (Err=True) AND (No=2) THEN CharToInteger(FinishCord1,FinishCord2,Xf,Yf)
              ELSE IF (Err=True) AND (No=1) THEN CharToInteger(FinishCord2,FinishCord1,Xf,Yf);
           IF (Abs(Yf-Ys)=1) AND (Abs(Xf-Xs)=1) THEN Moving(Xs,Ys,Xf,Yf,MasOfChar,BlockColor,Err)
              ELSE IF (Abs(Yf-Ys)=2) AND (Abs(Xf-Xs)=2) THEN Fighting(Xs,Ys,Xf,Yf,MasOfChar,BlockColor,
                                                                      Err,NumberOfBlack,NumberOfWhite)
                   ELSE Err:=False;
           END
              ELSE
                  BEGIN
                       Delay(60000);
                       StartAI(MasOfChar,NumberOfBlack,NumberOfWhite);
                  END;
     UNTIL (Err=False) OR (NumberOfBlack=0) OR (NumberOfWhite=0);
     CloseGraph;
     IF Err=False THEN WriteLn('ERROR');
     IF NumberOfBlack=0 THEN WriteLn('White WIN')
        ELSE IF NumberOfWhite=0 THEN WriteLn('Black WIN');
     ReadKey;
END.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi"
THandle
Rrader
volvo877

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

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

2. Публиковать ссылки на варез

3. Оффтопить

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

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

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Object Pascal: кроссплатформенные технологии | Следующая тема »


 




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


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

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