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

Ваш аккаунт

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

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

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

Реализация алгоритма alpha-beta для шашек на Ява.

10K
25 ноября 2006 года
ljevik
48 / / 02.10.2006
Нужна помощь в написании программы, основанной на этом аплете:
http://math.hws.edu/javanotes/c8/s5.htm, код аплета приведен здесь:
http://math.hws.edu/javanotes/source/Checkers.java. Сейчас возможно играть друг с другом, мне нужно реализовать возможность игры с компьютером. Компьютер, по идее, должен получить искусстенный интеллект, выбор вариантов хода происходит по алгоритму альфа-бэта:
http://www.ocf.berkeley.edu/~yosenl/extras/alphabeta/alphabeta.html. Может ли кто-нибудь оказать помощь в написании кода выбора хода для компьютера? А так же недрение возможности игры компьютера в этот аплет? Заранее спасибо.
10K
27 ноября 2006 года
ljevik
48 / / 02.10.2006
Может быть кто-нибудь мог бы помочь хотя бы в том, чтобы сделать на основе этого кода возможность игры с компьютером? Убрать лишнее и добавить буквально один, абослютно любой ход компьютера в ответ на первый ход человека, при условии, что начинают красные?:rolleyes:
355
28 ноября 2006 года
<SCORP>
786 / / 21.10.2006
здесь компьютер отвечает на ход игрока первым попавшимся под руку допустимым ходом. снала даже прикольно смотриться, но потом оно ведёт себя жутко тупо :)
Код:
void doMakeMove(CheckersMove move) {
             // This is called when the current player has chosen the specified
             // move.  Make the move, and then either end or continue the game
             // appropriately.

         board.makeMove(move);

         /* If the move was a jump, it's possible that the player has another
            jump.  Check for legal jumps starting from the square that the player
            just moved to.  If there are any, the player must jump.  The same
            player continues moving.
         */

         if (move.isJump()) {
            legalMoves = board.getLegalJumpsFrom(currentPlayer,move.toRow,move.toCol);
            if (legalMoves != null) {
               if (currentPlayer == CheckersData.RED)
                  message.setText("RED:  You must continue jumping.");
               else
                  message.setText("BLACK:  You must continue jumping.");
               selectedRow = move.toRow;  // Since only one piece can be moved, select it.
               selectedCol = move.toCol;
               repaint();
               return;
            }
         }

         /* The current player's turn is ended, so change to the other player.
            Get that player's legal moves.  If the player has no legal moves,
            then the game ends. */

         if (currentPlayer == CheckersData.RED) {
            currentPlayer = CheckersData.BLACK;
            legalMoves = board.getLegalMoves(currentPlayer);
            if (legalMoves == null)
               gameOver("BLACK has no moves.  RED wins.");
//==ALL CHANGES WERE MADE HERE====================
            else/* if (legalMoves[0].isJump())
               message.setText("BLACK:  Make your move.  You must jump.");
            else*/
            {
               //message.setText("BLACK:  Make your move.");
               doMakeMove(legalMoves[0]);
            }
//==============================================
         }
         else {
            currentPlayer = CheckersData.RED;
            legalMoves = board.getLegalMoves(currentPlayer);
            if (legalMoves == null)
               gameOver("RED has no moves.  BLACK wins.");
            else if (legalMoves[0].isJump())
               message.setText("RED:  Make your move.  You must jump.");
            else
               message.setText("RED:  Make your move.");
         }

         /* Set selectedRow = -1 to record that the player has not yet selected
             a piece to move. */

         selectedRow = -1;

         /* As a courtesy to the user, if all legal moves use the same piece, then
            select that piece automatically so the use won't have to click on it
            to select it. */

         if (legalMoves != null) {
            boolean sameStartSquare = true;
            for (int i = 1; i < legalMoves.length; i++)
               if (legalMoves.fromRow != legalMoves[0].fromRow
                                    || legalMoves.fromCol != legalMoves[0].fromCol) {
                   sameStartSquare = false;
                   break;
               }
            if (sameStartSquare) {
               selectedRow = legalMoves[0].fromRow;
               selectedCol = legalMoves[0].fromCol;
            }
         }

         /* Make sure the board is redrawn in its new state. */

         repaint();

      }  // end doMakeMove();

весь код форум не пропустил. изменения требуются только в этой функции.
10K
29 ноября 2006 года
ljevik
48 / / 02.10.2006
Понадобилось изменить даже меньше, чем я себе мог представить:) ...только одна проблемма, компьютер рубит только один раз, а если больше одного раза можно срубить, то следующие разы все равно человек должен вместо компьютера:)

А если думать над интеллектом для этого зверя, то как бы вы стали делать? Скажем, какой бы оценивали ходы? Тоесть чтобы выбрать какой лучше?

Нам предложили оценивать как -1, 0, 1 но, я не представляю как 3-мя цифрами можно уловить столько ньюансов.
355
29 ноября 2006 года
&lt;SCORP&gt;
786 / / 21.10.2006
найдите строку
message.setText("BLACK: You must continue jumping.");
и замените на
doMakeMove(legalMoves[0]);
это в той же функции, только немного выше. тогда он не будет останавливаться после первой же срубленой шашки

а по поводу оценки ходов, то альфа-бетта алгоритм, как я понял из Вашей же ссылки, как раз для этого и предназначен
10K
29 ноября 2006 года
ljevik
48 / / 02.10.2006
Я, наверно, неправильно выразился. Я имею ввиду не то, каким алгоритмом будет проходить выбор (из уже имеющихся) лучшего хода, а то каким образом, скажем, в самом начале игры, заполнится массив ходов? Тоесть на каком основании должно приниматься решение, стоит ли та или иная шашка в лучшем положении, чем другая.
10K
05 декабря 2006 года
ljevik
48 / / 02.10.2006
:) поставлю вопрос по-другому. кто может написать (дописать) аплет, чтобы компьютер мог играть (основываясь на алгоритме альфа-бета отсечений)...скажем не супер-мега-круто, но процентов эдак на 50%...хотя бы не делал невероятно глупых ходов. В распоряжение дам исходный код (который уже давал), а так же могу дать пару исходных кодов для шашек (тоже с альфой-бетой, но немного старых весий). Тоесть нужно слепить из двух кодов один. Разумеется не бесплатно. Просьба заинтересовавшихся отметиться здесь и оставить свои контактные данные:) :(
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог