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

📄 tanchishe.txt

📁 VC6.0上编写的贪吃蛇程序。内容很详细
💻 TXT
字号:
#include "stdafx.h" 
#include "Snake.h" 
#include "mmsystem.h"  
#include <windows.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]; 
////////////////////////////////////////////////////////////////////////////////////////// 
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,  
 
 
  
 作者: 黑的发紫   2008-2-25 14:54   回复此发言    
 
--------------------------------------------------------------------------------
 
2 [小剑版 贪食蛇][VC6.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() 
{ 
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; 
 
 
  
 作者: 黑的发紫   2008-2-25 14:54   回复此发言    
 
--------------------------------------------------------------------------------
 
3 [小剑版 贪食蛇][VC6.0完成]  
 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:  
   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; 
 
 
  
 作者: 黑的发紫   2008-2-25 14:54   回复此发言    
 
--------------------------------------------------------------------------------
 
4 [小剑版 贪食蛇][VC6.0完成]  
        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); 
} 
 
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -