Большой Воронежский Форум
Страница 8 из 13
« Первая < 2345678 910111213 >
» Программирование>Создание игры!!!(кто хочет помочь все сюда!!!)
The_God 23:25 13.03.2008
максим2007, а как ты его изучаеш ? ты читаеш книжки ? или хочеш сам потратить несколько лет на наступление на все грабли программирования на с++

в книжках описывают полезные приёмы программирования.

например вот почему ты пишеш код и тутже видиш что он непонятный и пишеш коментарий к этой строчке
double reit;//рейтинг хода
вместо того чтобы написать так
double reiting;

транслит хоть и не очень хорошо по сравнению с англиским словом, но пусть лучше хоть так, чем трёхбуквенные переменные которые фих поймеш что хранят в себе.

потом юзай пустые строки для отделения классов, процедур и других структур друг от друга, 2-3 пустые строки былобы клёво.

не юзай переменные короче 5 символов, переменная это всегда как мининмум 2 слова, это NomerHoda, HodSumm и тп ( лучше по англиски но суть таже как минимум 2 слова ), потомучто переменная это не просто кусочек памяти для универсального использования, лучше пусть будет много временных локальных переменных которые делают своё небольшое дело и умирают с закрывающей скобкой, вместо кучки универсальных переменных описанных в стиле паскаля ( i j k a b ) гдето вверху и юзаемых потом по всей процедуре.

имхо [Ответ]
xxx-men 11:12 14.03.2008
максим2007, я что та нефига не понял как его денис прикручивать будет.... [Ответ]
xxx-men 11:22 14.03.2008

Сообщение от The_God:
лучше пусть будет много временных локальных переменных которые делают своё небольшое дело и умирают

вопросег кстати, для работы какой либо функции необходима int Temp;
функция вызываеца часто,
имеет ли смысл ее делать статической? [Ответ]
максим2007 13:30 14.03.2008

Сообщение от xxx-men:
максим2007, я что та нефига не понял как его денис прикручивать будет....

пусть создаст массив типа desc, в которой будет храниться текущая ситуация на доске, перемнную типа Ai с характеристиками интеллекта компьютера. И когда наступает очередь ходить противнику надо вызывать метод имяИИ.game(имя доски). Этот метод преобразует доску в соответствии с ходом компьютера
По хорошему мой код должен храниться в отдельном файле хотя я пока не разобрался как это делается.
Кто-нибудь может сказать почему моя программа не запускается ни на каком комьютере кроме моего. Делал в Visual C++ 2008 Express Edition. [Ответ]
xxx-men 14:09 14.03.2008
CreateWindow(L"xxxxxx", L"йа акошко", dwStyle, 100,100,640, 480, 0, 0, hInstance1, NULL);

чо писать в dwStyle чтобы был голый прямоугольник без ничего? [Ответ]
xxx-men 14:13 14.03.2008

Сообщение от xxx-men:
чо писать в dwStyle

не актуально, подобрал WS_POPUP [Ответ]
xxx-men 14:22 14.03.2008
максим2007, почитай гдето 6-ю страницу,
мы там решили оформлять АИ класом, с простым интерфейсом

Сообщение от максим2007:
По хорошему мой код должен храниться в отдельном файле хотя я пока не разобрался как это делается.

самое простое это в прграмме пишеш:
class X
{
public: int A();
};
и в дериктории где находица main.cpp создаеш фаил x.cpp, где реализуеш класс X

помоему должно работать [Ответ]
The_God 18:22 15.03.2008

Сообщение от xxx-men:
вопросег кстати, для работы какой либо функции необходима int Temp;
функция вызываеца часто,
имеет ли смысл ее делать статической?

я бы не стал её делать изза этого статической [Ответ]
DeniSS1 21:04 16.03.2008
УРА! Я смог вернуться! Вот недоделанная версия консольного ИИ. Это, честно говоря, вообще не ИИ, но больше я за один сегодняшний день сделать не успел.
Управление: 4 - курсор влево, 6 - вправо, 8 - вверх, 2 - вниз. 5 - выбрать клетку, с которой берём свою шашку, потом снова курсором выбираем пустую клетку и снова жмём 5 - ставим. Противник пока бездействует. 0 - выход. Перед выходом программа выводит информацию по доске - где чьи шашки стоят.
Цель: сверить, правильно ли функционирует эта подготовительная часть. Если да, я перейду к созданию ИИ, если нет - сначала доработаю это. [Ответ]
Gillbert 21:10 16.03.2008
Ыы.. а где файлик то? [Ответ]
DeniSS1 15:58 17.03.2008
Блииииииин....
Поменяйте расширение на exe. По-другому не выкладывается.
Изображения
[Ответ]
максим2007 18:02 17.03.2008
DeniSS1, я уже написал почти весь ИИ. Чтобы приклеить его к своим шашкам пользуйся моими классами и функциями:
class board//массив 8 на 8 из элементов этого типа образует доску
{
public:
int figure; //0-пустая 1-шашка 2-дамка
bool color;//true-бел false-чёрн
};

class Step//этот класс описывает перемещения фигуры с координатами (x[0],y[0]) в точку (x[1],y[1]) затем в (x[2],y[2]) и т.д. до (x[num],y[num]).
{
public:
double reit; //рейтинг_хода =количество_белых/количество_чёрных подсчет производится после завершения хода
int num;//количество перемещений в ходе
int x[12];
int y[12];
void setXY(int a,int b);//дописать в крнец перемещение в точку (a,b)
};
class ListStep//список ходов
{
public:
Step h[50];
int num;//количество ходов
void Zeroing();//обнулить список
};

class Ai//это сам ии
{
public:
int Complexity;//на сколько шагов вперёд он может думать
bool color;// за какой цвет он играет
void game(board dos[8][8]);//заставить ии думать над доской "dos". В результате он изменит доску в соответствии со своим ходом.
};

double getReiting(board dos[8][8]);//получить рейтинг из доски "dos"

bool Draug(board dos[8][8],int x1,int y1,int x2,int y2);// возвращает true если в клетке(x1,y1) стоит шашка которая может, никого не убив, пойти на (x2,y2)

bool DraugBlow(board dos[8][8],int x1,int y1,int x2,int y2);// возвращает true если в клетке(x1,y1) стоит шашка которая может пойти, убив одну фигуру противника, в (x2,y2)

bool KingBlow(board dos[8][8],int x1,int y1,int x2,int y2);//аналогично для дамки
bool King(board dos[8][8],int x1,int y1,int x2,int y2);

void draw(board d[8][8]);//нарисовать доску "d"

void AlterBoard(board dos[8][8],Step b);//преобразовать доску "dos" в соответствии с ходом "b"

ListStep CreateListStepDraug(board dos[8][8],int X,int Y);//возвращает список ходов с ударом , которые может сделать шашка, стоящая на (x,y)

ListStep CreateListStepKing(board dos[8][8],int X,int Y);//аналогично для дамки

ListStep CreateListStep(board dos[8][8],bool color);//возвращает список всех доступных ходов на доске "dos" для фигур цвета "color"

ListStep SumList(ListStep a,ListStep b);//соединяет два списка ходов и возвращает что получилось

double getTrueReiting(board dos[8][8],bool color,int m);//возвращает рейтинг с доски "dos", если следующий ход будет делать игрок цвета "color" с учётом развития ситуации на m ходов вперёд.

текст всех функций в присоединённом файле. Если его откомпилировать то в консольном окне будут играть два ии, которые могут просчитывать варианты на 2 хода вперёд.
Изображения
[Ответ]
DeniSS1 18:55 17.03.2008
максим2007, спасибо. Сейчас присобачу к графической части! [Ответ]
xxx-men 20:11 17.03.2008
максим2007, код мозг хаваед, но

Сообщение от максим2007:
В результате он изменит доску в соответствии со своим ходом

я так и не понял какую доску он менят, но в коде увидел глобальную перемнную типа: board, наверное её (значит работать графика будет с ней?)
что произойдет если данные в board a[8][8] и параметр для void game(board dos[8][8]) будут отличаца?
ды даже если ты работаеш с глобальной какой смысл методу game() скармливать какие либо параметры....

представь себе:
void game(board& dos[8][8]);//меняет доску какую дадут
а всю остальную пачку функций ты запихиваеш внутри класса
помоему на много красивее...
[Ответ]
максим2007 11:15 18.03.2008
Ai::game меняет ту доску которую передают. Изнутри эта функция ни как не связна с board a, так что можешь передавать туда что хочешь. Попробуй создать какую-нибудь другую доску внутри main и передать в game, ничего не изменится просто компьютер теперь будет играть на другой доске. Можешь даже устроить сеанс одновременной игры на десяти досках

Сообщение от :
значит работать графика будет с ней?

Да. Очень желательно чтобы она могла рисовать доски класса board.

Сообщение от :
представь себе:
void game(board& dos[8][8]);//меняет доску какую дадут
а всю остальную пачку функций ты запихиваеш внутри класса
помоему на много красивее...

для этого всё переделать надо, а мне лень.
[Ответ]
DeniSS1 18:46 26.03.2008
Поясню, почему долго делаю. С 12 марта начался тур программирования конкурса "Интернет и мы". Сейчас добиваю конкурсную задачу и возвращаюсь к шашкам. :-) [Ответ]
DeniSS1 17:20 02.04.2008
Так, с конкурсом закончил, теперь один вопрос:
Есть bmp-файл. В нём текстуры шашек (сразу всех)
Вопрос: как сделать так, как Gillbert: у него РАЗНЫЕ текстуры грузятся ОТДЕЛЬНО из этого самого файла.
Искал в книгах по OPenGL-ю - не нашёл ни хрена... [Ответ]
AIM-9M 10:22 03.04.2008

Сообщение от DeniSS1:
Так, с конкурсом закончил, теперь один вопрос:
Есть bmp-файл. В нём текстуры шашек (сразу всех)
Вопрос: как сделать так, как Gillbert: у него РАЗНЫЕ текстуры грузятся ОТДЕЛЬНО из этого самого файла.
Искал в книгах по OPenGL-ю - не нашёл ни хрена...

Если у тебя текстура, допустим 256*128 пикселей, в левой половине нарисована белая шашка, а в правой - черная, то для полигона, который будет отображать белую шашку, надо брать текстурные координаты по горизонтали от 0 до 0,5, а для черной от 0,5 до 1, если я правильно понял вопрос. [Ответ]
DeniSS1 14:53 03.04.2008
AIM-9M, вопрос понят правильно, спасибо, ждите максимум послезавтра аналог Gillbertских шашек без ИИ. Потом уже присобачу максим2007-ий ИИ. [Ответ]
Gillbert 02:44 06.04.2008
Вот как всегда послезавтра уже прошло, а ничего так и не дождались ((( [Ответ]
DeniSS1 18:39 06.04.2008
Извиняюсь за неразбериху со сроками, но у меня, похоже, пиратский brain.dll Вот пример, должен выводить на экран два прямоугольника с текстурами. На этом примере я отрабатывал вывод текстур для шашек их одного файла. Но текстуры не видны. Почему? Объясните, плиз.

#include <windows.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glaux.h>

unsigned int photo_tex;
AUX_RGBImageRec* photo_image;

unsigned int space_tex;
AUX_RGBImageRec* space_image;


void CALLBACK resize(int width,int height) // освещение
{
glViewport(0,0,width,height);
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glOrtho(-5,5, -5,5, 2,12);
gluLookAt( 0,0,5, 0,0,0, 0,1,0 );
glMatrixMode( GL_MODELVIEW );
}
// Здесь идёт вся отрисовка
void CALLBACK display(void)
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

glEnable(GL_TEXTURE_2D);
glColor3d(1,1,1);

glBindTexture(GL_TEXTURE_2D, space_tex );
glBegin(GL_QUADS);
glTexCoord2d(0,0); glVertex3d(-5,-5, -0.1);
glTexCoord2d(0,1); glVertex3d(-5, 5, -0.1);
glTexCoord2d(1,1); glVertex3d( 5, 5, -0.1);
glTexCoord2d(1,0); glVertex3d( 5,-5, -0.1);
glEnd();

glBindTexture(GL_TEXTURE_2D, photo_tex);
glBegin(GL_QUADS);
glTexCoord2d(0,0); glVertex2d(-4,-4);
glTexCoord2d(0,1); glVertex2d(-4, 4);
glTexCoord2d(1,1); glVertex2d( 4, 4);
glTexCoord2d(1,0); glVertex2d( 4,-4);
glEnd();

glDisable(GL_TEXTURE_2D);

auxSwapBuffers();

}


int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
float pos[4] = {3,3,3,1};
float dir[3] = {-1,-1,-1};

auxInitPosition( 50, 10, 400, 400);
auxInitDisplayMode( AUX_RGB | AUX_DEPTH | AUX_DOUBLE );
auxInitWindow( "Texture" );
auxIdleFunc(display);
auxReshapeFunc(resize);


glEnable(GL_DEPTH_TEST);
glEnable(GL_ALPHA_TEST);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);



glLightfv(GL_LIGHT0, GL_POSITION, pos);
glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, dir);


glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

photo_image = auxDIBImageLoad("photo.bmp");
space_image = auxDIBImageLoad("space.bmp");


glGenTextures(1, &photo_tex);
glGenTextures(1, &space_tex);

glBindTexture(GL_TEXTURE_2D, photo_tex );



glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);



glTexImage2D(GL_TEXTURE_2D, 0, 3,
photo_image->sizeX,
photo_image->sizeY,
0, GL_RGB, GL_UNSIGNED_BYTE,
photo_image->data);


glBindTexture(GL_TEXTURE_2D, space_tex );

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

glTexImage2D(GL_TEXTURE_2D, 0, 3,
space_image->sizeX,
space_image->sizeY,
0, GL_RGB, GL_UNSIGNED_BYTE,
space_image->data);

auxMainLoop(display);
return 0;
}
[Ответ]
Akad 01:55 07.04.2008
DeniSS1, Не знаю, говорил тебе кто-нибудь или нет, но в сети натыкался на исходники реверси. Причем все сделано на openGL, все фишки с бампом. И соответственно изменяются с какой стороны подводят мышь. Выглядит очень прикольно. Исходник на дельфе но адаптировать под с++ имхо ничего сложного.
Кстати там и очень не хреновый ии, можешь поизучать как-нибудь... [Ответ]
xxx-men 07:41 07.04.2008
Akad, а тогда какой смысл написания? [Ответ]
Akad 14:27 07.04.2008
xxx-men, Очень просто. Посмотреть как и что уже сделано. Подумать что можно сделать лучше. Как раз смысла нет изобретать велосипед. Человек как я понял учится. [Ответ]
DeniSS1 19:43 07.04.2008
Спасибо, поищу, но пока хотелось бы узнать, почему не работает данный пример. [Ответ]
DeniSS1 22:28 11.04.2008
Ну что, никто не подскажет, почему не работает пример? [Ответ]
DeniSS1 16:08 15.04.2008
наверх!! [Ответ]
xxx-men 16:41 15.04.2008
DeniSS1, ды хз, я огл не знаю, отладчик задрачивай...

может текстура не загружена
может неверные координаты
может.... дофига чего

полностью(хоть как нибуть) текстуру на полигон получаеца натягивать?

кстать , в случае ошибки, функции возвращают её код... [Ответ]
DeniSS1 21:07 24.04.2008
Путём сложных логических умозаключений пришёл к выводу, что траблы не в выводе 2 и более текстур, а в натягивании хотя бы одной на объект.
Вот код, который работает:


#include <windows.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glaux.h>

AUX_RGBImageRec* image;

void CALLBACK resize(int width,int height)
{
glViewport(0,0,width,height);
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glOrtho(-5,5, -5,5, 2,12);
gluLookAt( 0,0,5, 0,0,0, 0,1,0 );
glMatrixMode( GL_MODELVIEW );
}

void CALLBACK display(void)
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );


glRasterPos2d(-4.5,-3);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glPixelZoom(1.0, 1.0);
glDrawPixels(image->sizeX, image->sizeY,
GL_RGB, GL_UNSIGNED_BYTE,
image->data);


auxSwapBuffers();
}



int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
float pos[4] = {3,3,3,1};
float dir[3] = {-1,-1,-1};

image = auxDIBImageLoad("space.bmp");

glEnable(GL_ALPHA_TEST);
glEnable(GL_DEPTH_TEST);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

glLightfv(GL_LIGHT0, GL_POSITION, pos);
glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, dir);


auxInitPosition( 50, 10, 400, 400);
auxInitDisplayMode( AUX_RGB | AUX_DEPTH | AUX_DOUBLE );
auxInitWindow( "Photo" );
auxIdleFunc(display);
auxReshapeFunc(resize);
auxMainLoop(display);

}

А код, который не работает, смотрите на предыдущей странице.
Задал вопрос на RSDN - пока не ответили. [Ответ]
xxx-men 23:18 25.04.2008
DeniSS1,

Сообщение от xxx-men:
в случае ошибки, функции возвращают её код...

полученый код ошибки можно забить в гугле, а уж он точно знает [Ответ]
Страница 8 из 13
« Первая < 2345678 910111213 >
Вверх