Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > C++

Ответ
 
Опции темы
Старый 25.08.2007, 21:02   #31
Alex_90
Знающий
 
Регистрация: 05.02.2007
Сообщений: 201
Написано одно полезное сообщение
(для 2 участников)
Re: Алгоритм игры Lines

Нельзя!
Я только согодня проверял: для текстовой информации только CString.
(У меня Visual Studio 6.0 Servis Pack 5)
(Offline)
 
Ответить с цитированием
Старый 25.08.2007, 21:04   #32
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
Re: Алгоритм игры Lines

1. См. предыдщий пост (обновил).
2. Покажи как берёшь информацию из тескстового поля.
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием
Старый 25.08.2007, 21:13   #33
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
Re: Алгоритм игры Lines

int GetDlgItemText( int nID, LPTSTR lpStr, int nMaxCount ) const;
или
int GetWindowText( LPTSTR lpszStringBuf, int nMaxCount ) const;

чем не подходят?
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием
Старый 25.08.2007, 21:17   #34
Alex_90
Знающий
 
Регистрация: 05.02.2007
Сообщений: 201
Написано одно полезное сообщение
(для 2 участников)
Re: Алгоритм игры Lines

  1. Создаю текстовое поле
  2. С нажатой Ctrl дважды щелкаю на поле ввода
  3. В открывшимся диалоге "Add member variable" задаю имя переменной
  4. Определяю ее тип как Value
  5. Определяю ее тип как CString из выпадающего списка (пункта char в этом списке нет)
(Offline)
 
Ответить с цитированием
Старый 25.08.2007, 21:18   #35
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
Re: Алгоритм игры Lines

=/ Вот оэтому многие неоправданно обсирают MFC. А ты ручками кодь)
#30 пост тогда смотри
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием
Старый 25.08.2007, 23:23   #36
Alex_90
Знающий
 
Регистрация: 05.02.2007
Сообщений: 201
Написано одно полезное сообщение
(для 2 участников)
Re: Алгоритм игры Lines


че то фигня какая-то: ошибок не выдает при копмиляции с новыми функциями, однако во время выполнения снимается виндусом. Вот новый код функции:
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.
(Offline)
 
Ответить с цитированием
Старый 26.08.2007, 00:12   #37
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
Re: Алгоритм игры Lines

char* vsp;
есть, а инициализации оператором new - нет
char *vsp=new char[50+1];
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием
Старый 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)
 
Ответить с цитированием
Старый 14.09.2007, 17:32   #39
dimanche13
Мастер
 
Регистрация: 19.03.2007
Сообщений: 1,039
Написано 153 полезных сообщений
(для 252 пользователей)
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++)
{
Ты уж определись
(Offline)
 
Ответить с цитированием
Старый 14.09.2007, 19:13   #40
Alex_90
Знающий
 
Регистрация: 05.02.2007
Сообщений: 201
Написано одно полезное сообщение
(для 2 участников)
Re: Алгоритм игры Lines

По поводу расхождения в разных циклах for - исправил, а вот создание отдельной функции для проверки проигрыша игрока считаю явно лишним: тогда я окончательно запутаюсь в своем коде. И еще: лишняя проверка проигрыша никогда не мешает - хуже, когда проигрыш останется незамеченным.
Исправляния внес в приведенный выше код.
Однако все равно добавляется в основном 4 шара (3 реже)!
(Offline)
 
Ответить с цитированием
Старый 14.09.2007, 19:57   #41
dimanche13
Мастер
 
Регистрация: 19.03.2007
Сообщений: 1,039
Написано 153 полезных сообщений
(для 252 пользователей)
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;
}

          }
      }

}
Что-то типа такого...
(Offline)
 
Ответить с цитированием
Старый 14.09.2007, 21:26   #42
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
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++;
Думаю даже в производительности разницы не будет, но это - принято. Конструкция += используется для не единичного прироста.
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием
Старый 14.09.2007, 21:36   #43
dimanche13
Мастер
 
Регистрация: 19.03.2007
Сообщений: 1,039
Написано 153 полезных сообщений
(для 252 пользователей)
Re: Алгоритм игры Lines

impersonalis, спасибо за поправки, но я это всё знаю. А писал я так, чтобы было понятно новичку. Единственное где я прокоЛОЛся это двойное равно "==" ))) В главной целью моего опуса, было донести, что одна большая функция, может быть разбита на ряд маленьких, которые написать проще.
(Offline)
 
Ответить с цитированием
Старый 15.09.2007, 00:14   #44
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
Re: Алгоритм игры Lines

Сообщение от dimanche13
impersonalis, спасибо за поправки, но я это всё знаю.
Что я и не отрицал )
Сообщение от dimanche13
В главной целью моего опуса, было донести, что одна большая функция, может быть разбита на ряд маленьких, которые написать проще.
Аналогично - потому и записал последовтаельно. Я не отрицаю твоего решения - я привёл пример последующих упрощений.
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием
Старый 15.09.2007, 15:28   #45
Alex_90
Знающий
 
Регистрация: 05.02.2007
Сообщений: 201
Написано одно полезное сообщение
(для 2 участников)
Re: Алгоритм игры Lines


Вот фрагмент функции, где добавляются шары:
//Добавляем шары
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 шар?
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Алгоритм MD5 Dialogus Библиотеки 7 07.02.2010 15:17
Алгоритм Дейкстры Serega 3D-программирование 6 29.10.2009 20:18
Алгоритм темы на нокиа demon112 Алгоритмика 7 22.05.2009 01:24
Морской бой - алгоритм Matt Merkulov 2D-программирование 3 27.05.2007 00:25
Алгоритм поворота alcosholik Алгоритмика 8 08.09.2005 21:05


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com