⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 小剑版贪食蛇.cpp

📁 一个简单的贪食蛇游戏
💻 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 + -