forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   C++ (http://forum.boolean.name/forumdisplay.php?f=22)
-   -   Алгоритм игры Lines (http://forum.boolean.name/showthread.php?t=3896)

Alex_90 25.08.2007 21:02

Re: Алгоритм игры Lines
 
Нельзя!
Я только согодня проверял: для текстовой информации только CString.
(У меня Visual Studio 6.0 Servis Pack 5)

impersonalis 25.08.2007 21:04

Re: Алгоритм игры Lines
 
1. См. предыдщий пост (обновил).
2. Покажи как берёшь информацию из тескстового поля.

impersonalis 25.08.2007 21:13

Re: Алгоритм игры Lines
 
int GetDlgItemText( int nID, LPTSTR lpStr, int nMaxCount ) const;
или
int GetWindowText( LPTSTR lpszStringBuf, int nMaxCount ) const;

чем не подходят?

Alex_90 25.08.2007 21:17

Re: Алгоритм игры Lines
 
  1. Создаю текстовое поле
  2. С нажатой Ctrl дважды щелкаю на поле ввода
  3. В открывшимся диалоге "Add member variable" задаю имя переменной
  4. Определяю ее тип как Value
  5. Определяю ее тип как CString из выпадающего списка (пункта char в этом списке нет)

impersonalis 25.08.2007 21:18

Re: Алгоритм игры Lines
 
=/ Вот оэтому многие неоправданно обсирают MFC. А ты ручками кодь)
#30 пост тогда смотри

Alex_90 25.08.2007 23:23

Re: Алгоритм игры Lines
 
:dontknow:
че то фигня какая-то: ошибок не выдает при копмиляции с новыми функциями, однако во время выполнения снимается виндусом. Вот новый код функции:
Цитата:

void Add_user::OnAdd()
{
UpdateData (true);
if (Add_text.GetLength ()>50)
{
AfxMessageBox ("Такое имя без поллитра не прочтешь, а если и прочтешь, то я язык сломаешь! Введите имя не более 50 символов в длину.",MB_OK+MB_ICONEXCLAMATION,0);
}
if (Add_text.GetLength()!=0&&Add_text.GetLength ()<=50)
{
// TODO: Add your control notification handler code here
//Теперь надо дабавть нового игрока в список игроков и соддать
//для него список его рекордов
fstream f_user,f_records;
f_user.open ("Users.lin",ios::in);
char* vsp;
GetDlgItemText (IDC_EDIT1,vsp,50);
for (int i=0;i==50;i++)
{
f_user.put (vsp[i]);
}
f_user.close ();
CDialog::OnOK();
}
if (Add_text.GetLength ()==0)
{
AfxMessageBox ("Инкогнитые из Питербурга к игре не допускаются! Все таки имя ввсести придется!",MB_OK+MB_ICONEXCLAMATION,0);
}
}
Тут пришлось вводить в файл строку по символам, так как f_user.put требует (во всяком случае у меня) односимвольного char.

impersonalis 26.08.2007 00:12

Re: Алгоритм игры Lines
 
char* vsp;
есть, а инициализации оператором new - нет
char *vsp=new char[50+1];

Alex_90 14.09.2007 17:03

Re: Алгоритм игры Lines
 
Привет всем.
У меня в игре есть функция HodCompa (), которая должна проверять вариант проигрыша игрока, и если он не проиграл, то добавить 3 шара.:stop: Удивительно, но все работает за исключением одного: при выполнении этой функции добавляется или 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;
}
}
}
//Ну и все. Можно доверять ходить игроку!
}
:)

dimanche13 14.09.2007 17:32

Re: Алгоритм игры Lines
 
Бегло проглядев код, могу сказать. Почему бы не сделать отдельную функцию int PlayerLose() которая проверяет проиграл ли игрок и возращает true при проигрыше. Потом зачем 3 раза проверять в одной функции? и потом ты делаешь , то так
Код:

for (i1=0;i1<14;i1++)
{
        for (int i2=1;i2<15;i2++)
        {

то эдак :
Код:

for (int i1=0;i1<14;i1++)
{
for (int i2=0;i2<14;i2++)
{

Ты уж определись

Alex_90 14.09.2007 19:13

Re: Алгоритм игры Lines
 
По поводу расхождения в разных циклах for - исправил, а вот создание отдельной функции для проверки проигрыша игрока считаю явно лишним: тогда я окончательно запутаюсь в своем коде.:) И еще: лишняя проверка проигрыша никогда не мешает - хуже, когда проигрыш останется незамеченным.
Исправляния внес в приведенный выше код.
Однако все равно добавляется в основном 4 шара (3 реже)!

dimanche13 14.09.2007 19:57

Re: Алгоритм игры Lines
 
Код:

int isEmptyPosition(int x, int y)
{
  if(g[x][y] = 0) return true;
  return false
}

int NumFreePosition()
int temp = 0;
for (int x=0;x<14;x++)
  {
    for (int y=0;y<14;y++)
    {
        if ( isEmptyPosition(x,y) )  temp+=1;
    }
  }
return temp;
}

void HodCompa ()
{
  if(!PlayerLose() && NumFreePosition() > 3)
    {
      addBall(3)
    }
}

int playerlose()
{
int temp = 0;
for (int x=0;x<14;x++)
  {
    for (int y=0;y<14;y++)
    {
        if ( isEmptyPosition(x,y) )  return false;
    }
  }
  return true;
}

addBall(int sBall)
{
  int x,y,c;
  for (int k=0;k<sBall;k++)
    {
           
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;
}

          }
      }

}

Что-то типа такого...

impersonalis 14.09.2007 21:26

Re: Алгоритм игры Lines
 
Во-первых, не
Код:

int isEmptyPosition(int x, int y)
{
  if(g[x][y] = 0) return true;
  return false
}

,
а :
Код:

int isEmptyPosition(int x, int y)
{
  if(g[x][y] == 0) return true;
  return false
}

Во-вторых подобные конструкции по всему коду
можно сжать до:
Код:

int isEmptyPosition(int x, int y)
{
  return (!g[x][y]);
}

В-третьих:
Код:

bool isEmptyPosition(int x, int y)
{
  return (!g[x][y]);
}

Возможно так же - стоило определить функцию с inline модификатором, или вообще задефайнить её директивой.

Ну и
Код:

temp+=1;
принято записывать как инкремент:
Код:

temp++;
Думаю даже в производительности разницы не будет, но это - принято. Конструкция += используется для не единичного прироста.

dimanche13 14.09.2007 21:36

Re: Алгоритм игры Lines
 
impersonalis, спасибо за поправки, но я это всё знаю. А писал я так, чтобы было понятно новичку. Единственное где я прокоЛОЛся это двойное равно "==" ))) В главной целью моего опуса, было донести, что одна большая функция, может быть разбита на ряд маленьких, которые написать проще.

impersonalis 15.09.2007 00:14

Re: Алгоритм игры Lines
 
Цитата:

Сообщение от dimanche13
impersonalis, спасибо за поправки, но я это всё знаю.

Что я и не отрицал )
Цитата:

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

Аналогично - потому и записал последовтаельно. Я не отрицаю твоего решения - я привёл пример последующих упрощений.

Alex_90 15.09.2007 15:28

Re: Алгоритм игры Lines
 
:SOS:
Вот фрагмент функции, где добавляются шары:
Цитата:

//Добавляем шары
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;
}
}
}
}
так, вероятно, именно здесь есть какая-то мелкая ошибка, в результате чего добавляется в основном не 3 а 4 шара. Откуда берется 4 шар?


Часовой пояс GMT +4, время: 23:19.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot