Softwaretechnologie II WS 08/09 SpieleProgrammieren UlTris V07 Reihen vorbelegen, Spielfeld anzeigen...

Post on 05-Apr-2015

105 views 2 download

Transcript of Softwaretechnologie II WS 08/09 SpieleProgrammieren UlTris V07 Reihen vorbelegen, Spielfeld anzeigen...

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