<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Programm stürzt unerklärbar ab]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich hab folgendes Problem, welches ich mir nicht erklären kann:<br />
ich möchte mit rand() einen zufälligen x und y-Wert erzeugen. Danach soll geprüft werden, ob in der zweidemensionalen Matrix 'feld' der die Stelle [x][y] leer, also 0 ist. wenn ja, dann soll mit dem Programm fortgefahren werden, wenn nein soll, dann sollen x und y solange neu mit rand() 'berechnet' werden, bis 'feld' an der Stelle [x][y] 0 ist. Eigenlich eine simple Sache:</p>
<pre><code class="language-cpp">do
     {
         x=rand()%(xbereich-1);
         y=rand()%(ybereich-1);
     }
     while(feld[x][y]!=leer);
</code></pre>
<p>'xbereich' und 'ybereich' sind zuvor berechnete Variablen und begrenzen hier x und y. Leider klappt es nicht, das Programm bleibt hängen, noch bevor ein Fenster gezeigt wird. Das richtig abartige ist aber, dass es wo anders(WM_TIMER) im selben Code problemlos klappt! Auch das hier klappt:</p>
<pre><code class="language-cpp">x=rand()%(xbereich-1);
         y=rand()%(ybereich-1);

        if(feld[x][y]!=leer)
        {
            x=rand()%(xbereich-1);
            y=rand()%(ybereich-1);
        };
</code></pre>
<p>Hat aber den Nachteil, dass die Wahrscheinlichkeit besteht, dass x/y trotzem auf eine Stelle zeigen, die besetzt ist. Übrigens: es liegt nicht daran, dass alle Stellen in 'feld' 'besetzt' sind, im Gegenteil, über 95% sind 0.</p>
<p>Wie kann das sein???<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>MfG Mark</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/180763/programm-stürzt-unerklärbar-ab</link><generator>RSS for Node</generator><lastBuildDate>Wed, 08 Jul 2026 19:31:13 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/180763.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 06 May 2007 12:43:44 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Programm stürzt unerklärbar ab on Sun, 06 May 2007 12:43:44 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich hab folgendes Problem, welches ich mir nicht erklären kann:<br />
ich möchte mit rand() einen zufälligen x und y-Wert erzeugen. Danach soll geprüft werden, ob in der zweidemensionalen Matrix 'feld' der die Stelle [x][y] leer, also 0 ist. wenn ja, dann soll mit dem Programm fortgefahren werden, wenn nein soll, dann sollen x und y solange neu mit rand() 'berechnet' werden, bis 'feld' an der Stelle [x][y] 0 ist. Eigenlich eine simple Sache:</p>
<pre><code class="language-cpp">do
     {
         x=rand()%(xbereich-1);
         y=rand()%(ybereich-1);
     }
     while(feld[x][y]!=leer);
</code></pre>
<p>'xbereich' und 'ybereich' sind zuvor berechnete Variablen und begrenzen hier x und y. Leider klappt es nicht, das Programm bleibt hängen, noch bevor ein Fenster gezeigt wird. Das richtig abartige ist aber, dass es wo anders(WM_TIMER) im selben Code problemlos klappt! Auch das hier klappt:</p>
<pre><code class="language-cpp">x=rand()%(xbereich-1);
         y=rand()%(ybereich-1);

        if(feld[x][y]!=leer)
        {
            x=rand()%(xbereich-1);
            y=rand()%(ybereich-1);
        };
</code></pre>
<p>Hat aber den Nachteil, dass die Wahrscheinlichkeit besteht, dass x/y trotzem auf eine Stelle zeigen, die besetzt ist. Übrigens: es liegt nicht daran, dass alle Stellen in 'feld' 'besetzt' sind, im Gegenteil, über 95% sind 0.</p>
<p>Wie kann das sein???<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>MfG Mark</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1279645</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1279645</guid><dc:creator><![CDATA[p_mork]]></dc:creator><pubDate>Sun, 06 May 2007 12:43:44 GMT</pubDate></item><item><title><![CDATA[Reply to Programm stürzt unerklärbar ab on Sun, 06 May 2007 13:01:29 GMT]]></title><description><![CDATA[<p>Hi,<br />
Also ich kann leider mit deiner Fehlerbeschreibung nicht viel anfangen. Was heist es bleibt hängen? Hast du irgendwelche Fehlerkontrollen? bist du dir sicher das deine Bedingung while(feld[x][y]!=leer); richtig ist?<br />
Also so recht kann ich da jetzt nix erkennen.</p>
<p>schirrmie</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1279654</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1279654</guid><dc:creator><![CDATA[schirrmie]]></dc:creator><pubDate>Sun, 06 May 2007 13:01:29 GMT</pubDate></item><item><title><![CDATA[Reply to Programm stürzt unerklärbar ab on Sun, 06 May 2007 13:12:34 GMT]]></title><description><![CDATA[<p>Also ich hab das auch einmal überprüft, wobei das immer zu einem ergebnis kommt.</p>
<pre><code class="language-cpp">int mat2D[100][100];
    for(int i = 0; i &lt; 100; i++)
        for(int ii = 0; ii &lt; 100; ii++)
            mat2D[i][ii] = rand() % 2;
    int x, y;
    do 
    { 
        x = rand() % 99; 
        y = rand() % 99; 
    } 
    while(mat2D[x][y]);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1279660</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1279660</guid><dc:creator><![CDATA[Dennis123]]></dc:creator><pubDate>Sun, 06 May 2007 13:12:34 GMT</pubDate></item><item><title><![CDATA[Reply to Programm stürzt unerklärbar ab on Sun, 06 May 2007 13:13:40 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Erstmal drei Fragen dazu:</p>
<p>Wie ist die Matrix deklariert?<br />
Wie wird sie initialisiert?<br />
Ist die Anwendung Multithreaded?</p>
<p>Grüsse</p>
<p>*this</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1279661</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1279661</guid><dc:creator><![CDATA[Gast++]]></dc:creator><pubDate>Sun, 06 May 2007 13:13:40 GMT</pubDate></item><item><title><![CDATA[Reply to Programm stürzt unerklärbar ab on Sun, 06 May 2007 13:13:50 GMT]]></title><description><![CDATA[<p>Es kommt immer eine lösung obwohl ich in der Matrix etwa 50% 0 und 50% 1 habe.<br />
Oder meinst du irgend etwas anderes als eine Dauerschleife?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1279664</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1279664</guid><dc:creator><![CDATA[Dennis123]]></dc:creator><pubDate>Sun, 06 May 2007 13:13:50 GMT</pubDate></item><item><title><![CDATA[Reply to Programm stürzt unerklärbar ab on Sun, 06 May 2007 15:26:53 GMT]]></title><description><![CDATA[<p>schirrmie schrieb:</p>
<blockquote>
<p>bist du dir sicher das deine Bedingung while(feld[x][y]!=leer); richtig ist?</p>
</blockquote>
<p>Ja. 'leer' ist bei übrigens 0(mit #define definiert).</p>
<p>schirrmie schrieb:</p>
<blockquote>
<p>Was heist es bleibt hängen?</p>
</blockquote>
<p>Damit meine ich, dass das Programm auf garnichts reagiert und laut TaskManager die ganze freie CPU-leistung verbraucht.</p>
<p>Gast++ schrieb:</p>
<blockquote>
<p>Wie ist die Matrix deklariert?<br />
Wie wird sie initialisiert?<br />
Ist die Anwendung Multithreaded?</p>
</blockquote>
<pre><code class="language-cpp">voaltile int feld[200][150];
...
for(x=0;x&lt;200;x++)
        for(y=0;y&lt;150;y++)
           feld[x][y]=leer;
</code></pre>
<p>Nein, nur ein Thread.</p>
<p>Ich poste mal den ganzen Code. Leider ist er so ziemlich kommentarlos, weshalb ich ihn auch ungefähr erklären sollte:<br />
Es ist ein Snakespiel. Man bewegt die schlange mit den Pfeiltasten zum grünen Kästchen uns sammelt es ein. Nachdem 'stonemax' Kästchen eingesammelt sind kommt das nächste Level. Ein Level besteht bei mir aus Linien, dessen verhältinismäßige Anfangs- und Endpositionen in einem int-array deklariert sind. So kann das Fenster in der Größe problemlos geändert werden. Das meiste läuft in WM_TIMER ab. Die Funktion NewGame(HWND) leert das Spielfeld, erzeugt aus dem entsperechenden Levelarray ein Raster, welches in die Var feld geschrieben wird. Die Funktion FeldLine(x1,y1,x2,y2) zeichnet eine Wand ins 'feld'. Zusätlich gibt es Steine, die die Schlange an einen anderen Ort 'teleportieren'. Das Problem liegt in Zeile 773 in der NewGame() beim erzeugen der Zufallsposition für den ersten einzusammelnden Stein. Die Erzeugung der nächsten Steine liegt in Zeile 549, nämlich dann, wenn ein bereits exestierender Stein eingessammelt wird und ein neuer hinmuss. Da klappt die do...while-Methode problemlos. Der Compiler ist überigens GCC mit DEV-C++.<br />
...<br />
Äh wie fügt man hier Dateien ein???<br />
MfG Mark</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1279727</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1279727</guid><dc:creator><![CDATA[p_mork]]></dc:creator><pubDate>Sun, 06 May 2007 15:26:53 GMT</pubDate></item><item><title><![CDATA[Reply to Programm stürzt unerklärbar ab on Sun, 06 May 2007 16:03:03 GMT]]></title><description><![CDATA[<p>Du kannst ja mal versuchen den ganzen Code in einen Code-Block eingefügt zu posten(dauert sicher nicht lang <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /> ). Hat Dev-C++ einen Debugger? Dann könntest du an der richtigen stelle halten und genau nachgucken wo es hängt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1279744</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1279744</guid><dc:creator><![CDATA[Dennis12]]></dc:creator><pubDate>Sun, 06 May 2007 16:03:03 GMT</pubDate></item><item><title><![CDATA[Reply to Programm stürzt unerklärbar ab on Sun, 06 May 2007 16:22:43 GMT]]></title><description><![CDATA[<p>Snake.cpp:</p>
<pre><code>#include &lt;windows.h&gt;
#include &lt;time.h&gt;       //für rand()
#include &quot;resource.h&quot;

#define leer 0       //für eine leere stelle
#define schlange 1   //da ist ein teil der schlange
#define stein 2      //da ist ein stein zum einsammeln
#define wand 3        //da ist eine Wand
#define trans 4     //da liegt ein 'transformer' zum teleportieren

#define stonemax 5   //anzahl der steine zum nachsten level
#define SnakeTimer 1  //TIMER-ID für den timer der schlange
#define SnakeColor RGB(150, 0, 255) //farbe der schlange

#define levels 7  //anzahl der levels

HDC hdc;
PAINTSTRUCT ps;
HBRUSH hBrush;

volatile int SnakeSpeed; //für den timer in ms
volatile int feld[200][150]; //da ist der gesamte inhalt des spielfelds enthalten
volatile int translistx[32],translisty[32];//liste für die transformer, von wo nach wohin
volatile int xbereich,ybereich;  //aktiver bereich, in der WM_SIZE berechnet
volatile int toadd,lengh;//toadd: anzahl der steine, die noch dazu addiert werden müssen
// wenn die schlange einen stein einsammelt, wird dann bis 0 runtergezählt
//lengh: aktuelle länge der schlange
volatile int xbuff[256],ybuff[256];//buffer für die position der einzelnen schlangenkästchen,
//[0] ist das letzte 
volatile int xpos,ypos,xv,yv;//aktuelle position der schlange so wie die richtung,
//werden bei WM_TIMER zusammenaddiert
volatile int pause;//1=pause,0=aktives spiel
volatile int levelcount;//nummer des aktuellen levels
volatile int stonecount;//anzahl der eingesammelten steine
volatile int minimized;//1 wenn das fenster bei der letzten WM_SIZE minimiert wurde 
volatile int killoncrash;//1: schalnge wird beim crash sofort getötet,
//0: schlange wird stückweise abgeschnitten 
volatile int transer;//anzahl der transformer im aktueleln level

/*  Declare Windows procedure  */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
void NewGame(HWND hwnd);
void FeldLine(unsigned char x1,unsigned char y1,unsigned char x2,unsigned char y2);

/*  Make the class name into a global variable  */
char szClassName[ ] = &quot;MorkSnake&quot;;
const char szInfo[]=&quot;              Snake V1.6\n\n&quot;
                    &quot;Steurung: Pfeiltasten zum Bewegen\n&quot;
                    &quot;'P' für Pause\n\n&quot;
                    &quot;Ziel: Einsammeln von grünen Punkten,\n&quot;
                    &quot;um in den nächsten Level zu kommen\n\n&quot;
                    &quot;              Viel Spaß!\n\n&quot;;

//die levels                 
int level1[]={
//startposition
500,500,
//anzahl der linien:
//0 ist dabei ganzlinks bzw oben, 1000 ganz rechts/unten im fenster
//500 ist demanch die mmitte
2,
//Linien:
250,250,250,750,
750,250,750,750,
//Amzahl Transformer
0
//dessen Pos:
};   

int level2[]={
//startposition
500,500,
//anzahl der linien:
8,
//Linien: x1,y1,x2,y1
//0 ist dabei ganzlinks bzw oben, 1000 ganz rechts/unten im fenster
//500 ist demanch die mmitte
160,160,330,160,
160,160,160,330,
670,160,830,160,
830,160,830,330,
160,670,160,830,
160,830,330,830,
670,830,830,830,
830,670,830,830,
//Amzahl Transformer
0
//dessen Pos:
};  

int level3[]={
//startposition
500,500,
//anzahl der linien:
//0 ist dabei ganzlinks bzw oben, 1000 ganz rechts/unten im fenster
//500 ist demanch die mmitte
4,
//Linien:
200,200,800,200,
200,200,200,800,
200,800,800,800,
800,200,800,800,
//Amzahl Transformer
2,
//dessen Pos:
300,300,900,900,
900,900,300,300
};

int level4[]={
//startposition
500,200,
//anzahl der linien:
//0 ist dabei ganzlinks bzw oben, 1000 ganz rechts/unten im fenster
//500 ist demanch die mmitte
14,
//Linien: 
0,0,200,0,
300,0,700,0,
800,0,1000,0,
1000,0,1000,200,
1000,300,1000,700,
1000,800,1000,1000,
1000,1000,800,1000,
700,1000,300,1000,
200,1000,0,1000,
0,1000,0,800,
0,700,0,300,
0,200,0,0,
300,500,700,500,
500,300,500,700,
//Amzahl Transformer
0
//dessen Pos:
};

int level5[]={
//startposition
200,200,
//anzahl der linien:
//0 ist dabei ganzlinks bzw oben, 1000 ganz rechts/unten im fenster
//500 ist demanch die mmitte
10,
//Linien:
500,0,500,1000,
0,500,1000,500,
100,100,400,100,
100,100,100,400,
600,100,900,100,
900,100,900,400,
100,600,100,900,
100,900,400,900,
600,900,900,900,
900,900,900,600,
//Amzahl Transformer
0
//dessen Pos:
};

int level6[]={
//startposition
500,500,
//anzahl der linien:
//0 ist dabei ganzlinks bzw oben, 1000 ganz rechts/unten im fenster
//500 ist demanch die mmitte
16,
//Linien:
100,100,400,100,
100,100,100,400,
400,100,400,400,
100,400,400,400,

600,100,900,100,
600,100,600,400,
900,100,900,400,
600,400,900,400,

100,600,400,600,
100,600,100,900,
400,600,400,900,
100,900,400,900,

600,600,900,600,
600,600,600,900,
900,600,900,900,
600,900,900,900,
//Amzahl Transformer
8,
//dessen Pos:
475,475,250,250,
250,250,475,475,
525,475,750,250,
750,250,525,475,
475,525,250,750,
250,750,475,525,
525,525,750,750,
750,750,525,525
};

int level7[]={
//startposition
200,200,
//anzahl der linien:
//0 ist dabei ganzlinks bzw oben, 1000 ganz rechts/unten im fenster
//500 ist demanch die mmitte
6,
//Linien:
0,0,1000,0,
0,0,0,1000,
1000,0,1000,1000,
0,1000,1000,1000,
500,0,500,1000,
0,500,1000,500,
//Amzahl Transformer
4,
//dessen Pos:
250,250,750,250,
750,250,250,750,
250,750,750,750,
750,750,250,250

};
//das level-zeiger-array
int*level[]={level1,level2,level3,level4,level5,level6,level7};          

//standart winmain
int WINAPI WinMain (HINSTANCE hThisInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nFunsterStil)

{
    HWND hwnd;               /* This is the handle for our window */
    MSG messages;            /* Here messages to the application are saved */
    WNDCLASSEX wincl;        /* Data structure for the windowclass */
    HACCEL hAccel;

    /* The Window structure */
    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
    wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */
    wincl.cbSize = sizeof (WNDCLASSEX);

    /* Use default icon and mouse-pointer */
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = &quot;UNSERMENU&quot;;                 /* No menu */
    wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
    wincl.cbWndExtra = 0;                      /* structure or the window instance */
    /* Use Windows's default color as the background of the window */
    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;

    /* Register the window class, and if it fails quit the program */
    if (!RegisterClassEx (&amp;wincl))
        return 0;

    /* The class is registered, let's create the program*/
    hwnd = CreateWindowEx (
           0,                   /* Extended possibilites for variation */
           szClassName,         /* Classname */
           &quot;MorkSnake V1.6&quot;,       /* Title Text */
           WS_OVERLAPPEDWINDOW, /* default window */
           CW_USEDEFAULT,       /* Windows decides the position */
           CW_USEDEFAULT,       /* where the window ends up on the screen */
           544,                 /* The programs width */
           425,                 /* and height in pixels */
           HWND_DESKTOP,        /* The window is a child-window to desktop */
           NULL,                /* No menu */
           hThisInstance,       /* Program Instance handler */
           NULL                 /* No Window Creation data */
           );

    /* Make the window visible on the screen */
    ShowWindow (hwnd, nFunsterStil);

    hAccel = LoadAccelerators(hThisInstance, &quot;SHORTCUTS&quot;);
    /* Run the message loop. It will run until GetMessage() returns 0 */
    while (GetMessage (&amp;messages, NULL, 0, 0))
    {
        if(!TranslateAccelerator(hwnd, hAccel, &amp;messages))
        {
            /* Translate virtual-key messages into character messages */
            TranslateMessage(&amp;messages);
            /* Send message to WindowProcedure */
            DispatchMessage(&amp;messages);
        }
    }

    /* The program return-value is 0 - The value that PostQuitMessage() gave */
    return messages.wParam;
}

/*  This function is called by the Windows function DispatchMessage()  */

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int i,x,y;// Variablen zur zzwischenberechnung
    char c[10];

    switch (message)                  /* handle the messages */
    {
    //defaultwerte einstellen und spiel beginnen
        case WM_CREATE:
             SnakeSpeed=64;
             levelcount=0;
             killoncrash=0;
             srand( (unsigned)time( NULL ) );
             NewGame(hwnd);
             return 0;

        //x- und ybereich neu berechnen, wenn größe geändert
        case WM_SIZE:
             xbereich = (LOWORD(lParam)-8)/8+1;
	         ybereich = (HIWORD(lParam)-8-16)/8+1; //16 für den Status

	         if(HIWORD(lParam)==0)//minimiert
	         {
                 minimized=1;
                 KillTimer(hwnd,SnakeTimer);
             }
             else  if(minimized==1)//maximiert
             {
                  minimized=0;
                  pause=1;
                  hdc=GetDC(hwnd);
                  TextOut(hdc,0,ybereich*8,&quot;Game paused&quot;,11);
                  ReleaseDC(hwnd,hdc);
             }
             else NewGame(hwnd);//größe geändert-&gt;die wände neu berechnen  
	         return 0;

        //wenn fenster (de)aktiviert
        case WM_ACTIVATE:
             if (!LOWORD(wParam))
             {
                 pause=1;
                 KillTimer(hwnd,SnakeTimer);
                 hdc=GetDC(hwnd);
                 TextOut(hdc,0,ybereich*8,&quot;Game paused&quot;,11);
                 ReleaseDC(hwnd,hdc);
             };       
             return 0;

       //zeichenet den anwendungsberecih neu
        case WM_PAINT:
             hdc = BeginPaint(hwnd, &amp;ps);
             //ein rechteck, damit man sieht, wo die grenzen sind
             Rectangle(hdc,0,0,xbereich*8-1,ybereich*8-1);

             for(x=0;x&lt;xbereich;x++)//ganzes feld scannen
                for(y=0;y&lt;ybereich;y++)
                   if(feld[x][y]==schlange)//blaues kästchen
                   {
                       hBrush = (HBRUSH) SelectObject(hdc,CreateSolidBrush(SnakeColor));
                       Rectangle(hdc,x*8,y*8,x*8+7,y*8+7);
                       DeleteObject(SelectObject(hdc, hBrush)); 
                   }
                   else if(feld[x][y]==wand)//schwarzes kästchen
                   {
                        hBrush = (HBRUSH) SelectObject(hdc,CreateSolidBrush(RGB(0, 0, 0)));
                       Rectangle(hdc,x*8,y*8,x*8+7,y*8+7);
                       DeleteObject(SelectObject(hdc, hBrush)); 
                   }
                   else if(feld[x][y]==trans)//rostes kästchen
                   {
                       hBrush = (HBRUSH) SelectObject(hdc,CreateSolidBrush(RGB(255, 0, 0)));
                       Rectangle(hdc,x*8,y*8,x*8+7,y*8+7);
                       DeleteObject(SelectObject(hdc, hBrush)); 
                   }
                   else if(feld[x][y]==stein)//grünes kästchen
                   {
                        hBrush = (HBRUSH) SelectObject(hdc,CreateSolidBrush(RGB(0, 255, 0)));
                        Rectangle(hdc,x*8,y*8,x*8+7,y*8+7);
                        DeleteObject(SelectObject(hdc, hBrush));
                   };

             if(pause)TextOut(hdc,0,ybereich*8,&quot;Game paused&quot;,11);
              //anzahl der noch einzusammelnder steine                
             itoa(stonemax-stonecount,c,10);
             TextOut(hdc,xbereich*8-50,ybereich*8,c,strlen(c));
             for(i=0;i&lt;6-strlen(c)*2;i++) 
             TextOut(hdc,(xbereich*8-42)+i*4,ybereich*8,&quot; &quot;,1);

             TextOut(hdc,(xbereich*8-90),ybereich*8,&quot;Noch  &quot;,6);

             EndPaint(hwnd, &amp;ps);
             return 0;

        //die richtungsvariablen xv/yv ändern bzw spiel püausieren/aktivieren
        case WM_KEYDOWN:
             switch(wParam)
             {
                 case VK_UP:
                      if(yv!=1)
                      {
                          yv=-1;
                          xv=0;
                      };
                      return 0;   

                 case VK_DOWN:
                      if(yv!=-1)
                      {
                          yv=1;
                          xv=0;
                      };
                      return 0; 

                 case VK_RIGHT:
                      if(xv!=-1)
                      {
                          yv=0;
                          xv=1;
                      };
                      return 0; 

                 case VK_LEFT:
                      if(xv!=1)
                      {
                          yv=0;
                          xv=-1;
                      };
                      return 0; 

                 case 'P':
                      if(pause)
                      {
                         pause=0;
                         SetTimer(hwnd,SnakeTimer,SnakeSpeed,NULL);
                         RECT rc;
                         rc.left=0;
                         rc.top=ybereich*8;
                         rc.right=150;
                         rc.bottom=ybereich*8+16;
                         InvalidateRect(hwnd,&amp;rc,TRUE);
                      }
                      else
                      {
                          pause=1;
                          KillTimer(hwnd,SnakeTimer);
                          hdc=GetDC(hwnd);
                          TextOut(hdc,0,ybereich*8,&quot;Game paused&quot;,11);
                          ReleaseDC(hwnd,hdc);
                      };
                      return 0; 

                 case VK_F1:
                      pause=1;
                      hdc=GetDC(hwnd);
                      TextOut(hdc,0,ybereich*8,&quot;Game paused&quot;,11);
                      ReleaseDC(hwnd,hdc);
                      KillTimer(hwnd,SnakeTimer);
                      MessageBox(hwnd,szInfo,&quot;Info&quot;,MB_ICONINFORMATION | MB_OK);
                      return 0;

                 case VK_F2:
                      levelcount=0;
                      NewGame(hwnd);
                      return 0;

                 case VK_F3:
                      NewGame(hwnd);
                      return 0; 

                 //geschwndigkeit ändern
                 case '1':
                      SnakeSpeed=256;
                      SetTimer(hwnd,SnakeTimer,SnakeSpeed,NULL);
                      return 0;

                 case '2':
                      SnakeSpeed=128;
                      SetTimer(hwnd,SnakeTimer,SnakeSpeed,NULL);
                      return 0;

                 case '3':
                      SnakeSpeed=64;
                      SetTimer(hwnd,SnakeTimer,SnakeSpeed,NULL);
                      return 0;

                 case '4':  
                      SnakeSpeed=32;
                      SetTimer(hwnd,SnakeTimer,SnakeSpeed,NULL);
                      return 0;

                 case '5': 
                      SnakeSpeed=16;
                      SetTimer(hwnd,SnakeTimer,SnakeSpeed,NULL);
                      return 0;

                 case '6':  
                      SnakeSpeed=8;
                      SetTimer(hwnd,SnakeTimer,SnakeSpeed,NULL);
                      return 0;           
             };
             return 0;

        //das eigentliche spiel
        case WM_TIMER:
             if(toadd)//wenn die schlange verlängert werden soll
             {
                 toadd--;
                 lengh++;
             }
             else//ansonsten letztes kästchen löschen und positionsFIFO um eins shiften
             {
                 if(feld[*xbuff][*ybuff]!=trans)
                 {
                     RECT rc;
                     rc.left=xbuff[0]*8;
                     rc.top=ybuff[0]*8;
                     rc.right=xbuff[0]*8+7;
                     rc.bottom=ybuff[0]*8+7;

                     feld[xbuff[0&rsqb;&rsqb;[ybuff[0&rsqb;&rsqb;=leer;
                     InvalidateRect(hwnd,&amp;rc,TRUE);
                 };

                 for(i=0;i&lt;lengh;i++)
                 {
                    xbuff[i]=xbuff[i+1];
                    ybuff[i]=ybuff[i+1];
                 };
             };
             //berechnen der neuen position anhand von xv/yv
             xpos+=xv;
             ypos+=yv;

             if(xpos&gt;xbereich-1)xpos=0;//gucken, ob die schlange ausserhalbs des feldes liegt
             else if(xpos&lt;0)xpos=xbereich-1;
             if(ypos&gt;ybereich-1)ypos=0;
             else if(ypos&lt;0)ypos=ybereich-1;

             switch(feld[xpos][ypos])//gtucken, was an der stelle ist
             {
                 case stein:
                      //wen nein stein dann einsammeln, toadd erhöhen und einen neuen stein erzeugen
                      feld[xpos][ypos]=schlange;
                      toadd+=3; 
                      //zufallskoordinaten erzeugen,klappt perfekt
                      do
                      {
                         x=rand()%(xbereich-1);
                         y=rand()%(ybereich-1);
                      }
                      while(feld[x][y]!=leer); 

                      hdc=GetDC(hwnd);
                      hBrush = (HBRUSH) SelectObject(hdc,CreateSolidBrush(RGB(0, 255, 0)));
                      Rectangle(hdc,x*8,y*8,x*8+7,y*8+7);
                      DeleteObject(SelectObject(hdc, hBrush));

                      feld[x][y]=stein;
                      stonecount++;

                      //anzahl der einzusammelnder steine ausgeben
                      itoa(stonemax-stonecount,c,10);
                      TextOut(hdc,xbereich*8-50,ybereich*8,c,strlen(c));
                      for(i=0;i&lt;6-strlen(c)*2;i++) 
                      TextOut(hdc,(xbereich*8-42)+i*4,ybereich*8,&quot; &quot;,1);

                      ReleaseDC(hwnd,hdc); 
                      if(stonecount&gt;=stonemax)//wenn genug steine-&gt;nächstes level
                      {
                         levelcount++;
                         NewGame(hwnd);
                         return 0;
                      };

                 //nein, kein break|return !!!
                 //jetzt den positionsFIFO mit ankueller position beschreiben und ein neues
                 //kästchen zeichnen
                 case leer:
                      feld[xpos][ypos]=schlange;
                      xbuff[lengh]=xpos;
                      ybuff[lengh]=ypos;

                      hdc=GetDC(hwnd);
                      hBrush = (HBRUSH) SelectObject(hdc,CreateSolidBrush(SnakeColor));
                      Rectangle(hdc,xpos*8,ypos*8,xpos*8+7,ypos*8+7);                           
                      DeleteObject(SelectObject(hdc, hBrush));
                      ReleaseDC(hwnd,hdc);

                      return 0;

                 case trans://wenn trasformer
                      for(i=0;i&lt;(transer);i++)//suchen nach der postion in der liste
                      {
                          if((xpos==translistx[i*2])&amp;&amp;(ypos==translisty[i*2]))
                          {
                              xpos=translistx[i*2+1];//teleportieren
                              ypos=translisty[i*2+1];
                              xbuff[lengh]=xpos;
                              ybuff[lengh]=ypos;
                              return 0;
                          }//von der V1.5:
                          /*else if((xpos==translistx[i*2+1])&amp;&amp;(ypos==translisty[i*2+1]))
                          {
                              xpos=translistx[i*2];
                              ypos=translisty[i*2];
                              xbuff[lengh]=xpos;
                              ybuff[lengh]=ypos;
                              return 0;
                          }*/;
                      };
                      return 0;

                 default://ansonsten:
                      if(killoncrash)//wenn killoncrash dann level neustarten
                      NewGame(hwnd);
                      else//sonst schlange kürzen
                      {  
                         lengh--;
                         if(lengh&gt;0)
                         {
                             xpos-=xv;
                             ypos-=yv;
                         }
                         else NewGame(hwnd);                
                      };
                      return 0;
             };
             return 0;

        case WM_COMMAND://menüpunkte und tastaturkürzel
             switch(LOWORD(wParam))
             {
                 case IDM_NEU:
                      levelcount=0;

                 case IDM_RESET:
                      NewGame(hwnd);
                      return 0;

                 case IDM_BEENDEN:
                      pause=1;
                      hdc=GetDC(hwnd);
                      TextOut(hdc,0,ybereich*8,&quot;Game paused&quot;,11);
                      ReleaseDC(hwnd,hdc);
                      KillTimer(hwnd,SnakeTimer);
                      int mes;
                      KillTimer(hwnd,SnakeTimer);
                      mes=MessageBox(hwnd,&quot;Wirklich Beenden?&quot;,&quot;Beenden&quot;,MB_OKCANCEL);
                      if(mes==IDOK)
                      PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
                      return 0;

                 case IDM_VERYSLOW:
                      SnakeSpeed=256;
                      SetTimer(hwnd,SnakeTimer,SnakeSpeed,NULL);
                      return 0;

                 case IDM_SLOW:
                      SnakeSpeed=128;
                      SetTimer(hwnd,SnakeTimer,SnakeSpeed,NULL);
                      return 0;

                 case IDM_NORMAL:
                      SnakeSpeed=64;
                      SetTimer(hwnd,SnakeTimer,SnakeSpeed,NULL);
                      return 0;

                 case IDM_FAST:
                      SnakeSpeed=32;
                      SetTimer(hwnd,SnakeTimer,SnakeSpeed,NULL);
                      return 0;

                 case IDM_VERYFAST:
                      SnakeSpeed=16;
                      SetTimer(hwnd,SnakeTimer,SnakeSpeed,NULL);
                      return 0;

                 case IDM_EXTFAST:
                      SnakeSpeed=8;
                      SetTimer(hwnd,SnakeTimer,SnakeSpeed,NULL);
                      return 0;

                 case IDM_INFO:
                      pause=1;
                      hdc=GetDC(hwnd);
                      TextOut(hdc,0,ybereich*8,&quot;Game paused&quot;,11);
                      ReleaseDC(hwnd,hdc);
                      KillTimer(hwnd,SnakeTimer);
                      MessageBox(hwnd,szInfo,&quot;Info&quot;,MB_ICONINFORMATION | MB_OK);
                      return 0;

                 case IDM_KILLY:
                      killoncrash=1;
                      return 0;

                 case IDM_KILLN:
                      killoncrash=0;
                      return 0;

             };

        case WM_DESTROY:
            PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
            break;
        default:                      /* for messages that we don't deal with */
            return DefWindowProc (hwnd, message, wParam, lParam);
    }

    return 0;
}
//initialsiert den level
void NewGame(HWND hwnd)
{
     int i,imax,x,y;
     int* plevel;

     for(x=0;x&lt;200;x++)//feld leeren
        for(y=0;y&lt;150;y++)
           feld[x][y]=leer;

     lengh=1;//startlänge:1
     toadd=5;//soll dan auf 6 erhöht werden

     xv=1;//startrichtung;nach rechts
     yv=0;
     stonecount=0;

     pause=0;

     if(levelcount&gt;=levels)levelcount=0;//beim überlauf wieder auf level 0

     plevel=level[levelcount];//pointer initialsieren

     xpos=(xbereich-1)*plevel[0]/1000;//startpunkt holen
     ypos=(ybereich-1)*plevel[1]/1000;

     xbuff[0]=xpos;
     ybuff[0]=ypos;

     feld[xpos][ypos]=schlange;

     imax=plevel[2];

     plevel+=3;

     for(i=0;i&lt;imax;i++)//wände zeichnen
     {
         FeldLine((xbereich-1)*plevel[0]/1000,(ybereich-1)*plevel[1]/1000,(xbereich-1)*plevel[2]/1000,(ybereich-1)*plevel[3]/1000);
         plevel+=4;
     };

     imax=*plevel;
     transer=imax;
     plevel++;

     for(i=0;i&lt;imax;i++)//transformer setzen
     {
         feld[(xbereich-1)*plevel[0]/1000][(ybereich-1)*plevel[1]/1000]=trans;
         feld[(xbereich-1)*plevel[2]/1000][(ybereich-1)*plevel[3]/1000]=trans;

         translistx[i*2]=(xbereich-1)*plevel[0]/1000;
         translistx[i*2+1]=(xbereich-1)*plevel[2]/1000;

         translisty[i*2]=(ybereich-1)*plevel[1]/1000;
         translisty[i*2+1]=(ybereich-1)*plevel[3]/1000;

         plevel+=4;
     };
     //ersten stein berechnen: klappt nicht,wenn man die kommentarstriche wegmacht
     //do
     //{
         x=rand()%(xbereich-1);
         y=rand()%(ybereich-1);
     //}
     //while(feld[x][y]!=leer);

        if(feld[x][y]!=leer)
        {
            x=rand()%(xbereich-1);
            y=rand()%(ybereich-1);
        };

     feld[x][y]=stein;

     InvalidateRect(hwnd,NULL,TRUE);//alles neu zeichnen

     SetTimer(hwnd,SnakeTimer,SnakeSpeed,NULL);//tiemr für die schlange setzen 
};

void FeldLine(unsigned char x1,unsigned char y1,unsigned char x2,unsigned char y2)//wand ins feld zeinen
{ 
	//Routine arbeitet nur mit Integer-Werten - also schnell!
	unsigned char x,y;
	signed char xinc,yinc;
	short d,c,m,hx,hy;
	x = x1;
	y = y1;
	d = 0;
	hx = x2 - x1;                                           //Anzahl der Punkte auf der X-Achse
	hy = y2 - y1;

	xinc = 1;
	yinc = 1;
	if(hx &lt; 0)
    {
		xinc = -1;
		hx *=-1;
	};
	if(hy&lt;0)
	{
		yinc = -1;
		hy*=-1;
	};
	if(hy &lt;= hx)
	{
		c = 2 * hx;
		m = 2 * hy;
		while(x!=x2)
		{
			feld[x][y]=wand;
			x+=xinc;
			d+=m;
			if(d&gt;hx)
			{
				y+=yinc;
				d-=c;
			};
		};
	}
	else
	{
		c = 2 * hy;
		m = 2 * hx;
		while(y!=y2)
		{
			feld[x][y]=wand;
			y+=yinc;
			d+=m;
			if(d&gt;hy)
			{
				x+=xinc;
				d-=c;
			};
		};
	};
	feld[x][y]=wand;
};
</code></pre>
<p>resource.h:</p>
<pre><code class="language-cpp">#define IDM_NEU             200
	#define IDM_BEENDEN         201

	#define IDM_SLOW            202
	#define IDM_NORMAL          203
	#define IDM_FAST           204
	#define IDM_VERYFAST       205
	#define IDM_VERYSLOW       206
	#define IDM_INFO           207
	#define IDM_EXTFAST        208
	#define IDM_RESET          209
	#define IDM_KILLY          210
	#define IDM_KILLN          211
</code></pre>
<p>resource.rc:</p>
<pre><code class="language-cpp">#include &quot;resource.h&quot;

	UNSERMENU MENU
	BEGIN
	     POPUP &quot;&amp;Spiel&quot;
	     BEGIN
	          MENUITEM &quot;&amp;Neues Speiel (F2)&quot;,      IDM_NEU
              MENUITEM &quot;&amp;Level neu starten (F3)&quot;,      IDM_RESET
	          MENUITEM SEPARATOR
	          MENUITEM &quot;B&amp;eenden (ALT+F4)&quot;,    IDM_BEENDEN
	     END
	     POPUP &quot;&amp;Speed&quot;
	     BEGIN
              MENUITEM &quot;&amp;Very slow (1)&quot;,      IDM_VERYSLOW
	          MENUITEM &quot;&amp;Slow (2)&quot;,      IDM_SLOW
	          MENUITEM &quot;&amp;Normal (3)&quot;,    IDM_NORMAL
	          MENUITEM &quot;&amp;Fast (4)&quot;,      IDM_FAST
	          MENUITEM &quot;&amp;Very fast (5)&quot;,      IDM_VERYFAST
	          MENUITEM &quot;&amp;Extremly fast (6)&quot;,      IDM_EXTFAST
	     END
	     POPUP &quot;&amp;Mode&quot;
	     BEGIN
              MENUITEM &quot;&amp;Cut on crash (ALT+C)&quot;,      IDM_KILLN
	          MENUITEM &quot;&amp;Kill on crash (ALT+K)&quot;,      IDM_KILLY
	     END
	     POPUP &quot;&amp;Hülfe&quot;
	     BEGIN
	          MENUITEM &quot;&amp;Info (F1)&quot;,      IDM_INFO
         END
	END

	SHORTCUTS ACCELERATORS
    BEGIN
	     &quot;Q&quot;, IDM_BEENDEN, VIRTKEY, ALT
	     &quot;C&quot;, IDM_KILLN, VIRTKEY, ALT
	     &quot;K&quot;, IDM_KILLY, VIRTKEY, ALT
    END
</code></pre>
<p>Ja, DEV-C++ hat einen, aber ich weiss leider nicht wie man den benutzt.</p>
<p>MfG Mark</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1279758</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1279758</guid><dc:creator><![CDATA[p_mork]]></dc:creator><pubDate>Sun, 06 May 2007 16:22:43 GMT</pubDate></item></channel></rss>