Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.63/49: Рейтинг темы: голосов - 49, средняя оценка - 4.63
5 / 5 / 0
Регистрация: 08.05.2011
Сообщений: 215

ИИ в реверси

26.05.2011, 23:59. Показов 10043. Ответов 34
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вечер добрый, лего ли реализовать ИИ для реверси, если есть общий алгоритм, но на двух игроков?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.05.2011, 23:59
Ответы с готовыми решениями:

Реверси в консольном приложении - Как обработать ход игрока
Всем привет. У меня задача: написать реверси на си шарп , с консольным приложением интерфейса. Вопрос1: как обработать ход игрока,...

Перенос игры "Реверси" с С++ на С#
Игра реверси на С++ надо перенести на С#. Сам пытался перенести выдает ошибку не знаю как исправить. #include <stdio.h> #include...

Реверси
Помогите пожалуйста! У кого есть исходник для консольного вида? очень срочно нужен

34
 Аватар для chessman1
167 / 96 / 23
Регистрация: 13.03.2011
Сообщений: 402
27.05.2011, 23:30
Студворк — интернет-сервис помощи студентам
Хорошо если ввести вспомогательный массив размером 10х10. Крайние горизонтали и вертикали заполнить каким-либо значением, т.е. обозначить границы.
Тогда проверка того, есть ли рядом фишки, упрощается.
Например:
0 - пустая клетка
1 - черная фишка
3 - белая фишка
4 - граница
Массив можно сделать битовым, этого достаточно.
Только надо отслеживать соответствие между кнопками и этим массивом.
0
5 / 5 / 0
Регистрация: 08.05.2011
Сообщений: 215
27.05.2011, 23:47  [ТС]
8 на 8, а граница для чего?
0
 Аватар для chessman1
167 / 96 / 23
Регистрация: 13.03.2011
Сообщений: 402
28.05.2011, 08:37
Алгоритм упрощается. Берем клетку и проверяем все что вокруг нее. Не надо делать проверку выхода за границы
массива, иначе во время выполнения можно вылететь по ошибке.
Также проще фишки переворачивать, достаточно операций ++ и --
1
5 / 5 / 0
Регистрация: 08.05.2011
Сообщений: 215
29.05.2011, 21:20  [ТС]
Программа, работает ошибочно, потому что я могу поставить фишку в любое место (вначале игры в угол), а так не должно быть. Вот не знаю какую проверку ввесит, перебором? - дак тут условий не оберешь.
А с генератором что делать? Смотрит по циклу элементы со значениями 0, пытается поставить туда 2-ку (здесь срабатывает обработка исключений - очем я писал выше), если не может - идёт дальше, ведь так всё. Можете помочь?

Добавлено через 1 минуту
Цитата Сообщение от chessman1 Посмотреть сообщение
Не надо делать проверку выхода за границы
Если бегать по циклу (процедура исключения), то он выйдет за границы, надо массив циклическим наверное делать.
0
 Аватар для chessman1
167 / 96 / 23
Регистрация: 13.03.2011
Сообщений: 402
29.05.2011, 22:58
Цитата Сообщение от zzz_ Посмотреть сообщение
Программа, работает ошибочно, потому что я могу поставить фишку в любое место (вначале игры в угол), а так не должно быть. Вот не знаю какую проверку ввесит, перебором? - дак тут условий не оберешь.
А с генератором что делать? Смотрит по циклу элементы со значениями 0, пытается поставить туда 2-ку (здесь срабатывает обработка исключений - очем я писал выше), если не может - идёт дальше, ведь так всё. Можете помочь?

Добавлено через 1 минуту

Если бегать по циклу (процедура исключения), то он выйдет за границы, надо массив циклическим наверное делать.
Условия надо проверять все обязательно на возможность хода в некую клетку. За неимением времени привожу лишь
наброски.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
byte [] board = new[100]; // можно заполнить программно или через { } - дело вкуса
// массив одномерный, легче работать с одним индексом
// проверяем клетку справа
if(board[i+1] == 4) return; // справа граница - ни чего не делаем
if(board[i+1] == 1 || board[i+1] == 2) ... ; // справа фишка, обратываем 
if(board[i+1] == 0 || board[i+1] == 2) ... ; // справа пусто, обратываем пусто
// проверяем клетку слева
if(board[i-1] == 4) return; // справа граница - ни чего не делаем
if(board[i-1] == 1 || board[i-1] == 2) ... ; // справа фишка, обратываем 
if(board[i-1] == 0 || board[i-1] == 2) ... ; // справа пусто, обратываем пусто
// проверяем клетку сверху
if(board[i-10] == 4) return; // справа граница - ни чего не делаем
if(board[i-10] == 1 || board[i-10] == 2) ... ; // справа фишка, обратываем 
if(board[i-10] == 0 || board[i-10] == 2) ... ; // справа пусто, обратываем пусто
// снизу аналогично board[i-10]
// вправо-вверх board[i-9] и т.д.
Проверять все 64 клетки затратно по времени, если осталось к примеру 20 свободных клеток нет смысла
лопатить все 64. Лучше вести список возможных ходов. В начале 60, потом он будет по ходу убывать.
Можно сделать на связных списках, можно на массиве. При реализации chess11x11 я выбрал последнее.
Найденные возможные ходы так же надо учитывать. Так же делал на одномерном массиве. Исходник привести
не могу в связи с "улетом" винта.
Минимум что нужно:
board - текущая позиция; possibleList - список возможных ходов; moveList - список найденных ходов.
Хотя если писать игру для двух человек possibleList не нужен, moveList - желателен, но не обязателен, проверку
можно сделать по ходу.

Добавлено через 11 минут
Ошибся:
C#
1
 if(board[i+1] == 0 || board[i+1] == 2) ... ; // справа пусто, обратываем пусто
Надо так:
C#
1
 if(board[i+1] == 0) ... ; // справа пусто, обратываем пусто
1
5 / 5 / 0
Регистрация: 08.05.2011
Сообщений: 215
30.05.2011, 01:57  [ТС]
Игра человек vs компьютер. Но тут чисто наглядность - принцип игры, никакой тактики (разве только у человека) комп рендомит.
А вот выход за пределы массива как смотреть? он при нажатии на первую кнопку сразу ругаться будет - мол выход.

Добавлено через 2 минуты
C#
1
if(board[i-1] == 4) return;
Но ведь в граничную точку можно ставить фишку.
Это Процедура proverka(), я так понял. Пробегать можно все, здесь это не существенно, главное организовать правильную проверку, и следить за выходом за границы.
Т.е. есть процедура проверки. и процедкра генерации хода (каждый раз идёт с 0). Попадает в 0 - срабатывает проверка, если да - то ставит и выходит, если нет - идём дальше пока не найдем.
0
 Аватар для chessman1
167 / 96 / 23
Регистрация: 13.03.2011
Сообщений: 402
30.05.2011, 09:04
Цитата Сообщение от zzz_ Посмотреть сообщение
Игра человек vs компьютер. Но тут чисто наглядность - принцип игры, никакой тактики (разве только у человека) комп рендомит.
А вот выход за пределы массива как смотреть? он при нажатии на первую кнопку сразу ругаться будет - мол выход.

Добавлено через 2 минуты
C#
1
if(board[i-1] == 4) return;
Попадает в 0 - срабатывает проверка, если да - то ставит и выходит, если нет - идём дальше пока не найдем.
Да, так и есть.
0
5 / 5 / 0
Регистрация: 08.05.2011
Сообщений: 215
02.06.2011, 00:00  [ТС]
Как обработать границу? Всё-таки сделать циклический массив? Или связный список? Можете пример?
0
 Аватар для chessman1
167 / 96 / 23
Регистрация: 13.03.2011
Сообщений: 402
02.06.2011, 08:16
Цитата Сообщение от zzz_ Посмотреть сообщение
Как обработать границу? Всё-таки сделать циклический массив? Или связный список? Можете пример?
Для примера привожу начало кода игры логической игры таблут (сейчас над ней работаю), может вам в чем-то
поможет:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
        public const int WHITE = 0;     public const int W = WHITE;
        public const int BLACK = 1;     public const int B = BLACK;
        public int SIDE = WHITE;
 
        public const int ROOK  = 1;     public const int R = ROOK;
        public const int KING  = 2;     public const int K = KING;
        public const int EMPTY = 3;     public const int E = EMPTY;
        public const int OUT   = 4;     public const int O = OUT;
 
// направления
        public const int nU = 0; // вверх
        public const int nD = 1; // вниз
        public const int nL = 2; // влево
        public const int nT = 3; // вправо
// смещения
        public const int U = -11; // вверх
        public const int D =  11; // вниз
        public const int L =  -1; // влево
        public const int T =   1; // вправо
 
        public static int [] vDisp = {U,D,L,T};
 
        public static int [,] vCapt = {{U,L,T}, {D,L,T}, {L,U,D}, {T,U,D}};
 
        public static int [] BOARD_FIG = // расстановка по фигурам
    { O, O, O, O, O, O, O, O, O, O, O,
      O, E, E, E, R, R, R, E, E, E, O, // 9
      O, E, E, E, E, R, E, E, E, E, O, // 8
      O, E, E, E, E, R, E, E, E, E, O, // 7
      O, R, E, E, E, R, E, E, E, R, O, // 6
      O, R, R, R, R, K, R, R, R, R, O, // 5
      O, R, E, E, E, R, E, E, E, R, O, // 4
      O, E, E, E, E, R, E, E, E, E, O, // 3
      O, E, E, E, E, R, E, E, E, E, O, // 2
      O, E, E, E, R, R, R, E, E, E, O, // 1
      O, O, O, O, O, O, O, O, O, O, O };
//       a  b  c  d  e  f  g  h  i
 
        public static int [] BOARD_COL = // расстановка по цвету
   { O, O, O, O, O, O, O, O, O, O, O,
     O, E, E, E, B, B, B, E, E, E, O, // 9
     O, E, E, E, E, B, E, E, E, E, O, // 8
     O, E, E, E, E, W, E, E, E, E, O, // 7
     O, B, E, E, E, W, E, E, E, B, O, // 6
     O, B, B, W, W, W, W, W, B, B, O, // 5
     O, B, E, E, E, W, E, E, E, B, O, // 4
     O, E, E, E, E, W, E, E, E, E, O, // 3
     O, E, E, E, E, B, E, E, E, E, O, // 2
     O, E, E, E, B, B, B, E, E, E, O, // 1
     O, O, O, O, O, O, O, O, O, O, O };
//       a  b  c  d  e  f  g  h  i
 
static int getCol(int coor) { return BOARD_COL[coor]; }
 
static int getTyp(int coor) { return BOARD_FIG[coor]; }
 
static void putFig(int fig, int col, int coor) {
    BOARD_FIG[coor] = fig;
    BOARD_COL[coor] = col; }
1
5 / 5 / 0
Регистрация: 08.05.2011
Сообщений: 215
02.06.2011, 23:40  [ТС]
искоълючения:
если board[i]==1 то смотрит чтобы рядом board[i+1]==2, и в цикле, после [i+1] ищет белые, как реализовать?
0
 Аватар для chessman1
167 / 96 / 23
Регистрация: 13.03.2011
Сообщений: 402
03.06.2011, 00:09
Цитата Сообщение от zzz_ Посмотреть сообщение
искоълючения:
если board[i]==1 то смотрит чтобы рядом board[i+1]==2, и в цикле, после [i+1] ищет белые, как реализовать?
C#
1
2
3
4
5
6
if( board[ i ] !=  ЕМPTY ) return( 0 ); // ход не возможен, т.к. клетка занята
if( bord[ i +U] ==  EMPTY || bord[ i +U] ==  OUT || ) { // взятия по направлению вверх нет }
if( bord[ i +U] == BLACK && side == WHITE) { // здесь анализ по линии вверх, на предмет взятия черных белыми }
 
// и так далее по всем вертикалям, горизонталям и диагоналям - всего 8 направлений, в зависимости от того
// чей ход - side; код лучше разбить на отдельные процедурки.
0
90 / 89 / 13
Регистрация: 28.09.2010
Сообщений: 262
03.06.2011, 07:05
А это http://www.codeproject.com/KB/game/reversi.aspx не поможет?
0
 Аватар для chessman1
167 / 96 / 23
Регистрация: 13.03.2011
Сообщений: 402
03.06.2011, 07:22
Цитата Сообщение от planar Посмотреть сообщение
А смысл? Пока своими ручками не сделаешь, ни чему толком не научишься.
0
90 / 89 / 13
Регистрация: 28.09.2010
Сообщений: 262
03.06.2011, 16:25
Ну, если ручками
http://acm.mipt.ru/twiki/bin/v... mAlphaBeta

Я бы в реверси делал бы отсечку на невозможность занятием противником углов, поскольку в реверси обычно выигрывает тот, кто занял больше углов. А до определенного количества ходов (скажем до 15) просто банальное отношение числа фишек на поле, причем чем ближе к краю, тем выше вес фишки.
0
 Аватар для chessman1
167 / 96 / 23
Регистрация: 13.03.2011
Сообщений: 402
03.06.2011, 17:48
Цитата Сообщение от planar Посмотреть сообщение
Ну, если ручками
http://acm.mipt.ru/twiki/bin/v... mAlphaBeta

Я бы в реверси делал бы отсечку на невозможность занятием противником углов, поскольку в реверси обычно выигрывает тот, кто занял больше углов. А до определенного количества ходов (скажем до 15) просто банальное отношение числа фишек на поле, причем чем ближе к краю, тем выше вес фишки.
Не со всем согласен. Играл в своё время много в эту игру. Банальное превышение числа фишек - может в конце
игры привести к полному разгрому со стороны противника. Хотя к краям "прилипать" очень выгодно. Но это не факт
для победы. Бывали партии когда при 3-х занятых углах проигрывал ( и выигрывал несколько баллов). Игра очень
достойная - за простоту и динамизм. Встречал варианты с 6-ти гранными реверси - не прижилось, как и цилиндри-
ческие шахматы, шахматы Фишера и проч. муть. Классика есть классика. (Но у человека так устроен мозг -
всегда хочется исследовать что-то новое).
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.06.2011, 17:48

Реверси
Здравствуйте, для школы нужно было создать игрока который будет играть в Реверси, совершенно простого, чтобы играл рандомно. Но программа...

Реверси (ошибка)
Здравствуйте. Я пишу курсовую. Для нее нужно написать игру реверси. Я её не дописал потому, что при компиляции возникает...

Игра Реверси
Вечер добрый ) у меня к общественности большая просьба, без помощи настоящих программистов мне не обойтись... Суть дела вот в чем: у меня...

Игра реверси на MFC
Здорова! Есть консольная версия игры реверси, когда то давно делал, а щас от как будет время думаю добавить GUI к ней на MFC. Нужно...

В пакете 1С 8.0 написать программу «Реверси»
В пакете 1С 8.0 написать программу «Реверси» - перестановка букв в слове в обратном порядке.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
35
Ответ Создать тему
Новые блоги и статьи
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru