Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 Аватар для M-39
3 / 3 / 2
Регистрация: 14.11.2013
Сообщений: 36

Четыре в ряд. (Connect Four) Альфа-бета отсечение

23.03.2015, 20:01. Показов 3181. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Уважаемые! Представляю вам игру компьютер vs игрок - Четыре в ряд. Цель - выставлять по очереди фишки на поле 6х7 (причем фишки падают сверху и заполняют с нижней строки по верхнюю) пока у одного из играющих не выстроится четыре своих фишки по диагонали, вектикали или горизонтали.
https://ru.wikipedia.org/wiki/... 1%8F%D0%B4

Моя проблема заключается в том, что не выходит найти ошибку в алгоритме. После трех ходов (игрок-компьютер-игрок / компьютер-игрок-компьютер) поле хаотично заполняется лишними фишками.

Вывод таблицы:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void display()
{
    cout<<" 0   1   2   3   4   5   6\n";
    for(int i=0; i<= 5; i++)
    {
        for(int j=0; j<=6; j++) cout<<char(218)<<char(196)<<char(191)<<" ";
        cout<<'\n';
        for(int j=0; j<= 6; j++) cout<<char(179)<<place[i][j]<<char(179)<<" ";
        cout<<'\n';
        for(int j=0; j<= 6; j++) cout<<char(192)<<char(196)<<char(217)<<" ";
        cout<<'\n';
    }
}
Ставит фишку на полученную координату столбца, и выводит вторую координату ряда:
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
int drop(int b, char player)    
{
    if(b >=0 && b<= 6)
    {
        if(place[0][b] == ' ')
        {
            int i;
            for(i = 0;place[i][b] == ' ';i++)
                if(i == 5)
                {
                    place[i][b] = player;
                    return i;
                }
                i--;
                place[i][b] =player;
                return i;
        }
        else
        {
            return -1;
        }
    }
    else
    {
        return -1;
    }
}
Получилось или нет Четыре в Ряд:
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
bool won(char place[HEIGHT][WIDTH], int a, int b)
{
    int vertical=1;//(|)
    int horizontal=1;//(-)
    int diagonal1=1;//(\)
    int diagonal2=1;//(/)
    char player=place[a][b];
    int i;//vertical
    int ii;//horizontal
    //check for vertical(|)
    for(i=a+1; place[i][b]==player && i<=5; i++,vertical++);//Check down
    for(i=a-1; place[i][b]==player && i>=0; i--,vertical++);//Check up
    if(vertical>=4)return true;
    //check for horizontal(-)
    for(ii=b-1; place[a][ii]==player && ii>=0; ii--,horizontal++);//Check left
    for(ii=b+1; place[a][ii]==player && ii<=6; ii++,horizontal++);//Check right
    if(horizontal>=4) return true;
    //check for diagonal 1 (\)
    for(i=a-1,ii=b-1; place[i][ii]==player && i>=0 && ii>=0; diagonal1++,i--,ii--);//up and left
    for(i=a+1,ii=b+1; place[i][ii]==player && i<=5 && ii<=6;diagonal1++,i++,ii++);//down and right
    if(diagonal1>=4) return true;
    //check for diagonal 2(/)
    for(i=a-1,ii=b+1; place[i][ii]==player && i>=0 && ii<=6; diagonal2++,i--,ii++);//up and right
    for(i=a+1,ii=b-1; place[i][ii]==player && i<=5 && ii>=0; diagonal2++,i++,ii--);//up and left
    if(diagonal2>=4) return true;
    return false;
}
Минимаксный алгоритм альфа-бета отсечения. просматривает рекурсионно все возможные последующие ходы:
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
double AB_minmax(int player, int hold,int recurDepth,double a,double b)
{
    int pp;
    double value=0,val=0;
    if(colH[hold]>=HEIGHT)              
        return 0;                       
 
    recurDepth++;
    place[hold][colH[hold]]=player;     
    colH[hold]++;
 
    if(colH[hold]>=HEIGHT)              
        return 0;                       
 
    if(won(place,hold,colH[hold])>0)    
    {
        if(player==15)                                  
            {value=MAX_RECURDEPTH+1-recurDepth;}
        else {value=-MAX_RECURDEPTH-1+recurDepth;}
    }
    if(player==15)
    {
        for (int i=0; (i<WIDTH && recurDepth<=MAX_RECURDEPTH); i++,recurDepth++)
        {
            pp=254;
            val=AB_minmax(pp,i,(recurDepth+1),a,b);
            if(val<b)
            {
                b=val;
                break;
            }
        }
        return b;
    }
    if(player==254)
    {
        for(int j=0; (j<WIDTH && recurDepth<=MAX_RECURDEPTH);j++,recurDepth++)
        {
            pp=15;
            val=AB_minmax(pp,j,(recurDepth+1),a,b);
            if(val>a)
            {
                a=val;
                break;
            }
        }
        return a;
    }
    value=val;
 
    recurDepth--;
    colH[hold]--;
    place[hold][colH[hold]]=' ';
    return value;
 
}
Тело программы:
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
#include<iostream>
#include <cstdlib>
#include <vector>
#include <algorithm>
#define WIDTH 7
#define HEIGHT 6
#define MAX_RECURDEPTH 8
using namespace std;
 
char place[HEIGHT][WIDTH];
char colH[HEIGHT]={0,0,0,0,0,0};
void display();
bool won(char place[HEIGHT][WIDTH],int a, int b);
int drop(int b, char player);
double AB_minmax(int player, int hold,int recurDepth,double a,double b);
 
int main()
{
    for(int i=0; i<=5; i++)
    {
        for(int j=0; j<=6; j++)
        {
            place[i][j]=' ';
        }
    }
 
    display();
    int recurDepth=0;
    double a=-MAX_RECURDEPTH;
    double b=MAX_RECURDEPTH;
    std::vector<int> moves;
    int hold,p;
    int hold2 = 0;
    int charsPlaced = 0;
    bool gamewon = false;
    char player=15;
    int move=0;
    double value=0;
 
    std::cout<<"who play first? (1.Player; 2.Computer)";////15= Computer(star), 254= Player (square)
    std::cin>>p;
    if (p==2) (player=254);
 
    while(!gamewon)
    {
        if(hold2 != -1)
        {
            if(player == 15)        //PLAYER            
            {
                std::cout<<"player  drop where?";
                player = 254;
            }
            else                    //COMPUTER
            {
                player = 15;
            }
        }
        while(true)
        {
            if(charsPlaced == 42) break;           
                if (player == 15)                  
                {
                    moves.clear();
                    hold=0;
                    value=0;
                    double prevValue=-MAX_RECURDEPTH-1;
 
                    for(int x=0; x<WIDTH; x++)     
                    {
                        if(colH[x]>=HEIGHT)         
                            continue;
                        if (move==0)
                        {
                            int v1=rand() % 6;
                            moves.push_back(v1);
                            break;
                        }
                        if(player==15 && move==1)
                        {
                            //int v1=rand() % 6;
                            moves.push_back(x);
                            break;
                        }
 
                        value=AB_minmax(player, x, recurDepth, a,b); //may be a mistake
 
                        if(value>prevValue)
                        {
                            moves.clear();
                            prevValue=value;
                        }
                        if(value==prevValue)
                        {
                            moves.push_back(x);
                        }
                    }
                    move++;
                    //std::cout<<"VAlue:";
                    //std::cout<<(prevValue++);
                    if(moves.size()>0)
                    {
                        std::random_shuffle( moves.begin(), moves.end() );
                        hold=moves.at(0);
                    }
                    if(moves.size()==0)
                    {
                        cout<<"Its a draw.";
                        break;
                    }
                }
                else
                std::cin>>hold;
 
                //hold--;//take off 1 to account for arrays starting at 0 not 1
 
                if(hold <=6 && hold>= 0) break;
                else
                std::cout<< "\nplease enter a value between 0 and 6 :";
                if (cin.fail()) //catch a non number
                {                       
                    cin.clear();        
                    char c;         
                    cin>>c;           
                }                       
        }
 
        if(charsPlaced == 42) break;//if draw
 
        hold2 = drop(hold,player);
        colH[hold]++;
        if(hold2 == -1)
        std::cout<<"Column is full\nPlease enter another number between 0 and 6:";
        else
        {
            gamewon = won(place,hold2,hold);
            charsPlaced ++;
            system("cls");
            display();
        }
    }
    system("cls");
    if(charsPlaced == 42)
        {
            std::cout<<"No winner, Game was draw\n";
            system("pause");
            return 0;
        }
    if(player == 15)
        std::cout<<"gamewon by : computer\n";
    else
        std::cout<<"gamewon by : player\n";
    system("pause");
 
    return 0;
}

Заранее благодарю за помощь!
Изображения
  
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.03.2015, 20:01
Ответы с готовыми решениями:

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

Альфа и бета коэффициенты транзистора
Почему коэффициент β значительно сильнее зависит от тока эмиттера и температуры, чем коэффициент α ? Добавлено через 17 часов 25...

Реализация альфа-бета алгоритма на языке программирования Prolog
Попрошу помочь, мне нужна реализация альфа-бета алгоритма на языке программирования Prolog. Реализация что бы выглядела не простая на вид....

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.03.2015, 20:01
Помогаю со студенческими работами здесь

Найти вероятность попадания значений случайной величины в интервал (Альфа;Бета)
Дана функция распределения f(x) Альфа=1 Бета=2.5 a=0.8 Найти: 1)Вероятность попадания значений случайной величины в интервал...

Укажите число альфа- и бета-распадов, в результате которых произошло превращение ядра
В результате ряда радиоактивных превращений ядро урана превратилось в ядро свинца. Укажите число альфа- и бета-распадов, в результате...

Определите сколько бета и альфа частиц выбрасывается при превращении ядра таллия в ядро свинца
Определите сколько бета(с минусом) и альфа частиц выбрасывается при превращении ядра таллия в ядро свинца.

Метрическая задача. Через точку В провести плоскость Бетта перпендикулярную прямой АС и построить линию пересечения плоскостей Бета и Альфа
Через точку В провести плоскость Бета перпендикулярную прямой АС и построить линию пересечения плоскостей Бета и Альфа ( Альфа задана...

Отцентровать четыре картинки в ряд
Как отцентровать четыре картинки в ряд? .wrap-glob { width: 960px; margin: 0 auto; } .wrap-item { width: 200px; ...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru