|
|
|
|
Schleife die durch Eingabe unterbrochen wird |
species8472
Junior Member
Dabei seit: 23.05.2002
Beiträge: 172
Herkunft: Aus meiner Mutter
|
|
Schleife die durch Eingabe unterbrochen wird |
|
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 |
|
|
phlox81
Bote des Lichts und Moderator
Dabei seit: 19.10.2002
Beiträge: 3.028
Herkunft: Irgendwo im Nirgendwo
|
|
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 |
|
|
species8472
Junior Member
Dabei seit: 23.05.2002
Beiträge: 172
Herkunft: Aus meiner Mutter
Themenstarter
|
|
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 |
|
|
COCYHOK
Verunsicherungsmakler
Dabei seit: 04.10.2003
Beiträge: 1.079
Herkunft: CCCP
|
|
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:
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 |
|
|
|
|
|
|