见缝插针

编程环境: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();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值