Zeichen an Zeile anketten



  • Hallo,

    Ich bin gerade dabei ein Pokerspiel zu programmieren und es sollten die Karten so ausgegeben werden.

    http://img3.imagebanana.com/img/6kzso1hj/headsup.gif

    Ich könnte zwar alle aufeinmal ausgeben, aber nach den ersten 3 Karten wird gesetzt. Das heißt ich muss die letzten 2 Karten dazueditieren.
    Wie ist das möglich?



  • Dieser Thread wurde von Moderator/in evilissimo aus dem Forum 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.



  • Hi,
    du kannst ja den Cursor an der Stelle positionieren, wo du etwas reinschreiben willst.
    Das ist eine Möglichkeit. Oder du nimmst WriteConsoleOutput, damit kannst du gleich nen ganzen Block irgendwo auf dem Monitor ausgeben.



  • hää? 😕

    Sry das hab ich leider nicht verstanden 😞

    Also ich hab hier den Code für eine Karte:

    printf("2##########2\n");
    printf("#          #\n");
    printf("#          #\n");
    printf("#    **    #\n");
    printf("#   *  *   #\n");
    printf("#     *    #\n");
    printf("#    *     #\n");
    printf("#   ****   #\n");
    printf("#          #\n");
    printf("#          #\n");
    printf("2##########2\n");
    

    Jetzt möchte ich nebenbei eine weitere Karte hinzufügen.
    Dazu muss ich doch die einzelnen Zeilen editieren und immer eine Reihe der Karte hinzufügen.



  • Hallo,

    also, soweit ich das verstehe, würdest du gern den Cursor in der Konsole positionieren.

    Leider ist das mit C-Standard nicht machbar. Willst du dich allerdings nur auf die Windows Konsole beschränken, dann gibt es etliche Funktionen die in dem "windows.h" Header deklariert sind. Das ganze ist allerdings nicht unbedingt einsteigerfreundlich.

    Man könnte z.B. sowas schreiben:

    #include <windows.h>
    
    void GotoXY(int x, int y) {
        HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
        COORD pos = {x, y};
        setConsoleCursorPosition(hStdOut, pos);
    }
    

    Das wäre eine Funktion, die den Cursor an die Position (x, y) setzt, wobei x und y jeweils bei 0 anfangen.

    Dann wäre es relativ einfach die jeweilige Karte verschoben zu printen. Du müsstest eben vor jedem "printf" ein "GotoXY" machen und den Cursor entsprechend platzieren.

    Die Referenz zu den ganzen Funktionen findet sich zum Beispiel hier: http://msdn.microsoft.com/en-us/library/ms682087(VS.85).aspx



  • PeterMueller schrieb:

    hää? 😕

    Sry das hab ich leider nicht verstanden 😞

    Also ich hab hier den Code für eine Karte:

    printf("2##########2\n");
    printf("#          #\n");
    printf("#          #\n");
    printf("#    **    #\n");
    printf("#   *  *   #\n");
    printf("#     *    #\n");
    printf("#    *     #\n");
    printf("#   ****   #\n");
    printf("#          #\n");
    printf("#          #\n");
    printf("2##########2\n");
    

    Jetzt möchte ich nebenbei eine weitere Karte hinzufügen.
    Dazu muss ich doch die einzelnen Zeilen editieren und immer eine Reihe der Karte hinzufügen.

    Das ist ein bisschen zu fummelig und unflexibel.
    Du kannst auf dem Monitor gezielt per Koordinaten etwas anzeigen. Linux, Windows haben da ihre eigenen 'gotoxy' Funktionen, guckst du hier:

    #include <stdio.h>	
    #include <windows.h>
    
    HANDLE hOut, hIn;
    
    #define CARDSIZX 15
    #define CARDSIZY 11
    #define BLANK 32
    
    CHAR_INFO chipik7[CARDSIZX*CARDSIZY];
    unsigned char pik7[] = {  // 15*11
    	201,205,205,205,205,205,205,205,205,205,205,205,205,205,187,
    	186,  6, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,'7',186,
    	186, 32, 32, 32,207,207,207,207,207,207,207, 32, 32, 32,186,
    	186, 32, 32, 32, 32, 32, 32, 32, 32, 32,207, 32, 32, 32,186,
    	186, 32, 32, 32, 32, 32, 32, 32, 32,207, 32, 32, 32, 32,186,
    	186, 32, 32, 32, 32, 32,207,207,207, 32, 32, 32, 32, 32,186,
    	186, 32, 32, 32, 32, 32,207, 32, 32, 32, 32, 32, 32, 32,186,
    	186, 32, 32, 32, 32, 207,32, 32, 32, 32, 32, 32, 32, 32,186,
    	186, 32, 32, 32, 32, 207,32, 32, 32, 32, 32, 32, 32, 32,186,
    	186,'7', 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,  6,186,
    	200,205,205,205,205,205,205,205,205,205,205,205,205,205,188
    };
    
    int init_console ()
    {
    
    	hOut = GetStdHandle( STD_OUTPUT_HANDLE );
    	if ( NULL == hOut )
    	{
    		puts ("init_console: GetStdHandle failed.");
    		return 1;
    	}
    
    	hIn = GetStdHandle( STD_INPUT_HANDLE );
    	if ( NULL == hIn )
    	{
    		puts ("init_console: GetStdHandle failed.");
    		return 1;
    	}
    
    	return 0;
    }
    
    void gotoxy ( int x, int y )
    {
    	COORD pos;
    	pos.X = x;
    	pos.Y = y;
        SetConsoleCursorPosition( hOut, pos );
    } 
    
    void show_card( unsigned char* card, int posx, int posy )
    {	
    	int x=0,y=0;
    
    	for ( y=0; y<CARDSIZY; y++ )
    	{
    		for ( x=0; x<CARDSIZX; x++ )
    		{
    			gotoxy(posx+x,posy+y);
    			putchar(card[y*CARDSIZX+x]);
    		}
    	}
    }
    
    void erase_card( int posx, int posy )
    {
    	int x=0,y=0;
    	for ( y=0; y<CARDSIZY; y++ )
    	{
    		for ( x=0; x<CARDSIZX; x++ )
    		{
    			gotoxy(posx+x,posy+y);
    			putchar(BLANK);
    		}
    	}
    }
    
    void init_card ( CHAR_INFO* pcard )
    {
    	int i=0;
    	while ( pik7[i] )
    	{
    		chipik7[i].Char.AsciiChar = pik7[i];
    	 	chipik7[i].Attributes =   FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE;
    		i++;
    	}
    }
    
    int main()
    {
    	unsigned char* pcard=pik7;
    	COORD dwBufferSize={CARDSIZX,CARDSIZY}, dwBufferCoord={0};
    	SMALL_RECT smr = {60,0,60+CARDSIZX,CARDSIZY};
    	int posx = 0, posy = 0;
    	if(init_console ())
              return 1;
    	init_card (chipik7);
    
    	while (posx<60)
    	{
    		show_card(pik7, posx,posy);
    
    		WriteConsoleOutput( hOut, // handle to a console screen buffer
    		  chipik7,  // pointer to buffer with data to write
    			dwBufferSize,     // column-row size of source buffer
    			dwBufferCoord,    // upper-left cell to write from
    			&smr  );// pointer to rectangle to write to
    
    		Sleep(400);
    		erase_card(posx,posy);
    		erase_card(smr.Left,smr.Top);
    
    		smr.Left--;
    		smr.Right--;
    		posx++;
    	}
    
    	show_card(pcard,2,2);
    
    	return 0;
    }
    

    WriteConsoleOutput hat Schwierigkeiten mit einigen Symbolen. Naja, dafür kann man direkt die Farben manipulieren FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE, BACKGROUND_RED, usw.
    Das geht aber auch mit SetConsoleTextAttribute, ohne das CHAR_INFO Ding.



  • Wow danke!
    Gib mir etwas Zeit.
    Da sind so einige Sachen dabei die ich noch nicht verstehe.

    Kann ich dich irgendwie kontaktieren?

    Gruß



  • Was liegt denn an? Ich surfe ab und an mal hier durch das Forum.


Anmelden zum Antworten