问题描述:在胜负判定的部分有点问题,实际上两根针隔的很远就会导致游戏输掉,希望优化一下,有偿打赏
代码见如下知乎原文
https://zhuanlan.zhihu.com/p/588883053?utm_psn=1714451083458650112
关于网上一个easyx制作的见缝插针小游戏(c++)
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
16条回答 默认 最新
关注获得7.50元问题酬金 引自强大而免费的微信小程序:皆我百晓生。
这个小游戏中,判断胜负的逻辑存在一些问题。实际上,两根针隔得非常远时是不应该判定为游戏输掉的。要修复这个问题,只需要修改碰撞判定的逻辑。
在游戏主循环的for循环中,比较两根针之间的角度接近程度时,将条件改为
if (abs(Angles[lineNum-1]-Angles[i]) < Pi/60 && i != lineNum-1)。这样,在比较两根针是否接近时,不会将新加的针和自身比较。只需要将旋转速度设为0并跳出循环即可。修改后的代码如下:
#include <graphics.h> #include <conio.h> #include <stdio.h> #include <math.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 score = 0; // 得分 int i; BeginBatchDraw(); // 开始批量绘制 while (1) // 重复循环 { cleardevice(); // 以背景色清空背景 setlinecolor(RGB(0,0,0)); // 设置针颜色为黑色 line(0,height/2,lineLength,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==' ') // 如果为空格键 { 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 (i=0;i<lineNum-1;i++) // 拿新增加的针和之前所有针比较 { // 如果两根针之间角度接近,认为碰撞,游戏失败 if (abs(Angles[lineNum-1]-Angles[i]) < Pi/60 && i != lineNum-1) { rotateSpeed = 0; // 旋转速度设为0 break; // 不用再比较了,循环跳出 } } score = score + 1; // 得分+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]; // 定义字符串数组 _stprintf(s, _T("%d"), score); // 将score转换为字符串 settextstyle(50, 0, _T("Times")); // 设置文字大小、字体 settextcolor(RGB(50,50,50)); // 设置字体颜色 outtextxy(65, 200, s); // 输出得分文字 FlushBatchDraw(); // 批量绘制 Sleep(10); // 暂停10毫秒 } closegraph(); // 关闭画面 return 0; }现在当两根针间隔较大时,就不会判定为游戏失败了。同时,两根非相邻的针之间角度接近也不会导致游戏失败。
评论 打赏 举报 编辑记录解决 2无用