1 Востаннє редагувалося roctik1996 (25.04.2015 15:41:27)

Тема: Хрестики - нулики на безмежному полі

Привіт)
в мене виникла помилка при перевірці умови на перемогу гравців...помилка полягає в наступному:
відрахунок 5-х хрестиків/нуликів починається з головної діагоналі, тобто якщо почати ставити хрестик вище на одну клітинку від головної діагоналі то на стільки ж більше потрібно буде доставити хрестиків внизу(надіюсь зрозуміло пояснив :) )
вот код перевірки умов(P.S.можу скинути весь проект якщо знадобиться):

//---Натиск лівою клавішею на віконечку(розміщення хрестика або нулика)
void MousePressed(int button,int state,int x,int y)
{

    if(button==GLUT_LEFT_BUTTON && state==GLUT_DOWN)
    {
        A.row=y/A.scale;
        A.col=x/A.scale;
        if(a[A.row][A.col].value==-1)
            a[A.row][A.col].value=A.gamer;
        else 
            return ;

        CheckVertical();
        CheckHorizontal();
        CheckMainDiagonal();
        CheckNotMainDiagonal();
        CheckAll();
        A.gamer=!A.gamer;
        ++A.count;
        PrintCard();
    }
}
//---функція для перевірки по вертикалі
void CheckVertical()
{
bool state=0;
for(int i=A.row;i<A.row+4;i++)
{
    if(a[i][A.col].value==A.gamer){}
    else
    {
        state=1;
        break;
    }
}
if(!state)
{
    exit(1);
    cout<<"Вертикальна перемога у "<<A.gamer<<endl;
    
}
}
//---Функція для перевірки по горизонталі
void CheckHorizontal()
{
bool state=0;
for(int i=A.col;i<A.col+4;i++)
{
    if(a[A.row][i].value==A.gamer){}
    else
    {
        state=1;
        break;
    }
}
if(!state)
{
    cout<<"Горизонтальна перемога перемога у "<<A.gamer<<endl;
    exit(1);
}
}
//---Функція для перевірки на головній діагоналі
void CheckMainDiagonal()
{
bool state=0;
for(int i=A.col;i<A.col+4;i++)
{
    if(a[i][i].value==A.gamer){}
    else
    {
        state=1;
        break;
    }
}
if(!state)
{
    cout<<"Дiагональна перемога перемога у "<<A.gamer<<endl;
    exit(1);
}
for(int i=A.col;i<A.col+4;i++)
{
    if(a[i][i].value==!A.gamer){}
    else
    {
        state=1;
        break;
    }
}
if(!state)
{
    cout<<"Діагональна перемога у "<<!A.gamer<<endl;
    exit(1);
}

}
//---Функція для перевірки на бічній діагоналі
void CheckNotMainDiagonal()
{
bool state=0;
for(int i=A.row,j=A.col-1;i<A.col+4;i++,j++)
{
    if(a[i][j].value==A.gamer){}
    else
    {
        state=1;
        break;
    }
}
if(!state)
{
    cout<<"Перемога по бiчнiй дiагоналi у "<<A.gamer<<endl;
    exit(1);
}
}
//---Функція для перевірки нічиї
void CheckAll()
{
    if(A.count>=A.rozm*A.rozm-1)
    {
        cout<<"НIЧИЯ!!!"<<endl;
        exit(1);
    }
}

2 Востаннє редагувалося yooll (25.04.2015 22:04:59)

Re: Хрестики - нулики на безмежному полі

Я б замість циклу for використав два цикли while: один рахує вліво - другий вправо, або вгору-вниз і т.д. Наприклад, перевірку перемоги по головній діагоналі можна зробити так (псевдокод, потрібно ще додати перевірку виходу за межі поля):

//перевірка по головній діагоналі
//після ходу в поле A[i][j]
int count=1;//кількість "своїх" символів
int k=1;
while(A[i-k][j-k]=="свій символ"){
    count++;
    k++;
}
k=1;
while(A[i+k][j+k]=="свій символ"){
    count++;
    k++;
}
if(count>=5){
     cout<<"Дiагональна перемога...;
}
Подякували: roctik1996, leofun012

3

Re: Хрестики - нулики на безмежному полі

Що таке "головна діагональ безмежного поля"?

Подякували: leofun011

4

Re: Хрестики - нулики на безмежному полі

koala написав:

Що таке "головна діагональ безмежного поля"?

Поле "безмежне" умовно. В кожній грі поле має конкретний розмір, але в різних іграх ці розміри можуть бути різними.
"Головна діагональ" і "бічна діагональ" - це 5 символів по діагоналі з протилежними нахилами.

Подякували: 221VOLT, leofun012

5 Востаннє редагувалося roctik1996 (25.04.2015 23:04:14)

Re: Хрестики - нулики на безмежному полі

yooll написав:

Я б замість циклу for використав два цикли while

я так зрозумів що це для кожної перевірки(як по діагоналі так і по вертикалі і горизонталі)
дякую, буду переробляти трохи))

6 Востаннє редагувалося Yola (26.04.2015 11:12:57)

Re: Хрестики - нулики на безмежному полі

1. Потрібно якомога сильніше відокремити логіку від Інтерфейсу Користувача. Тобто поменше коду в обробниках.
2. Використовуйте

enum

, а не сталі - 1, 0.

7

Re: Хрестики - нулики на безмежному полі

yooll написав:
koala написав:

Що таке "головна діагональ безмежного поля"?

Поле "безмежне" умовно. В кожній грі поле має конкретний розмір, але в різних іграх ці розміри можуть бути різними.
"Головна діагональ" і "бічна діагональ" - це 5 символів по діагоналі з протилежними нахилами.

Ви з автором одна особа? Я бачу з коду, що автор це розуміє не так, як ви.

Подякували: leofun011

8

Re: Хрестики - нулики на безмежному полі

koala написав:

Ви з автором одна особа? Я бачу з коду, що автор це розуміє не так, як ви.

просто спочатку поле було стале, розміром 5 на 5(від того головна і бічна діагональ)потім я вже від того зробив задання власного розміру вручну, yooll описав все правильно і я не став поправляти

9

Re: Хрестики - нулики на безмежному полі

Чи не могли б ви намалювати стан поля коли програма помиляється?

10

Re: Хрестики - нулики на безмежному полі

Yola написав:

Чи не могли б ви намалювати стан поля коли програма помиляється?

на цьому моменті повинно закритись ігрове поле і в консольному вікні видати інформацію що переміг "Х"
але нічого не відбувається, коли поставлю ще один хрестик внизу - віконечко закриється...

Post's attachments

Безымянный.png 199.42 kb, 441 downloads since 2015-04-27 

11

Re: Хрестики - нулики на безмежному полі

А якщо поставите хрестик згори? Тобто складається враження, що ви перевіряєте лише в один бік -- від A.col до A.col+3.

Подякували: roctik19961

12

Re: Хрестики - нулики на безмежному полі

Yola написав:

А якщо поставите хрестик згори? Тобто складається враження, що ви перевіряєте лише в один бік -- від A.col до A.col+3.

ой блін, я напевно знайшов помилку.....пізніше перевірю і закину результат
дякую Вам)

13

Re: Хрестики - нулики на безмежному полі

дещо виправив, дещо переробив...працює перевірка умови по горизонталі і вертикалі
з діагоналями в мене проблеми

Подякували: 221VOLT, ostap34PHP2

14 Востаннє редагувалося roctik1996 (05.05.2015 17:47:02)

Re: Хрестики - нулики на безмежному полі

умова на перевірку умови працює, буду пробувати гратись з кимось із друзів))
як зробити бота, просто потрібно щоб можливо було і із комп'ютером грати
в мене ідей майже ніяких немає(

Подякували: 221VOLT1

15

Re: Хрестики - нулики на безмежному полі

Я колись писав таку гру, і бота для неї писав, а також є вже такі ігри написані, і боти в них краще написані були, ніж у мене

16 Востаннє редагувалося Alchimic (10.09.2018 19:38:25)

Re: Хрестики - нулики на безмежному полі

що за бздури... кожен квадратик перевірити по матриці +1+1.-1-1. 5 х  +1 0 . -1 0  5х 0 ........ отак \ так / ітак - ітак | і нетреба ніяких горизонталей і вертикалей. ліпше дані в матриці полі тримати. зараз напишу якомога попроще.

class code
{
.....
code(int ,int,int,int,int,int,int,int,int,int); 2 по 5;
int c[10];
bool check( a int [][], i int. j int){} перевірка матриці з умовою вихода за межі.
{
int k=a[i][j];
 if (i+c[0]>=0 && i+c[0]<N)&&(j+c[1]>=0 && j+c[1]<N)  if (k==a[i+c[0]][j+c[1]]) 
 if (i+c[2]>=0 && i+c[2]<N)&&(j+c[3]>=0 && j+c[3]<N)  if (k==a[i+c[2]][j+c[3]])
 if (i+c[4]>=0 && i+c[4]<N)&&(j+c[5]>=0 && j+c[5]<N)  if (k==a[i+c[4]][j+c[5]]) 
 if (i+c[6]>=0 && i+c[6]<N)&&(j+c[7]>=0 && j+c[7]<N)  if (k==a[i+c[6]][j+c[7]]) 
 if (i+c[8]>=0 && i+c[8]<N)&&(j+c[9]>=0 && j+c[9]<N)  if (k==a[i+c[8]][j+c[9]]) 
return true;
return false;
}
}
code m []=(-1,-1,-2,-2,0,0,1,1,2,2),..............коди перевірок  19 штук. 
 for (i)...0..n
for (j)...0..n
for(k)... 0..19
if (m[k].check(a,i,j)) {
if (a[i][j]==1) {win 1} else{win 2}.
 тру ля ля  перевірка на кінець гри.
}

наваляжив на бисторую щоб просто понять алгоритм

17 Востаннє редагувалося /KIT\ (27.07.2021 12:17:45)

Re: Хрестики - нулики на безмежному полі