Csoport neve: nullpointer

Feladat sorszáma: 6.

Feladat címe: Stratégiai játék








Objektumtervezés





Gyakorlatvezető::

RÉPÁSI TIBOR












Csoport tagok:


Bikki Balázs

FOJNI7

bikki@iit.uni-miskolc.hu

Bereczki Dániel

JJ92CZ

neuroster@gmail.com

Horváth Lajos

A2MT7H

l.horvath4@chello.hu

Kocsis Sándor

C144EG

rebel00@vipmail.hu

Majoros Zoltán

J1AHR8

majoros1@iit.uni-miskolc.hu


2006-05-12


Történet


Dátum

Verzió

Leírás

Szerző

2006.05.12.

1.0

Első verzió

Bikki Balázs










Tartalomjegyzék

Bevezetés

Adatstruktúrák, algoritmusok

Adatstruktúrák

Algoritmusok

A* algoritmus

A program futásának menete

Osztályok felsorolása

CSound osztály

CRenderable osztály

CGameUnit osztály

CMovingUnit osztály

CCombatUnit osztály

CBuilding osztály

CSpiceRefinery osztály

CTile osztály

CFremenFactory osztály

CHarkonnenFactory osztály

CCommunication osztály

CReservoir osztály

CWindTrap osztály

CBarrack osztály

COrangery osztály

CTower osztály

CSayyadina osztály

CTransporter osztály

CPeasant osztály

CFeydakin osztály

CSardaukar osztály

CWorm osztály

CGameField osztály

CPlayer osztály

CAIPlayer osztály

CHumanPlayer osztály

CGraphics

CRenderable

CFilePanel

CMainMenu

CGameMenu

CControlPanel

CResources

CInput osztály


Bevezetés



A termék valós idejű stratégiai játék a következő fikcióból kiindulva: Létezik egy bolygó, amely felszínét 85%-ban homoksivatag borítja. A maradék felület zömében sziklás és szinte elhanyagolható mértékben itt-ott növényzetet is tartalmaz. Valaha a felszínét dús esőerdő borította. Mára esőzés nincs, a bolygó vízháztartása a felszín alatt zajlik. Ott barlangokban tárolódik a víz. A bolygó őslakossága elhatározza, hogy újból virágzóvá teszi a Dűnét. De számolniuk kell a homokviharokkal és egy a sivatagi környezethez alkalmazkodott élőlény fajjal, a Homokférgekkel…

A fantáziabirodalom középpontjában az Arrakis bolygó és a csak itt található Fűszer áll. A bolygón azonban gyakorlatilag a Fűszer az egyetlen hasznosítható anyag, mivel a planéta felszínét hatalmas sivatagok borítják, ahol nagyon nehéz életben maradni. Maga a Fűszer az univerzum legcsodálatosabb anyaga: ami meghosszabbítja a tulajdonosa életét és nagyobb erők parancsolójává teszi őt, kitágítja az öntudatot, s ez teszi lehetővé, hogy a navigátorok (akiket még soha senki sem látott) meghajlítva a teret, csillagközi utazásokra vigyék a hatalmas űrhajókat. A bolygó fő terméke és kiviteli cikke (bolygóközi kereskedelem) a fűszer, másnéven melanzs, amit a homokférgek termelnek (fremen elnevezéssel mester, vagy Shai-hulud), a homokférgek számára viszont a víz és a nedves környezet mérgező.A történelem során számtalan csatát vívtak már ezért a varázslatos anyagért, és a bolygóért, de a Dűne évszázadokon át a Harkonnen Ház fennhatósága alatt maradt.

Frank Herbert eredeti regényétől eltérően a játék világa zárt világot alkot, az események menetébe nem szólnak bele a Padisah császár és a két ház, az Atreides és a Harkonnen közti háborúságok. A játékban nem szerepel továbbá a fremen nép összetett vallás- és hiedelemrendszere, a Bene Gesserit és egyéb iskolák hatása sincsen jelen.

A felhasználó feladata hogy megfelelően kialakított stratégiája szerint vezetve az őslakos fremeneket, lakhatóbb hellyé tegye az Arrakis bolygót anélkül hogy felborítaná a bolygó megváltozott ökoszisztémáját, ami a homokférgek teljes populációjának kipusztulásához és ezen keresztül a Fűszerhiányhoz vezet.
A játék során a déli palmáriumokból kiindulva fokozatosan növényeket kell telepíteni a Dűnén uralkodó hivatalos hatalom tudta nélkül, miközben folyamatosan termelni kell a fűszert, új fremen településeket, úgynevezett sziecseket alapítani, felszerelni. Mindezek közben a Harkonnenek folyamatos őrjárataival is számolni kell, és vissza kell verni a büntető vagy "hódító" támadásaikat is a Harkonnen-katonáknak és a velük szövetséges császári elitalakulatoknak, a Sardaukaroknak.

A tradicionális stratégiai alapokra épülő játék a jól ismert Dűne sci-fi világát dolgozza fel, néhol attól eltérve. A hatalmat úgy lehet megszerezni, hogy a lehető legnagyobb területeket kell meghódítani a Dűnén, a végső cél pedig a Fűszer feletti teljes kontroll megszerzése, hiszen "aki a Fűszert uralja, uralja az Univerzumot is!"



Adatstruktúrák, algoritmusok

Adatstruktúrák



A programban használt adattípusok a C++ és az SDL által biztosított alaptípusok. Ezenkívül a többértékű típusok esetén a konkrét használattól függően vagy tömböt, vagy láncolt listát alkalmazunk. Ahol előre ismert az elemek száma ott tömböt, ahol nem ismert az elemek száma, vagy gyakran változhat, ott láncolt listát alkalmazunk.



Algoritmusok

A* algoritmus



A programban egyetlen nemtriviális algoritmust használunk a mozgó egységek útkeresésére. Az A* algoritmus heurisztikus keresőalgoritmus.

Keresés során az egyes útvonalakat egy prioritási sorban tárolja. Egy útvonal prioritását az f(x)=g(x)+h(x) függvény határozza meg.

g(x) az eddig megtett út költsége, h(x) pedig a célig még hátralévő út heurisztikus becslése. Esetünkben a heurisztikus függvény a cél és az adott pozíció légvonalban mért távolsága.



Az algoritmus vázlata:

function A*(start,goal)

var closed := the empty set

var q := make_queue(path(start))

while q is not empty

var p := remove_first(q)

var x := the last node of p

if x in closed

continue

if x = goal

return p

add x to closed

foreach y in successors(p)

if y not in closed

enqueue(q, extend_path(p,y))

return failure




A program futásának menete



A program végrehajtása a programozó szempontjából szekvenciális tehát eljárások soros meghívásásával történik. Valójában a futás közben több szál is létezik (eseménykezelő, hangkezelő) , de mivel ezeket az SDL rendszer implicit módon hozza létre, ezért ugyan jó ha a programozó tud létezésükről, de a programozás során szálkezeléssel nem kell foglalkoznia.




Magyarázat



Inicializáció: memóriafoglalás, szükséges fájlok betöltése (játékállás, hangfájlok, bitmapek)

User Input: lekérdezés után annak eldöntése, hogy mely objektumra vonatkozik az esemény

Időzítés: a program adott képernyőfrissítési frekvenciával fut. Itt történik a várakozás, majd a pontos idő lekérdezése, mivel ez szükséges a játékobjektumok időzítéséhez.

Logika végrehajtása: minden egyes játékobjektum doLogic() függvénye meghívódik, melynek során az objektum viselkedésének megfelelő tevékenység végrehajtása történik.

Renderelés: a grafikus alrendszer meghívja a képernyőn jelenlévő, ezért megjelenítendő objektumok Draw() metódusát



Osztályok felsorolása



CSound osztály



Név

Típus

Leírás

music

*Mix_Music

az éppen játszott zenét tárolja

AChunk

*Mix_Chunk[]

hangeffektek tömbje






Név

Argumentumok

Működése, feladata

Csound

()

Konstruktor, betölti az összes effektet, meghívja a zeneválasztó metódust. Csatornákat hoz létre.

PlayChunk


(int)

Lejátszik egy effektet.

PlayMusic

(int)

Lejátszik egy zenét.

RandMusic

()

Callback metódus, automatikusan választ egy zenét.



CRenderable osztály



Név

Típus

Leírás

m_Position

SDL_Rect

Az objektumot pozíciója a játéktéren

          Név

Argumentumok

Visszatérési érték

Működése, feladata

Draw






CGameUnit osztály



Név

Típus

Leírás

Cost

integer

Az objektum elkészítésének költsége fűszer egységben

Type

integer

Az objektum típusa

Time

integer

a játék indítása óta eltelt idő másodpercben

Sound

CSound

a hangosztály interfésze

VoiceIndex

integer

az egység hangmintájának indexe

See

CGameUnit[]

Az objektum által látott más objektumok

IsShot

boolean

Jelzi, hogy az adott körben lőttek az objektumra

Owner

Cplayer

Tulajdonosra mutató pointer

Health

integer

Életerő

MaxHealth

integer

maximális életerő

Tile

CTile

tartózkodás helye

TextureIndex

integer

Az objektumra jellemző textúra

Graphic

CGraphic

a grafikus osztály interfésze



Név

Argumentumok

Működése, feladata

Visszatérési érték

Draw

()

Ezt meghívva a grafikus alrendszerrel együttműködve kirajzolja az objektumot


DoLogic

()

Irányítja az objektum viselkedését


Save

(stream)

Elmenti az objektumot a megadott streambe


modifyHealth

(integer)

életerő módosítása


SetTime

(integer)

a játék kezdete óta eltelt idő beállítása


WhereAreYou

()

az objektum helye

CTile



CMovingUnit osztály



Név

Típus

Leírás

Path

Ctile[]

Az egység által követendő útirány

Direction

Integer

A mozgás aktuális iránya

From

SDL_Rect

mozgás kezdőpozíciója

To

SDL_Rect

mozgás célpozíciója

Speed

integer

sebesség



Név

Argumentumok

Visszatérési érték

Működése, feladata





CountPos

()

SDL_Rect

aktuális pozíció számítása

go

(CTile)

SDL_Rect

lefoglalja a cél CTile-t

leave

(CTile)


felszabadítja az elhagyott CTile-t



CCombatUnit osztály



Név

Típus

Leírás

ShootNow

CGameUnit

támadott játékobjektum

FirePower

integer

tűzerő

Guard

boolean

őrségben áll: ekkor nem mozdul el

RateOfFire

integer

tüzelési gyakoriság

Név

Argumentumok

Visszatérési érték

Működése, feladata

Shoot

(CGameUnit)


megadott objektum támadása



CBuilding osztály



Név

Típus

Leírás






Név

Argumentumok

Visszatérési érték

Működése, feladata

Destroy

()


Megsemmisítés

Repair

()


Javítás

Sell

()


Épület eladása







CSpiceRefinery osztály



Név

Típus

Leírás

Collector

CSpiceCollector

a hozzá tartozó fűszeres

Transporter

CTransporter

a hozzá tartozó transzporter

Silo

CSpiceSilo

a hozzá tartozó siló






Név

Argumentumok

Visszatérési érték

Működése, feladata

doLogic

()


működés biztosítása







CTile osztály



Név

Típus

Leírás

Unit

CGameUnit

A rajta tartózkodó objektum

Position

SDL_Rect

Helyzet, kiterjedés

Type

integer

Típus






Név

Argumentumok

Visszatérési érték

Működése, feladata

Reserve

()

boolean

CTile lefoglalása

Release

()

void

CTile felszabadítása

growGreen

(int)

void

növényzet elhelyezése

CFremenFactory osztály



Név

Típus

Leírás

WormDrivingTool

integer

rendelkezésre álló készlet

Need

integer

gyártandó mennyiség









Név

Argumentumok

Visszatérési érték

Működése, feladata

CreateTool

()

boolean

egy eszköz termelése

doLogic

()


működés biztosítása



CHarkonnenFactory osztály



Név

Típus

Leírás









Név

Argumentumok

Visszatérési érték

Működése, feladata

doLogic

()







CCommunication osztály



Név

Típus

Leírás

count

integer




Név

Argumentumok

Visszatérési érték

Működése, feladata

EnableMinimap

()


minimap engedélyezése

DisableMinimap

()


minimap tiltása

CReservoir osztály



Név

Típus

Leírás

WaterLevel

int

vízszint



Név

Argumentumok

Visszatérési érték

Működése, feladata

fill

(integer)


feltöltés

use

(integer)

boolean

használat

CWindTrap osztály



Név

Típus

Leírás

Store

CReservoir

itt tárolja a gyűjtött vizet



Név

Argumentumok

Visszatérési érték

Működése, feladata

doLogic

()


működés biztosítása

AddWater

(integer)


víztározó töltés

CBarrack osztály



Név

Típus

Leírás

Need

integer

igényelt egységek száma



Név

Argumentumok

Visszatérési érték

Működése, feladata

doLogic

()

void

működés biztosítása

Create

()

boolean

egység készítése

COrangery osztály



Név

Típus

Leírás

Need

integer

igényelt egységek száma

Stock

integer

rendelkezésre álló egységek száma



Név

Argumentumok

Visszatérési érték

Működése, feladata

doLogic

()

void

működés biztosítása

CreatePlant

()

boolean

növény készítése

PlacePlant

(Ctile)

boolean

növény kihelyezése

CreatePeasant

()

void

földművelő készítése

CTower osztály



Név

Típus

Leírás






Név

Argumentumok

Visszatérési érték

Működése, feladata

doLogic

()

void

működés biztosítása





CSayyadina osztály



Név

Típus

Leírás

rate

integer

gyógyítás ismétlési sebessége

power

integer

gyógyítás során átadott életerő



Név

Argumentumok

Visszatérési érték

Működése, feladata

doLogic

()

void

működés biztosítása

Heal

(CGameUnit)

boolean

gyógyítás

CTransporter osztály



Név

Típus

Leírás

Collector

CSpiceCollector

a hozzá tartozó fűszeres

Refinery

CSpiceRefinery

a hozzá tartozó feldolgozó



Név

Argumentumok

Visszatérési érték

Működése, feladata

doLogic

()

void

működés biztosítása

getCollector

()

void

fűszeres felvétele

releaseCollector

()

void

fűszeres eleresztése



CPeasant osztály



Név

Típus

Leírás

ToKeep

CTile[]

karbantartandó növények



Név

Argumentumok

Visszatérési érték

Működése, feladata

doLogic

()

void

működés biztosítása

Keep

(CTile)

void

növény gondozása



CFeydakin osztály



Név

Típus

Leírás

CanDriveWorm

boolean

féreghajtó



Név

Argumentumok

Visszatérési érték

Működése, feladata

doLogic

()

void

működés biztosítása

driveWorm

()

boolean

féreghajtás



CSardaukar osztály



Név

Típus

Leírás






Név

Argumentumok

Visszatérési érték

Működése, feladata

doLogic

()

void

működés biztosítása





CWorm osztály



Név

Típus

Leírás

Driver

CFeydakin

vezető



Név

Argumentumok

Visszatérési érték

Működése, feladata

doLogic

()

void

működés biztosítása







CGameField osztály



Név

Típus

Leírás

Tiles

CTile[]

A játékteret alkotó négyzetek



Név

Argumentumok

Visszatérési érték

Működése, feladata

getPath

(CTile)

CTile[]

útkeresés a megadott CTile-ig

getNearestUnit

(integer)

CTile

megadott típusú legközelebbi egység helyét keresi



CPlayer osztály



Név

Típus

Leírás

Units

CGameUnit[]

a játékos objektumai

Spice

int

rendelkezésre álló vízmennyiség

Water

int

rendelkezésre álló fűszer mennyisége

WhatCanBeBuilt

int

az aktuális játékban építhető egységek

WhatIsBuilt

int

már felépített egységek



Név

Argumentumok

Visszatérési érték

Működése, feladata

doLogic

()

void

működés biztosítása

Build

(CGameUnit)

boolean

építés engedélyezése

CAIPlayer osztály



Név

Típus

Leírás






Név

Argumentumok

Visszatérési érték

Működése, feladata

doLogic

()

void

működés biztosítása







CHumanPlayer osztály

Név

Típus

Leírás

SelectedUnit

CGameUnit

a kiválasztott egység



Név

Argumentumok

Visszatérési érték

Működése, feladata

doLogic

()

void

működés biztosítása

Event

()

void

esemény fogadása


CGraphics



Név

Típus

Leírás

Width

Numerikus

A képernyő-felbontás vízszintes mérete

Height

Numerikus

A képernyő-felbontás függőleges mérete

Bpp

Numerikus

A használt videómód színmélysége






operációk

Név

Argumentumok

Működése, feladata

Init

Nincs

Inicializálja a grafikus alrendszert, betöltö a megfelelő grafikus adatokat

Render

Nincs

Frame-enként meghívandó, az aktuális képernyőtartalom kirajzolásáért felelős metódus.






CRenderable


Név

Típus

Leírás

x

Numerikus

Az objektum bal felső sarkának x koordinátája

y

Numerikus

Az objektum bal felső sarkának y koordinátája

Width

Numerikus

Az objektum szélessége pixelben

Height

Numerikus

Az objektm magassága pixelben



operációk

Név

Argumentumok

Működése, feladata

Draw

Célterület

A célterületként megadott surface-re kirajzolja az objektumot






CFilePanel


Név

Típus

Leírás

FileList

CList

Az aktuális jegyzékben található fájlok listája

Slider

CSlider

A fájllista scroll-ozására sziolgáló elem

OK

CButton

A kiválasztott fájlon a művelet végrehajtása

Cancel

CButton

A panel bezárása

FileName

CTextBox

A fájl nevét tartalmazó mező



operációk

Név

Argumentumok

Működése, feladata

Load

FileName

Betölti az adott nevű játékállást

Save

FileName

Kimenti a megadott fájlnévvel az aktuális játékállást

Close

Void

A panel bezárása



CMainMenu


Név

Típus

Leírás

BStart

CButton

Új játék kezdése

BLoad

CButton

Játékállás betöltése

BQuit

CButton

Kilépés a játékból



operációk

Név

Argumentumok

Működése, feladata

Start

Void

Új játék indítása

Load

Void

A töltés fájlpanel meghívása

Quit

Void

Kilépés a játékból



CGameMenu


Név

Típus

Leírás

BSave

CButton

Játékállás kimentése

BLoad

CButton

Játékállás betöltése

BQuit

CButton

Kilépés a játékból



operációk

Név

Argumentumok

Működése, feladata

Save

Void

A mentés fájlpanel meghívása

Load

Void

A töltés fájlpanel meghívása

Quit

Void

Kilépés a játékból



CControlPanel


Név

Típus

Leírás

Controlelemek

Láncolt lista

A panelon szereplő menüpontok láncolt listája






operációk

Név

Argumentumok

Működése, feladata






CResources


Név

Típus

Leírás

Controlelemek

Láncolt lista

A panelon szereplő menüpontok láncolt listája




CInput osztály



Név

Típus

Leírás

Event

SDL_Event

az SDL event alrendszer adatstruktúrája



Név

Argumentumok

Visszatérési érték

Működése, feladata

getMessage

()

Event

esemény lekérdezése







SourceForge.net Logo