softwaretechnologie ii ws 08/09 spieleprogrammieren ultris v07 reihen vorbelegen, spielfeld anzeigen...
TRANSCRIPT
Softwaretechnologie IIWS 08/09
SpieleProgrammieren UlTrisV07
Reihen vorbelegen, Spielfeld anzeigen und Punktestand ausrechnen
Sibylle C. Schellhorn, Medieninformatik
Ziel des Abschnitts V07:
ST-II, WS 08/09: Ulrich Kaisers Tetris=UlTris, V07 - Sibylle C. Schellhorn Vorbelegen von Spielreihen, Anzeige des Feldes, des Punktestandes 2
Durch Angeben der Anzahl von Reihen festlegen, wie viele Steine schon im Spielfeld vorbelegt sind.
Anschließend Punktestand errechnen und Spiel anzeigen
ST-II, WS 08/09: Ulrich Kaisers Tetris=UlTris, V07 - Sibylle C. Schellhorn Vorbelegen von Spielreihen, Anzeige des Feldes, des Punktestandes 3
ST-II, WS 08/09: Ulrich Kaisers Tetris=UlTris, V07 - Sibylle C. Schellhorn Vorbelegen von Spielreihen, Anzeige des Feldes, des Punktestandes 4
Sowie das Tastaturkürzel F1 für den Start eines neuen Spiels inizialisieren
Der Klasse Ultris neue Member hinzufügen, um statischen Elemente zu erfassen
class ultris{private:
int vorbelegung; // Anzahl der bei Spielbeginn vorzubelegenden Zeilenint vorschau; // Anzahl der Formen in der Vorschauint spielfeld[20][10]; // Das Spielfeld, 20 Zeilen z à 10 Steinen sint fuellstand[20]; // Der Fuellstand einer Reihe (= Anzahl Segmente in der Reihe)int punktestand; // Der aktuelle Punktestandvoid initialisieren();void vorbelegen();void display_spielfeld();void display_punktestand();
public:int spiel_laeuft; // Indikator, dass das Spiel laeuftultris() { srand( GetTickCount()); initialisieren(); vorbelegung = 0; vorschau = 1;}int get_vorbelegung() { return vorbelegung;}void set_vorbelegung( int v) {if( v < 0) v = 0; if( v > 20) v = 20; vorbelegung = v;}int get_vorschau() { return vorschau;}void set_vorschau( int v) {if( v < 0) v = 0; if(v > 5) v = 5; vorschau = v;}void start();void display();
};
ST-II, WS 08/09: Ulrich Kaisers Tetris=UlTris, V07 - Sibylle C. Schellhorn Vorbelegen von Spielreihen, Anzeige des Feldes, des Punktestandes 5
void ultris::initialisieren()
Ein leeres Spielfeld wird erzeugt, solange der Spieler keine eigene Auswahl trifft
ST-II, WS 08/09: Ulrich Kaisers Tetris=UlTris, V07 - Sibylle C. Schellhorn Vorbelegen von Spielreihen, Anzeige des Feldes, des Punktestandes 6
void ultris::initialisieren()void ultris::initialisieren()
{int z, s;
for( z = 0; z < 20; z++){fuellstand[z] = 0;for( s = 0; s < 10; s++)
spielfeld[z][s] = 0;}
spiel_laeuft = 0; // muß noch gestartet werdenpunktestand = 0;}
ST-II, WS 08/09: Ulrich Kaisers Tetris=UlTris, V07 - Sibylle C. Schellhorn Vorbelegen von Spielreihen, Anzeige des Feldes, des Punktestandes 7
void ultris::vorbelegen()void ultris::vorbelegen()
{int z, s, i;
for( i = 0; i < vorbelegung*5; i++){z = 19-rand()%vorbelegung;s = rand()%10;if( !spielfeld[z][s])
{spielfeld[z][s] = 1;fuellstand[z]++;}
}punktestand = vorbelegung * 2500;}
ST-II, WS 08/09: Ulrich Kaisers Tetris=UlTris, V07 - Sibylle C. Schellhorn Vorbelegen von Spielreihen, Anzeige des Feldes, des Punktestandes 8
void ultris::vorbelegen()Exkurs: Die Funkion rand()
void ultris::vorbelegen(){int z, s, i;
for( i = 0; i < vorbelegung*5; i++){z = 19-rand()%vorbelegung;s = rand()%10;if( !spielfeld[z][s])
{spielfeld[z][s] = 1;fuellstand[z]++;}
}punktestand = vorbelegung * 2500;}
ST-II, WS 08/09: Ulrich Kaisers Tetris=UlTris, V07 - Sibylle C. Schellhorn Vorbelegen von Spielreihen, Anzeige des Feldes, des Punktestandes 9
Mit der parameterlosen Funktionrand() , // für randomdie durch die stdio.h zur Verfügung gestellt wird,Erzeugt man Zufallszahlen
Eine Zufallszahl zw. a und b(inlcl. A und b) erzeugt man mit:a+ (rand() %(b-a+1))
void ultris::vorbelegen()den Spielstand hochzählen
void ultris::vorbelegen(){int z, s, i;
for( i = 0; i < vorbelegung*5; i++){z = 19-rand()%vorbelegung;s = rand()%10;if( !spielfeld[z][s])
{spielfeld[z][s] = 1;fuellstand[z]++;}
}punktestand = vorbelegung * 2500;}
ST-II, WS 08/09: Ulrich Kaisers Tetris=UlTris, V07 - Sibylle C. Schellhorn Vorbelegen von Spielreihen, Anzeige des Feldes, des Punktestandes 10
Der Spielstand wird nur hochgezählt,wenn ein Feld mit einem Stein belegtist. Sollte es durch die rand() zu einer„Doppelbelegung“ kommen, beeinflußt das den Zähler des Standesnicht.
void ultris::start()
void ultris::start(){ultris_sounds.play( sound_start);initialisieren();vorbelegen();spiel_laeuft = 1;}
ST-II, WS 08/09: Ulrich Kaisers Tetris=UlTris, V07 - Sibylle C. Schellhorn Vorbelegen von Spielreihen, Anzeige des Feldes, des Punktestandes 11
Sound wird gestartetDie bisher implementierten Vorgele-gungen werden durchgeführt
void ultris::display_spielfeld()void ultris::display_spielfeld()
{int z, s;
for( z = 0; z < 20; z++){for( s = 0; s < 10; s++)
{if( spielfeld[z][s])
ultris_display.feldstein( z, s);}
}}
// das angelegte Array wird zeilenweise durchlaufen// und für jedes belegte Feld// wird an der Stelle ein Stein angezeigt
ST-II, WS 08/09: Ulrich Kaisers Tetris=UlTris, V07 - Sibylle C. Schellhorn Vorbelegen von Spielreihen, Anzeige des Feldes, des Punktestandes 12
void ultris::display_punktestand()void ultris::display_punktestand()
{int i, z, p;
for( i = 5, p = punktestand; i >= 0; i--, p/= 10){z = p % 10;ultris_display.ziffer( i, z);}
}
// der Punktestand wird in einzelne Ziffern z zerlegt// und mit der Funktion ziffer aus der Klasse display// (ultris_display.ziffer, V02) ausgegeben.
ST-II, WS 08/09: Ulrich Kaisers Tetris=UlTris, V07 - Sibylle C. Schellhorn Vorbelegen von Spielreihen, Anzeige des Feldes, des Punktestandes 13
void ultris::display ()void ultris::display()
{ ultris_display.hintergrund();
display_spielfeld(); ultris_display.abdeckung();
display_punktestand();ultris_display.present();}
// die Methode wird erweitert
ST-II, WS 08/09: Ulrich Kaisers Tetris=UlTris, V07 - Sibylle C. Schellhorn Vorbelegen von Spielreihen, Anzeige des Feldes, des Punktestandes 14
Akkzelerator für F1=„Neues Spiel“
• In der Demo.rcID_ULTRIS_NEUESSPIELexistiert schon und bekommt den key / die Taste F1 zugewiesen
• Der Windowshandler in Demo.cpp wird um die Funktion mein_spiel.start() erweitert,
ST-II, WS 08/09: Ulrich Kaisers Tetris=UlTris, V07 - Sibylle C. Schellhorn Vorbelegen von Spielreihen, Anzeige des Feldes, des Punktestandes 15
LRESULT CALLBACK ultris_windowhandler( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
[…]case ID_ULTRIS_NEUESSPIEL:
mein_spiel.start();CheckMenuItem( ultris_menu, ID_ULTRIS_PAUSE,
MF_UNCHECKED);PostMessage( ultris_window, WM_PAINT, 0, 0);break;
schicken eine message an WM_PAINT und das Spielfeld wird neu gezeichnet:
case WM_PAINT:mein_spiel.display();break;
ST-II, WS 08/09: Ulrich Kaisers Tetris=UlTris, V07 - Sibylle C. Schellhorn Vorbelegen von Spielreihen, Anzeige des Feldes, des Punktestandes 16
Ende
Vielen Dank für Ihre Aufmerksamkeit
ST-II, WS 08/09: Ulrich Kaisers Tetris=UlTris, V07 - Sibylle C. Schellhorn Vorbelegen von Spielreihen, Anzeige des Feldes, des Punktestandes 17