Problem bei "unten,oben,links,rechts" Bewegung

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
Bunutzername
Beiträge: 2
Registriert: Do Jan 15, 2009 8:39 pm

Problem bei "unten,oben,links,rechts" Bewegung

Beitrag von Bunutzername » Do Jan 15, 2009 8:48 pm

Hallo Leute :)
Ich "programmmiere" seit 2 Monaten
Ertmal wollte ich sagen das Ich diese Seite bis jetzt echt toll finde Weiter so ^^
So nun zu meiner eingentlichen Farge ich wollte mir sein spiel machen nennen wir es ma "Irrgarten ich bin jetzt auch so weit gekommen dass ich das spielfeld hab das so ungefähr aussieht
#######################
#C....*...*..................*#
#................*......*.....#
#.......****...............****#
#...........................$#
#######################
man steuern die figur c und das ziel ist es an das $ zeichen zu kommen
ich bin nun soweit dass wenn man auf enter klikt die figur pro klikt seinem Ziel näher kommt
ich wollte nun wissen wie ich es schaffe das man die figur selber in irgendeine richtung steuern kann
danke im voraus
Ich programmiere In C
<<Code.Blocks>>

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Problem bei "unten,oben,links,rechts" Bewegung

Beitrag von cloidnerux » Do Jan 15, 2009 8:57 pm

Also, unter DirectX(keine Ahnungs ob es auch mit OpenGL geht) könntet du mit DirectInput die Pfeiltasten Ablesen.
Eine weitere Möglichkeit wäre es, unetn am spielfeld ne inegabe machen zu lassen, die nur das erste zeichen das Eingegeben wurde
Interprtiert und die Figur Bewegt.
Eine andere Möglichkeit ist mir jezt nicht bekannt.

Aber sonst wilkommen im Forum.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: Problem bei "unten,oben,links,rechts" Bewegung

Beitrag von Dirty Oerti » Do Jan 15, 2009 9:00 pm

Hallo und willkommen :)

Ich nehme mal stark an, dass du das in der Konsole ohne spezielle Libraries machen willst :)

Nun musst du dir gut überlegen, wie du das machst.
Im Endeffekt kannst du kein Zeichen einzeln auf der Konsole verändern (kannst du natürlich iwie, aber ist ja mal egal).
Du musst also bei jeder Änderung den kompletten Bildschirm neuzeichnen.

Du brauchst also einen Speicher, in dem dein Bildschirminhalt gehalten wird, der verändert wird, wenn eine Taste z.B. gedrückt wurde und dann neu auf den Bildschirm gespeichert wird.

Code: Alles auswählen

char screen[25*20];//Die Zahlen stehen für Höhe und Breite, dass musst du anpassen
Nun musst du wissen, wo sich dein C und wo sich dein Ziel befindet.

Code: Alles auswählen

int cposx, cposy;
int targetx, targety;
Dein Spielfeld kannst du ja schon zeichnen. Mit dieser Anordnung hier geht das ähnlich.
Du gibst einfach zuerst 25 (=Breite) Zeichen von screen aus, fügst dann ein "\n" an, gibst die nächsten 25 aus etc bis du alle Zeilen (20 in meinem Bsp) ausgegeben hast.

Wenn du dein Spielfeld ausgegeben hast frägst du nach einer Tasteneingabe.
Die wertest du dann aus.
Bsp:

w => nach oben
a => nach links
s => nach unten
d => nach rechts
q => beenden

Je nachdem was gedrückt wurde führst du deine Aktion aus.
Wenn du z.B. nach Links gehst, überprüfst du, ob du nicht schon ganz links stehst.
Wenn nicht, dann kannst du gucken, was denn in dem Feld links von dir ist (durch die cposx).
Ist da frei, dann kannst du rein.
Heißt: In das Feld schreibst du das C, im Feld mit dem alten C schreibst du eine Leerstelle.
Dann änderst du noch cposx und cposy auf die neuen Koordinaten.

Dann kannst du screen wieder zeichnen.

Wenn du das geschafft hast, dann hast du eine Art 2D-Text-Renderer programmiert :)
Sogar mit Kollisionserkennung :)

Wenn du etwas nicht verstehst, dann frag einfach :)
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Bunutzername
Beiträge: 2
Registriert: Do Jan 15, 2009 8:39 pm

Re: Problem bei "unten,oben,links,rechts" Bewegung

Beitrag von Bunutzername » Do Jan 15, 2009 9:11 pm

Danke für die schnelle antwort :)
schande über mein haupt -_- weil ich die sachen die du erklärt hast zum ersten ma höre
sorry würde mich noch über ein paar tipps freuen
falls es nichts ausmacht poste ich hier den quellcode

Code: Alles auswählen

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#ifdef __unix__
#define clrscr() printf("\x1B[2J")
#elif __BORLANDC__ && __MSDOS__
#include <conio.h>
#elif __WIN32__ || _MSC_VER
#define clrscr() system("cls")
#else
#define clrscr() printf("clrscr() - Fehler\n")
#endif

#define HINDERNISSE 150

char spielfeld[15][50];

void createspielfeld(void)
{
    int i, j, x, y;
    for(i=0, j=0; j < 50; j++)
    spielfeld[i][j] = '#';
    for(i=1 ;i < 15; i++)
    for(j=0;j<50;j++)
    {
        if(j==0 || j==49)
        spielfeld[i][j] = '#';
        else
        spielfeld[i][j] = ' ';
        if(i==13 && j==48)
        spielfeld[i][j] = 'O';
    }
    for(i=14,j=0;j<50;j++)
    spielfeld[i][j] = '#';

    for(i=0;i<=HINDERNISSE;i++)
    {
    x=rand()%14;
    y=rand()%48;
    if(x<15&&y<50 && x>0&&y>0)
    spielfeld[x][y] = '*';
}
spielfeld[1][1]=' ';
}

void showspielfeld(void)
{
    int i, j;
    clrscr();
    for(i=0; i < 15; i++)
    for(j=0;j<50;j++)
    {
        printf("%c",spielfeld[i][j]);
        if(j==49)
        printf("\n");
    }
}

int step(int x, int y, int xalt, int yalt)
{
    printf("<ENTER>"); getchar();
    if(spielfeld[x][y] == 'O')
    {
        spielfeld[x][y] = 'C';
        spielfeld[xalt][yalt] == ' ';
        showspielfeld();
        printf("Level eins erfolgreich geschafft\n");
        exit (EXIT_SUCCESS);
    }
    else if(spielfeld[x][y] == ' ');
    {
    spielfeld[x][y] = 'C';
    spielfeld[xalt][yalt] = ' ';
    showspielfeld();
    if( y+1<49 && spielfeld[x][y+1] !='*' &&
    yalt!=y+1 && step(x,y+1,x,y) )
    return 1;
    else if( x+1<14 && spielfeld[x+1][y] !='*' && xalt!=x+1 && step(x+1,y,x,y) )
    return 1;
    else if( x-1>0 && spielfeld[x-1][y] !='*' && xalt!=x-1 && step(x-1,y,x,y) )
    return 1;
    else if( y-1>0 && spielfeld[x][y-1] !='*' && yalt!=y-1 && step(x,y-1,x,y) )
    return 1;

}
}

int main(void)
{
    createspielfeld();
    step(1,1,1,1);
    return EXIT_SUCCESS;
}

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Problem bei "unten,oben,links,rechts" Bewegung

Beitrag von nufan » Do Jan 15, 2009 9:14 pm

Willkommen :)
Ich hab es mal geschafft ein sehr systemabhängiges Windows-Spiel zu programmieren, das man mit den Pfeiltasten steuern kann.
Den Quellcode habe ich hier verlinkt.
Wobei ich gerade sehe, dass der Auszug im Beitrag nicht gerade sinnvoll ist...

Die Funktion "spielzug" könnte dich interessieren.

Aber das einfachste ist am Anfang wahrscheinlich die WASD-Steuerung. :)

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: Problem bei "unten,oben,links,rechts" Bewegung

Beitrag von Dirty Oerti » Do Jan 15, 2009 9:23 pm

Gut, du bist schon relativ weit.
Funktioniert das alles bisher so?
Den Code habe ich mir jetzt nicht genau durchgeschaut, denke aber, dass man das noch etwas kürzer/einfacher schreiben kann.

Deine neue main:

Code: Alles auswählen


int x, y;

int main(void)
{
    char weiter = 1
    char input = 0;
    createspielfeld();
    while(weiter) {
//nun bekommst du input
        fgets(input,1,stdin);
//bitte hier den EIngabepuffer leeren...
        switch (input) {
            case 'w': // nun bewegst du dich
            case 'q': weiter = 0;break;
            default: break;
        }
    }
    return EXIT_SUCCESS;
}

Deine step Funktion solltest du überarbeiten.
Speichere am besten global, wo dein C steht, und benutze dann step so:
step ( änderung nach x, änderung nach y);
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Antworten