看Windows程序有段时间了,终于动手写东西。贪吃蛇算是一个开始吧,下面的贪吃蛇很简单,也有很多地方需要修改,还有情况没有考虑QAQ 但这不是我的目的了。。。
思路很简单:建个链表储存蛇身节点即可。
#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>
原文:http://www.cnblogs.com/duanyuanzhi/p/3980043.html
【说明】:本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!