С 1 сентября будет открыт новый курс "Программирование на C++ с нуля". Для тех, кто совсем не умеет программировать на Си++ (но очень этого хочет).
Сегодня этот язык - наиболее востребован в ИТ-проектах. Его также быстро догоняет Java. Зарплат у java-программистов меньше 1000 долл я вообще не знаю, а реально - платят от 1500, при том, что вакансии заполняются едва на 50% из-за острейшей нехватки програмистов. Впрочем, Си++ (да и Дельфи :) на коей, например, автоматизирован документооборот Госдумы РФ и создана печально известная ЕГАИС :-) - программистам платят немногим меньше :)
Java сильно схожа с Си++, поэтому переход с Си++ на Java, будет не очень сложен :)
Глобальная карта
Последний выпуск по ролевой игре - был в выпуске N 110.
Практически во всех популярных играх имеется возможность просмотра глобальной карты. Это упрощает перемещение между ключевыми пунктами, помогает быстрому переходу с уровня на уровень и т. д. Создание такой глобальной карты в текстовом режиме затруднено, так как по вертикали в стандартном режиме нам доступны лишь 24 строки, а даже наша относительно небольшая локальная карта-пещера требует 32 клеток. Поэтому упростим (в демонстрационных целях) данную функцию, условившись, что одна строка глобальной карты будет
хранить объекты сразу двух строк локальной карты.
Какие объекты нас интересуют? Это прежде всего местонахождение самого игрока и его партнеров, лестницы для перехода с уровня на уровень, магазины, предметы и монстры (те, которые находятся на открытой, видимой, исследованной части пещеры).
Назовем новую процедуру ShowGlobalMap, разместим ее в модуле LowLevel, а вызывать будем из главного модуля Main по нажатии клавиши m:
k := ReadKey; case k of
...
' m ' : ShowGlobalMap;
Внутри этой процедуры подготовим локальный массив gm размером 32 (в ширину) на 16 (по вертикали) элементов:
{ ----------------- } procedure ShowGlobalMap; var gm: array[1..32, 1..16] of Integer; begin
end;
Мы будем просматривать сразу две строки карты и отмечать присутствие на них нужных предметов. Пусть герой будет отмечаться значением 1, лестница - 21 вверх и 22 вниз, магазин оружия - 3, магазин магических предметов и еды - 4, монстры - 5, и источники здоровья - 6. Вероятно, имеет смысл отличать "текущего" героя от остальных "партийцев", поэтому, оставив значение1 за героем, который находится в данный момент в режиме управления, отведем значение 7 для других членов игровой партии.
Все остальное будет приниматься равным нулю, если тайл видим, или -1, если не видим.
{ ----------------- } procedure ShowGlobalMap; var gm: array[1..32, 1..16] of Integer;
x,y: Integer;
s: string; begin for x := 1 to 32 do for y := 1 to 32 do begin
gm[x,(y+1) div 2] := 0; if GameMap[CurMap].Cells[ LOCAL_MAP_WIDTH+x,
LOCAL_MAP_HEIGHT+y].IsVisible then begin
case
GameMap[CurMap].Cells[LOCAL_MAP_WIDTH+x,LOCAL_MAP_HEIGHT+
y].Tile of
tileStairsUp:
gm[x,(y+1) div 2] := 21;
tileStairsDown:
gm[x,(y+1) div 2] := 22;
tileWeaponShop:
gm[x,(y+1) div 2] := 3;
tileMagicShop:
gm[x,(y+1) div 2] := 4;
tileLive:
gm[x,(y+1) div 2] := 6;
end;
if IsMonsterOnTile( LOCAL_MAP_WIDTH+x, LOCAL_MAP_HEIGHT+y) >
0 then
gm[x,(y+1) div 2] := 5; end
else gm[x,(y+1) div 2] := -1; end;
for x := 1 to MaxHeroes do if Heroes[x].HP > 0 then if x = CurHero then gm[Heroes[x].x-LOCAL_MAP_WIDTH,
(Heroes[x].y-LOCAL_MAP_HEIGHT+1) div 2] := 1 else gm[Heroes[x].x-LOCAL_MAP_WIDTH,
(Heroes[x].y-LOCAL_MAP_HEIGHT+1) div 2] := 7;
ClrScr; for y := 1 to 16 do for x := 1 to 32 do begin
GoToXY(x,y); case gm[x,y] of
1: begin
TextColor(White);
Write( ' X ' ); end;
21: begin
TextColor(LightGray);
Write( ' < ' ); end;
22: begin
TextColor(LightGray);
Write( ' > ' ); end;
3: begin
TextColor(LightGreen);
Write( ' $ ' ); end;
4: begin
TextColor(LightCyan);
Write( ' $ ' ); end;
5: begin
TextColor(LightRed);
TextColor(LightRed);
Write( ' # ' ); end;
6: begin
TextColor(LightCyan);
Write( ' * ' ); end;
7: begin
TextColor(Yellow);
Write( ' X ' ); end; else begin if gm[x,y] = 0 then TextColor(LightGray) else TextColor(DarkGray);
Write( ' . ' ); end;
end; end;
ReadLn;
end;
Сначала, перебирая все клетки пещеры, выявляются тайлы лестниц, магазинов и источников, а также проверяется, имеется ли на ней монстр. Далее на глобальную карту явно заносятся координаты героев, после чего на основании значений массива gm рисуется схема карты разноцветными символами.
При этом возможны, конечно, накладки, когда два полезных и отмечаемых на карте элемента расположены на соседних по вертикали клетках, а показан будет лишь один из них. Читатель может самостоятельно улучшить данную процедуру.
Далее - программируем переходы между уровнями пещеры.
Исходный код текущей версии для Turbo Pascal (всегда проверен и работоспособен, главный файл - main.pas):
В книге рассмотрены новые возможности системы программирования Delphi 2006 и представлены нововведения в языке, оболочке, редакторе, компиляторе и отладчике. Объяснены новые технологии работы с базами данных и создания приложений для Интернета. Особое внимание уделено средствам и технологиям повышения эффективности работы программистов: рефакторингу, шаблонам проектирования, унифицированному языку UML и технологии моделирования ECO.
Издание рассчитано на программистов всех уровней подготовки. Начинающие разработчики познакомятся с удобными средствами быстрого создания программ, программисты средней квалификации изучат современные подходы к разработке сложных систем и новые средства визуального проектирования, а профессионалам будут интересны новые возможности технологий моделирования ECO III, UML 2.0 и паттернов проектирования.