见缝插针小游戏

基于VS2019   EasyX插件   C/C++

见缝插针小游戏

#include<graphics.h>
#include<conio.h>
#include<stdio.h>
#include<math.h>
int main()
{
	float Pi = 3.1415926;
	int width = 800;//画面宽度
	int height = 600;//画面高度
	initgraph(width, height);//新开一个画面
	setbkcolor(RGB(255, 255, 255));//背景设为白色
	setlinestyle(PS_SOLID, 3);//线宽为3,这样针看起来更明显

	float lineLength = 160;//针的长度
	float xEnd, yEnd;//针的终点位置坐标(针起始位置为圆心)
	float rotateSpeed = Pi / 360;//针的旋转速度
	int lineNum = 0;//在旋转的针的个数
	float Angles[1000];//浮点数数组,存储所有针的旋转角度,最多1000根针
	int score = 0;//得分

	BeginBatchDraw();//开始批量绘制
	while (1) 
	{
		cleardevice();//以背景色清空背景
		setlinecolor(RGB(0, 0, 0));//设置针的颜色为黑色

		line(0, height / 2, lineLength, height / 2);//左边发射区域的一根针

		for (int i = 0; i < lineNum; i++)//对所有旋转针进行遍历
		{
			Angles[i] = Angles[i] + rotateSpeed;//角度增加
			if (Angles[i] > 2 * Pi)//如果超过2*Pi就减去2*Pi,防止角度数据无限增加
			{
				Angles[i] = Angles[i] - 2 * Pi;
			}
			xEnd = lineLength * cos(-Angles[i]) + width / 2;//计算针的末端坐标
			yEnd = lineLength * sin(-Angles[i]) + height / 2;
			setlinecolor(RGB(0, 0, 255));//设定旋转针的颜色为蓝色
			if (i == lineNum - 1)
			{
				setlinecolor(RGB(255, 0, 0));
			}
			line(width / 2, height / 2, xEnd, yEnd);//绘制一根针
		}

		if (_kbhit() && rotateSpeed!=0)//如果按键,并且旋转速度不等于0
		{
			char input = _getch();//获得用户按键输入
			if (input == ' ')//如果为空格键
			{
				lineNum++;//针的个数加1
				Angles[lineNum - 1] = Pi;//这跟新增加针的初始角度
				xEnd = lineLength * cos(-Angles[lineNum - 1]) + width / 2;//新增针的末端坐标
				yEnd = lineLength * sin(-Angles[lineNum - 1]) + height / 2;
				line(width / 2, height / 2, xEnd, yEnd);//绘制出这跟新增加的针

				for (int i = 0; i < lineNum - 1; i++)
				{
					//如果两根针之间角度接近,认为碰撞,游戏失败
					if (fabs(Angles[lineNum - 1] - Angles[i]) < Pi / 60)
					{
						rotateSpeed = 0;//旋转速度设为0
						break;//不需要再次进行比较了,循环跳出
					}
				}
			}
			score = score + 1;
		}
		setfillcolor(HSVtoRGB(0, lineNum / 60.0, 0.8));//针越多,中间圆盘颜色越鲜艳
		setlinecolor(HSVtoRGB(0, 0.9, 0.8));//设置圆盘线条颜色为红色
		fillcircle(width / 2, height / 2, 60);//绘制中间的圆盘
		TCHAR s[20];//定义字符串数组
		swprintf_s(s, _T("%d"), score);//将score转换为字符串
		settextstyle(50, 0, _T("Times"));//设置文字大小、字体
		settextcolor(RGB(50, 50, 50));//设置字体颜色
		outtextxy(65, 200, s);//输出得分文字

		FlushBatchDraw();//批量绘制,当该行代码之前全部执行完成后才会进行一次绘制
		Sleep(10);

	}
	closegraph();
	return 0;
}

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值