win32强化练习3.6_贪吃蛇半部
来源:互联网 发布:淘宝开店 企业店铺 编辑:程序博客网 时间:2024/06/06 09:40
这个练习仍然是3.1键盘消息和3.3定时器消息的组合;所谓贪吃蛇半部指的是我们只做一半,因为完整的需要比较多的时间,至少是个把小时,我们的基础练习尽量在10~20分钟内能够完成,目前还不适合涉及太多的琐碎的地方。
练习主要分2大部分来完成,具体步骤如下:
1. 完成一个字符的定时移动,键盘控制方向:
1.1 定义全局变量 ,自定义格点与pix之间的比例关系,例如 20pix为1个格点,设定游戏区范围是20*16格点,从(10,10)开始,则相对坐标为 (10+20* x)
1.2 处理WM_PAINT消息,在其中先画一个边框(画笔HPEN的使用练习),再画出单个字符(在游戏区的中心位置)
1.3 在WM_CREATE中,开启定时器SetTimer
1.4 处理WM_TIMER消息,根据当前x向和y向及正负,使用字符移动一个格点
1.5 处理键盘消息,实现根据上下左右按键改变运动方向
int gx = 10, gy = 8;//中心位置 int vx = 1, vy = 0;//默认向右移动
case WM_PAINT:{PAINTSTRUCT ps;hdc = BeginPaint(hwnd, &ps);HPEN hPen = CreatePen(0,3, RGB(0,255,0));HPEN hOld = (HPEN)SelectObject(hdc, hPen);Rectangle(hdc, 10,10, 20*20+10, 20*16+10);//画边框 DeleteObject(SelectObject(hdc, hOld));TextOut(hdc, 10+ 20 *gx, 10 + 20*gy, "*",1); //画字符 EndPaint(hwnd, &ps);}break;
case WM_TIMER:{gx+=vx;gy+=vy;InvalidateRect(hwnd, NULL, TRUE); //重绘 }break;
case WM_KEYDOWN:{switch(wParam){case VK_LEFT: vx = -1; vy = 0; break;case VK_RIGHT: vx = 1; vy = 0; break;case VK_UP: vx = 0; vy = -1; break;case VK_DOWN: vx = 0; vy = 1; break;default:break;}InvalidateRect(hwnd, NULL, TRUE);}break;
2. 完成多个字符(组成一条蛇)的移动,键盘控制方向:
2.1 单个字符的键盘响应移动已经奠定了基础,在此基础上再进一步就需要把蛇的身体(几个字符)造出来,如果是想练习链表就用链表做,需要练习数组就用数组做,练习C++类就用class来做,这次的练习我们来建一个SNAKE的类,成员变量为节数,并用vector相当于建立2个动态数组,分别存放每个节点的x和y的格点值;
2.2 在主函数之前,用SNAKE(i) 创建对象并构造有i个字符的蛇;
2.3 在SNAKE类,建一个showSnake()的成员函数,传递hdc即可
2.4 在WM_PAINT处理中,将TextOut单个字符改换成调用showSnake()进行蛇身各节点的绘制
2.5 在SNAKE类,建一个moveSnake()的成员函数,由于在这个函数将在定时器消息中使用,需要把hdc声明为全局
2.6 在WM_TIMER中,调用moveSnake()函数,实现整条蛇的移动
class SNAKE{int size;//蛇的节数vector <int> vecx, vecy; //使用vector容器 public:SNAKE(){};SNAKE(int num)//构造蛇各节{size = num;int x = 10, y = 5;for (int i = 0; i< num; i++){vecx.push_back(x);vecy.push_back(y + i);}}};
SNAKE s(8);
void showSnake(HDC hdc){for (int i = 0; i< size; i++){TextOut(hdc, 10+ 20* vecx[i], 10 + 20* vecy[i], "&", 1);}}
case WM_PAINT:{PAINTSTRUCT ps;hdc = BeginPaint(hwnd, &ps);HPEN hPen = CreatePen(0,3, RGB(0,255,0));HPEN hOld = (HPEN)SelectObject(hdc, hPen);Rectangle(hdc, 10,10, 20*20+10, 20*16+10);//画边框 DeleteObject(SelectObject(hdc, hOld));//TextOut(hdc, 10+ 20 *gx, 10 + 20*gy, "*",1); //画字符 s.showSnake(hdc);//画蛇 EndPaint(hwnd, &ps);}
void moveSnake(){for (int i = size-1; i>0;i-- ){vecx[i] = vecx[i-1];vecy[i] = vecy[i-1];}vecx[0] = vecx[0] + vx;vecy[0] = vecy[0] + vy;}
case WM_TIMER:{//gx+=vx;//gy+=vy;s.moveSnake(hdc);InvalidateRect(hwnd, NULL, TRUE); //重绘 }break;至此,贪吃蛇的创建、移动以及根据按键改变方向的功能就完成了,当然完整的程序后面还有碰撞检测(包含碰边界死亡、碰自身死亡、碰豆子增加一节...)以及随机放豆子等功能就不在这里练习了。
从3.5,3.6两节练习可以看到,定时器+键盘的灵活搭配,已经可以制作简单的可玩耍的游戏了,这些立竿见影的基本功,还不多多练习?
- win32强化练习3.6_贪吃蛇半部
- win32强化练习3.7_拖动窗口
- win32强化练习4.0_资源相关练习简介
- win32强化练习3.3_定时器与弹球
- win32强化练习3.5_弹球游戏(键盘+定时器)
- win32强化练习4.1_更改别人的菜单
- win32强化练习4.4_状态栏、坐标与时钟
- win32强化练习4.5_标准工具栏的使用
- win32强化练习4.7_快速建立TreeView
- win32强化练习4.9_快速建立ListView
- win32强化练习5.1_动画秒表(位图初步)
- win32强化练习4.2_菜单勾选与图标变换
- win32强化练习4.3_粗糙的SPY获取别人的窗口
- win32强化练习4.6_自定义图标或图像的工具栏
- win32强化练习4.8_TreeView快速应用(处理消息)
- Win32 贪吃蛇游戏
- win32贪吃蛇实现
- 查询SQL强化练习
- Spring整合Junit框架进行单元测试Demo
- retrofit入门教程
- 小C语言--词法分析程序
- 51nod逆序数
- mysql 悲观锁
- win32强化练习3.6_贪吃蛇半部
- SpringMVC 环境 get请求 中文乱码问题
- VS2013/MFC编程入门之一(利用MFC向导生成单文档应用程序框架)
- Tool Resource
- JavaScript数组方法大全
- JavaScript toFixed() 方法
- 简单的NLPIR分词 JAVA 实现
- JavaScript 作用域
- js函数命名常用动词