当前位置:首页 > 操作系统 > Windows

Windows程序设计 贪吃蛇c

看Windows程序有段时间了,终于动手写东西。贪吃蛇算是一个开始吧,下面的贪吃蛇很简单,也有很多地方需要修改,还有情况没有考虑QAQ 但这不是我的目的了。。。

思路很简单:建个链表储存蛇身节点即可。

bubuko.com,布布扣

bubuko.com,布布扣 bubuko.com,布布扣
#include <windows.h><span>
#include </span><time.h>

<span>#define</span> ID_TIMER    1   
<span>#define</span> TIMERSET    600 
<span>char</span>    score,temp=<span>0</span><span>;  
</span><span>int</span><span>     flag,tempx,tempy,
        foodx,foody,key;</span><span>//</span><span>运动方向,食物坐标,标记</span><span>bool</span>    havebody[<span>50</span>][<span>50</span><span>]; 
</span><span>bool</span>    over = <span>false</span><span>;

</span><span>struct</span><span> Snake
{
    Snake </span>*<span>next;
    </span><span>int</span><span> x;
    </span><span>int</span><span> y;
}; 
</span><span>struct</span> Snake *<span>head;
</span><span>struct</span> Snake *creat()<span>//</span><span>链表初始化</span><span>{
    </span><span>struct</span> Snake *p1,*p2,*<span>p3;
    head</span>=(<span>struct</span> Snake*)malloc(<span>sizeof</span><span>(Snake));
    p1</span>=(<span>struct</span> Snake*)malloc(<span>sizeof</span><span>(Snake));
    p2</span>=(<span>struct</span> Snake*)malloc(<span>sizeof</span><span>(Snake));
    p3</span>=(<span>struct</span> Snake*)malloc(<span>sizeof</span><span>(Snake));
    
    head</span>->x=<span>23</span>;head->y=<span>23</span><span>;
    head</span>->next=<span>p1;
    p1</span>->x=<span>24</span>;p1->y=<span>23</span><span>;
    p1</span>->next=<span>p2; 
    p2</span>->x=<span>25</span>;p2->y=<span>23</span><span>;
    p2</span>->next=<span>p3; 
    p3</span>->x=<span>26</span>;p3->y=<span>23</span><span>;
    p3</span>->next=<span>NULL; 
    </span><span>return</span><span> head;
};
        
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

</span><span>int</span> WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, <span>int</span><span> nCmdShow)
{
    TCHAR        szAppName[]    </span>= TEXT(<span>"</span><span>dy</span><span>"</span><span>);
    WNDCLASS    wndcls;
    wndcls.cbClsExtra        </span>= <span>0</span><span>;
    wndcls.cbWndExtra        </span>= <span>0</span><span>;
    wndcls.hbrBackground    </span>=<span> (HBRUSH) GetStockObject(WHITE_BRUSH);
    wndcls.hCursor            </span>=<span> LoadCursor(hInstance, IDC_ARROW);
    wndcls.hIcon            </span>=<span> LoadIcon(hInstance, IDI_APPLICATION);
    wndcls.hInstance        </span>=<span> hInstance;
    wndcls.lpfnWndProc        </span>=<span> WndProc;
    wndcls.lpszClassName    </span>=<span> szAppName;
    wndcls.lpszMenuName        </span>=<span> NULL;
    wndcls.style            </span>= CS_HREDRAW |<span> CS_VREDRAW;
    RegisterClass(</span>&<span>wndcls);

    HWND hwnd </span>= CreateWindow (szAppName, TEXT (<span>"</span><span>dyww</span><span>"</span><span>),
                          WS_OVERLAPPEDWINDOW,
                           </span><span>300</span>, <span>100</span><span>,
                          </span><span>390</span>, <span>400</span><span>,
                          NULL, NULL, hInstance, NULL) ;
     
    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

    MSG msg;
    </span><span>while</span>(GetMessage(&msg, NULL, <span>0</span>, <span>0</span><span>))
    {
        TranslateMessage(</span>&<span>msg);
        DispatchMessage(</span>&<span>msg);
    }
    </span><span>return</span><span> msg.wParam;
}

</span><span>void</span> food(HWND hwnd)<span>//</span><span>食物</span><span>{
    foodx </span>= rand() % <span>37</span>, foody = rand() %<span>36</span><span>;
    </span><span>while</span><span>(havebody[foodx][foody])
    {
        foodx </span>= rand() % <span>37</span>, foody = rand() % <span>36</span><span>;
    }
    havebody[foodx][foody] </span>= <span>true</span><span>;
    InvalidateRect(hwnd, NULL, TRUE);
}

</span><span>void</span>  checkdeath()<span>//</span><span>检查是否死亡</span><span>{
    Snake </span>*p= head,*<span>end;
    </span><span>do</span><span>
    {    
        p</span>=p-><span>next;
    }</span><span>while</span>(p->next!=<span>NULL);
    end</span>=<span>p;
    </span><span>if</span>(p->x <<span>0</span>||p->x ><span>36</span> ||    p->y <<span>0</span> ||    p->y ><span>35</span><span>)
    over</span>=<span>true</span><span>;
    p</span>=head-><span>next;
    </span><span>do</span><span>
    {
        </span><span>if</span>(p->x==end->x&&p->y==end->y){over=<span>true</span><span>;}
        p</span>=p-><span>next;
    }</span><span>while</span>(p->next!=<span>NULL);
}        
</span><span>bool</span> havefood(Snake *<span>p)
{
    </span><span>if</span>(foodx==p->x&&foody==p-><span>y)
        </span><span>return</span><span>true</span><span>;
    </span><span>else</span><span>return</span><span>false</span><span>;
}

</span><span>struct</span> Snake *insert(<span>int</span> x,<span>int</span> y)<span>//</span><span>插入节点</span><span>{
    </span><span>struct</span> Snake *p1,*<span>p;
    p</span>=(<span>struct</span> Snake*)malloc(<span>sizeof</span><span>(Snake));
    p1</span>=<span>head;
    p</span>->x=head->x;p->y=head-><span>y;
    p</span>->next=head-><span>next;
    head</span>->x=tempx;head->y=<span>tempy;
    head</span>->next=<span>p;
    havebody[head</span>->x][head->y]=<span>true</span><span>;
    </span><span>return</span><span> head;
};

Snake  </span>*<span>mainrun(HWND hwnd)
{
    </span><span>struct</span> Snake *<span>p;
    p</span>=<span>head;
    </span><span>int</span> temp=<span>0</span>,deadfood=<span>0</span><span>;
    tempx</span>=p->x;tempy=p->y;<span>//</span><span>储存头节点的值</span><span>do</span><span>
        {        
            </span><span>if</span>(p->next!=<span>NULL){
                </span><span>if</span>(temp==<span>0</span>){havebody[p->x][p->y]=<span>false</span>; p->x=p->next->x;p->y=p->next->y;havebody[p->x][p->y]=<span>true</span>;temp++<span>;}
            </span><span>else</span><span> 
                {p</span>->x=p->next->x;p->y=p->next->y;havebody[p->x][p->y]=<span>true</span><span>;}}        
            p</span>=p-><span>next;    
        }</span><span>while</span>(p->next!=<span>NULL);
        </span><span>//</span><span>havebody[p->x][p->y]=false;</span><span>if</span>(flag==<span>1</span>) p->x--<span>;
        </span><span>if</span>(flag==<span>2</span>) p->y--<span>;
        </span><span>if</span>(flag==<span>3</span>) p->x++<span>;
        </span><span>if</span>(flag==<span>4</span>) p->y++<span>;
        </span><span>if</span>(havefood(p))  {insert(tempx,tempy);deadfood=<span>1</span>;score+=<span>1</span><span>;}
        checkdeath();    
        havebody[p</span>->x][p->y]=<span>true</span><span>;
        InvalidateRect(hwnd, NULL, TRUE);
    </span><span>if</span><span>(deadfood)  food(hwnd);
    </span><span>return</span><span> head;    
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)</span><span>//</span><span>窗口过程</span><span>{
    HDC                hdc;
    PAINTSTRUCT        ps;
    TCHAR            szScore[]</span>=TEXT(<span>"</span><span>GAME OVER 得分:</span><span>"</span><span>),
                    szBuffer[</span><span>20</span><span>];
                
    </span><span>int</span><span>                x, y;

    </span><span>switch</span><span>(message)
    {
    </span><span>case</span> WM_CREATE:<span>//</span><span>各种初始化</span>
        flag=<span>3</span>;key=<span>1</span>;score=<span>0</span><span>;
        srand(time(NULL));
        creat();
        food(hwnd);
        havebody[foodx][foody]</span>=<span>true</span><span>;
        SetTimer(hwnd, ID_TIMER, TIMERSET, NULL);
        </span><span>return</span><span>0</span><span>;

    </span><span>case</span><span> WM_TIMER:    
        mainrun(hwnd);
        </span><span>if</span><span>(over)
        {
            KillTimer(hwnd, ID_TIMER);
            InvalidateRect(hwnd, NULL, TRUE);
        }
        </span><span>else</span><span> InvalidateRect(hwnd, NULL, TRUE);
        </span><span>return</span><span>0</span><span>;

    </span><span>case</span><span> WM_KEYDOWN:
        </span><span>if</span>(over) <span>return</span><span>0</span><span>;
        </span><span>switch</span><span>(wParam)
        {
        </span><span>case</span><span> VK_UP:
            </span><span>if</span>(flag != <span>4</span><span>)
            {
                flag </span>= <span>2</span><span>;
                mainrun(hwnd);
            }
            </span><span>break</span><span>;
        </span><span>case</span><span> VK_DOWN:
            </span><span>if</span>(flag != <span>2</span><span>)
            {
                flag </span>= <span>4</span><span>;
                mainrun(hwnd);
            }
            </span><span>break</span><span>;
        </span><span>case</span><span> VK_LEFT:
            </span><span>if</span>(flag != <span>3</span><span>)
            {
            flag </span>= <span>1</span><span>;
                mainrun(hwnd);
            }
            </span><span>break</span><span>;
        </span><span>case</span><span> VK_RIGHT:
            </span><span>if</span>(flag != <span>1</span><span>)
            {
                flag </span>= <span>3</span><span>;
                mainrun(hwnd);
            }
            </span><span>break</span><span>;
        </span><span>default</span><span>:
            </span><span>break</span><span>;
        }
        </span><span>return</span><span>0</span><span>;

    </span><span>case</span><span> WM_PAINT:
        hdc </span>= BeginPaint(hwnd, &<span>ps);
        Rectangle(hdc,</span><span>0</span>, <span>0</span>,    <span>370</span>, <span>360</span><span>);
        </span><span>if</span><span>(over)
            {SelectObject(hdc, GetStockObject(RGB(</span><span>100</span>,<span>255</span>,<span>0</span>)));Rectangle(hdc,<span>0</span>, <span>0</span>,    <span>370</span>, <span>360</span><span>);
            TextOut(hdc, </span><span>140</span>, <span>130</span><span>, szScore, lstrlen(szScore));
            TextOut(hdc, </span><span>178</span>, <span>160</span>,    szBuffer, wsprintf(szBuffer, TEXT(<span>"</span><span>%4d</span><span>"</span><span>), score));
            </span><span>//</span><span>TextOut(hdc, 198, 190,    szBuffer, wsprintf(szBuffer, TEXT("%4d"), temp));</span><span>            }
         SelectObject(hdc, GetStockObject(BLACK_BRUSH));
        </span><span>for</span>(x = <span>0</span>; x <<span>37</span>; x++<span>)
            </span><span>for</span>(y = <span>0</span>; y <<span>36</span>; y++<span>)
            {    </span><span>if</span><span>(havebody[x][y])
                    Rectangle(hdc,x</span>*<span>10</span>,y*<span>10</span>,(x+<span>1</span>)*<span>10</span>,(y+<span>1</span>)*<span>10</span><span>);
            }
        EndPaint (hwnd, </span>&<span>ps) ;
        </span><span>return</span><span>0</span><span>;

    </span><span>case</span><span> WM_DESTROY:
        KillTimer(hwnd, ID_TIMER);
        PostQuitMessage(</span><span>0</span><span>);
        </span><span>return</span><span>0</span><span>;
    }
    </span><span>return</span><span> DefWindowProc(hwnd, message, wParam, lParam);
}</span>
View Code

 

原文:http://www.cnblogs.com/duanyuanzhi/p/3980043.html


【说明】本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!

相关教程推荐

其他课程推荐