编程环境:visual studio,插件:easyX
创建窗口
设置背景颜色
setbkcolor(WHITE) 颜色单词要大写
或者 setcolor(RGB(255,255,255)) 用计算机三原色也可以实现同样的效果
#include<graphics.h>
#include<conio.h>
#include<stdio.h>
#include<math.h>
int main() {
initgraph(800, 600); //设置窗口大小
setbkcolor(WHITE); //设置背景颜色是白色
cleardevice(); //刷新背景,不然默认是黑色
_getch(); //设置一直输入状态,让设置的窗口可以一直显示
closegraph(); //关闭设置状态
}
添加角色
设置空心圆
setlinecolor(BLUE) 设置线条颜色
circle(x,y,半径) :绘制空心圆,给定圆心坐标和半径
设置线条
setlinestyle(PS_SOLID,3) :设置线条宽度
line(x1,y1,x2,y2):绘制线条,给定线条的起点坐标和终点坐标
#include<graphics.h>
#include<conio.h>
#include<stdio.h>
#include<math.h>
int main() {
initgraph(800, 600);
setbkcolor(WHITE);
cleardevice();
setlinestyle(PS_SOLID, 3); //设置线条宽度,放在画圆之前,圆一起变宽一点
setlinecolor(RGB(0, 0, 0)); //修改设置的线条颜色,区分开圆和线条
line(400, 300, 560, 300); //绘制线条x1=400,y1=300,x2=560,y2=300
setlinecolor(BLUE);
fillcircle(400, 300, 60); //画实心圆,盖住圆范围内的线条
_getch();
closegraph();
}
但是针是会旋转的,现在先试一下把这根水平直线,旋转一下角度
假设每偏移的角度是 float angle=0.01;
起点坐标都设置成圆心,终点坐标需要偏移角度,因为绘制的线条长度是160,所以
x2 = 160 * cos(-angle) + 400;
y2 = 160 * sin(-angle) + 300;
(因为是逆时针旋转,角度会负数)
#include<graphics.h>
#include<conio.h>
#include<stdio.h>
#include<math.h>
int main() {
initgraph(800, 600);
setbkcolor(WHITE);
cleardevice();
float angle = 0.1; //偏移的角度
float x2, y2; //终点坐标
setlinestyle(PS_SOLID, 3);
//设置线条
setlinecolor(RGB(0, 0, 0));
x2 = 160 * cos(-angle) + 400; //x轴上偏转的是正弦
y2 = 160 * sin(-angle) + 300; //y轴上偏转的是余弦
line(400, 300, x2, y2);
setlinecolor(BLUE);
fillcircle(400, 300, 60);
_getch();
closegraph();
}
让针旋转
知道了如何偏移角度之后,把绘制圆和针的代码进行无限循环就可以了
#include<graphics.h>
#include<conio.h>
#include<stdio.h>
#include<math.h>
int main() {
initgraph(800, 600);
setbkcolor(WHITE);
cleardevice();
setlinestyle(PS_SOLID, 3);
float angle =0; //把变量放在循环外面
float s=0.01; //设置速度
float x2, y2;
while (1) {
cleardevice(); //刷新每一根针
angle += s; //每一次针增加的角度,数值越大,旋转越快
setlinecolor(RGB(0, 0, 0));
x2 = 160 * cos(-angle) + 400;
y2 = 160 * sin(-angle) + 300;
line(400, 300, x2, y2);
setlinecolor(BLUE);
fillcircle(400, 300, 60);
Sleep(10); //延迟一下
}
_getch();
closegraph();
}
设置之后就可以看见一根针旋转的效果了
实现量产
先尝试实现有多根针在旋转,用数组先存储多根针偏移的角度
float angle[1000]; 把角度改成数组类型
在数组中平均分布针的初始位置
for (int i = 0; i < 20; i++) { //循环产生20根针的角度
angle[i] = i*2*3.14/20; //在圆上平均分布
}
绘制的时候再遍历一次,并让每一根针的角度增加
#include<graphics.h>
#include<conio.h>
#include<stdio.h>
#include<math.h>
int main() {
initgraph(800, 600);
setbkcolor(WHITE);
cleardevice();
setlinestyle(PS_SOLID, 3);
float angle[100]; //把角度变成数组类型
float s=0.01;
for (int i = 0; i < 20; i++) { //循环产生20根针的角度
angle[i] = i*2*3.14/20; //在圆上平均分布
}
float x2, y2;
while (1) {
cleardevice();
setlinecolor(RGB(0, 0, 0));
for (int i = 0; i < 20; i++) { //遍历数组
angle[i] += s; //每一个角度在逐渐增加
x2 = 160 * cos(-angle[i]) + 400;
y2 = 160 * sin(-angle[i]) + 300;
line(400, 300, x2, y2);
if (angle[i] > 2 * 3.14) { //设置角度增加的边界,防止角度无限增加爆数组
angle[i] -= 2 * 3.14;
}
}
setlinecolor(BLUE);
fillcircle(400, 300, 60);
Sleep(10);
}
_getch();
closegraph();
}
运行之后会出现卡顿,添加两个代码
BeginBatchDraw(); 开始批量生产
FlushBatchDraw();
#include<graphics.h>
#include<conio.h>
#include<stdio.h>
#include<math.h>
int main() {
initgraph(800, 600);
setbkcolor(WHITE);
cleardevice();
setlinestyle(PS_SOLID, 3);
float angle[100];
float s=0.01;
for (int i = 0; i < 20; i++) {
angle[i] = i*2*3.14/20;
}
float x2, y2;
BeginBatchDraw(); //循环之前开始
while (1) {
cleardevice();
setlinecolor(RGB(0, 0, 0));
for (int i = 0; i < 20; i++) {
angle[i] +=s;
x2 = 160 * cos(-angle[i]) + 400;
y2 = 160 * sin(-angle[i]) + 300;
line(400, 300, x2, y2);
if (angle[i] > 2 * 3.14) {
angle[i] -= 2 * 3.14;
}
}
setlinecolor(BLUE);
fillcircle(400, 300, 60);
FlushBatchDraw(); //注意位置在绘制结束
Sleep(10);
}
_getch();
closegraph();
}
空格键插针
int num=0; 添加一个变量统计目前针的数量
按下一次空格键,变量增加1,将针添加进去
if (_kbhit()) { //记得加下划线
char c = _getch();
if (c == ' ') { //引号之间有一个空格
num++;
angle[num - 1] = 3.14;
x2 = 160 * cos(-angle[num - 1]) + 400;
y2 = 160 * sin(-angle[num - 1]) + 300;
line(400, 300, x2, y2);
}
}
最后要记得去修改for循环中的范围
#include<graphics.h>
#include<conio.h>
#include<stdio.h>
#include<math.h>
int main() {
initgraph(800, 600);
setbkcolor(WHITE);
cleardevice();
setlinestyle(PS_SOLID, 3);
int num = 0; //针的个数
float angle[100];
float s=0.01;
for (int i = 0; i < 20; i++) {
angle[i] = i*2*3.14/20;
}
float x2, y2;
BeginBatchDraw();
while (1) {
cleardevice();
setlinecolor(RGB(0, 0, 0));
line(10, 300, 170, 300); //绘制一根待放入的针
for (int i = 0; i < num; i++) { //循环范围为针的个数
angle[i] += s;
x2 = 160 * cos(-angle[i]) + 400;
y2 = 160 * sin(-angle[i]) + 300;
line(400, 300, x2, y2);
if (angle[i] > 2 * 3.14) {
angle[i] -= 2 * 3.14;
}
}
if (_kbhit()) {
char c = _getch();
if (c == ' ') {
num++;
angle[num - 1] = 3.14; //设置添加的初始位置
x2 = 160 * cos(-angle[num - 1]) + 400;
y2 = 160 * sin(-angle[num - 1]) + 300;
line(400, 300, x2, y2);
}
}
setlinecolor(BLUE);
fillcircle(400, 300, 60);
FlushBatchDraw();
Sleep(10);
}
_getch();
closegraph();
}
失败判断
在按键事件中遍历angle数组,判断角度是否小于间隔的角度,挨得太近设置速度为0
for (int i = 0; i < num - 1; i++) {
if (fabs(angle[num - 1] - angle[i]) < 3.14 / 60) {
s = 0;
break;
}
}
#include<graphics.h>
#include<conio.h>
#include<stdio.h>
#include<math.h>
int main() {
initgraph(800, 600);
setbkcolor(WHITE);
cleardevice();
setlinestyle(PS_SOLID, 3);
int num = 0; //针的个数
float angle[100];
float s = 3.14 / 360;
for (int i = 0; i < 20; i++) {
angle[i] = i*2*3.14/20;
}
float x2, y2;
BeginBatchDraw();
while (1) {
cleardevice();
setlinecolor(RGB(0, 0, 0));
line(10, 300, 170, 300);
for (int i = 0; i < num; i++) {
angle[i] += s;
x2 = 160 * cos(-angle[i]) + 400;
y2 = 160 * sin(-angle[i]) + 300;
line(400, 300, x2, y2);
if (angle[i] > 2 * 3.14) {
angle[i] -= 2 * 3.14;
}
}
if (_kbhit()) {
char c = _getch();
if (c == ' ') {
num++;
angle[num - 1] = 3.14;
x2 = 160 * cos(-angle[num - 1]) + 400;
y2 = 160 * sin(-angle[num - 1]) + 300;
line(400, 300, x2, y2);
//判断胜负
for (int i = 0; i < num - 1; i++) {
if (fabs(angle[num - 1] - angle[i]) < 3.14 / 60) {
s = 0;
break; //跳出循环,游戏会暂停不动
}
}
}
}
setlinecolor(BLUE);
fillcircle(400, 300, 60);
FlushBatchDraw();
Sleep(10);
}
_getch();
closegraph();
}