|
25.08.2007, 21:02
|
#31
|
Знающий
Регистрация: 05.02.2007
Сообщений: 201
Написано одно полезное сообщение (для 2 участников)
|
Re: Алгоритм игры Lines
Нельзя!
Я только согодня проверял: для текстовой информации только CString.
(У меня Visual Studio 6.0 Servis Pack 5)
|
(Offline)
|
|
25.08.2007, 21:04
|
#32
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Re: Алгоритм игры Lines
1. См. предыдщий пост (обновил).
2. Покажи как берёшь информацию из тескстового поля.
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
25.08.2007, 21:13
|
#33
|
Зануда с интернетом
Регистрация: 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
|
Знающий
Регистрация: 05.02.2007
Сообщений: 201
Написано одно полезное сообщение (для 2 участников)
|
Re: Алгоритм игры Lines
- Создаю текстовое поле
- С нажатой Ctrl дважды щелкаю на поле ввода
- В открывшимся диалоге "Add member variable" задаю имя переменной
- Определяю ее тип как Value
- Определяю ее тип как CString из выпадающего списка (пункта char в этом списке нет)
|
(Offline)
|
|
25.08.2007, 21:18
|
#35
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Re: Алгоритм игры Lines
=/ Вот оэтому многие неоправданно обсирают MFC. А ты ручками кодь)
#30 пост тогда смотри
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
25.08.2007, 23:23
|
#36
|
Знающий
Регистрация: 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
|
Зануда с интернетом
Регистрация: 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
|
Знающий
Регистрация: 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
|
Мастер
Регистрация: 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
|
Знающий
Регистрация: 05.02.2007
Сообщений: 201
Написано одно полезное сообщение (для 2 участников)
|
Re: Алгоритм игры Lines
По поводу расхождения в разных циклах for - исправил, а вот создание отдельной функции для проверки проигрыша игрока считаю явно лишним: тогда я окончательно запутаюсь в своем коде. И еще: лишняя проверка проигрыша никогда не мешает - хуже, когда проигрыш останется незамеченным.
Исправляния внес в приведенный выше код.
Однако все равно добавляется в основном 4 шара (3 реже)!
|
(Offline)
|
|
14.09.2007, 19:57
|
#41
|
Мастер
Регистрация: 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
|
Зануда с интернетом
Регистрация: 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 модификатором, или вообще задефайнить её директивой.
Ну и
принято записывать как инкремент:
Думаю даже в производительности разницы не будет, но это - принято. Конструкция += используется для не единичного прироста.
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
14.09.2007, 21:36
|
#43
|
Мастер
Регистрация: 19.03.2007
Сообщений: 1,039
Написано 153 полезных сообщений (для 252 пользователей)
|
Re: Алгоритм игры Lines
impersonalis, спасибо за поправки, но я это всё знаю. А писал я так, чтобы было понятно новичку. Единственное где я прокоЛОЛся это двойное равно "==" ))) В главной целью моего опуса, было донести, что одна большая функция, может быть разбита на ряд маленьких, которые написать проще.
|
(Offline)
|
|
15.09.2007, 00:14
|
#44
|
Зануда с интернетом
Регистрация: 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
|
Знающий
Регистрация: 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)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 10:53.
|