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 12.07.2007 23:21

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

Lines - игра, в которой надо выстроить в ряды не менее определенного количества шариков одного цвета, что бы они исчезли)
Hello, World!
Некоторые еще помнят те времена, когда компьютеры встречались в редких ведомствах. Это были 286, 386, 486 компы с MS-DOS. Печатали тогда в Лексиконе, считали в SuperCalk 4, а из игр у всех стояли PackMan'ы и Lines, причем Lines пользовался гораздо большей популярностью, чем PackMan. С появлением Windows 3.1 Lines сменили пасьянсы.:stop:
Были попытки (мне они известны) сделать Windows Lines, однако ни одна версия не вернула себе ту популярность, что была у Dos Lines.
Я решил попробывать сделать Lines для Windows средствами OpenGL и пока у меня дела идут отлично. С графикой проблем нет, однако алгоритма, по которому Lines работает у меня нет.
Так вот: может у кто знает принцип этого алгоритма, или у кого завалялись исходники того, досовского Lines. (Они были по-моему на pascal).:)

Magus 13.07.2007 01:54

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

С графикой проблем нет
Скрины покажешь? ;)

Цитата:

может у кто знает принцип этого алгоритма, или у кого завалялись исходники того, досовского Lines.
Алгоритм в принципе несложный. ИМХО, тетрис написать сложнее.:)
Код:

Функция Нажатие_На_Кнопку_Мыши
{
  определяем, в какую клетку тыкнули мышкой;
  если(ни один шарик не выбран)
  {
      если(клетка не пустая)
              запоминаем, какой шарик выбрали;
  }
  иначе
  {
      если(клетка пустая)
      {
            перемещаем в нее шарик;
            проверяем, не выстроилась ли линия из 5 шариков;
            если(линия выстроилась)
                    убираем линию;
            иначе
            {
                  добавляем несколько шариков в пустые ячейки;
                  проверяем, не выстроилась ли линия из 5 шариков;
                  если(линия выстроилась)
                        убираем линию;
            }
      }
      иначе
            запоминаем координаты нового выбранного шарика;
  }
}

Писалось сходу после тяжелого рабочего дня, так что алгоритм наверняка далек от оптимального. Но вроде должно работать.
З.Ы.по идее, перед перемещением шарика надо бы еще проверять, есть ли путь от шарика к нужной клетке. Но это уже детали. Если надумаешь, то смотри
http://pmg.org.ru/ai/navigato.htm
http://pmg.org.ru/ai/stout.htm


З.З.Ы.:ты все-таки решил их доделать...Гуд лак. :)


UPD.:
есть у меня знакомая девушка, которая лайнс делала на С++. Если найду ее, попрошу сорсы.

Дарья 13.07.2007 17:32

Re: Алгоритм игры Lines
 
Вложений: 2
В свое время делала Эту игрушку на С++. Остались куски алгоритма. Точно знаю, что там нет мелочей типа итоговой таблицы победителей и т. д. Но сам алгоритм представлен. Надеюсь что мой материал тебе поможет. Есть просьба! как сделаешь свою игру, пришли пожалуйста мне. Заранее спасибо!

WaReZ_MEN 14.07.2007 06:06

Re: Алгоритм игры Lines
 
Незнаю почему мои пост стерли но если тебе нужны исходники у меня есть на Delphi

Serge 25.07.2007 11:41

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

Сообщение от WaReZ_MEN
Незнаю почему мои пост стерли но если тебе нужны исходники у меня есть на Delphi

Мне нужны исходники на Delphi? выложи плиз или вышли на мыло [email protected] Буду очень благодарен.

WaReZ_MEN 26.07.2007 02:12

Re: Алгоритм игры Lines
 
Вот сдесь скачаи http://delphigfx.narod.ru/game.htm

Serge 26.07.2007 07:33

Re: Алгоритм игры Lines
 
Спасибо, как ни странно, но я тоже вспомнил вчера про этот сайт. В общем нашел там все, что нужно было. Еще раз спасибо.

WaReZ_MEN 26.07.2007 08:09

Re: Алгоритм игры Lines
 
Всегда пожалуисто :)

Alex_90 27.07.2007 16:56

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

Вот сдесь скачаи http://delphigfx.narod.ru/game.htm
Sorry, но там ссылка дохлая (ошибка 404) !!!

Android 27.07.2007 22:21

Re: Алгоритм игры Lines
 
Ничего она не дохлая, только заходил проверял

Horror 27.07.2007 23:49

Re: Алгоритм игры Lines
 
у мну оно не работает
у мну страница открывается , но у мну оно не качается
мну растроился

Alex_90 28.07.2007 14:35

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

у мну оно не работает
у мну страница открывается , но у мну оно не качается
мну растроился
Так вот: значит не у меня одного не качается! Сегодня опять проверил: не качается!

Serge 07.08.2007 14:20

Re: Алгоритм игры Lines
 
Зашел, работает, все дело в том что там есть такая инфа от 25.03.2002 г. И так, новый адрес httt://delphigfx.mastak.ru перепишите ссылки.
Старый, т.е. этот сервер, обновляться более не будет.

Но новый адрес не работает совсем. В общем помер он, потому и глючит. Очень жаль.

Alex_90 12.08.2007 00:08

Re: Алгоритм игры Lines
 
:SOS: ВСЕМ, ВСЕМ, ВСЕМ!
Привет всем.
Может, кто знает, почему ниже приведенный цикл, исспользуемый мной для поиска собранных линий и их удаления выполняется до бесконечности! Вроде бы я все проверил: явных ерроров нет. Дебаггер при проходе этого цикла выдает следующее:

Цитата:

First-chance exception in 3D Lines 2007.exe (GDI32.DLL): 0xC0000005: Access Violation.

А вот и сам цикл:

Код:

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

:)

impersonalis 12.08.2007 00:29

Re: Алгоритм игры Lines
 
Не поверишь - уменя он выполняется без провисов.
Возможно 3ависит от введённых данных.
Ты вообще уверен, что виснет именно этот цикл?
Если да , то первое, что бросается в галаза -
//Найдена линия из 5 шаров
товарищ - так не кодят =/ Раскручивай это нагромождение.

Alex_90 23.08.2007 16:16

Re: Алгоритм игры Lines
 
ОРИЕНТИРОВАНИЕ В ТЕКСТОВОМ ФАЙЛЕ
Всем привет.
В любой программе часто возникает необходимость сохранять информацию на длительное время, что бы ее можно было воспроизвести при следующем запуске программы. Единственнымм способом сделать это является запись этой информации в файл. Но держать для каждой записи отдельный файл очень нерационально и для конечного пользователя и для программиста, который может просто запутаться, в каком файле что лежит.
Гораздо более рационально использовать один-два файла и в них хранить сразу много записей.
Информации записать в один файл можно сколько угодно много (до 32мб), а вот считать гораздо сожнее:
в паскале был отличный метод ориентирования в файле
Seek (f:file,pozitsia:integer);
Есть аналогичный метод и в С++, но там у функции fseek сразу три параметра: file,long,int.
C первым вопроса нет - это указатель на файл, в котором ориентироваться, а вот что такое второй и третий - не знаю (fseek не документирована ни в одной книге по С++, так как унаследована от С).
Может кто знает, как с попощью этой или какой нибудь другой функции ориентироваться в файле?
Функция fseek находится в файле stdio.h.:)

impersonalis 23.08.2007 16:37

Re: Алгоритм игры Lines
 
по логике - это направление смещения ( от текущей позиции, начала или конца). Такие задчи я решаю при помощие fstream-класса. Показать?

jimon 23.08.2007 16:49

Re: Алгоритм игры Lines
 
вводим в гугл "fseek c++" и читаем мануал :
http://www.cplusplus.com/reference/c...dio/fseek.html

Alex_90 23.08.2007 17:57

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

по логике - это направление смещения ( от текущей позиции, начала или конца). Такие задчи я решаю при помощие fstream-класса. Показать?
Если можно, то да, потому что моя конструкция
Цитата:

Spisok_control.ResetContent ();
//Выводим в список все имена пользователей из расчета одна строка
//в файле - один пользователь
FILE *f_user;
char* FileNameUser="Users.lin";
char load_string [50] = "none";
f_user=fopen (FileNameUser,"r");
long st=0;
while (!feof(f_user))
{
fseek (f_user,st,SEEK_SET);
fgets( load_string, 50 , f_user);
Spisok_control.AddString (load_string);
st++;
}
fclose (f_user);
добавляет все элементы в одну строку списка, а не каждый элемент в свою.

jimon 23.08.2007 18:17

Re: Алгоритм игры Lines
 
Alex_90
если у тебя строчки по 50 символов то
st+=50 попробуй

Alex_90 23.08.2007 22:10

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

Alex_90
если у тебя строчки по 50 символов то
st+=50 попробуй

Проверил->Ни какого результата.
Все равно он все строчки в одну считывает.Ведь у меня строчки с именами игроков могут быть от 1 до 50 символов, причем, если строчка меньше 50 символов, то до 50 я добавляю пробелами:
Цитата:

//Теперь надо дабавть нового игрока в список игроков и соддать
//для него список его рекордов
FILE *f_user,*f_records;
char* FileNameUser="Users.lin";
//char* FileNameRecords=Add_text+".lin";
f_user=fopen (FileNameUser,"a");
//f_records=fopen (FileNameRecords,"w");
//Файл рекордов создан и открыт, но записывать туда будет другая
//программа, поэтому сразу этот файл ззакрываем
//fclose (f_records);
fputs (Add_text,f_user);
//Дополняем строку пробелами до 50 символов
int pr;
pr=50-Add_text.GetLength ();
for (int i=1;i==pr;i++)
{
fputs (".",f_user);
}
fclose (f_user);
Однако толи он пробелы не добавляет, толи не считывает, но все равно следующие строчки он приплюсовывает к предыдущей. Пробывал даже вместо пробелов точки добавлять->все равно их не видно.

impersonalis 23.08.2007 22:56

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

#include<fstream.h>
#include<iostream.h>
#include<conio.h>


void main(){
fstream file;
file.open("score.txt",ios::in|ios::nocreate);
if(!file.is_open()){
cout<<"cannot open!"<<endl;
getch();
return;
}
char load_string [50];
while(!file.eof()){
file>>load_string;
cout<<load_string<<endl;
}
file.close();
getch();
}
как-то так

Alex_90 23.08.2007 23:30

Re: Алгоритм игры Lines
 
А возможно как-то наладить считывание так, что бы он считывал по принципу:
одна строчка в файле - один пункт в списке?

Magus 23.08.2007 23:42

Re: Алгоритм игры Lines
 
Возможно. Есть такая функция - EOL(FILE*)
Возвращает true, если ты дошел до конца строки.
Насчет типа параметра не уверен, уточни.

impersonalis 24.08.2007 00:33

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

Сообщение от Alex_90
А возможно как-то наладить считывание так, что бы он считывал по принципу:
одна строчка в файле - один пункт в списке?

именно это мой пример и делает

impersonalis 24.08.2007 23:46

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

Сообщение от Alex_90
Вот интересная фигня получается:

Построчное считывание fstream работает и вполне нC

:4to: ась?

Alex_90 25.08.2007 20:03

Re: Алгоритм игры Lines
 
В MFC незльзя создать переменную для текстового поля типа char*, который требуется для записи в файл функцией f_user.put (char*)
Придется переводить полученное из поля ввода значение типа CString в char*, но как?
Наверно, для этого есть какая-нибудь функция?:)

impersonalis 25.08.2007 20:37

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

Сообщение от Alex_90
В MFC незльзя создать переменную для текстового поля типа char*, который требуется для записи в файл функцией f_user.put (char*)
Придется переводить полученное из поля ввода значение типа CString в char*, но как?
Наверно, для этого есть какая-нибудь функция?:)

Брехня! Нормально char работает. Покажи код.

Alex_90 25.08.2007 20:53

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);
f_user.put (Add_text);//Ошибка выдается здесь
f_user.close ();
CDialog::OnOK();
}
if (Add_text.GetLength ()==0)
{
AfxMessageBox ("Инкогнитые из Питербурга к игре не допускаются! Все таки имя ввсести придется!",MB_OK+MB_ICONEXCLAMATION,0);
}
}
Перменная Add_text связанна с полем ввода и имеет тип CString.
Ошибка, которую выдает Visual Studio:
Цитата:

C:\Мои документы\Программирование\Visual C++\OpenGL\User\Add_user.cpp(61) : error C2664: 'class ostream &__thiscall ostream::put(char)' : cannot convert parameter 1 from 'class CString' to 'char'

impersonalis 25.08.2007 20:58

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

В MFC незльзя создать переменную для текстового поля типа char*
можно
--------------------
Цитата:

MB_OK+MB_ICONEXCLAMATION
MB_OK|MB_ICONEXCLAMATION
-------------------
(LPTSTR)(LPCTSTR)Add_text юзай если уж так хочешь через CString

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 шар?

Magus 15.09.2007 15:46

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

for (i1=1;i1<15;i1++)
{
for (int i2=1;i2<15;i2++)
Опять 25! ;)

impersonalis 15.09.2007 15:49

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

while (true)
{
x=rand()%14;
y=rand()%14;//Рандомно определяем x и y координаты нового добавляемого шарика
if (!g[x][y])
{
g[x][y]=rand()%7+1;//Если место пусто, то добавляем шар
break;
}
}

Приведи код к нормальному стилю!
----------
так и не понял: у тебя индексация элементов матрицы с нуля или с 1 ?

dimanche13 15.09.2007 16:32

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

addBall(int sBall)
{
  int x,y,c;
  for (int k=0;k<sBall;k++)
    {
        do {   
            x=rand()%14;
            y=rand()%14;
            c=rand()%7+1;
          } while(!SetBall(x,y,c))
      }
}

//или в цикле попроще: while(!SetBall(rand()%14,rand()%14,rand()%7+1))

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

Или типа такого, писал в браузере, возможны ошибки))) А я вообще вот подумал: ход компа это лана-фигня, а вот ход игрок посложнее будет ,ч чуть ли не A* надо использовать... впрочем и тут я оставляю за собой право на ошибку)))
"так и не понял: у тебя индексация элементов матрицы с нуля или с 1 ?" -присоединяюсь к вопросу.

Alex_90 15.09.2007 17:15

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

Опять 25! ;)
Да! Потому, что вариант
Цитата:

for (i1=1;i1<14;i1++)
дает следующий глюк: шары выводятся так же не на игровом поле!

Alex_90 15.09.2007 17:30

Re: Алгоритм игры Lines
 
:dontknow:
Sorry, но я с такой конструкцией еще не сталкивался!
Цитата:

while (true)
{
...
break;
}
и с такой тоже!
Цитата:

if (!g[x][y])
{
...
break;
}

dimanche13 15.09.2007 17:45

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

Сообщение от Alex_90
Sorry, но я с такой конструкцией еще не сталкивался!
и с такой тоже!

1. while(true) или while(1) - бесконечный цикл.
2. break - команда для выхода из бесконечного цикла.(не только)
3. if(что-то-там) break; - выход из цикла по соблюдении условия.

Бесплатный совет(впрочем как и все остальные): используй такие определения
#define SIZEX 14
#define SIZEY 14
тогда
for(x=0;x<SIZEX;x++)
x = rand() % SIZEX
по-моему намного читабельнее, как ты считаешь?

Alex_90 15.09.2007 20:59

Re: Алгоритм игры Lines
 
Код добавления шаров исправил, но все равно выводится в основном не по 3 а по 4 шара (а требуется по 3):
Цитата:

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

impersonalis 15.09.2007 21:12

Re: Алгоритм игры Lines
 
while(!answer){
Цитата:

"так и не понял: у тебя индексация элементов матрицы с нуля или с 1 ?" -присоединяюсь к вопросу.
}

haedim 15.09.2007 21:25

Re: Алгоритм игры Lines
 
Согласен с impersonalis. Другой причины здесь не вижу.

dimanche13 15.09.2007 21:43

Re: Алгоритм игры Lines
 
47 и 48 посты ответ на твой вопрос, ответь же наконец и на наш вопрос! Это одна из самых тонких вещей в С++, если указываешь размер массива N, то последний элемент массива array[N-1](!!!), потому что счет идет с нуля array[0], array[1] ... array[9].
Мы написали тебе полный алгоритм хода компьютера. Просто перечитай, и все поймешь. С уважением.

Alex_90 20.09.2007 21:33

Re: Алгоритм игры Lines
 
:)
Итак:
  1. Идексация массива идет от 1 до 15 (так как от одного до 14 (что прямо указанно в моем сообщении выше) вызывает глюк - смещение шаров (при отрисовке это видно) на одну клетку назад. Шар который должен выводиться в первом ряду клеток выводится вообще перед полем!!!). Объявляется вы файле Var.h массив так:
    Цитата:

    int g[14][14];
  2. Функция HodCompa (), как наверно можно догадаться, не единственная (есть HodIgroka (), Otrisovka (), Shphere (), отображающаяя шар на экране с текстурами, подсветкой и другими прибомбасами). Дробить существующую функцию HodCpmpa () на несколько не буду, потому что тогда что либо найти в свем коде точно невозможно!!!:)

dimanche13 20.09.2007 21:45

Re: Алгоритм игры Lines
 
Итак:
1.Индексация массива идет не с 1 до 15, а с 0 до 13 перечитай главу про массивы. Так простейший одномерный массив типа инт
int array[5] = { 1, 2, 3, 4, 5 }
так вот array[0] = 1
array[1] = 2
array[2] = 3
array[3] = 4
array[4] = 5
2. Дело твоё. Я же советую как проще...

Alex_90 20.09.2007 21:48

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

с 0 до 13
Даже так!!!


impersonalis 20.09.2007 23:11

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

Сообщение от Alex_90
Идексация массива идет от 1 до 15

Код:

x=rand()%m1;
y=rand()%m1;//Рандомно определяем x и y координаты нового добавляемого шарика

x=0..(m1-1)
y=0..(m1-1)

Alex_90 21.09.2007 22:30

Re: Алгоритм игры Lines
 
НУ НАКОНЕЦ-ТО, ГЛЮК ИСПРАВИЛ!!!
Но почему-то обнаружился новый: шары при каждом вызове функции выводятся шары в одни и те же места?
Что еще более удивительно в WinMain у меня есть следующая строка:
Цитата:

srand(GetTickCount());
прямо запрещающая подобные выходки rand.
Как заставить шары выводиться в разных метстах?:)

dimanche13 21.09.2007 22:47

Re: Алгоритм игры Lines
 
а с чего ты решил, что шары выводятся в одних и тех же местах? Тем не менее если это так, то я тебе писал функцию isEmptyPos(x,y) посмотри в этой ветке ранее. Она проверяет в позиции [x][y] пустая клетка или нет.

Alex_90 21.09.2007 22:54

Re: Алгоритм игры Lines
 
:stop:
Вероятно вопрос не правильно понят!!!
Шары все время при начальной расстановке при первом вызове функции ставятся в одних и тех же местах! То есть при существующем варианте игра будет всегда ничинаться одинаково!:)

dimanche13 21.09.2007 23:07

Re: Алгоритм игры Lines
 
Хммм... странно, думаю вот из-за чего: функция srand(GetTickCount()); берет число тиков с начала старта программы а так как старт всегда одинаков одинаковы и числа, впрочем я могу ошибаться. А можешь попробовать сделать так.
Код:

srand(time())

Alex_90 21.09.2007 23:51

Re: Алгоритм игры Lines
 
Поставитл!
Рузультат:
Цитата:

error C2065: 'time' : undeclared identifier


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

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