你只能点十次, 但蝴蝶效应最终达到1万度。六种模式是可选的,每种模式都可以不断挑战极限,达到最高度。几十只精致的蝴蝶扇动翅膀,向你展示蝴蝶效应的美妙。一个小小的差异可能会导致很大的差异。
这是-10步万度游戏,效果如图所示:
玩法介绍:鼠标点击任何小圆圈,其指针顺时针旋转90度,随后的指向圆指针也依次旋转,所有圆圈的旋转度积累。玩家点击10次,试图获得尽可能高的旋转度。
首先,学习结构体的概念,利用结构体数组存储所有小圆信息;然后学习鼠标交互方法,实现鼠标点中小圆的旋转;然后学习数组作为函数的参数,实现旋转的迭代传播;最后统计和显示操作步数和旋转度数。
源码示例:
#include <graphics.h>
#include <conio.h>
#include <math.h>
#define PI 3.14159 // PI宏定义
struct Round // 定义结构体,用来表示带角指示的小圆圈
{
float x,y; // 小圆的圆心坐标
float r; // 小圆半径
int angleNum; // 这里的对应角度只有0、1、2、3。表示乘以 PI/2 四个角度值后对应
};
// 全局变量定义
Round rounds[5][5]; // 结构体二维数组
int step; // 剩下的操作步数
int score; // 得分,也就是一共旋转多少度
void rotateRound(int i,int j) // 顺时针旋转二维数组中i行j列的小圆圈
{
rounds[i][j].angleNum -= 1; // 值减1
if (rounds[i][j].angleNum<0) // 如果小于0,再设为3
rounds[i][j].angleNum = 3;
score += 90; // 得分加上90度
}
// 获得当前圆指向的下一个圆圈序列号
// 当前的圆序号存储在数组int中 indexes[2]下一个圆序号也存储在这个数组中
// 若有下一个方向的圆,返回1;如果指向边界,返回0
int GetNextIndexes(int indexes[2])
{
int i = indexes[0]; // 现在的圆i,j序号
int j = indexes[1]; //
// 根据当前圆的角度,获得下一个小圆圈的序号
if (rounds[i][j].angleNum==0) // 指向右边的小圆圈
j++; // right
else if (rounds[i][j].angleNum==3) // 指向下面的小圆圈
i++; // down
else if (rounds[i][j].angleNum==2) // 指向左边的小圆圈
j--; // left
else if (rounds[i][j].angleNum==1) // 指向上面的小圆圈
i--; // up
indexes[0] = i; // 下一个圆的序号在数组中更新
indexes[1] = j; //
if (i>=0 && i<5 && j>=0 && j<5) // 假如序号没有越界
return 1; // 说明指向一个圆圈,返回1
else //
return 0; // 没有指向有效圆圈,返回0
}
void startup() // 初始化函数
{
initgraph(600,700); // 新建画面
setbkcolor(RGB(50,50,50)); // 设置背景颜色
setlinestyle(PS_SOLID,3); // 设置线条样式和线宽
cleardevice(); // 清空背景
BeginBatchDraw(); // 批量绘制开始
step = 10; // 总共可以操作10步
score = 0; // 初始为0度
int i,j;
// 初始化 设置5*5共25个小圆圈
for (i=0;i<5;i++)
{
for (j=0;j<5;j++)
{
rounds[i][j].x = 100 + j*100; // 设置小圆圈的圆心坐标
rounds[i][j].y = 200 + i*100; //
rounds[i][j].r = 30; // 设置小圆圈的半径
rounds[i][j].angleNum = 1; // 一开始是PI/2角度,也就是说,都是向上的
}
}
}
void show() // 绘制函数
{
int i,j;
float angle; //
cleardevice();
// 遍历所有的小圆圈
for (i=0;i<5;i++)
{
for (j=0;j<5;j++)
{
setlinecolor(RGB(200,200,200)); // 将圆圈设置为白灰色
circle(rounds[i][j].x,rounds[i][j].y,rounds[i][j].r); // 画小圆圈
setlinecolor(RGB(255,0,0)); // 角度指示线设置为红色
angle = rounds[i][j].angleNum * PI/2; // 相应的角度是通过数组记录的变量设置的
// 用三角函数画出这条红线
line(rounds[i][j].x, rounds[i][j].y,
rounds[i][j].x + rounds[i][j].r * cos(-angle),
rounds[i][j].y + rounds[i][j].r * sin(-angle));
}
}
TCHAR s[20]; // 要输出的字符串
setbkmode(TRANSPARENT); // 文字的透明显示
_stprintf(s, _T("%d 步 %d 度"), step, score); // 将整数转换为字符串
settextstyle(50, 0, _T(“宋体”); // 字体大小,风格
outtextxy(150, 30, s); // 输出xy位置的字符串
settextstyle(20, 0, _T(“宋体”); //
outtextxy(15,100,_T(”点击一个圆圈 其指针顺时针旋转90度 指针依次旋转”);
FlushBatchDraw();
FlushBatchDraw(); // 批量绘制开始
}
void update() // 更新函数
{
MOUSEMSG m; // 定义鼠标消息
if (MouseHit()) // 假如有鼠标消息
{
m = GetMouseMsg(); // 得到鼠标消息
if (m.uMsg == WM_LBUTTonDOWN && step>0) // 按鼠标左键,还有可操作的步数
{
step--; // 操作步数-1
int clicked_i = int(m.y -150)/100; // 获得当前点击圆圈的序号
int clicked_j = int(m.x -50)/100; //
rotateRound(clicked_i,clicked_j); // 顺时针旋转当前圆圈90度
show(); // 绘制
Sleep(500); // 暂停几毫秒
int indexes[2] = {clicked_i,clicked_j}; // 数组存储点击小圆圈的行列序列号
while (GetNextIndexes(indexes)) // 获得指向的下一个圆圈。如果返回1,它将被重复执行
{
rotateRound(indexes[0],indexes[1]); // 将下一个指向的圆圈旋转90度
show(); // 绘制
Sleep(500); // 暂停几毫秒
}
}
}
}
int main() // 主函数
{
startup(); // 初始化
while (1) // 重复循环
{
show(); // 绘制
update(); // 更新
}
return 0;
}
作者:童晶
希望对大家有所帮助!
此外,我还与您分享我收集的其他资源,从最零基础教程到C语言C++项目案例,在学习C语言的道路上,帮助大家克服困难!
分享编程学习书籍:
编程学习视频分享:
整理分享(多年学习的源代码、项目实战视频、项目笔记、基础入门教程)最重要的是,你可以在小组中交换编程问题!
对于C/C++如果你感兴趣,你可以在后台关注小编的私信:[编程交流]一起学习!可以得到一些C///C++项目学习视频资料哦!已设置关键字自动回复,自动接收!
声明:易商讯尊重创作版权。本文信息搜集、整理自互联网,若有来源标记错误或侵犯您的合法权益,请联系我们。我们将及时纠正并删除相关讯息,非常感谢!