C++:见缝插针双人对战

简单说两句,这个双人对战只是实现了两人的对分,并没有做出相应判断,感兴趣的小伙伴可以自己动手写写。玩家一按数字1键,玩家二按数字2键,而且随着插入的针越来越多,速度也会越来越快。不过,你们可以自己更改参数来控制加速度的大小。可以自己研究下如何来控制加速度,实在想不通代码中也有注释可以让其找到相应的地方。
1.所用头文件

#include "stdafx.h"
#include <graphics.h>  
#include <conio.h>
#include <stdio.h>
#include <math.h>
#include <time.h> 

主函数

int main()
{
	const float Pi = 3.1415926; // Pi常量
	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 score1 = 0; // 得分
	int score2=0;
	int i;

	BeginBatchDraw(); // 开始批量绘制
	while (1) // 重复循环
	{
		cleardevice(); // 以背景色清空背景
		setlinecolor(RGB(0, 0, 0)); // 设置针颜色为黑色
		line(0, height / 2, lineLength, height / 2); // 左边发射区域的一根针
		line(640, height / 2, width, height / 2); // 右边发射区域的一根针

		for (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 == '1') // 如果为1键
			{
				lineNum++; // 针的个数加1
				rotateSpeed += Pi / 720;//实现越来越快
				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 (i = 0; i<lineNum - 1; i++) // 拿新增加的针和之前所有针比较
				{
					// 如果两根针之间角度接近,认为碰撞,游戏失败
					if (fabs(Angles[lineNum - 1] - Angles[i]) < Pi / 60)
					{
						rotateSpeed = 0; // 旋转速度设为0
						break; // 不用再比较了,循环跳出
					}
				}
				score1 += 1; // 得分+1
			}

			if (input == '2') // 如果为2键
			{
				lineNum++; // 针的个数加1
				rotateSpeed += Pi / 720;//实现越来越快
				Angles[lineNum - 1] = 0; // 这根新增加针的初始角度
				xEnd = lineLength*cos(-Angles[lineNum - 1]) + width / 2; //新增针的末端坐标
				yEnd = lineLength*sin(-Angles[lineNum - 1]) + height/ 2;
				line(width / 2, height / 2 ,xEnd, yEnd); // 绘制出这根新增加的针
				for (i = 0; i<lineNum - 1; i++) // 拿新增加的针和之前所有针比较
				{
					// 如果两根针之间角度接近,认为碰撞,游戏失败
					if (fabs(Angles[lineNum - 1] - Angles[i]) < Pi / 60)
					{
						rotateSpeed = 0; // 旋转速度设为0
						break; // 不用再比较了,循环跳出
					}
				}
				score2 += 1; // 得分+1
			}
		}

		setfillcolor(HSVtoRGB(0, lineNum / 60.0, 0.8)); // 绘制中间的圆盘,针越多,其颜色越鲜艳
		setlinecolor(HSVtoRGB(0, 0.9, 0.8)); // 设置圆盘线条颜色为红色
		int xEnd = 400; // 圆心坐标
		int yEnd = 300;
		int radius; // 圆半径	
		int j;
		float offset;  // 同一半径各组扇形之间的角度偏移量
		float totalOffset = 0; // 不同半径之间的角度偏移量
		for (radius = 60; radius > 0; radius = radius - 20) // 半径从大到小绘制
		{
			int left = xEnd - radius; // 圆外切矩形左上角x坐标
			int top = yEnd - radius; // 圆外切矩形左上角y坐标
			int right = xEnd + radius; // 圆外切矩形右下角x坐标
			int bottom = yEnd + radius; // 圆外切矩形右下角y坐标	
			for (j = 0; j < 20; j++) // 绕着旋转一周,绘制扇形区域
			{
				offset = j * Pi / 10 + totalOffset; // 各组扇形之间偏移的角度
				setfillcolor(RGB(0, 240, 220));// 设置填充颜色为青色
				solidpie(left, top, right, bottom, offset, 2 * Pi / 60 + offset); // 画填充扇形
				setfillcolor(RGB(255, 255, 255));// 设置填充颜色为白色
				solidpie(left, top, right, bottom, 2 * Pi / 60 + offset, 3 * Pi / 60 + offset);//画填充扇形
				setfillcolor(RGB(200, 0, 0));// 设置填充颜色为红色
				solidpie(left, top, right, bottom, 3 * Pi / 60 + offset, 5 * Pi / 60 + offset);//画填充扇形
				setfillcolor(RGB(0, 0, 0));// 设置填充颜色为黑色
				solidpie(left, top, right, bottom, 5 * Pi / 60 + offset, 6 * Pi / 60 + offset);//画填充扇形
			}
			totalOffset = totalOffset + Pi / 20; // 不同半径间角度偏移量为Pi/20
		}

		TCHAR s1[20]; // 定义字符串数组
		TCHAR s2[20]; // 定义字符串数组
		_stprintf(s1, _T("%d"), score1); // 将score1转换为字符串
		_stprintf(s2, _T("%d"), score2); // 将score2转换为字符串
		settextstyle(50, 0, _T("Times")); // 设置文字大小、字体
		settextcolor(RGB(50, 50, 50));  // 设置字体颜色
		outtextxy(65, 200, s1); // 输出得分文字
		outtextxy(665, 200, s2); // 输出得分文字

		FlushBatchDraw(); // 批量绘制
		Sleep(10); // 暂停10毫秒
	}
	closegraph();  // 关闭画面
	return 0;
}

3.实现效果
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孤独的根号三号程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值