C 语言天罡三十六题 - 进阶九题(2024-8-17 更新)
该系列共分四篇:
- 基础九题 https://codebus.cn/yangw/36-tasks-g1
- 进阶九题 https://codebus.cn/yangw/36-tasks-g2 (本篇)
- 精英九题 https://codebus.cn/yangw/36-tasks-g3
- 封神九题 https://codebus.cn/yangw/36-tasks-g4
相关说明请参考基础九题。
进阶九题
10. 天贵星
任务:绘制下面两张传说中的视觉错觉图片。
11. 天富星
任务:绘制星空动画。
用像素点代表星星。屏幕上有 200 颗星星,从左向右移动。每颗星星拥有不同的亮度和移动速度。越亮的星星,表示离自己越近,移动速度越快。
12. 天满星
任务:通过键盘控制一个小球上下左右移动。
画出 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 函数的介绍,其中有如何获取功能键的讲解)。
13. 天孤星
任务:生命游戏。
生命游戏也叫康威生命游戏、细胞自动机、元胞自动机等。
生命游戏不需要任何玩家,它是一个二维矩形世界,这个世界中的每个方格居住着一个活细胞或为空。
一个细胞在下一个时刻的生死取决于相邻八个方格中的活细胞数量,使整个生命世界不至于太过荒凉或拥挤,达成一种动态的平衡。
当一个方格没有活细胞时:
- 若周围有 3 个活细胞,则该方格产生一个活细胞(模拟繁殖)。
当一个方格存在活细胞时:
- 若周围少于 2 个活细胞,则该方格的细胞死亡(模拟人口稀疏)。
- 若周围有 2 个或 3 个活细胞,保持原样。
- 若周围多于 3 个活细胞,则该方格的细胞死亡(模拟极度拥挤)。
约定:世界为 100 x 100 大小。初始状态为世界周边有一圈活细胞。
写一个程序,模拟这个细胞世界的繁衍更迭。
14. 天伤星
任务:不可思议的图案。
请问如下数学步骤将会生成什么图案?
(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 轴。
15. 天立星
任务:12 个运动的小球。
步骤 1:一个小球坐标在 (0, 0),匀速运动到 (0, 1),再继续匀速运动到 (0, -1),再继续匀速运动到 (0, 0)。整个过程,分 120 步完成,每步间隔 16ms。整体效果就是一个小球上下移动。
步骤 2:步骤 1 的小球运动轨迹比较生硬,现在用 sin 函数优化运动轨迹:运动的 120 步,第 t 步的坐标是:
步骤 3:步骤 2 的小球运动方向为垂直方向(即 90° 方向),现改为水平运动(即 0° 方向),观察小球的运动效果。
步骤 4:将步骤 2 的小球改为沿 60° 方向运动,观察小球的运动效果。
步骤 5:同时生成 12 个运动的小球,第 t 个小球的运动方向为 180° * t / 12,观察 12 个小球的运动效果。
步骤 6:在步骤 5 的基础上,调整 12 个小球,使每个小球比前一个小球的 sin 运动轨迹的起始弧度少 π/12,观察 12 个小球的运动效果。
注: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 列的像素点构成。在点阵图里画一条线,会引起若干像素颜色变化,点阵图只存储每个像素的颜色,不记录引起像素颜色改变的是直线还是圆。
矢量图记录的是每个图形元素的具体坐标尺寸等信息。在矢量图里画一条线,会记录下来这条线的起始点、终止点、粗细、颜色等信息。
该任务要求实现一个基于点阵图象的绘图板。需要实现的功能包括:选择颜色、画直线、画圆、画矩形、保存图片、加载图片。保存和加载图片不考虑多种尺寸的情况,只处理一种固定的尺寸即可。
进一步要求:在该任务的基础上,增加功能:鼠标在图像上选取一个矩形区域,然后可以对该区域应用图像滤镜,包括:马赛克效果、高斯模糊效果、灰度效果、黑白二值图效果等。
添加评论
取消回复