C++第九课:逐步深入[独自思考]

putimage(图片x的坐标,图片y的坐标,IMAGE *srcSource,SRCAND);

SRCAND这里代表绘制出的像素颜色 = 屏幕颜色 AND 图像颜色,与运算规则。

putimage(图片x的坐标,图片y的坐标,IMAGE *srcSource,SRCPAINT);

SRCPAINT这里代表绘制出的像素颜色 = 屏幕颜色 OR 图像颜色,或运算规则。

最后一位参数本是默认过的,也可以不写,但在这里,你添加上这些参数,就能对图像进行操作。

当然还有很多参数,下面罗列出一些,有兴趣的朋友,可以自己查查看,但是能用到的几乎就这SRCAND和SRCPAINT两种。

DSTINVERT 绘制出的像素颜色 = NOT 屏幕颜色

MERGECOPY 绘制出的像素颜色 = 图像颜色 AND 当前填充颜色

MERGEPAINT 绘制出的像素颜色 = 屏幕颜色 OR (NOT 图像颜色)

NOTSRCCOPY 绘制出的像素颜色 = NOT 图像颜色

NOTSRCERASE 绘制出的像素颜色 = NOT (屏幕颜色 OR 图像颜色)

PATCOPY 绘制出的像素颜色 = 当前填充颜色

PATINVERT 绘制出的像素颜色 = 屏幕颜色 XOR 当前填充颜色

PATPAINT 绘制出的像素颜色 = 屏幕颜色 OR ((NOT 图像颜色) OR 当前填充颜色)

SRCCOPY 绘制出的像素颜色 = 图像颜色

SRCERASE 绘制出的像素颜色 = (NOT 屏幕颜色) AND 图像颜色

SRCINVERT 绘制出的像素颜色 = 屏幕颜色 XOR 图像颜色

前面已经能输出图片,下面小编就给图片弄些字体在上面,首先排除中文字,因为在运行后,如果敲击中文字会很麻烦,这里就用字母代替。

下面写到的功能就是从A~Z的字母随机性产生,你敲击一个字母,只要跟图片上显示的字母一致,就让图片消失,然后消失的图片再次重新出现。

既然是随机机制,就需要用到rand()函数:

rand()%6;

这句代码的意思就是随机0-5之中某个数,返回值是int类型,或者char也行。

我们都知道大写字母对应的二进制数是65到90,小写字母对应的二进制数是97到122,不懂的请搜索ASCII编码对照表。

那么我想输出大写的随机字母,该如何写呢?首先要保证它的数值在65~90之中,不能超出也不能低于这些数。

思考的方法,英文字母有多少个?如何让它等于65-90,代码如下:

rand()%26+65;

就是说随机为0的值时,再加上65,是不是等于65了?以此类推,为最高值25时,再加上65,不就是90了吗?

想通了的话,下面就实现代码输出字母的功能。

char m_Output = rand() % 26 + 65;

outtextxy(i + 25, j + 25, output);

outtextxy();三个参数的意思依次是:字母出现的x坐标、y坐标、输出的字

因为考虑到输出的字母要保证在绘制的图形内部,也要考虑到它的坐标问题,所以它放置的位置一定要符合逻辑,传统的思维都是写一段代码让它执行即可,但是编译器它没有思维,我们怎么能让编译器读懂你所写的代码意思呢?

实现代码如下:

char m_Output = rand() % 26 + 65;
for (j = 0; j < background.getheight(); j++)
{

	putimage(0, 0, &background);
	putimage(i, j, &LB2, SRCAND);
	putimage(i, j, &LB1, SRCPAINT);

	outtextxy(i+25,j+25,output);
}

不管行与不行,先运行看看,你会发现字母出现了,但也出现了黑底,问题就需要解决。这里就用到了清除黑底的函数,也就是透明化。

setbkmode(TRANSPARENT);透明化

加在outtextxy()函数下面,保证每次出现图片和字母时都在透明化。

最后就是写出一个功能,敲出同样的字母,使萝卜图消失。

而键盘有两种状态,一个是敲击,还有未敲击。敲击时编译器能得到你所按下键钮的消息,就可以执行下面的操作。

kbhit();就是实现敲击键钮状态的函数

当然有些编译器会报错:The POSIX name for this item is deprecated。Instead, use the ISO C++ conformant name : _kbhit。

意思:这个物品的 posix 名称已经过时了。相反,使用 iso c + + 相符的名称:_kbhit()

还需要引用一个头文件:

#include <conio.h>

这个头文件就是包含了_kbhit()函数

if(_kbhit())  //如果敲击才会执行下面的代码

{

   char cInput = _getch();  //_getch();敲击键盘不需要按回车键

   if(cinput==output || cinput==output+32)  //加上32代表小写字母a-z,也就是97-122

    {

    break;      //当输入的键钮和出现的字母相同,就退出当前循环

    }

}
实现的代码如下:

void InitGame()
{
  //保存图片的对象
  IMAGE background, LB1, LB2;
  //同步
  srand((unsigned int)time(NULL));

  //载入图片
  loadimage(&background, "images//background.jpg", 600, 600);
  loadimage(&LB1, "images//LB1.jpg", 50, 50);
  loadimage(&LB2, "images//LB2.jpg", 50, 50);

  //初始化界面的宽度和高度,在这里用background对象就能获取宽度和高度
  initgraph(background.getwidth(), background.getheight());
  //随机的大写字母
  char output = rand() % 26 + 65;
  int i = rand() % background.getwidth();
  int j = 0;
  for (j = 0; j < background.getheight(); j++)
  {

    putimage(0, 0, &background);
    putimage(i, j, &LB2, SRCAND);
    putimage(i, j, &LB1, SRCPAINT);

    outtextxy(i+25,j+25,output);
    setbkmode(TRANSPARENT);
    if (_kbhit()) //有操作
    {
      char input = _getch();
      if (input == output || input==output+32)
      {
        break;
      }
    }

    sleep(100);    //图片消失后,缓冲一些十分之一秒
  }

}

写好后,就能运行成功一次,当图片消失后,它就不会再重新出现萝卜图了,为什么?因为没有无限循环。

while();先想想放置在哪?

考虑的问题:字母消失后是不是需要再循环?萝卜图是不是需要再循环?萝卜上的字体消失后是不是需要再循环?输入的按钮消息是不是需要再循环?

BeginBatchDraw();双缓冲,作用:减少跳屏

EndBatchDraw();关闭

遥看漫漫长路,任重而道远。

原文地址:https://www.cnblogs.com/VisiousDragon/p/12128439.html

时间: 2024-10-16 18:47:51

C++第九课:逐步深入[独自思考]的相关文章

基于案例SQL优化第九课作业分享

默认统计信息收集: 1. 11g默认启动了统计信息收集的任务,默认运行时间是周一到周五晚上10点和周6,周天的早上6点 2. 你也可以关闭自动统计新收集任务,选择手工收集的方式,但是一般不建议这样操作. 动态统计信息: 1. 统计信息默认情况下是每天晚上10点半后收集,如果新建对象还没来得级收集统计信息,就采用动态采样的方式. 2. 具体在set autotrace 跟踪的执行计划中,可以看到类似:- dynamic sampling used for this statement (level

【C++探索之旅】第一部分第九课:数组威武,动静合一

内容简介 1.第一部分第九课:数组威武,动静合一 2.第一部分第十课预告:文件读写,海阔凭鱼跃 数组威武,动静合一 上一课<[C++探索之旅]第一部分第八课:传值引用,文件源头>中,我们学习了函数参数的不同传递形式:值传递和引用传递,也学习了如何用头文件和源文件来更好地组织项目. 在不少程序中,我们都需要使用多个相同类型的变量.例如:一个网站的用户名列表(一般是string类型):或者一场比赛的前10个最佳得分(一般是int类型). 类似地,C++和大多数编程语言一样,也有将多个相同类型的数据

NeHe OpenGL教程 第九课:移动图像

转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线教程的编写,以及yarn的翻译整理表示感谢. NeHe OpenGL第九课:移动图像 3D空间中移动图像: 你想知道如何在3D空间中移动物体,你想知道如何在屏幕上绘制一个图像,而让图像的背景色变为透明,你希望有一个简单的动画.这一课将教会你所有的一切.前面的课程涵盖了基础的OpenGL,每一课都是在

【Linux探索之旅】第二部分第九课:查找文件,无所遁形

内容简介 1.第二部分第九课:查找文件,无所遁形 2.第二部分测试题 查找文件,无所遁形 这一课不难,但挺重要的. 之前的课程我们见识过了Linux下文件的组织形式是很特别的,跟Windows不一样. 我们也用ls / 这个命令来列出根目录下的所有目录,有/bin,/etc,/var,/home,等等.而这些目录下又有子目录和文件,错综复杂. 这些目录中有一部分是历史遗留的,从Unix时代就有了.问题是:我们如何在这"茫茫文海"中查找我们需要的文件. "人潮人海中,有你有我.

【C语言探索之旅】 第一部分第九课:函数

内容简介 1.课程大纲 2.第一部分第九课:函数 3.第一部分第十课预告: 练习题+习作 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语言编写三个游戏. C语言编程基础知识 什么是编程? 工欲善其事,必先利其器 你的第一个程序 变量的世界 运算那点事 条件表达式 循环语句 实战:第一个C语言小游戏 函数 练习题 习作:完善第一个C语言小游戏 C语言高级技术 模块化编程 进击的指针,C语言王牌 数组 字符串 预处理 创建你自己的变量类型 文件读写 动

BeagleBone Black板第九课:测试读取ADC数据

BBB板第九课:测试读取ADC数据 之前我们初步学习了GPIO的使用方法,接下来认识下BBB板上ADC数据的读取操作,因为用BBB板做外部控制,接收外部传感器的一些模拟数据,模数转换ADC是需要用到的.所以在这里我也测试一下这BBB板的ADC简单功能,以后有深入学习到知识再进行补充. ADC资源引脚,P9_32至P9_40共九个引脚,其中P9_32为电源正极,P9_34为共地,其他七个对应七个ADC输入脚,因为有一个Ain_7估计是内部使用了,所以我们只使用Ain_0至Ain_6这七个ADC.

【C语言探索之旅】 第二部分第九课: 实战&quot;悬挂小人&quot;游戏

内容简介 1.课程大纲 2.第二部分第九课: 实战"悬挂小人"游戏 3.第二部分第十课预告: 安全的文本输入 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语言编写三个游戏. C语言编程基础知识 什么是编程? 工欲善其事,必先利其器 你的第一个程序 变量的世界 运算那点事 条件表达式 循环语句 实战:第一个C语言小游戏 函数 练习题 习作:完善第一个C语言小游戏 C语言高级技术 模块化编程 进击的指针,C语言王牌 数组 字符串 预处理 创建

【C语言探索之旅】 第二部分第九课: 实战[悬挂小人]游戏

内容简介 1.课程大纲 2.第二部分第九课: 实战"悬挂小人"游戏 3.第二部分第十课预告: 安全的文本输入 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语言编写三个游戏. C语言编程基础知识 什么是编程? 工欲善其事,必先利其器 你的第一个程序 变量的世界 运算那点事 条件表达式 循环语句 实战:第一个C语言小游戏 函数 练习题 习作:完善第一个C语言小游戏 C语言高级技术 模块化编程 进击的指针,C语言王牌 数组 字符串 预处理 创建

[随笔]在清明节假期独自思考

有时候我们总是以为外界环境错了,其实错在内心. 这个假期有幸能一个人独自在学校,在宿舍,一个人的生活,能让我把精力更多的放在精神层面.所以有时候会不吃饭:) 1.思考了自己与外界的关系 之前有个名词"社会主义巨婴",老是自诩见多识广,最终也栽在了这个词上.无法处理好与外界的关系是巨婴的一个特点,一个人为中心,没有一定的组织能力,"好吃懒做",表里不一--没想到另一个我如此不堪,好像恰好占到了我最讨厌的所有性格. 我也有要守护的东西,但这种守护的信念还不够强大,其实也