当前位置:   article > 正文

C/C++项目源码——数字雨DigitalRain_数字雨代码

数字雨代码

目录

一、函数段

二、完整代码

三、运行效果


一、函数段

1、显示图形界面

(1)安装EasyX图形库,官网地址:EasyX Graphics Library for C++

(2)图形库头文件

#include<graphics.h>

(3)宏定义 设置图形化界面大小

  1. #define WIDTH 960 //窗口宽度
  2. #define HEIGTH 640 //窗口高度

(4)图形化窗口的使用

  1. initgraph(WIDTH, HEIGTH); //打开图形化窗口
  2. getchar();
  3. closegraph(); //关闭图像化窗口

2、数字雨的结构体struct

(1)定义属性代码段

  1. struct Rain
  2. {
  3. int x; //数字雨横向位置
  4. int y; //y坐标
  5. int speed; //下降速度
  6. char str[STR_SIZE]; //数字雨数组
  7. }rain[STR_NUM];

3、随机字符

(1)随机数生成数字雨,srand()需要头文件#include<Windows.h>

srand(GetTickCount());  //利用ASCII码值随机生成,GetTickCount();直接获取电脑开机到现在的毫秒数

(2)switch语句或if-else if语句随机生成数字0、1、2,且产生概率相同

4、初始化

(1)初始化基础数据

(2)初始化字符串

  1. void GameInit()
  2. {
  3. for (int i = 0; i < STR_NUM; i++){
  4. rain[i].x = i * STR_WIDTH;
  5. rain[i].y = rand() % HEIGTH;
  6. rain[i].speed = rand() % 5 + 5; // 510
  7. }
  8. for (int i = 0; i < STR_NUM; i++){
  9. for (int j = 0; j < STR_SIZE; j++)
  10. {
  11. rain[i].str[j] = CreateCh();
  12. }
  13. }
  14. }

5、输出字符

(1)字符串颜色设置

  1. settextcolor(RGB(255.0 / STR_SIZE * i, 255.0 / STR_SIZE * j, 0));
  2. //settextcolor(RGB(0, 255 - 13 * j, 0));

6、字符移动

7、变换字符

8、主函数main()

(1)如何解决字符下降速度较快问题

方法一:if()条件判断语句实现

  1. DWORD t1, t2;
  2. t1 = t2 = GetTickCount();
  3. while
  4. {
  5. if (t2 - t1 > 20) //使游戏下落延时
  6. {
  7. GamePlay();
  8. t1 = t2;
  9. }
  10. t2 = GetTickCount();
  11. }

方法二:Sleep()函数实现,功能: 等待一段时间

  1. #include<Windows.h> //适用于Windows系统
  2. #include <unistd.h> //适用于Linux系统
  3. Sleep(20); //使整个程序延时

(2)图形化界面的打开与关闭

  1. initgraph(WIDTH, HEIGTH); //打开图形化窗口
  2. closegraph(); //关闭图像化窗口

二、完整代码

  1. #include<stdio.h>
  2. #include<math.h>
  3. #include<graphics.h> //图形化界面头文件
  4. #include<Windows.h>
  5. #define WIDTH 960 //窗口宽度
  6. #define HEIGTH 640 //窗口高度
  7. #define STR_SIZE 20 //字符串数组的最大存储长度
  8. #define STR_NUM 128 //字符串数量
  9. #define STR_WIDTH 15 //字符串宽度
  10. // 数字雨的结构体
  11. struct Rain
  12. {
  13. int x; //数字雨横向位置
  14. int y; //y坐标
  15. int speed; //下降速度
  16. char str[STR_SIZE]; //数字雨数组
  17. }rain[STR_NUM];
  18. //随机字符
  19. char CreateCh()
  20. {
  21. int flag = rand() % 3; //随机产生数字012,且产生概率相同
  22. switch (flag)
  23. {
  24. case 0:
  25. return rand() % 26 + 'A';
  26. break;
  27. case 1:
  28. return rand() % 26 + 'a';
  29. break;
  30. case 2:
  31. return rand() % 10 + '0';
  32. break;
  33. default:
  34. break;
  35. }
  36. }
  37. //初始化
  38. void GameInit()
  39. {
  40. for (int i = 0; i < STR_NUM; i++)
  41. {
  42. rain[i].x = i * STR_WIDTH;
  43. rain[i].y = rand() % HEIGTH;
  44. rain[i].speed = rand() % 5 + 5; // 510
  45. }
  46. for (int i = 0; i < STR_NUM; i++)
  47. {
  48. for (int j = 0; j < STR_SIZE; j++)
  49. {
  50. rain[i].str[j] = CreateCh();
  51. }
  52. }
  53. }
  54. //输出字符
  55. void GameDraw()
  56. {
  57. cleardevice();
  58. for (int i = 0; i < STR_NUM; i++)
  59. {
  60. for (int j = 0; j < STR_SIZE; j++)
  61. {
  62. settextcolor(RGB(255.0 / STR_SIZE * i, 255.0 / STR_SIZE * j, 0));
  63. //settextcolor(RGB(0, 255 - 13 * j, 0));
  64. outtextxy(rain[i].x, rain[i].y + j * STR_WIDTH, rain[i].str[j]);
  65. //使用rain[i].y + j * STR_WIDTH输出一串随机字符
  66. }
  67. }
  68. }
  69. //字符移动
  70. void GamePlay()
  71. {
  72. for (int i = 0; i < STR_NUM; i++)
  73. {
  74. rain[i].y += rain[i].speed;
  75. if (rain[i].y - STR_SIZE * STR_WIDTH > HEIGTH)
  76. {
  77. rain[i].y = 0;
  78. }
  79. }
  80. }
  81. //变换字符
  82. void ChangeCh()
  83. {
  84. for (int i = 0; i < STR_NUM; i++)
  85. {
  86. rain[rand() % STR_NUM].str[rand() % STR_SIZE] = CreateCh();
  87. }
  88. }
  89. int main()
  90. {
  91. initgraph(WIDTH, HEIGTH); //打开图形化窗口
  92. srand(GetTickCount()); //利用ASCII码值随机生成,GetTickCount();直接获取电脑开机到现在的毫秒数
  93. GameInit();
  94. DWORD t1, t2;
  95. t1 = t2 = GetTickCount();
  96. while (1)
  97. {
  98. BeginBatchDraw();
  99. GameDraw();
  100. ChangeCh();
  101. if (t2 - t1 > 20) //使游戏下落延时
  102. {
  103. GamePlay();
  104. t1 = t2;
  105. }
  106. t2 = GetTickCount();
  107. EndBatchDraw();
  108. //Sleep(20); //使整个程序延时
  109. }
  110. getchar();
  111. closegraph(); //关闭图像化窗口
  112. return 0;
  113. }

三、运行效果

PS:可以自己试着运行一下,感受数字雨的动态效果

注意:

(1)如何解决字符串频闪问题

  1. BeginBatchDraw();
  2. EndBatchDraw();

(2)如何解决不兼容问题

方法:项目-属性-配置属性-常规-字符集-使用多字节字符集

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/94212
推荐阅读
相关标签
  

闽ICP备14008679号