#include <windows.h>
#include <stdlib.h>
#include "snake.h"
HMENU hmenu,haddmenu,embed,help;
HBITMAP hBm;
//BITMAP bm;
HDC hDC,hDCbit;
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
PAINTSTRUCT PtStr;
HPEN hPen;
HBRUSH hBrush,hBrush1,hBrush2;
static int x1[num],y1[num],x2[num],y2[num],food_x1,food_y1,food_x2,food_y2;
static int node,food,keynum,direction[10],start=0,flag[3]={0,0,0},showbit=1;
int i,j,k,tem;
static float speed=100.0;
static int game_begin=0;
char show[]="The length are \n GAME OVER!";
switch(message){
case WM_CREATE:
hmenu=CreateMenu();
haddmenu=CreateMenu();
embed=CreateMenu();
AppendMenu(embed,MF_ENABLED,IDM_EASY,"低(&L)");
AppendMenu(embed,MF_ENABLED,IDM_MIDDLE,"中(&M)");
AppendMenu(embed,MF_ENABLED,IDM_HARD,"高(&H)");
InsertMenu(haddmenu,0,MF_POPUP|MF_BYPOSITION,(UINT)embed,"难度(&D)");//embed的三项作为haddmenu的一项
AppendMenu(haddmenu,MF_ENABLED,IDM_START,"游戏开始(&S)");//下面的一句也可以
//InsertMenu(haddmenu,1,MF_POPUP|MF_BYPOSITION,(UINT)IDM_START,"游戏开始(&S)");
AppendMenu(haddmenu,MF_ENABLED,IDM_EXIT,"退出(&Q)");
InsertMenu(hmenu,0,MF_POPUP|MF_BYPOSITION,(UINT)haddmenu,"文件(&F)");
//SetMenu(hwnd,hmenu);
//menu=GetMenu(hwnd);
help=CreateMenu();
InsertMenu(hmenu,1,MF_POPUP|MF_BYPOSITION,IDM_PAUSE,"暂停(&P)");//注意与上面INSERTMENU的区别
InsertMenu(hmenu,2,MF_POPUP|MF_BYPOSITION,IDM_HELP,"关于..(&A)");
SetMenu(hwnd,hmenu);
CheckMenuItem(hmenu,IDM_EASY,MF_CHECKED);//在“低”选项前打勾
hDC=GetDC(hwnd);
hDCbit=CreateCompatibleDC(hDC);//获取内存设备环境句柄
ReleaseDC(hwnd,hDC);
flag[0]=1;
SetTimer(hwnd,1,(int)speed,NULL);
break;
case WM_TIMER:
SendMessage(hwnd,WM_GAME,0,0);
break;
case WM_GAME:
if(start){
SetTimer(hwnd,1,(int)speed,NULL);
//依次取代前一节的位置
for(i=node-1;i>0;i--){
x1[i]=x1[i-1];
y1[i]=y1[i-1];
x2[i]=x2[i-1];
y2[i]=y2[i-1];
}
if(keynum>1){
for(i=0;i<keynum;i++)
direction[i]=direction[i+1];
keynum--;
}
//蛇头位置
if(direction[0]==up){
y1[0]=y1[0]-10;
y2[0]=y2[0]-10;
}
if(direction[0]==down){
y1[0]=y1[0]+10;
y2[0]=y2[0]+10;
}
if(direction[0]==right){
x1[0]=x1[0]+10;
x2[0]=x2[0]+10;
}
if(direction[0]==left){
x1[0]=x1[0]-10;
x2[0]=x2[0]-10;
}
//flagg=1;//蛇头位置变化后才可以变化第二次方向
if(!food){
//
food_x1=rand()%280;
food_y1=rand()%240;
while(food_x1%10) food_x1++;
while(food_y1%10) food_y1++;
for(i=0;i<node;i++)
if(food_x1==x1[i]&&food_y1==y1[i]){
food_x1=rand()%290;
food_y1=rand()%250;
while(food_x1%10) food_x1++;
while(food_y1%10) food_y1++;
i=-1;
}
food_x2=food_x1+9;
food_y2=food_y1+9;
food=1;
}
if(food==1&&x1[0]==food_x1&&y1[0]==food_y1&&x2[0]==food_x2&&y2[0]==food_y2){
node++;
speed=(2.5*speed-1)/2.5;
if((int)speed<1) speed=1;
SetTimer(hwnd,1,(int)speed,NULL);
food=0;
}
if(node>=5){
for(i=4;i<node;i++)
if(x1[0]==x1[i]&&y1[0]==y1[i]&&x2[0]==x2[i]&&y2[0]==y2[i]){
start=0;
game_begin=0;
InvalidateRect(hwnd,NULL,TRUE);//同上,由于是越界判断,故越界后蛇头已经出界
//将会跑出界外
//show[17]='0'+node%10;////////*************************************
//show[16]='0'+node/10%10;
//show[15]='0'+node/100%10;
for(k=0;k<100;k++){
tem=1;
for(j=0;j<k;j++)
tem*=10;
if(!(node/tem)){
//show[15+k]='\0';
break;
}
show[15+k]='0'+node/tem%10;
}//for
for(j=0;j<k/2;j++){
char temp=show[15+j];
show[15+j]=show[15+k-j-1];
show[15+k-j-1]=temp;
}
MessageBox(hwnd,show,"^_^",MB_OK);//点击后之才显示位图
showbit=1;
x1[0]=x2[0]=y1[0]=y2[0]=0;//////////////蛇头与蛇身位置不重合
for(j=1;j<node;j++)
x1[j]=x2[j]=y1[j]=y2[j]=-1;
food_x1=food_x2=food_y1=food_y2=-1;
}
}
if(x1[0]<-1||x2[0]>299||y1[0]<0||y2[0]>252){
start=0;
game_begin=0;
InvalidateRect(hwnd,NULL,TRUE);//死后最后的刷新不会被执行,蛇的最后一节将不会显示
//更在此处需刷新
//show[17]='0'+node%10;////////*************************************
//show[16]='0'+node/10%10;
//show[15]='0'+node/100%10;
for(k=0;k<100;k++){
tem=1;
for(j=0;j<k;j++)
tem*=10;
if(!(node/tem)){
//show[15+k]='\0';
break;
}
show[15+k]='0'+node/tem%10;
}//for
for(j=0;j<k/2;j++){
char temp=show[15+j];
show[15+j]=show[15+k-j-1];
show[15+k-j-1]=temp;
}
MessageBox(hwnd,show,"^_^",MB_OK);
showbit=1;
for(i=0;i<node;i++)
x1[i]=x2[i]=y1[i]=y2[i]=-1;
food_x1=food_x2=food_y1=food_y2=-1;
}
InvalidateRect(hwnd,NULL,TRUE);
}
break;
case WM_KEYDOWN:
//if(flagg){//用flag限制在蛇头位置没有变化的时候发生两次方向改变,
//如:原来蛇向右行,按向下后再按向左,若太快则会导致蛇逆向行,会判断死亡
if(LOWORD(wParam)==VK_UP){
if(start&&direction[keynum-1]!=down&&direction[keynum-1]!=up){
direction[keynum++]=up;
}
}
else if(LOWORD(wParam)==VK_DOWN){
if(start&&direction[keynum-1]!=up&&direction[keynum-1]!=down){
direction[keynum++]=down;
}
}
else if(LOWORD(wParam)==VK_LEFT){
if(start&&direction[keynum-1]!=right&&direction[keynum-1]!=left){
direction[keynum++]=left;
}
}
else if(LOWORD(wParam)==VK_RIGHT){
if(start&&direction[keynum-1]!=left&&direction[keynum-1]!=right){
direction[keynum++]=right;
}
}
else if(LOWORD(wParam)==VK_SPACE){ //响应空格键暂停/启动
if(start){
start=0;
game_begin=1;
ModifyMenu(hmenu,1,MF_BYPOSITION,IDM_RESTART,"继续(&R)");
DrawMenuBar(hwnd);//为指定的窗口重画菜单
}
else if(game_begin){
start=1;
ModifyMenu(hmenu,1,MF_BYPOSITION,IDM_PAUSE,"暂停(&P)");
DrawMenuBar(hwnd);//为指定的窗口重画菜单
}
}
//flagg=0;//禁止连续按两次方向
//}
break;
case WM_PAINT:
hDC=BeginPaint(hwnd,&PtStr);
SetMapMode(hDC,MM_ANISOTROPIC);
if(showbit){///显示位图
SelectObject(hDCbit,hBm);
BitBlt(hDC,0,0,306,302,hDCbit,0,0,SRCCOPY);
}
hPen=(HPEN)GetStockObject(BLACK_PEN);
SelectObject(hDC,hPen);
//hBrush=(HBRUSH)GetStockObject(DC_BRUSH);
for(i=0;i<node;i++){
if(i==0){
hBrush1=CreateSolidBrush(RGB(255,120,0));
SelectObject(hDC,hBrush1);
}
if(i>0){
hBrush2=CreateSolidBrush(RGB(i*3%255,255,0));
SelectObject(hDC,hBrush2);
}
Rectangle(hDC,x1[i],y1[i],x2[i],y2[i]);
if(i==0){
SelectObject(hDC,hBrush1);
DeleteObject(hBrush1);
}
SelectObject(hDC,hBrush2);
DeleteObject(hBrush2);
}
if(food){
hBrush2=CreateSolidBrush(RGB(i*3%255,255,0));
SelectObject(hDC,hBrush2);
Rectangle(hDC,food_x1,food_y1,food_x2,food_y2);
SelectObject(hDC,hBrush2);
DeleteObject(hBrush2);
}
EndPaint(hwnd,&PtStr);
break;
case WM_COMMAND:
switch(LOWORD(wParam)){
case IDM_START:
DeleteObject(hBm);
//DeleteDC(hDCbit);
for(k=0;k<1000;k++)
x1[k]=y1[k]=x2[k]=y2[k]=0;
x1[0]=10;
y1[0]=100;
x2[0]=19;
y2[0]=109;
direction[0]=right;
food=0;
showbit=0;
//for(i=1;i<node;i++)//死亡时已经设置
// x1[i]=x2[i]=y1[i]=y2[i]=-1;
if(flag[0]==1) speed=100;
else if(flag[1]==1) speed=70;
else if(flag[2]==1) speed=40;
node=1;
keynum=1;
start=1;
if(game_begin==1){
ModifyMenu(hmenu,1,MF_BYPOSITION,IDM_PAUSE,"暂停(&P)");
DrawMenuBar(hwnd);//为指定的窗口重画菜单
game_begin=0;
}
/////////ModifyMenu(hmenu,1,MF_BYPOSITION,NULL,"暂停(&P)");
break;
case IDM_EASY:
CheckMenuItem(hmenu,IDM_MIDDLE,MF_UNCHECKED);
CheckMenuItem(hmenu,IDM_HARD,MF_UNCHECKED);
CheckMenu