BlackBoard » Design, Programmierung & Entwicklung » Programmieren » C - Frage Schleife die durch Eingabe unterbrochen wird » Hallo Gast [Anmelden|Registrieren]
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen
Neues Thema erstellen Antwort erstellen
Zum Ende der Seite springen Schleife die durch Eingabe unterbrochen wird
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
species8472 species8472 ist männlich
Junior Member


images/avatars/avatar-132.gif

Dabei seit: 23.05.2002
Beiträge: 172
Herkunft: Aus meiner Mutter

Schleife die durch Eingabe unterbrochen wird       Zum Anfang der Seite springen

Also, ich will eine schleife in C(DOS-Programm) schreiben, welche durch eine benutzereingabe unterbrochen wird.

Sie soll folgendes bewirken, ich habe ein * als spielfigur, welches sich auf druck einer cursortaste fortbewegt, und zwar so lange, bis ich eine andere cursortaste drücke um die richtung zu ändern (und die für die entsprechende richtung zuständige schleife dadurch zu aktivieren), das gesammte "game" soll durch drücken der ESCape taste beendbar bleiben.


hier der Quellcode, wie er bisher besteht (ist leider noch nicht viel):

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
242:
243:
244:
245:
246:
247:
248:
249:
250:
251:
252:
253:
254:
255:
256:
257:
258:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#include <dos.h>


/*Prototypen*/

void events (void);
void spielfeld (int);
void e_spielfeld (int);


/* funtion events

INPUT: none
out: none
in/out: none
return: none

Zweck: einzeichnen von Ereignissen im Spiel (z.B.: Kreuze/smileys) */

void events() {
	char inhalt[2];
	int posx,posy;
	int i;

	randomize();

	for(i=1; i<=10; i++) {
		do {
			posx = random (78)+2;
			/*Erinnerung: fÂr Schulpc auf 22 umsetzen(untem)*/
			posy = random (22)+2;
			gettext(posx,posy,posx,posy,&inhalt);
		}
		while (inhalt[0] != ' ');
		gotoxy (posx,posy);
		printf("");
	}

		for(i=1; i<=10; i++) {
		do {
			posx = random (78)+2;
			/*Erinnerung: fÂr Schulpc auf 22 umsetzen(untem)*/
			posy = random (22)+2;
			gettext(posx,posy,posx,posy,&inhalt);
		}
		while (inhalt[0] != ' ');
		gotoxy (posx,posy);
		printf("Å");
	}
	/*Erinnerung: weitere Events einfÂgen*/

}


/**********************************************************************

funktion: spielfeld
in: lvl
out:none
in/out:none
return:none
description: Anzeige der W„nde (von lvl abh„ngig)
************************************************************************/

void spielfeld(int lvl){

	switch (lvl) {
	case 1 : gotoxy (1,10);
		printf("                 ²                       ²\n");
		printf("                 ²²²²²²²²²²²²²²²²²²²²²²²²²\n");
		printf("                 ²                       ²\n");
		break;

	case 2 : gotoxy(1,2);
		printf("                 ²                        \n");
		printf("                                         ²\n");
		printf("                 ²                        \n");
		printf("                                         ²\n");
		printf("                 ²                        \n");
		printf("                                         ²\n");
		printf("                 ²                        \n");
		printf("                                         ²\n");
		printf("                 ²                        \n");
		printf("                                         ²\n");
		printf("                 ²                        \n");
		printf("                                         ²\n");
		printf("                 ²                        \n");
		printf("                                         ²\n");
		printf("                 ²                        \n");
		printf("                                         ²\n");
		printf("                 ²                        \n");
		printf("                                         ²\n");
		printf("                 ²                        \n");
		printf("                                         ²\n");
		printf("                 ²                        \n");
		printf("                                         ²\n");
		printf("                 ²                        \n");
		break;
	case 3: gotoxy(1,10);
		printf("       ²²²²²²²²²²²²²²²²²²²²²²²                  ²²²²²²²²²²²²²²²²²²²²\n");
		printf("       ²                                                           ²\n");
		printf("       ²                                                           ²\n");
		printf("       ²                                                           ²\n");
		printf("       ²                                                           ²\n");
		printf("       ²						           ²\n");
		printf("       ²  		                                           ²\n");
		printf("       ²                                                           ²\n");
		printf("       ²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²\n");
		break;
			/*Erinnerung: weitere lvl einfÂgen*/
	}
}

/********************************************************
funktion: e_spielfeld
in:none
out:none
in/out:none
return:none
description: zeichnen von hintergrundfeld, W„nden, Events
********************************************************/

void e_spielfeld(int lvl){
	textbackground(BLACK);
	window(1,1,80,25);
	clrscr();

	textbackground(BLUE);
	textcolor(WHITE);
	//blauer Hintergrund
	window(2,2,79,24);
	clrscr();

	//wieder kompletter Screen
	window (1,1,80,25);
	textbackground(BLACK);

	//platzhalter an Startposi

	gotoxy(2,2);
	printf("...\n");
	printf("...\n");
	printf("...\n");

	spielfeld(lvl);
	events();

	//platzhalter wieder l”schen
	gotoxy(2,2);
	printf("   \n");
	printf("   \n");
	printf("   \n");
}

/********************************************
funktion:main
in:none
out:none
in/out:none
return:none
description: Spielstart,
	     Steuerung der "Figur"(Tastaturabfrage),
	     Reaktion auf Events,
	     Punktestandanzeige
********************************************/

void main(){
	char wahl; //gedrÂckte taste
	char inhalt[2];
	int posx,posy;//akt. posi
	int alt_posx,alt_posy;//alte posi
	int score = 0; //akt. Punktestand
	int pieps;
	int lvl;
	int sstein;
	
	//Startlevel
	lvl=0;

     	sstein=0;
	do {
	   //FÂr lvl-change
	   if(sstein>0){   //falls noch ssteine da sein sollten
		alt_posx=posx;
		alt_posy=posy;
		pieps=20;
		wahl=getch();

		switch(wahl){
		 case 0 : wahl=getch(); //tastendruck einlesen
		   switch(wahl){
			case 77 : if (posx <79)
				posx++; /*cursor rechts*/
				break;
			case 75 : if(posx>2)
				posx--;//cursor links
				break;
			case 80 : if(posy<24)
				posy++; //cursor untem
				break;
			case 72 : if(posy>2)
				posy--; //cursor oben
				break;
		   }
		break;
		}
		gettext(posx,posy,posx,posy, &inhalt); //spielfeldinhalt auslesen

		switch(inhalt[0]){
			case '²': posx=alt_posx;
				posy=alt_posy;
				score-=5;
				break;
			case '': pieps = 3000;
				 score+=10;
				 sstein-=1;
				 break;
			case 'Å': pieps=500;
				 score-=20;
				 break;
		}

		gotoxy (alt_posx,alt_posy);
		printf(" "); //alte "Figur" l”schen
		gotoxy(posx,posy);
		printf("*"); //neue "Figur zeichnen
		sound(pieps);
		delay(40);
		nosound();
		gotoxy(2,1);
		printf("Punkte: %4i",score);

	   }

	   else {   //falls alle steine abger„umt wurden (Level beendet/n„chstes lvl)
		lvl+=1;  //muss 1 sein
	      	e_spielfeld(lvl);
		sstein=10;
		//Startposition
		posx=2;
		posy=2;
		gotoxy(posx,posy);
		printf("*");
		gotoxy(2,1);
		printf("Punkte: %4i",score);
	   }

	}
	while (wahl!=27); //Spiel mit ESC-Taste beenden

}



Ich hoffe jemand kann mir helfen

Nich über die seltsamen Zeichen wundern, der Quelltext is in Dos geschrieben udn in Win kopiert worden

P.S.: Ich hoffe ich hab genug comments reingeschrieben

__________________

Amantium irae amoris integratio est

30.12.2003 21:26 species8472 ist offline E-Mail an species8472 senden Beiträge von species8472 suchen
phlox81 phlox81 ist männlich
Bote des Lichts und Moderator


images/avatars/avatar-2264.jpg

Dabei seit: 19.10.2002
Beiträge: 3.028
Herkunft: Irgendwo im Nirgendwo

      Zum Anfang der Seite springen

Was ist dein Problem, ich werde mir nicht 250(!!) Zeilen C-Code durchlesen,
um dir zu sagen das in Zeile XYZ ein fehler ist. Wenn du zu deinem Code eine
Frage hast, dann poste bitte nur den Ausschnitt den es Betrifft...

Falls es nur um eine abbruchbedingung für ne schleife geht:
while(c != 'escape_code')
{
tu was...
eingabe(c);
}

Devil

__________________
Intelligenz ist eine Illusion des Menschen

phlox81.de | codenode.de
30.12.2003 21:33 phlox81 ist offline E-Mail an phlox81 senden Homepage von phlox81 Beiträge von phlox81 suchen
species8472 species8472 ist männlich
Junior Member


images/avatars/avatar-132.gif

Dabei seit: 23.05.2002
Beiträge: 172
Herkunft: Aus meiner Mutter

Themenstarter Thema begonnen von species8472
      Zum Anfang der Seite springen

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
switch(wahl){
		 case 0 : wahl=getch(); //tastendruck einlesen
		   switch(wahl){
			case 77 : if (posx <79)
				posx++; /*cursor rechts*/
				break;
			case 75 : if(posx>2)
				posx--;//cursor links
				break;
			case 80 : if(posy<24)
				posy++; //cursor untem
				break;
			case 72 : if(posy>2)
				posy--; //cursor oben
				break;
		   }
		break;


um diesen teil des codes geht es, ein wert wird von der tastatur eingelesen und verarbeitet.


anschliessend wird das bisherige zeichen an der neuen position ausgewertet:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
gettext(posx,posy,posx,posy, &inhalt); //spielfeldinhalt auslesen

		switch(inhalt[0]){
			case '²': posx=alt_posx;
				posy=alt_posy;
				score-=5;
				break;
			case '': pieps = 3000;
				 score+=10;
				 sstein-=1;
				 break;
			case 'Å': pieps=500;
				 score-=20;
				 break;
		}


und letztendlich zeichnet löscht er das alte zeichen und macht ein neues an die alte position:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
gotoxy (alt_posx,alt_posy);
		printf(" "); //alte "Figur" l”schen
		gotoxy(posx,posy);
		printf("*"); //neue "Figur zeichnen
		sound(pieps);
		delay(40);
		nosound();
		gotoxy(2,1);
		printf("Punkte: %4i",score);



mein prob ist, dass er das das sternchen (spielfigur) sich solange entsprechend der letzten eingabe fortbewegen soll, bis ich eine neue gültige eingabe gemacht habe.


bei meinen bisherigen versuchen ist mir immer einfach nur die tastatur blockiert worden, deshalb meine frage, von und bis wo ich die schleife setzen müsste

__________________

Amantium irae amoris integratio est

30.12.2003 21:49 species8472 ist offline E-Mail an species8472 senden Beiträge von species8472 suchen
COCYHOK COCYHOK ist männlich
Verunsicherungsmakler


images/avatars/avatar-2037.png

Dabei seit: 04.10.2003
Beiträge: 1.079
Herkunft: CCCP

      Zum Anfang der Seite springen

Um das Problem zu lösen, musst du dir über die Funktionsweise der Methoden, die du benutzt, im Klaren sein.
Zu erst solltest du dir den Tastaturpuffer so vorstellen:
| | | | | | | | |
Dies ist ein Beispiel-Tastaturpuffer, in den 8 Zeichen reinpassen (nur als Beispiel. Nach dem Systemstart sieht der Puffer so aus. Wenn du jetzt ein Zeichen über die Tastatur eingibst, füllt sich der Puffer und der Pufferzeiger wird hochgesetzt. Wenn du einen Stern tippst, würde der Puffer jetzt so aussehen:
|*| | | | | | | |
Der Puffer-Zeiger würde auf das zweite Element des Puffers zeigen - also auf das erste leere Element.
Gibst du als nächstes ein Q ein, hat der Zeiger den Wert 2 (er zeigt auf das 3. Element) und der Puffer selbst sieht so aus:
|*|Q| | | | | | |
Was die Methode getch() macht, ist Folgendes:
Sie liest das erste Zeichen des Puffers aus (*), verschiebt alle Elemente nach links und erniedrigt den Zeiger. Nachdem die Methode das Zeichen * zurückgegeben hat, sieht der Puffer so aus:
|Q| | | | | | | |
Die Methode kbhit() macht etwas Ähnliches: Sie überprüft den Puffer-Zeiger. Wenn der Puffer-Zeiger 0 ist (wenn also das erste leere Element gleichzeitig das erste Element im Puffer ist), liefert sie 0 - also einen falschen Wert zurück. Wenn der Zeiger!=0 ist, liefert sie einen wahren Wert zurück (1). Weder der Puffer, noch der Zeiger wird durch die Methode verändert.
Wenn du eine Tastatur-Eingabe nach der Abfrage nicht verlieren willst, musst du sie in einer Variablen speichern:
code:
1:
chr=getch();

Da die Funktion getch() auf eine Tastatureingabe wartet, wenn sie feststellt, dass der Puffer-Zeiger==0 ist, schreibst du das besser so:
code:
1:
if(kbhit()) chr=getch();

Wenn du das in eine Schleife einbaust, liegt jederzeit ein brauchbarer Wert für chr vor:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
chr=0;
do
{
 //Dein Code, der abhängig von der Variablen chr die Figur bewegt
 if(kbhit()) chr=getch();
}
while(chr!=27) //Schleife beenden, wenn ESC gedrückt wurde


Natürlich musst du die Eingabe bei nicht erlaubten Tasten ablehnen.

__________________
Es ist eine Frage, ob wir nicht, wenn wir einen Mörder rädern, grade in den Fehler des Kindes verfallen, das den Stuhl schlägt, an dem es sich stößt.
Georg Christoph Lichtenberg, 18. Jahrhundert
31.12.2003 15:52 COCYHOK ist offline E-Mail an COCYHOK senden Homepage von COCYHOK Beiträge von COCYHOK suchen
species8472 species8472 ist männlich
Junior Member


images/avatars/avatar-132.gif

Dabei seit: 23.05.2002
Beiträge: 172
Herkunft: Aus meiner Mutter

Themenstarter Thema begonnen von species8472
      Zum Anfang der Seite springen

Vielen Dank für die Hilfe und die ausführliche Erklärung, hat mir echt weitergeholfen.

__________________

Amantium irae amoris integratio est

01.01.2004 14:09 species8472 ist offline E-Mail an species8472 senden Beiträge von species8472 suchen
Baumstruktur | Brettstruktur
Gehe zu:
Neues Thema erstellen Antwort erstellen
BlackBoard » Design, Programmierung & Entwicklung » Programmieren » C - Frage Schleife die durch Eingabe unterbrochen wird

Forensoftware: Burning Board 2.3.6, entwickelt von WoltLab GmbH