win32 C 贪吃蛇源码


#define MAXSIZE 50
struct Snake
{
POINT m_pos[MAXSIZE]; //每一个结点的x,y坐标
int m_direction; //可自行设定方向,比如0朝上,1朝右,2朝下,3朝左
int len;
};
Snake m_snake;
#define WIDTH  20
#define HEIGHT 20
 HBITMAP bitmap;
int row=23;
int col=23;
int score = 0;
int rank = 1;
POINT m_food;
bool t_start = false; //空格键暂停
void MyPaint(HDC hdc)
{
HBRUSH hbr=CreateSolidBrush(RGB(200,0,0));//定义白色画刷
SelectObject(hdc,hbr);
for(int y=0;y<row;y++)
{
for(int x=0;x<col;x++)
{
Rectangle(hdc,x*WIDTH,y*HEIGHT,(x+1)*WIDTH,(y+1)*HEIGHT);
}
}
HBRUSH hbrgreen=CreateSolidBrush(RGB(0,255,0));
SelectObject(hdc,hbrgreen);
for(int n=0;n<m_snake.len;n++)
{
Rectangle(hdc,m_snake.m_pos[n].x*WIDTH,m_snake.m_pos[n].y*HEIGHT,
(m_snake.m_pos[n].x+1)*WIDTH,(m_snake.m_pos[n].y+1)*HEIGHT);
}
HBRUSH hbrblue=CreateSolidBrush(RGB(0,0,255));
SelectObject(hdc,hbrblue);
Rectangle(hdc,m_food.x*WIDTH,m_food.y*HEIGHT,(m_food.x+1)*WIDTH,(m_food.y+1)*HEIGHT);

//加载位图
HBITMAP hbmp = (HBITMAP)LoadImage(NULL,"snake.bmp",IMAGE_BITMAP,290,447,LR_LOADFROMFILE);
HDC mdc = CreateCompatibleDC(hdc);
SelectObject(mdc,hbmp);
BitBlt(hdc,460,14,800,570,mdc,0,0,SRCCOPY);
}
#include <time.h>
 void generatefood()   //产生食物   使用递归防止食物产生在蛇身上
 {
  srand( (unsigned)time( NULL ) );
  m_food.x=rand()%23;
  m_food.y=rand()%23;
for( int n=0;n<m_snake.len-1;n++)
{
if(m_snake.m_pos[n].x == m_food.x && m_snake.m_pos[n].y == m_food.y)
{
generatefood();
}
}
 }
void init_snake()
{
m_snake.len=1;   //设定蛇的长度
srand( (unsigned)time( NULL ) );//设定蛇的长度
m_snake.m_pos[0].x=10; //设定蛇头的坐标位置
m_snake.m_pos[0].y=10;
m_snake.m_direction=1; //设定蛇的方向,1表示朝右


for(int n=1;n<MAXSIZE;n++)
{
m_snake.m_pos[n].x=-1;
m_snake.m_pos[n].y=-1;
}
m_food.x=rand()%20;
  m_food.y=rand()%20;
for( n=0;n<m_snake.len-1;n++)
{
if(m_snake.m_pos[n].x == m_food.x && m_snake.m_pos[n].y == m_food.y)
{
init_snake();
break;
}
}
}
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   HWND hWnd;


   hInst = hInstance; // Store instance handle in our global variable


   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);


   if (!hWnd)
   {
      return FALSE;
   }


   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);

   init_snake();
   HDC hdc=GetDC(hWnd);
   MyPaint(hdc);  


   TextOut(hdc,530,0,"Rank: 1 , SCORE: 0",strlen("Rank: 1 , SCORE: 0"));
   TextOut(hdc,500,460,"↑↓←→控制方向,Space键暂停",strlen("↑↓←→控制方向,Space键暂停"));
   TextOut(hdc,100,460,"源码请访问http://blog.csdn.net/zjbpku",strlen("源码请访问http://blog.csdn.net/zjbpku"));
   return TRUE;
}


//
//  FUNCTION: WndProc(HWND, unsigned, WORD, LONG)
//
//  PURPOSE:  Processes messages for the main window.
//
//  WM_COMMAND - process the application menu
//  WM_PAINT - Paint the main window
//  WM_DESTROY - post a quit message and return
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
TCHAR szHello[MAX_LOADSTRING];
LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING);


switch (message) 
{
case WM_COMMAND:
wmId    = LOWORD(wParam); 
wmEvent = HIWORD(wParam); 
// Parse the menu selections:
switch (wmId)
{
case IDM_ABOUT:
  DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
  break;
case IDM_EXIT:
  DestroyWindow(hWnd);
  break;
default:
  return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_KEYDOWN:
switch(wParam)        //  控制方向
{
case VK_SPACE:
if(t_start == true)
{
KillTimer(hWnd,1);
t_start = false;
}
break;
case VK_UP:
if(t_start == false)
{
t_start = !t_start;
switch(rank)
{
case 1:
SetTimer(hWnd,1,300,NULL);
break;
case 2:
SetTimer(hWnd,1,100,NULL);
break;
case 3:
SetTimer(hWnd,1,80,NULL);
break;
case 4:
SetTimer(hWnd,1,60,NULL);
break;
}
m_snake.m_direction=0;
}
else
{
m_snake.m_direction=0;
}
break;
case VK_RIGHT:
if(t_start == false)
{
t_start = !t_start;
switch(rank)
{
case 1:
SetTimer(hWnd,1,300,NULL);
break;
case 2:
SetTimer(hWnd,1,100,NULL);
break;
case 3:
SetTimer(hWnd,1,80,NULL);
break;
case 4:
SetTimer(hWnd,1,60,NULL);
break;
}
m_snake.m_direction=1;
}
else
{
m_snake.m_direction=1;
}
break;
case VK_DOWN:
if(t_start == false)
{
t_start = !t_start;
switch(rank)
{
case 1:
SetTimer(hWnd,1,300,NULL);
break;
case 2:
SetTimer(hWnd,1,100,NULL);
break;
case 3:
SetTimer(hWnd,1,80,NULL);
break;
case 4:
SetTimer(hWnd,1,60,NULL);
break;
}
m_snake.m_direction=2;
}
else
{
m_snake.m_direction=2;
}
break;
case VK_LEFT:
if(t_start == false)
{
t_start = !t_start;
switch(rank)
{
case 1:
SetTimer(hWnd,1,300,NULL);
break;
case 2:
SetTimer(hWnd,1,100,NULL);
break;
case 3:
SetTimer(hWnd,1,80,NULL);
break;
case 4:
SetTimer(hWnd,1,60,NULL);
break;
}

m_snake.m_direction=3;
}
else
{
m_snake.m_direction=3;
}
break;
}
break;
case WM_TIMER:
{

//更新蛇的其他部分;
for(int n=m_snake.len-1;n>=1;n--)
{
m_snake.m_pos[n]=m_snake.m_pos[n-1];
}
//更新蛇的坐标,0朝上,1朝右,2朝下,3朝左
if(0==m_snake.m_direction)
{
if(m_snake.m_pos[0].y > 0)
{
m_snake.m_pos[0].y=m_snake.m_pos[0].y-1;
}
else if(rank == 4 && m_snake.m_pos[0].y == 0)
{
m_snake.m_pos[0].y = col-1;
}
else
{
KillTimer(hWnd,1);
score = 0;
MessageBox(hWnd,"The game is Over !","Warning",MB_ICONWARNING);
init_snake();
t_start = false;
}
}
if(1==m_snake.m_direction)
{
if(m_snake.m_pos[0].x < row-1)
{
m_snake.m_pos[0].x=m_snake.m_pos[0].x+1;
}
else if(rank == 4 && m_snake.m_pos[0].x == row-1 )
{
m_snake.m_pos[0].x = 0;
}
else
{
KillTimer(hWnd,1);
score = 0;
MessageBox(hWnd,"The game is Over !","Warning",MB_ICONWARNING|MB_OK);
init_snake();
t_start = false;
}
}
if(2==m_snake.m_direction)
{
if(m_snake.m_pos[0].y < col-1)
{
m_snake.m_pos[0].y=m_snake.m_pos[0].y+1;
}
else if(rank == 4 && m_snake.m_pos[0].y == col-1)
{
m_snake.m_pos[0].y = 0;
}
else
{
KillTimer(hWnd,1);
score = 0;
MessageBox(hWnd,"The game is Over !","Warning",MB_ICONWARNING|MB_OK);
init_snake();
t_start = false;
}
}
if(3==m_snake.m_direction)
{
if(m_snake.m_pos[0].x > 0)
{
m_snake.m_pos[0].x=m_snake.m_pos[0].x-1;
}
else if(rank==4 && m_snake.m_pos[0].x ==0 )
{
m_snake.m_pos[0].x = row -1;
}
else
{
KillTimer(hWnd,1);
score = 0;
MessageBox(hWnd,"The game is Over !","Warning",MB_ICONWARNING|MB_OK);
init_snake();
t_start = false;
}
}


//吃食物
if(m_snake.m_pos[0].x==m_food.x&&m_snake.m_pos[0].y==m_food.y)
{
m_snake.len++;
PlaySound("eatfood.wav", NULL, SND_SYNC);  //声音
score += 10;
if(rank < 5)
{
if(score == 100)
{
rank++;
SetTimer(hWnd,1,300,NULL);
KillTimer(hWnd,1);
MessageBox(hWnd,"恭喜你进入下一关","提示",MB_ICONINFORMATION|MB_OK);
t_start = false;
}
if(score == 300)
{
rank++;
SetTimer(hWnd,1,100,NULL);
KillTimer(hWnd,1);
MessageBox(hWnd,"恭喜你进入下一关","提示",MB_ICONINFORMATION|MB_OK);
t_start = false;
}
if(score == 350)
{
rank++;
SetTimer(hWnd,1,60,NULL);
KillTimer(hWnd,1);
MessageBox(hWnd,"恭喜你进入超级模式","提示",MB_ICONINFORMATION|MB_OK);
t_start = false;
}
}
else
{
rank = 4;
}
generatefood();
}
//判断是否吃到自身
for(int k =1;k < m_snake.len;k++)
{
if(m_snake.m_pos[0].x == m_snake.m_pos[k].x && m_snake.m_pos[0].y == m_snake.m_pos[k].y)
{
KillTimer(hWnd,1);
MessageBox(hWnd,"GAME OVER !!!","Warning",MB_ICONWARNING);
init_snake();
score = 0;
t_start = false;
break;
}
}
PlaySound("smove.wav", NULL, SND_ASYNC);
HDC hdc=GetDC(hWnd);  
char strtext[50];
if(rank == 4)
{
TextOut(hdc,610,100,"你已进入超级模式",strlen("你已进入超级模式"));
}
sprintf(strtext,"Rank: %d , SCORE: %d",rank,score);
TextOut(hdc,530,0, strtext, strlen(strtext));
MyPaint(hdc);
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
MyPaint(hdc);
EndPaint(hWnd, &ps);
break;
  case WM_DESTROY:
  PostQuitMessage(0);
  break;
default:
  return DefWindowProc(hWnd, message, wParam, lParam);
   }
   return 0;
}


// Mesage handler for about box.
LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG:
return TRUE;


case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) 
{
EndDialog(hDlg, LOWORD(wParam));
return TRUE;
}
break;
}
    return FALSE;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Layabox玛丽医生小游戏是一个非常有趣的游戏,它的源代码由Layabox引擎提供。玩家需要扮演医生玛丽,通过完成一系列的任务治疗患者。 游戏的源代码主要分为不同的部分。首先是游戏的基础设置部分,包括游戏界面的布局、背景音乐的设置,以及一些游戏参数的初始化。其次是角色控制部分,包括医生玛丽的移动和操作,以及患者的生成和移动。这部分代码涉及到游戏中的碰撞检测和角色移动的逻辑。然后是游戏的任务和关卡部分,包括不同关卡的设置和任务的指引。最后是游戏的结束和得分计算部分,包括判断游戏是否胜利或失败,以及根据玩家的表现计算得分和显示排行榜。 游戏中的源代码通过Layabox引擎的API实现了各种游戏功能,如角色的移动、碰撞检测、音乐播放等。它使用了Layabox引擎提供的精灵(Sprite)和场景(Scene)等组件进行游戏的构建。此外,源代码也包括一些用于控制游戏逻辑和界面显示的脚本文件。 通过分析Layabox玛丽医生小游戏的源代码,可以学到很多关于游戏开发的知识和技巧。你可以了解到游戏的基本架构和各个模块之间的交互关系。同时,你也可以学习到Layabox引擎的使用方法和一些游戏开发中常用的技术,如碰撞检测、角色移动、音乐播放等。 ### 回答2: Layabox玛丽医生小游戏源代码是一个使用Layabox引擎开发的医生小游戏的源代码。这个游戏的主要任务是帮助玛丽医生治疗患病的小动物。 在游戏中,玩家可以扮演玛丽医生,通过点击、拖拽等操作来完成治疗任务。游戏界面简洁清晰,采用了可爱的卡通风格,给人一种轻松愉快的感觉。 游戏源代码主要包括游戏的逻辑部分和界面部分。逻辑部分包括游戏的流程控制、任务操作等内容。界面部分则包括游戏的场景、角色、动画等元素。 玩家在游戏中需要根据小动物的病情选择合适的治疗工具,并进行操作。例如,当小狗受伤时,玩家可以使用拖拽工具将药膏涂在伤口上,然后用绷带缠绕。在完成治疗后,玩家可以获得一定的奖励。 这个游戏源代码使用Layabox引擎进行开发,Layabox引擎是一个基于HTML5的游戏引擎,可以用于开发跨平台的游戏。它具有高性能、易用性和丰富的功能特点。 总之,Layabox玛丽医生小游戏源代码是一个用Layabox引擎开发的医生小游戏,它通过简洁清晰的界面和有趣的玩法,带给玩家一种愉快轻松的游戏体验。 ### 回答3: LayaBox玛丽医生小游戏源代码是一种使用LayaBox引擎开发的小游戏源代码。玛丽医生是一款拥有医疗主题的益智游戏,旨在培养玩家的医疗常识和操作技能。 在游戏中,玩家扮演玛丽医生,需要处理来自不同患者的医疗问题。玩家需要根据患者的症状和需求,选择正确的治疗工具和药物进行操作。游戏中的患者多种多样,有感冒、发烧、骨折等不同的病情,玩家需要根据不同的情况给予正确的治疗措施。 在代码中,开发者会使用LayaBox引擎提供的各种功能和特性来实现游戏的各种功能。例如,使用引擎提供的场景管理器来创建游戏场景,使用精灵对象来表示游戏中的元素,如玛丽医生和患者角色,使用碰撞检测功能来判断治疗工具是否与患者接触,使用动画和音效来增强游戏体验等等。 此外,源代码还包括游戏的逻辑和处理部分。通过编写适当的游戏逻辑代码,开发者可以实现患者的生成和随机病情设置,以及玩家操作的响应和游戏结果的判断等功能。 总之,LayaBox玛丽医生小游戏源代码提供了一个可以直接使用和修改的游戏基础框架,开发者可以根据自己的需求进行二次开发和定制,使其更加符合个人或商业目标。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值