максим2007, а как ты его изучаеш ? ты читаеш книжки ? или хочеш сам потратить несколько лет на наступление на все грабли программирования на с++
в книжках описывают полезные приёмы программирования.
например вот почему ты пишеш код и тутже видиш что он непонятный и пишеш коментарий к этой строчке
double reit;//рейтинг хода
вместо того чтобы написать так
double reiting;
транслит хоть и не очень хорошо по сравнению с англиским словом, но пусть лучше хоть так, чем трёхбуквенные переменные которые фих поймеш что хранят в себе.
потом юзай пустые строки для отделения классов, процедур и других структур друг от друга, 2-3 пустые строки былобы клёво.
не юзай переменные короче 5 символов, переменная это всегда как мининмум 2 слова, это NomerHoda, HodSumm и тп ( лучше по англиски но суть таже как минимум 2 слова ), потомучто переменная это не просто кусочек памяти для универсального использования, лучше пусть будет много временных локальных переменных которые делают своё небольшое дело и умирают с закрывающей скобкой, вместо кучки универсальных переменных описанных в стиле паскаля ( i j k a b ) гдето вверху и юзаемых потом по всей процедуре.
максим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:
вопросег кстати, для работы какой либо функции необходима int Temp;
функция вызываеца часто,
имеет ли смысл ее делать статической?
я бы не стал её делать изза этого статической [Ответ]
DeniSS1 21:04 16.03.2008
УРА! Я смог вернуться! Вот недоделанная версия консольного ИИ. Это, честно говоря, вообще не ИИ, но больше я за один сегодняшний день сделать не успел.
Управление: 4 - курсор влево, 6 - вправо, 8 - вверх, 2 - вниз. 5 - выбрать клетку, с которой берём свою шашку, потом снова курсором выбираем пустую клетку и снова жмём 5 - ставим. Противник пока бездействует. 0 - выход. Перед выходом программа выводит информацию по доске - где чьи шашки стоят.
Цель: сверить, правильно ли функционирует эта подготовительная часть. Если да, я перейду к созданию ИИ, если нет - сначала доработаю это.
[Ответ]
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)
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 хода вперёд.
Изображения
максим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 Вот пример, должен выводить на экран два прямоугольника с текстурами. На этом примере я отрабатывал вывод текстур для шашек их одного файла. Но текстуры не видны. Почему? Объясните, плиз.
DeniSS1, Не знаю, говорил тебе кто-нибудь или нет, но в сети натыкался на исходники реверси. Причем все сделано на openGL, все фишки с бампом. И соответственно изменяются с какой стороны подводят мышь. Выглядит очень прикольно. Исходник на дельфе но адаптировать под с++ имхо ничего сложного.
Кстати там и очень не хреновый ии, можешь поизучать как-нибудь...
[Ответ]
xxx-men, Очень просто. Посмотреть как и что уже сделано. Подумать что можно сделать лучше. Как раз смысла нет изобретать велосипед. Человек как я понял учится.
[Ответ]
DeniSS1 19:43 07.04.2008
Спасибо, поищу, но пока хотелось бы узнать, почему не работает данный пример.
[Ответ]
DeniSS1 22:28 11.04.2008
Ну что, никто не подскажет, почему не работает пример?
[Ответ]
DeniSS1, ды хз, я огл не знаю, отладчик задрачивай...
может текстура не загружена
может неверные координаты
может.... дофига чего
полностью(хоть как нибуть) текстуру на полигон получаеца натягивать?
кстать , в случае ошибки, функции возвращают её код...
[Ответ]
DeniSS1 21:07 24.04.2008
Путём сложных логических умозаключений пришёл к выводу, что траблы не в выводе 2 и более текстур, а в натягивании хотя бы одной на объект.
Вот код, который работает: