【Windows编程】球球大作战(二) 贪吃蛇的实现

做一个普通的贪吃蛇出来,首先看下我们要实现的功能:
  • 会移动的球
  • 随机生成吃的食物
  • 球吃了食物会变大
首先是球的移动
  int x,y;
  case WM_CREATE:
       SetTimer(hwnd, 1, 100, NULL); // 设置定时器的刷新时间
       return 0;
  case WM_PAINT: // 可以理解为绘制窗口用
       hdc = BeginPaint(hwnd, &ps); // 必须要有BeginPaint 和 EndPaint。 hdc 是设备上下文
       Ellipse(hdc, x, y, x + Ballsize, y + Ballsize); // 画圆的api , 2到4的参数分别是左上xy坐    标和右下坐标,Ballsize可以理解为球的直径
       EndPaint(hwnd, &ps);
       return 0;
  case WM_TIMER:      // 定时器
       x+=speed,y+=speed;
       InvalidateRect(hwnd, NULL, TRUE); //刷新窗口用
       return 0;

通过时时刷新窗口,每次刷新时,圆的坐标都相较上次移动了speed的距离,这也就实现了球的移动。

通过上下左右控制球的移动

  case WM_KEYDOWN:      //按键消息
    switch (wParam)
    {
        case VK_UP:
        p = 0;
        return 0;
        case VK_DOWN:
        p=1
       return 0;
       case VK_LEFT:
       p = 2;
       return 0;
       case VK_RIGHT:
       p = 3;
       return 0;
       }

   //在 WM_PAINT中增加
       if (p == 0)
       y -= 10;
       else if (p == 1)
       y += 10;
       else if (p == 2)
       x -= 10;
       else if (p == 3)
       x += 10;

通过获得按键消息,改变P的值 从而确定圆的行走方向。以上 也就是基本实现了 通过上下左右控制圆球的移动功能。
而实现随机产生食物的功能就更简单了。

  srand((unsigned)time(NULL));//设置时间种子  防止伪随机 
       for(int i=0;i<number;i++)
        {
          x = rand() % 700;
          y = rand() % 700;
          Ellipse(hdc, x, y, x + FoodSize, y + FoodSize);
         }
//画很多很多的圆就ok了!
//吃了食物会变大
        vector<Food> foodvector  // 装有食物的数组
        void Grow()
        {
        bool Eat()
        {
        while(foodvector)
        {
       // 判断每个食物的中心坐标是否在圆的左上坐标和右下坐标之间,如果是,则认为圆吃了食物 
        }
        }
        if(吃掉了食物)
        {
         // 重新分配食物的x,y的坐标
          Ballsize += Growsize;  //球长大
         }
         }

难点在于如何判断圆是否吃了食物,我的方法就如上所说是通过坐标判断的。之后的很多判断都是通过坐标,所以坐标判断的函数可以抽出来,这样就不用每次都写了。
突然觉得Unity3D中的碰撞检测好方便啊。
基本的实现就是这样了。我之前说过我将会用C++的封装。
- CCoordinate //坐标类 所有拥有坐标的物体都继承该类,左上右下和中心点坐标
- CBallProPerty //球的属性类
- CFood //食物坐标
- CControl // 球的移动以及其他操作
- CSimpleAI // 智障AI类 这是我下一章要写的内容

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
基于c++实现球球大作战游戏源码+操作说明.zip 基于c++实现球球大作战游戏源码+操作说明.zip 基于c++实现球球大作战游戏源码+操作说明.zip 【资源说明】 该项目是个人毕设项目源码,评审分达到95分,都经过严格调试,确保可以运行!放心下载使用。 该项目资源主要针对计算机、自动化等相关专业的学生或从业者下载使用,也可作为期末课程设计、课程大作业、毕业设计等。 具有较高的学习借鉴价值!基础能力强的可以在此基础上修改调整,以实现类似其他功能。 3.1 运行环境 3.1.1 Windows 10 Windows操作系统是最常见的计算机操作系统,是微软公司开发的操作软件。该软件经历了多年的发展历程,目前推出的win10系统相当成熟。Windows操作系统具有人机操作互动性好,支持应用软件多,硬件适配性强等特点,未来该系统将更加安全、智能、易用。 操作系统是将人类利用计算机硬件发挥作用的平台,是计算机软件运行工作的环境,是计算机硬件的翻译。从计算机诞生发展到今天,出现了相当多种类的操作系统。Windows操作系统是其中的佼佼者。Windows操作系统是美国微软公司推出的一款操作系统。该系统从1985年诞生到现在,经过多年的发展完善,相对比较成熟稳定,是当前个人计算机的主流操作系统。 3.2 开发平台及技术基础 3.2.1 Visual Studio 2017 Microsoft Visual Studio是VS的全称。VS是美国微软公司的开发工具包系列产品。VS是一个基本完整的开发工具集,它包括了整个软件生命周期中所需要的大部分工具,如UML工具、代码管控工具、集成开发环境(IDE)等等。所写的目标代码适用于微软支持的所有平台,包括Microsoft WindowsWindows Mobile、Windows CE、.NET Framework、.Net Core、.NET Compact Framework和Microsoft Silverlight 及Windows Phone。 Visual Studio是目前最流行的Windows平台应用程序的集成开发环境。最新版本为 Visual Studio 2019版本,基于.NET Framework 4.7。 3.2.2 Easyx图形库 EasyX 是针对 C++ 的图形库,可以帮助 C 语言初学者快速上手图形和游戏编程。比如,可以用 VC + EasyX 很快的用几何图形画一个房子,或者一辆移动的小车,可以编写俄罗斯方块、贪吃蛇、黑白棋等小游戏,可以练习图形学的各种算法,等等。 许多学编程的都是从 C 语言开始入门的,而目前的现状是: (1)有些学校以 Turbo C 为环境讲 C 语言,只是 Turbo C 的环境实在太老了,复制粘贴都很不方便。 (2) 有些学校直接拿 VC 来讲 C 语言,因为 VC 的编辑和调试环境都很优秀,并且 VC 有适合教学的免费版本。可惜在 VC 下只能做一些文字性的练习题,想画条直线画个圆都很难,还要注册窗口类、建消息循环等等,初学者会受严重打击的。初学编程想要绘图就得用 TC,很是无奈。 (3) 还有计算机图形学,这门课程的重点是绘图算法,而不是 Windows 编程。所以,许多老师不得不用 TC 教学,因为 Windows 绘图太复杂了,会偏离教学的重点。新的图形学的书有不少是用的 OpenGL,可是门槛依然很高。 所以,我们想给大家一个更好的学习平台,就是 VC 方便的开发平台和 TC 简单的绘图功能,于是就有了这个 EasyX 库。如果您刚开始学 C 语言,或者您是一位教 C 语言的老师,再或者您在教计算机图形学,那么这个库一定会让您兴奋的。 3.3 基本设计概要及处理流程
以下是一个简单的贪吃蛇Windows编程的示例: ```c++ #include <iostream> #include <conio.h> #include <windows.h> using namespace std; bool gameOver; const int width = 20; const int height = 20; int x, y, fruitX, fruitY, score; int tailX[100], tailY[100]; int nTail; enum eDirection { STOP = 0, LEFT, RIGHT, UP, DOWN }; eDirection dir; void Setup() { gameOver = false; dir = STOP; x = width / 2; y = height / 2; fruitX = rand() % width; fruitY = rand() % height; score = 0; } void Draw() { system("cls"); for (int i = 0; i < width + 2; i++) cout << "#"; cout << endl; for (int i = 0; i < height; i++) { for (int j = 0; j < width; j++) { if (j == 0) cout << "#"; if (i == y && j == x) cout << "O"; else if (i == fruitY && j == fruitX) cout << "F"; else { bool printTail = false; for (int k = 0; k < nTail; k++) { if (tailX[k] == j && tailY[k] == i) { cout << "o"; printTail = true; } } if (!printTail) cout << " "; } if (j == width - 1) cout << "#"; } cout << endl; } for (int i = 0; i < width + 2; i++) cout << "#"; cout << endl; cout << "Score:" << score << endl; } void Input() { if (_kbhit()) { switch (_getch()) { case 'a': dir = LEFT; break; case 'd': dir = RIGHT; break; case 'w': dir = UP; break; case 's': dir = DOWN; break; case 'x': gameOver = true; break; } } } void Logic() { int prevX = tailX[0]; int prevY = tailY[0]; int prev2X, prev2Y; tailX[0] = x; tailY[0] = y; for (int i = 1; i < nTail; i++) { prev2X = tailX[i]; prev2Y = tailY[i]; tailX[i] = prevX; tailY[i] = prevY; prevX = prev2X; prevY = prev2Y; } switch (dir) { case LEFT: x--; break; case RIGHT: x++; break; case UP: y--; break; case DOWN: y++; break; default: break; } if (x >= width) x = 0; else if (x < 0) x = width - 1; if (y >= height) y = 0; else if (y < 0) y = height - 1; for (int i = 0; i < nTail; i++) { if (tailX[i] == x && tailY[i] == y) gameOver = true; } if (x == fruitX && y == fruitY) { score += 10; fruitX = rand() % width; fruitY = rand() % height; nTail++; } } int main() { Setup(); while (!gameOver) { Draw(); Input(); Logic(); Sleep(10); // 控制游戏速度 } return 0; } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值