Показать сообщение отдельно
Старый 14.09.2007, 17:03   #38
Alex_90
Знающий
 
Регистрация: 05.02.2007
Сообщений: 201
Написано одно полезное сообщение
(для 2 участников)
Re: Алгоритм игры Lines

Привет всем.
У меня в игре есть функция HodCompa (), которая должна проверять вариант проигрыша игрока, и если он не проиграл, то добавить 3 шара. Удивительно, но все работает за исключением одного: при выполнении этой функции добавляется или 3 или 4 шара. Происхождение 4 шара неизвестно, так же как не известно, как сделать так, чтобы он не появлялся.
У меня есть версия, что он всегда выводит по 4 шара, однако один из них выводит за игровым полем (то есть он ставится на не существующий элемент массива).
Функция HodCompa() приведена ниже. Так же сообщу, что игровое поле 14*14 клеток.
void HodCompa ()
{
//С этой функции начинается игра
//В этой функции идет расстановка шаров, и, если требуется,
//удаление собранный линий. Так же здесь идет определение проигрыша,
//в случае, если все клетки игрового поля заняты.



//Проверяем вариант проигрыша игрока
bool proigrish=false;//Проигрыша еще нет, однако...
for (int i1=1;i1<15;i1++)
{
for (int i2=1;i2<15;i2++)
{
if (g[i1][i2]==0)
{
proigrish=true;
break;
}
}
}





//Игрок еще не проиграл! Плохо!






//Достаточно, возможно, лишь добавить шаров!
//Добавляем шары
int x,y,c=0;//Добавляем переменные, которым присваиваем значение "0"
bool r;//Переменная состояния клетки (занята-свободна)
for (int k=1;k<4;k++)//Добаляем 3 шара
{
r=false;//По умолчанию это место уже занято чем либо
while (r==false)
{
x=rand()%14;
y=rand()%14;//Рандомно определяем x и y координаты нового добавляемого шарика
c=rand()%7+1;//Так же рандомно определяем цвет шарика
if (g[x][y]==0)
{
g[x][y]=c;//Если место пусто, то добавляем шар
r=true;
}
}
//Теперь опять может наступисть проигрыш игрока
//Проверяем вариант проигрыша игрока
for (i1=1;i1<15;i1++)
{
for (int i2=1;i2<15;i2++)
{
if (g[i1][i2]==0)
{
proigrish=true;
break;
}
}
}
}

//Проверяем наличае собранных линий в колличестве 5 и более
int vsp;
//По горизонтали вправо
for (i1=1;i1<15;i1++)
{
for (int i2=1;i2<15;i2++)
{
int temp=g[i1][i2];
if(temp!=0)
{
if(g[i1+1][i2]==temp&&g[i1+2][i2]==temp&&g[i1+3][i2]==temp&&g[i1+4][i2]==temp)//Найдена линия из 5 шаров


{
vsp=g[i1][i2];//Получаем в переменную vsp тип шариков
//Присваиваим этим клеткам значение "0", то есть удаляем шары
g[i1][i2]=g[i1+1][i2]=g[i1+2][i2]=g[i1+3][i2]=g[i1+4][i2]=0;
//А может в линии шаров больше, чем пять? Проверим и это!
for (int p=5;p<14;p++)
{
if (g[i1+p][i2]==vsp)
{
g[i1+p][i2]=0;//Удаляем и этот шар.
}
if (g[i1+p][i2]!=vsp)
{
break;
}
}
}
}
}
}
//По вертикали вниз
for (i1=1;i1<15;i1++)
{
for (int i2=1;i2<15;i2++)
{
int temp=g[i1][i2];
if(temp!=0)
{
if (g[i1][i2]==temp&&g[i1][i2+1]==temp&&g[i1][i2+2]==temp&&g[i1][i2+3]==temp&&g[i1][i2+4]==temp)//Найдена линия из 5 шаров
{
vsp=g[i1][i2];//Получаем в переменную vsp тип шариков
//Присваиваим этим клеткам значение "0", то есть удаляем шары
g[i1][i2]=g[i1][i2+1]=g[i1][i2+2]=g[i1][i2+3]=g[i1][i2+4]=0;
//А может в линии шаров больше, чем пять? Проверим и это!
for (int p=5;p<14;p++)
{
if (g[i1][i2+p]==vsp)
{
g[i1][i2+p]=0;//Удаляем и этот шар.
}
if (g[i1][i2+p]!=vsp)
{
break;
}
}
}
}
}
}
//По диагонали сверху слева вправо вниз
for (i1=1;i1<15;i1++)
{
for (int i2=1;i2<15;i2++)
{
int temp=g[i1][i2];
if(temp!=0)
{
if (g[i1][i2]==temp&&g[i1+1][i2+1]==temp&&g[i1+2][i2+2]==temp&&g[i1+3][i2+3]==temp&&g[i1+4][i2+4]==temp)//Найдена линия из 5 шаров
{
vsp=g[i1][i2];//Получаем в переменную vsp тип шариков
//Присваиваим этим клеткам значение "0", то есть удаляем шары
g[i1][i2]=g[i1+1][i2+1]=g[i1+2][i2+2]=g[i1+3][i2+3]=g[i1+4][i2+4]=0;
//А может в линии шаров больше, чем пять? Проверим и это!
for (int p=5;p<14;p++)
{
if (g[i1+p][i2+p]==vsp)
{
g[i1+p][i2+p]=0;//Удаляем и этот шар.
}
if (g[i1+p][i2+p]!=vsp)
{
break;
}
}
}
}
}
}

//Навсякий случай проверим вариант проигрыша!
for (i1=1;i1<15;i1++)
{
for (int i2=1;i2<15;i2++)
{
if (g[i1][i2]==0)
{
proigrish=true;
break;
}
}
}
//Ну и все. Можно доверять ходить игроку!
}
(Offline)
 
Ответить с цитированием