Spiel "SpaceBolt" (in Konsolenfenster) - Fehler



  • Hi,
    ich programmiere seit ein paar Tagen, an einem Spiel, welches ein simples Raumschiff - Abschießspiel sein soll.
    Ich habe schon folgendes gemacht:

    Main Funktion:

    //-----------------------------------------------------------------------------
    //Funktionen
    //-----------------------------------------------------------------------------
    
    void GameRahmen();
    void level1();
    void steuer(int);
    void posfestlegung(int);
    void curserausg();
    void curserausgHelp(int);
    int possuche();
    void schussabgabe();
    void schussWeiter();
    void schussAusgabe();
    
    //-----------------------------------------------------------------------------
    //globale Variablen
    //-----------------------------------------------------------------------------
    
    int posi[14]={0,0,0,0,0,0,1,0,0,0,0,0,0,0};
    int schuss[13][15]={0};
    
    //-----------------------------------------------------------------------------
    //Main - Funktion
    //-----------------------------------------------------------------------------
    
    int main()
    {
    	unsigned char taste;
    	setcursor(CURSOR_OFF);
    	system("color F0");
    	curserausg();
    	while(1)
    	{
    		GameRahmen();
    		schussAusgabe();
    		schussWeiter();
    		if(kbhit())
    		{
    			taste=_getch();
    			if(taste == 224)
    			{
    				taste=_getch();
    				if(taste== 75)
    				{
    					steuer(0);
    					curserausg();
    				}
    				else if(taste==77)
    				{
    					steuer(1);
    					curserausg();
    				}
    			}
    			if(taste==32)
    			{
    				schussabgabe();
    			}
    			if(taste=='x')
    				return 0;
    		}
    		_sleep(500);
    	}
    }
    

    Die nächste Funktion erzeugt einen Spielrahmen (funktioniert auch einwandfrei):

    void GameRahmen()
    {
    	int i; //indexvariable
    
    	gotoxy(10,5);
    	printf("\311");
    	for(i=11;i<71;i++)
    	{
    		gotoxy(i,5);
    		printf("\315");
    	}
    	gotoxy(71,5);
    	printf("\273");
    	for(i=6;i<24;i++)
    	{
    		gotoxy(71,i);
    		printf("\272");
    	}
    	gotoxy(71,24);
    	printf("\274");
    	for(i=11;i<71;i++)
    	{
    		gotoxy(i,24);
    		printf("\315");
    	}
    	gotoxy(10,24);
    	printf("\310");
    	for(i=6;i<24;i++)
    	{
    		gotoxy(10,i);
    		printf("\272");
    	}
    	//gotoxy(1,26);
    }
    

    Dann haben wir noch die Steuerung des "Raumschiffes", welche auch einwandfrei Funktioniert:

    void steuer(int richtung)
    {
    	int i;
    	int poscurser;
    
    	for(i=0; i<14;i++)
    	{
    		if(posi[i]==1)
    		{
    			poscurser=i;
    		}
    	}
    
    	if(richtung==0&&posi[0]!=1)
    	{
    		//links
    		poscurser--;
    		posfestlegung(poscurser);
    
    	}
    	else if(richtung==1&&posi[13]!=1)
    	{
    		//rechts
    		poscurser++;
    		posfestlegung(poscurser);
    
    	}
    }
    
    //-----------------------------------------------------------------------------
    // Positionsfestlegung des eigenen "Schiffes"
    //-----------------------------------------------------------------------------
    
    void posfestlegung(int poscurser)
    {
    	int i;
    	for(i=0;i<14;i++)
    	{
    		if(i==poscurser)
    		{
    			posi[i]=1;
    		}
    		else
    		{
    			posi[i]=0;
    		}
    	}
    }
    
    //-----------------------------------------------------------------------------
    // Ausgabe des eigenen "Schiffes"
    //-----------------------------------------------------------------------------
    
    void curserausg()
    {
    	int poscurser;
    	int temp;
    	int i;
    
    	gotoxy(11,22); //Löschen der Zeile, in das Spielerschiff navigiert
    	for(i=11;i<69;i++)
    	{
    		printf(" ");
    	}
    
    	poscurser=possuche();
    
    	switch(poscurser)
    	{
    	case 0:
    		temp=12;
    		break;
    	case 1:
    		temp=16;
    		break;
    	case 2:
    		temp=20;
    		break;
    	case 3:
    		temp=24;
    		break;
    	case 4:
    		temp=28;
    		break;
    	case 5:
    		temp=32;
    		break;
    	case 6:
    		temp=36;
    		break;
    	case 7:
    		temp=40;
    		break;
    	case 8:
    		temp=44;
    		break;
    	case 9:
    		temp=48;
    		break;
    	case 10:
    		temp=52;
    		break;
    	case 11:
    		temp=56;
    		break;
    	case 12:
    		temp=60;
    		break;
    	case 13:
    		temp=64;
    		break;
    	}
    	curserausgHelp(temp);
    
    }
    
    //-----------------------------------------------------------------------------
    // Hilfsfunktion - Ausgabe des eigenen "Schiffes"
    //-----------------------------------------------------------------------------
    
    void curserausgHelp(int temp)
    {
    	gotoxy(temp,22);
    	printf("\334\333\334");
    }
    
    //-----------------------------------------------------------------------------
    // Funktion, in der die Position des eigenen "Schiffes" 
    // ermittelt wird
    //-----------------------------------------------------------------------------
    
    int possuche()
    {
    	int i, poscurser;
    
    	for(i=0; i<14;i++)
    	{
    		if(posi[i]==1)
    		{
    			poscurser=i;
    		}
    	}
    	return (poscurser);
    }
    

    Bis hier hin funktioniert alles.
    Bei den nachfolgenden Funktionen tritt nun ein Problem auf. Und zwar, gibt das Prog die erste Schussposition richtig aus, gibt aber auch einen Schuss ganz oben und 4 Felder links von der eigentlichen Schusslinie einen weiteren Schuss aus (warum, weiss ich leider nicht).

    //-----------------------------------------------------------------------------
    // Festlegung, der Schusspositionen bei Betätigung der Leertaste
    //-----------------------------------------------------------------------------
    
    void schussabgabe()
    {
    	int spalte;
    
    	spalte = possuche();
    	schuss[spalte][0]=1;
    
    }
    
    //-----------------------------------------------------------------------------
    // Funktion, die den Schuss nach Oben weiterfliegen lässt
    //-----------------------------------------------------------------------------
    
    void schussWeiter()
    {
    	int i,j;
    	for(j=0;j<14;j++)
    	{
    		for(i=0;i<16;i++)
    		{
    			if(schuss[j][i]==1)
    			{
    				schuss[j][i]=0;
    				if(i!=15)
    				{
    					schuss[j][i+1]=1;
    				}
    			}
    		}
    	}
    }
    
    //-----------------------------------------------------------------------------
    // Ausgabe der Schüsse
    //-----------------------------------------------------------------------------
    
    void schussAusgabe()
    {
    	int i,j, help, help1;
    	for(j=0;j<14;j++)
    	{
    		for(i=0;i<16;i++)
    		{
    			if(schuss[j][i]==1)
    			{
    				gotoxy((13+4*j),21-i);
    				printf("\174");
    			}
    		}
    	}
    
    }
    

    Würde mich freuen, wenn mir jemand helfen kann.

    Lyrix



  • Spätestens jetzt wird es Zeit sich mit dem Debugger auseinander zu setzen (und am besten auch anzufreunden ;)).

    system() solltest du nur verwenden um externe Programme aufzurufen und nicht für Systembefehle. Um etwas farbig auszugeben gibt es einige betriebssystem spezifische Funktionen (u. a. cprintf()). Generell gillt: Systembefehle bzw. Konsolenbefehle kann man immer durch betriebssystem spezifische Funktionen abdecken (und das auch noch aus mehreren Gesichtspunkten besser).

    Da du eh schon betriebssystem spezifische Funktionen verwendest, hat das nicht mehr viel mit ANSI-C zu tun. Für welches BS compilierst du?



  • Windows 😉

    Edit:
    Ganz vergessen,
    Ich lese mich gerade ins buch von Petzold ein (Windows Programmierung). Leider habe ich noch nicht viel ahnung von win api. Sobald ich das buch durch habe, hoffe ich die System-Befehle vermeiden zu koennen.



  • Gut, dann kommst ins Konsolenforum.

    Noch ein kleiner Tipp:
    Verwende am besten Sleep() (anstatt _sleep()). Denn dadurch kann Windows in der Zwischenzeit andere Prozesse mit Prozessorressourcen versorgen und dein eigener verbrät nicht alles ;).



  • Dieser Thread wurde von Moderator/in AJ aus dem Forum ANSI C in das Forum DOS und Win32-Konsole verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Hallo Lyrix,
    Unter welcher Entwicklungsumgebung programmierst du?
    und welche Biblios hast du für dein Spiel eingefügt.
    Ich habe vom DevC++ zum Borland gewechselt. Jetzt funktionieren die Befehle
    clrscr() und gotoxy(); aber der sleep-befehl nicht mehr. Mit welcher Biblio
    hast du den Cursor gelöscht?

    Danke 😉

    MfG Ed



  • EdwinKeller schrieb:

    Hallo Lyrix,
    Unter welcher Entwicklungsumgebung programmierst du?
    und welche Biblios hast du für dein Spiel eingefügt.
    Ich habe vom DevC++ zum Borland gewechselt. Jetzt funktionieren die Befehle
    clrscr() und gotoxy(); aber der sleep-befehl nicht mehr. Mit welcher Biblio
    hast du den Cursor gelöscht?

    Danke 😉

    MfG Ed

    IDE ist Microsoft Visual C++ 6.0
    Biblio für das löschen vom Cursor, sowie gotoxy(); ist curser.h und curser.lib
    Hab mein Prob aber gefunden, lag an einem kleinen Denkfehler, bei der grösse des Arrayfeldes.

    #include "stdafx.h"
    #include <stdio.h>
    #include <stdlib.h>
    #include <process.h>
    #include <time.h>
    #include "cursor.h"
    #include <conio.h>
    #include <ctype.h>
    

    @Dein Problem.

    Hast du auch alle Headerdateien richtig includet?

    Edwin, hast du icq, wenn ja koennen wir uns da mal etwas unterhalten, meine nummer ist:

    316698305



  • Werbung: http://ic.sidewindershome.net

    MfG SideWinder



  • SideWinder schrieb:

    Werbung: http://ic.sidewindershome.net

    MfG SideWinder

    😃


Anmelden zum Antworten