慢羊羊的空间

无为,无我,无欲,居下,清虚,自然

C 语言天罡三十六题 - 进阶九题(2021-5-27) 金牌收录

该系列共分四篇:

相关说明请参考基础九题

进阶九题

10. 天贵星

任务:模拟 45 度反弹的 10 个小球。

在屏幕里画一个大矩形。

在矩形内的随机位置生成 10 个小球,每个小球都沿着某个 45 度方向匀速前进,碰到矩形边框后做 45 度反弹,反弹后速度不减,再次碰撞后再次反弹,如此往复循环。模拟这个动画过程。

11. 天富星

任务:绘制下面两张传说中的视觉错觉图片。

12. 天满星

任务:绘制星空动画。

用像素点代表星星。屏幕上有 200 颗星星,从左向右移动。每颗星星拥有不同的亮度和移动速度。越亮的星星,表示离自己越近,移动速度越快。

13. 天孤星

任务:通过键盘控制一个小球上下左右移动。

画出 20 行、30 列的空心圆阵列,将空心圆阵列中坐标为(10, 10)的圆画为实心的。

任务 1:通过 a、s、d、w 四个键,实现实心圆的移动。例如,按下 d 键,实心圆从(10, 10)移到(11, 10)。输入大写的 A、S、D、W 仍然有效。

任务 2:实现实心圆的自动行走。例如,按下 d 键,实心圆从(10, 10)移到(11, 10),再到(12, 10),一直向右走,移动速度为 500 毫秒移一格。移动到右边界后,从左边穿出来。再按其它方向,便会向其它方向自动行走。

任务 3:通过四个方向键实现对实心圆的移动控制(提示:参考微软官方文档中对 _getch 函数的介绍,其中有如何获取功能键的讲解)。

14. 天伤星

任务:生命游戏。

生命游戏也叫康威生命游戏、细胞自动机、元胞自动机等。

生命游戏不需要任何玩家,它是一个二维矩形世界,这个世界中的每个方格居住着一个活细胞或为空。

一个细胞在下一个时刻的生死取决于相邻八个方格中的活细胞数量,使整个生命世界不至于太过荒凉或拥挤,达成一种动态的平衡。

当一个方格没有活细胞时:

  • 若周围有 3 个活细胞,则该方格产生一个活细胞(模拟繁殖)。

当一个方格存在活细胞时:

  • 若周围少于 2 个活细胞,则该方格的细胞死亡(模拟人口稀疏)。
  • 若周围有 2 个或 3 个活细胞,保持原样。
  • 若周围多于 3 个活细胞,则该方格的细胞死亡(模拟极度拥挤)。

约定:世界为 100 x 100 大小。初始状态为世界周边有一圈活细胞。

写一个程序,模拟这个细胞世界的繁衍更迭。

15. 天立星

任务:不可思议的图案。

请问如下数学步骤将会生成什么图案?

(1) 随机生成 3 个点 P[0]、P[1]、P[2];

(2) 随机生成 1 个点 P;

(3) 绘制点 P;

(4) 随机生成整数 n(0 ≤ n ≤ 2);

(5) 令 P = P 与 P[n] 的中点;

(6) 重复执行步骤 (3)~(5) 三万次。

写一个程序模拟该过程以求得最终图案。

以上只是个开胃菜。完成之后,请继续完成以下任务:

求以下迭代公式的图像:

// x’ = a * x + b * y + e
// y’ = c * x + d * y + f
// p = 概率
// x、y 值范围:0 ~ 1
double a[5] = { 0.35173,  0.35338, 0.5,    0.5154,   0.00364 };
double b[5] = { 0.35537, -0.3537,  0,     -0.0018,   0 };
double c[5] = {-0.35537,  0.35373, 0,      0.00157,  0 };
double d[5] = { 0.35173,  0.35338, 0.5,    0.58795,  0.57832 };
double e[5] = { 0.3545,   0.2879,  0.25,   0.2501,   0.5016 };
double f[5] = { 0.5,      0.1528,  0.462,  0.1054,   0.0606 };
double p[5] = { 0.1773,   0.38,    0.1773, 0.2091,   0.0563 };

公式重复 5 万次。

简单解释一下步骤:

(1) 生成坐标 (x, y),范围是 0 < x < 1,0 < y < 1。

(2) 产生数组下标 n,范围 0 ≤ n ≤ 4。其中 n == 0 的概率为 17.73%,n == 1 的概率为 38%……,每个值的概率由数组 p[5] 指定,p[i] 的值就是 i 的概率。

(3) 计算 x’ = a[n] * x + b[n] * y + e[n],y’ = c[n] * x + d[n] * y + f[n]

(4) 令 x = x',y = y'。

(5) 在 (x, y) 位置画一个红色的点。

(6) 重复执行步骤 (2)~(5) 五万次。

写一个程序模拟该过程以求得最终图案。

注:x、y 坐标是数学坐标,要表示到屏幕上,需要相应放大,且颠倒 y 轴。

16. 天捷星

任务:打字母游戏。

具体要求:

  1. 进入游戏后,屏幕顶端随机位置产生一个随机的大写字母下落,按对应按键后字母消失。
  2. 每按对 10 个按键,字母下降速度加快一点,以增加游戏难度。
  3. 字母落到底部后游戏结束。

4. 游戏窗口右侧显示若干提示信息,例如:游戏时间、正确数量、错误数量、正确率、打字速度等。

5. 随机落下的字母由 1 个变为 3 个,按对任何 1 个按键,对应的字母消失,并重新产生一个新的字母落下。3 个字母的逻辑互不影响。

17. 天暗星

任务:双人击球游戏。

请顺序完成以下步骤:

1. 在屏幕上画一个较大的长方形作为游戏区域,里面有一个小球做 45 度反弹。

2. 将游戏区域长方形的左、右边界擦掉,改为画一个小矩形,表示挡板,通过按键 D、W 可以上下移动这个挡板。小球碰到挡板就反弹;小球越过左、右边界,游戏结束。

3. 左侧游戏者通过 ASDW、右侧游戏者通过方向键在各自的区域内上下左右四个方向移动挡板,击打小球。

4. 挡板改为圆球,小球碰撞到球形挡板后,根据两球碰撞的接触位置,计算出小球的反弹角度。

5. 在顶部增加游戏信息,先累计赢 3 次者,胜利。

游戏示意图如下(虚线表示小球运动轨迹,无需绘制):

18. 天佑星

任务:基于点阵图像的绘图板。

图像分两类,点阵图和矢量图。

点阵图又称位图或栅格图,整个图像由 M 行、N 列的像素点构成。在点阵图里画一条线,会引起若干像素颜色变化,点阵图只存储每个像素的颜色,不记录引起像素颜色改变的是直线还是圆。

矢量图记录的是每个图形元素的具体坐标尺寸等信息。在矢量图里画一条线,会记录下来这条线的起始点、终止点、粗细、颜色等信息。

该任务要求实现一个基于点阵图象的绘图板。需要实现的功能包括:选择颜色、画直线、画圆、画矩形、保存图片、加载图片。保存和加载图片不考虑多种尺寸的情况,只处理一种固定的尺寸即可。

进一步要求:在该任务的基础上,增加功能:鼠标在图像上选取一个矩形区域,然后可以对该区域应用图像滤镜,包括:马赛克效果、高斯模糊效果、灰度效果、黑白二值图效果等。

精英九题

https://codebus.cn/yangw/36-tasks-g3

添加评论