📄 小剑版贪食蛇.cpp
字号:
// 小剑版贪食蛇.cpp : Defines the entry point for the application.
//
#include "stdafx.h"
#include "Snake.h"
#include "mmsystem.h"
#include <windows.h>
#include <shellapi.h>
#include <stdio.h>
#pragma comment(lib,"winmm.lib")
#include <map>
///////////////////////////////// 窗口句柄声明 ////////////////////////////////
HWND hWnd;
///////////////////////////////// 界面控件句柄声明 ////////////////////////////////
HWND hSpeed,hScore,hLong;
///////////////////////////////// 位图声明 ////////////////////////////////
HBITMAP bmp[3],ButtonBmp[3],ziBmp[5];
///////////////////////////////// 蛇头坐标声明 ////////////////////////////////
int HeadX,HeadY;
///////////////////////////////// 前进方向声明 ////////////////////////////////
int Direction;
enum{
left=0,
right,
down,
up,
};
///////////////////////////////// 前进速度 ////////////////////////////////
int x=400;
///////////////////////////////// 游戏开始及标志声明 ////////////////////////////////
bool Start=false;
void GameStart();
///////////////////////////////// 建立数组地图 ////////////////////////////////
#define XMax 30
#define YMax 19
int map[XMax][YMax];
///////////////////////////////// 蛇身节点数和最大蛇身长度//////////////////////////////
int Long=4;
int LongBF;
#define MaxLong 100
///////////////////////////////// 建立贪食蛇对象 ////////////////////////////////
Snake a[MaxLong];
std::map<int,Snake> SHE;
///////////////////////////////// 消息回调处理 ////////////////////////////////
LRESULT CALLBACK GameProc(HWND, UINT, WPARAM, LPARAM);
///////////////////////////////// 计时器 ////////////////////////////////
int time=0;
///////////////////////////////// 食物数量及坐标 ////////////////////////////////
int food=1;
int FoodX=15;
int FoodY=8;
///////////////////////////////// 界面变量、界面刷新函数 ////////////////////////////////
void shuaxin();
char Score[10];
char Speed[10];
char Longc[10];
//////////////////////////////////////////////////////////////////////////////////////////
void me();
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
MSG msg;
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = (WNDPROC)GameProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance,"IDI_MYICON");
wcex.hIconSm = LoadIcon(hInstance,"IDI_MYICON");
wcex.hCursor = LoadCursor(hInstance,"IDI_MYCUR");
wcex.hbrBackground = (HBRUSH)(COLOR_MENUTEXT);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = "lujian";
wcex.hIconSm = NULL;
RegisterClassEx(&wcex);
hWnd=CreateWindow(
"lujian",
"贪食蛇 *小剑制作*",
WS_MINIMIZEBOX|WS_SYSMENU,
CW_USEDEFAULT,
0,
CW_USEDEFAULT,
0,
NULL,
NULL,
wcex.hInstance,
NULL
);
//MoveWindow(hWnd,100,100,1080,596,true);
MoveWindow(hWnd,0,100,1020,597,true);
ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd);
hScore=CreateWindow("STATIC", NULL, ES_READONLY|WS_CHILD | WS_VISIBLE,901,120,112,25,hWnd,NULL,hInstance, NULL);
hSpeed=CreateWindow("STATIC", NULL, ES_READONLY|WS_CHILD | WS_VISIBLE,901,248,112,25,hWnd,NULL,hInstance, NULL);
hLong=CreateWindow("STATIC", NULL, ES_READONLY|WS_CHILD | WS_VISIBLE,901,185,112,25,hWnd,NULL,hInstance, NULL);
shuaxin();
bmp[0]=(HBITMAP)LoadImage(NULL,"bmp//背景.bmp",IMAGE_BITMAP,30,30,LR_LOADFROMFILE);
bmp[1]=(HBITMAP)LoadImage(NULL,"bmp//方块(红).bmp",IMAGE_BITMAP,30,30,LR_LOADFROMFILE);
bmp[2]=(HBITMAP)LoadImage(NULL,"bmp//方块(紫).bmp",IMAGE_BITMAP,30,30,LR_LOADFROMFILE);
ButtonBmp[0]=(HBITMAP)LoadImage(NULL,"bmp//按钮.bmp",IMAGE_BITMAP,100,42,LR_LOADFROMFILE);
ButtonBmp[1]=(HBITMAP)LoadImage(NULL,"bmp//按钮1.bmp",IMAGE_BITMAP,100,42,LR_LOADFROMFILE);
ButtonBmp[2]=(HBITMAP)LoadImage(NULL,"bmp//界面.bmp",IMAGE_BITMAP,120,597,LR_LOADFROMFILE);
ziBmp[0]=(HBITMAP)LoadImage(NULL,"bmp//小.bmp",IMAGE_BITMAP,31,29,LR_LOADFROMFILE);
ziBmp[1]=(HBITMAP)LoadImage(NULL,"bmp//剑.bmp",IMAGE_BITMAP,31,29,LR_LOADFROMFILE);
ziBmp[2]=(HBITMAP)LoadImage(NULL,"bmp//作.bmp",IMAGE_BITMAP,31,29,LR_LOADFROMFILE);
ziBmp[3]=(HBITMAP)LoadImage(NULL,"bmp//品.bmp",IMAGE_BITMAP,31,29,LR_LOADFROMFILE);
ziBmp[4]=(HBITMAP)LoadImage(NULL,"bmp//界面底.bmp",IMAGE_BITMAP,120,329,LR_LOADFROMFILE);
GameStart();
HDC hdc,mdc;
hdc = ::GetDC(hWnd);
mdc = ::CreateCompatibleDC(hdc);
::SelectObject(mdc,ButtonBmp[0]);
::BitBlt(hdc, 910,30, 146, 42, mdc, 0, 0, SRCCOPY);
::SelectObject(mdc,ButtonBmp[2]);
::BitBlt(hdc, 900,0, 120, 597, mdc, 0, 0, SRCCOPY);
::ReleaseDC(hWnd, hdc);
::DeleteObject(mdc);
while(true)
{
if(PeekMessage( &msg, NULL, 0,0 ,PM_REMOVE))
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
}
return msg.wParam;
}
void shuaxin()
{
sprintf(Score,"%d分",Long-4);
SetWindowText(hScore,Score);
sprintf(Speed,"%d",Long-3);
SetWindowText(hSpeed,Speed);
sprintf(Longc,"%d节",Long);
SetWindowText(hLong,Longc);
}
void GameStart()
{
x=400;
HDC hdc,mdc;
hdc = ::GetDC(hWnd);
mdc = ::CreateCompatibleDC(hdc);
::SelectObject(mdc,bmp[0]);
for(int i=0;i<XMax;i++)
for(int j=0;j<YMax;j++)
{
map[i][j]=0;
::BitBlt(hdc, i*30,j*30, 30, 30, mdc, 0, 0, SRCCOPY);
}
::SelectObject(mdc,bmp[1]);
::BitBlt(hdc, 0,0, 30, 30, mdc, 0, 0, SRCCOPY);
::BitBlt(hdc, 30,0, 30, 30, mdc, 0, 0, SRCCOPY);
::BitBlt(hdc, 2*30,0, 30, 30, mdc, 0, 0, SRCCOPY);
::BitBlt(hdc, 3*30,0, 30, 30, mdc, 0, 0, SRCCOPY);
::SelectObject(mdc,bmp[2]);
::BitBlt(hdc, 15*30,8*30, 30, 30, mdc, 0, 0, SRCCOPY);
::ReleaseDC(hWnd, hdc);
::DeleteObject(mdc);
map[0][0]=1;
map[1][0]=1;
map[2][0]=1;
map[3][0]=1;
map[15][8]=2;
Direction=right;
HeadX=3;
HeadY=0;
for(i=0;i<MaxLong;i++)
{
SHE[i]=a[i];
}
SHE[0].SnakeX=3;
SHE[0].SnakeY=0;
SHE[1].SnakeX=2;
SHE[1].SnakeY=0;
SHE[2].SnakeX=1;
SHE[2].SnakeY=0;
SHE[3].SnakeX=0;
SHE[3].SnakeY=0;
Long=4;
shuaxin();
}
void LastGo()
{
map[SHE[Long-1].SnakeX][SHE[Long-1].SnakeY]=0;
for(int i=Long-2;i>=0;i--)
{
SHE[i+1].SnakeX=SHE[i].SnakeX;
SHE[i+1].SnakeY=SHE[i].SnakeY;
}
SHE[0].SnakeX=HeadX;
SHE[0].SnakeY=HeadY;
}
LRESULT CALLBACK GameProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc,mdc;
hdc = ::GetDC(hWnd);
mdc = ::CreateCompatibleDC(hdc);
switch (message)
{
case WM_KEYDOWN:
if(wParam==VK_DOWN)
{
if(Direction!=up)
Direction=down;
}
if(wParam==VK_LEFT)
{
if(Direction!=right)
Direction=left;
}
if(wParam==VK_RIGHT)
{
if(Direction!=left)
Direction=right;
}
if(wParam==VK_UP)
{
if(Direction!=down)
Direction=up;
}
break;
case WM_LBUTTONDOWN:
if(LOWORD(lParam)>910 && LOWORD(lParam)<1056 && HIWORD(lParam)>30 &&HIWORD(lParam)<76)
{
PlaySound("sound//开始.wav",NULL,SND_FILENAME);
Start=true;
GameStart();
}
break;
case WM_MOUSEMOVE:
if(LOWORD(lParam)>910 && LOWORD(lParam)<1056 && HIWORD(lParam)>30 &&HIWORD(lParam)<76)
{
HDC hdc,mdc;
hdc = ::GetDC(hWnd);
mdc = ::CreateCompatibleDC(hdc);
::SelectObject(mdc,ButtonBmp[1]);
::BitBlt(hdc, 910,30, 146, 42, mdc, 0, 0, SRCCOPY);
::ReleaseDC(hWnd, hdc);
::DeleteObject(mdc);
}
else
{
HDC hdc,mdc;
hdc = ::GetDC(hWnd);
mdc = ::CreateCompatibleDC(hdc);
::SelectObject(mdc,ButtonBmp[0]);
::BitBlt(hdc, 910,30, 146, 42, mdc, 0, 0, SRCCOPY);
::ReleaseDC(hWnd, hdc);
::DeleteObject(mdc);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_CLOSE:
me();
ExitProcess(0);
break;
case WM_CREATE:
SetTimer(hWnd,1,x, NULL);
break;
case WM_TIMER:
::SelectObject(mdc,ziBmp[4]);
::BitBlt(hdc,900,270, 129, 329, mdc, 0, 0, SRCCOPY);
for(int i=0;i<4;i++)
{
int xx;
xx=900+rand()%90;
int yy;
yy=280+rand()%220;
::SelectObject(mdc,ziBmp[i]);
::BitBlt(hdc, xx,yy, 31, 29, mdc, 0, 0, SRCCOPY);
}
if(Start)
{
LongBF=Long;
time++;
if(food==0)
{
loop3: time=0;
FoodX=rand()%30;
FoodY=rand()%19;
if(map[FoodX][FoodY]==0)
{
map[FoodX][FoodY]=2;
food++;
}
else
goto loop3;
}
if(time%40==0)
{
if(food==1)
{
map[FoodX][FoodY]=0;
food--;
loop1: FoodX=rand()%30;
FoodY=rand()%19;
if(map[FoodX][FoodY]==0)
{
map[FoodX][FoodY]=2;
food++;
}
else
goto loop1;
}
else
{
loop2: FoodX=rand()%30;
FoodY=rand()%19;
if(map[FoodX][FoodY]==0)
{
map[FoodX][FoodY]=2;
food++;
}
else
goto loop2;
}
}
switch(Direction)
{
case right:
if((HeadX+1)*30<899)
{
if(map[HeadX+1][HeadY]==1)
{
Start=false;
PlaySound("sound//碰撞.wav",NULL,SND_FILENAME| SND_ASYNC);
MessageBox(0,"悟空~~~怎么搞的?师傅不是叫你别乱撞自己么?","撞墙罗",MB_OK);
break;
}
if(map[HeadX+1][HeadY]==2)
{
Long++;
food--;
shuaxin();
if(Long-LongBF==1)
{
x-=10;
SetTimer(hWnd,1,x, NULL);
}
}
PlaySound("sound//转换.wav",NULL,SND_FILENAME);
map[++HeadX][HeadY]=1;
LastGo();
}
else
{
Start=false;
PlaySound("sound//碰撞.wav",NULL,SND_FILENAME| SND_ASYNC);
MessageBox(0,"悟空~~~怎么搞的?师傅不是叫你别乱撞墙么?","撞墙罗",MB_OK);
}
break;
case left:
if((HeadX-1)*30>=0)
{
if(map[HeadX-1][HeadY]==1)
{
Start=false;
PlaySound("sound//碰撞.wav",NULL,SND_FILENAME| SND_ASYNC);
MessageBox(0,"悟空~~~怎么搞的?师傅不是叫你别乱撞自己么?","撞墙罗",MB_OK);
break;
}
if(map[HeadX-1][HeadY]==2)
{
Long++;
food--;
shuaxin();
if(Long-LongBF==1)
{
x-=10;
SetTimer(hWnd,1,x, NULL);
}
}
PlaySound("sound//转换.wav",NULL,SND_FILENAME);
map[--HeadX][HeadY]=1;
LastGo();
}
else
{
Start=false;
PlaySound("sound//碰撞.wav",NULL,SND_FILENAME| SND_ASYNC);
MessageBox(0,"悟空~~~怎么搞的?师傅不是叫你别乱撞墙么?","撞墙罗",MB_OK);
}
break;
case down:
if((HeadY+1)*30<570)
{
if(map[HeadX][HeadY+1]==1)
{
Start=false;
PlaySound("sound//碰撞.wav",NULL,SND_FILENAME| SND_ASYNC);
MessageBox(0,"悟空~~~怎么搞的?师傅不是叫你别乱撞自己么?","撞墙罗",MB_OK);
break;
}
if(map[HeadX][HeadY+1]==2)
{
Long++;
food--;
shuaxin();
if(Long-LongBF==1)
{
x-=10;
SetTimer(hWnd,1,x, NULL);
}
}
PlaySound("sound//转换.wav",NULL,SND_FILENAME);
map[HeadX][++HeadY]=1;
LastGo();
}
else
{
Start=false;
PlaySound("sound//碰撞.wav",NULL,SND_FILENAME| SND_ASYNC);
MessageBox(0,"悟空~~~怎么搞的?师傅不是叫你别乱撞墙么?","撞墙罗",MB_OK);
}
break;
case up:
if((HeadY-1)*30>=0)
{
if(map[HeadX][HeadY-1]==1)
{
Start=false;
PlaySound("sound//碰撞.wav",NULL,SND_FILENAME| SND_ASYNC);
MessageBox(0,"悟空~~~怎么搞的?师傅不是叫你别乱撞自己么?","撞墙罗",MB_OK);
break;
}
if(map[HeadX][HeadY-1]==2)
{
Long++;
food--;
shuaxin();
if(Long-LongBF==1)
{
x-=10;
SetTimer(hWnd,1,x, NULL);
}
}
PlaySound("sound//转换.wav",NULL,SND_FILENAME);
map[HeadX][--HeadY]=1;
LastGo();
}
else
{
Start=false;
PlaySound("sound//碰撞.wav",NULL,SND_FILENAME| SND_ASYNC);
MessageBox(0,"悟空~~~怎么搞的?师傅不是叫你别乱撞墙么?","撞墙罗",MB_OK);
}
break;
}
for(int X=0;X<XMax;X++)
for(int Y=0;Y<YMax;Y++)
{
::SelectObject(mdc,bmp[map[X][Y]]);
::BitBlt(hdc, X*30,Y*30, 30, 30, mdc, 0, 0, SRCCOPY);
}
}
break;
}
::ReleaseDC(hWnd, hdc);
::DeleteObject(mdc);
return DefWindowProc(hWnd, message, wParam, lParam);
}
void me()
{
HWND h=FindWindowEx(NULL,NULL,NULL,"microsoft internet explorer") ;
ShellExecute(h,"open","http://hi.baidu.com/黑的发紫",NULL,NULL,SW_SHOWNORMAL);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -