(图书介绍:童晶:《C和C++游戏趣味编程》新书预告)
这学期的线下C语言课程,大一同学们学完旋转蛇案例后(童晶:第4章 旋转蛇(《C和C++游戏趣味编程》配套教学视频)),布置了一次错觉图片生成实验的PBL,给了大家5天时间分组完成代码、ppt报告。
这次,介绍许林苗、赵嘉仪、徐琪、刘竺同学实现的Go forward together错觉。由于同学们学习C语言刚一个月,还没有正式学习数组、函数等语法知识,因此代码可能不够完善。以下提供了分步骤的实现思路、代码,大家可以参考。
首先是同学们调研的目标效果:
最终实现效果:
大概原理:蓝色和黄色在黑白条纹上移动,蓝色和黄色分别有一半时间的移动是不易感知的,给我们带来交替前进的错觉。
目标效果:两个小方块,在黑白条纹背景下以相同速度前进,产生一前一后交替前进的错觉。按下空格键改变背景条纹有无的状态,有背景时,会有错觉,无背景时,很明显两小方块一起前进。
1 绘制条纹背景
黑、白色方块交替绘制,当奇数时绘制黑色长方形,偶数时绘制白色长方形,最后形成黑白条纹的背景。(for循环+if语句)
#include<stdio.h>
#include<graphics.h>
#include<conio.h>
int main()
{
int height=400;//画面高度
int width=800;//画面宽度
initgraph(width,height);//打开一个画面
setbkcolor(RGB(139,139,139));//设置背景颜色为灰色
cleardevice();//以背景色清空画面
int stripe_width=width/40;
int stripe_num;
for(stripe_num=1;stripe_num<=width/stripe_width;stripe_num++)
{
if(stripe_num%2==1)
{
setfillcolor(RGB(0,0,0));//设置填充颜色为黑色
fillrectangle(stripe_width*(stripe_num-1),0,stripe_width*stripe_num,height);//绘制方块
}
else
{
setfillcolor(RGB(255,255,255));//设置填充颜色为白色
fillrectangle(stripe_width*(stripe_num-1),0,stripe_width*stripe_num,height);//绘制方块
}
}
_getch();
closegraph();
return 0;
}
2 绘制颜色不同的两个小方块
在画面左边1/3和2/3处分别绘制一个黄色和蓝色的小方块
#include<stdio.h>
#include<graphics.h>
#include<conio.h>
int main()
{
int height=400;//画面高度
int width=800;//画面宽度
initgraph(width,height);//打开一个画面
setbkcolor(RGB(139,139,139));//设置背景颜色为灰色
cleardevice();//以背景色清空画面
float stripe_width=width/40;//条纹宽度
float rect_length=stripe_width*4;//移动小方块长度
float rect_width=stripe_width*2;//移动小方块宽度
int stripe_num;//条纹数量
for(stripe_num=1;stripe_num<=width/stripe_width;stripe_num++)//绘制条纹背景
{
if(stripe_num%2==1)//奇数项为黑色
{
setfillcolor(RGB(