采用面向对象的编程思想

在头文件中引入acllic图形库,实现c++控制图片以及生成可视化窗口

所需工具:

acllib图形库下载地址:acl图形库下载地址

win32位项目的创建:通过visual studio创建win32项目

三张图片:tom.bmp,jerry.bmp,heart.bmp

游戏规则很简单,如下:

1.猫和老鼠游戏,其中包含可以加分的红心(heart)。

2.用户通过上下左右键控制老鼠jerry的移动,每当老鼠jerry与猫tom碰撞时,用户分数会下降,当老鼠jerry与红心heart碰撞时,用户分数增加。

3.tom猫的个数会随着时间增加,上限为5只,生成位置随机。

游戏没有设置获胜或者失败条件。

游戏效果图:

工程结构图:

注:

setup()函数为acllib库里的启动函数,相当于一般c++程序中的主函数。

游戏的重点在于图片碰撞的检测算法,要考虑两张图片的位置x,y与两张图片的宽高width,height之间的关系,用if语句进行判断,若猫鼠碰撞则减分,若鼠心碰撞则加分。

要考虑猫主动碰撞鼠、鼠主动碰撞猫以及鼠主动碰撞红心3种情况。

游戏的第二重点在于猫的自动生成与运行轨迹。代码中采用计时器实现tom猫的随机生成与移动,生成位置的随机性使用rand()函数实现 。用结构体数组和循环实现五只tom猫。   开头的srand((unsigned)time(NULL));语句让rand()函数与时间无关。

 

源码:

#include "acllib.h"
#include <time.h>
#include <string>
using namespace std;
typedef struct rect
{int x;int y;int width;int  height;
}rect;
ACL_Image tomimg, jerryimg,heartimg;//变量
ACL_Color red = RED;
void timerEvent(int id);
void keyEvent(int key, int e);
int winWidth = 700, winHeight = 480;
int moveid = 0, movetime = 60;
int creatid = 1, creattime = 6000;
const int maxnum = 5;
const char* tomm = "tom.bmp";
const char* jerryy = "jerry.bmp";
const char* heartt = "heart.bmp";
void paint();
int score=0;//分数
int collision(rect r1, rect r2);struct sprite {char const* name;int x, y;int distx, disty;int width, height;
};
struct sprite tom[maxnum], jerry , heart[maxnum];
int num = 0;int Setup()
{srand((unsigned)time(NULL));initWindow("happy game", DEFAULT, DEFAULT, winWidth, winHeight);loadImage(tomm, &tomimg);loadImage(jerryy, &jerryimg);//loadImage(heartt, &heartimg);//tom[0].width = 100;tom[0].height = 100;tom[0].x = rand() % (winWidth - tom[0].width);tom[0].y = rand() % (winHeight - tom[0].height);tom[0].distx = tom[0].disty = 3;//tom[num] = (struct sprite*)malloc(sizeof(struct sprite));//?jerry.x = 40;jerry.y = 50;registerTimerEvent(timerEvent);startTimer(moveid, movetime);startTimer(creatid, creattime);//paint();registerKeyboardEvent(keyEvent);//paint();return 0;
}//windows编程   消息处理机制
void timerEvent(int id)
{if (id == 0){for (int i = 0; i < maxnum; i++){tom[i].x += tom[i].distx;tom[i].y += tom[i].disty;if (tom[i].x > (winWidth - tom[i].width) || tom[i].x <= 0) tom[i].distx = tom[i].distx * -1;if (tom[i].y > (winHeight - tom[i].height) || tom[i].y <= 0) tom[i].disty = tom[i].disty * -1;}for (int i = 0; i < num; ++i){rect r1, r2;r1.x = jerry.x;r1.y = jerry.y;r1.width = 80;r1.height = 70;r2.x = tom[i].x;r2.y = tom[i].y;r2.width = tom[i].width;r2.height = tom[i].height;int c = collision(r1, r2);if (c == 1) score--;}//判断于tom是否主动碰撞jerry}if (id == 1){if (num < maxnum-1){num++;tom[num].width = 100;tom[num].height = 100;tom[num].x = rand() % (winWidth - tom[num].width);tom[num].y = rand() % (winHeight - tom[num].height);tom[num].distx = tom[num].disty = 3;}heart[num].width = 40;heart[num].height = 40;heart[num].x = rand() % (winWidth - tom[num].width);heart[num].y = rand() % (winHeight - tom[num].height);heart[num].distx = heart[num].disty = 0;}paint();}void paint()
{beginPaint();//putImage(&img,0,0);//把图片数据绘制到指定位置clearDevice();setTextSize(40);setTextColor(BLACK);paintText(1, 1, "分数:");char score1[20];sprintf_s(score1, "%d", score);paintText(99, 1, score1);setTextSize(20);setTextColor(BLUE);paintText(490, 450, "使用键盘控制jerry");putImageScale(&jerryimg, jerry.x, jerry.y, 80, 70);for (int i = 0; i <= num; i++){putImageScale(&tomimg, tom[i].x, tom[i].y, tom[i].width, tom[i].height);putImageScale(&heartimg, heart[i].x, heart[i].y, heart[i].width, heart[i].height);}endPaint();
}void keyEvent(int key, int e)
{if (e != KEY_DOWN) return;switch (key){case VK_UP:jerry.y = jerry.y - 11;break;case VK_DOWN:jerry.y = jerry.y + 11;break;case VK_LEFT:jerry.x = jerry.x - 11;break;case VK_RIGHT:jerry.x = jerry.x + 11;break;}for (int i = 0; i < num; ++i) {rect r1, r2;r1.x = jerry.x;r1.y = jerry.y;r1.width =  80;r1.height = 70;r2.x = tom[i].x;r2.y = tom[i].y;r2.width = tom[i].width;r2.height = tom[i].height;int c = collision(r1, r2);if (c ==1) score--;}//判断于tom是否碰撞for (int i = 1; i <=num; ++i){rect r1, r2;r1.x = jerry.x;r1.y = jerry.y;r1.width = 80;r1.height = 70;r2.x = heart[i].x;r2.y = heart[i].y;r2.width = heart[i].width;r2.height = heart[i].height;int c = collision(r1, r2);if (c == 1) { score = score + 5; heart[i].width = 0; heart[i].height = 0; heart[i].x = winWidth + 10000;  }}//判断是否与heart碰撞paint();
}
int collision(rect r1, rect r2)
{int c = 1;
if (r1.x<r2.x && r1.x + r1.width>r2.x) {if (r1.y > r2.y && r1.y < r2.y + r2.height) return c;if (r1.y<r2.y && r1.y + r1.height>r2.y)return c;else {if (r1.x > r2.x && r2.x + r2.width > r1.x) {if (r1.y > r2.y && r1.y < r2.y + r2.height) return c;if (r1.y<  r2.y && r1.y + r1.height > r2.y)return c;}c = 0; return c;}}}

至此,游戏编写完成,但存在碰撞检测偶尔不敏感,jerry可以移动出可视化窗口等问题。

 

用C++实现简单的小游戏相关推荐

  1. java简单通讯录的实现02person类_用java实现简单的小游戏(你一定玩过)

    用java实现简单的小游戏(你一定玩过) 对于java初学者来说,通过一些学习小游戏来对swing学习以及对java基础的学习是一个好的方法,同时也给学习带来了很多的乐趣,接下来就给大家分享一个jav ...

  2. java实现简单窗体小游戏----球球大作战

    java实现简单窗体小游戏----球球大作战 需求分析 1.分析小球的属性: ​ 坐标.大小.颜色.方向.速度 2.抽象类:Ball ​ 设计类:BallMain-创建窗体 ​ BallJPanel- ...

  3. unity编写一个简单的小游戏

    unity编写一个简单的小游戏 简易fly bird的制作 关于flybird 场景的搭建和素材的导入 使用素材搭建game和scene 制作柱体 bird的script column的sprite ...

  4. 用Python做一个超简单的小游戏(一听就懂)

    前言 有的人可能学过一点Python基础,但不知道干什么好.今天就教大家做一个简单的小游戏 未经允许,禁止转载 文章目录 前言 写它会用到 源码先抛出来 知识讲解 random 介绍 语法 方法参数表 ...

  5. c语言写一个简单的小游戏-推箱子

    在学习C语言之后,写了一个简单的小游戏来锻炼自己的代码以及C语言知识的掌握能力. 推箱子作为手机上最常见的简单游戏,其代码也相对简单,想法也比较简单,下面为其代码和运行图. /************ ...

  6. HTML5小游戏-简单抽奖小游戏

    换了新工作以后,专注前端开发,平常空闲时间也比较多,可以多钻研一下技术,写一下博客.最近在学习canvas,参考网上的slotmachine插件,用canvas实现了一个简单抽奖小游戏.       ...

  7. java做小窗体_java实现简单窗体小游戏----球球大作战

    java实现简单窗体小游戏----球球大作战 需求分析 1.分析小球的属性: ​坐标.大小.颜色.方向.速度 2.抽象类:Ball ​设计类:BallMain-创建窗体 ​BallJPanel-画小球 ...

  8. JS实现简单农场小游戏

    JS实现简单农场小游戏 简介 效果展示 代码实现 在线预览 简介 最近抽空写了一个简单的农场小游戏,比较简陋,目的只是为了练习js开发能力. 游戏界面顶部包含昵称.经验值.等级和金币信息展示.经验的获 ...

  9. 记录一次用 Vue 简单完成小游戏:十滴水 (无动画)

    记录一次用 Vue 简单完成小游戏:十滴水(无动画) 前言 1.游戏规则 2.开发思路 1.地图设计 2.子弹发射事件 3.水滴状态 4.水滴溅射 5.获胜条件 3.源码 3.1 Template 部 ...

  10. 一个简单的c 游戏编程语言,编程达人 c语言写一个简单的小游戏-推箱子

    在学习C语言之后,写了一个简单的小游戏来锻炼自己的代码以及C语言知识的掌握能力. 推箱子作为手机上最常见的简单游戏,其代码也相对简单,想法也比较简单,下面为其代码和运行图. /************ ...

最新文章

  1. javascript操作select下拉列表框的一点小经验
  2. Docker(二):Docker常用命令之镜像的创建:Dockerfile 与 commit
  3. 你的鼠标有多快-小游戏
  4. 我想成为计算机专业第一,我对计算机专业学生的忠告。
  5. vue项目安装axios - cmd篇
  6. 父亲去年喂猪挣了21万
  7. 【 js 算法类】这么全的数组去重,你怕不怕?
  8. GPS卫星星历与卫星历书的区别
  9. 13.56MHz非接触式读写器芯片:CI521(AB卡,低成本)
  10. 实现一个打点计时器,要求 1、从 start 到 eThd(包含 start 和 eThd),每隔 100 毫秒 coThsole.log 一个数字,每次数字增幅为 1 2、返回的对象中需要包含一个
  11. JS测试显示屏分辨率以及屏幕尺寸
  12. 淘宝人群拖价怎么做? 大神导航,一个神奇的网站,从此开启大神之路!
  13. 新法将赋予FBI无需法院命令也能阅读公民邮件的权力
  14. KBEngine warring项目源码阅读(三) 实体文件与Account处理
  15. Tomcat配置与调优
  16. 为什么很多硅谷工程师偏爱 OS X,而不是 Linux 或 Windows
  17. DAMA数据管理知识体系简介
  18. 辅助知识-第2 章 项目合同管理
  19. 杭州python培训价格
  20. android手机的扩容教程,解决手机系统空间不足

热门文章

  1. # CSS 背景设置
  2. 滚动截屏苹果_苹果手机上的5个神器,让你的手机更高效,顺手
  3. insmod depmod modprobe的区别及用法
  4. iOS二维码生成与识别
  5. JAVA 的性能优化
  6. Android Snackbar使用方法及小技巧-design
  7. 1003 Emergency (25 point(s))
  8. ethz-asl Hand-Eye-Calibration 实验之hand_eye_calibration_batch_estimation模块
  9. 草草们的忧伤:环信IM昵称和头像
  10. VS2017 -error LNK1104: 无法打开文件“msvcprtd.lib”