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

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

23.03.2015, 20:01. Показов 3205. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru