根据试验,发现C++ 转杯子猜球位置 游戏有BUG。
BUG 1:当输入杯子个数较大时,会导致输出出现问题。
BUG 1 原因:窗口太小,输出太多时会导致换行输出。
BUG 1 解决方案:将控制台的大小进行调整,使其大小合理,不仅增加了美观性,还让 BUG 1 得以解决
BUG 2:上程序输入难度虽然超过20,但程序会自动把他设为20,就会让别人非常嚣张。
BUG 2 原因:当杯子数量多时,移动距离变长,时间也会变长,导致猜位置变得更简单。
BUG 2 解决方案:针对这个情况,我研发了一个新的功能,在这里先保密,如有想知道者,请自己编译程序并运行。
下面是 转杯子猜球位置 2 完整代码
- #include
- #include
- using namespace std;
- char a[50][50]={"------",
- "| |",
- "| |",
- "| |",
- "------"};
- int c,n=10,kl,sudu;
- bool k[200]={0,1,0,0};
- using namespace std;
- void color(int x)
- {
- switch(x)
- {
- case 1:SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY |FOREGROUND_RED );break;
- case 2:SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY |FOREGROUND_BLUE );break;
- case 3:SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY |FOREGROUND_GREEN);break;
- case 4:SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY |FOREGROUND_RED |FOREGROUND_BLUE );break;
- case 5:SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY |FOREGROUND_RED |FOREGROUND_GREEN);break;
- case 6:SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY |FOREGROUND_BLUE |FOREGROUND_GREEN);break;
- case 7:SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY |FOREGROUND_GREEN|FOREGROUND_BLUE |FOREGROUND_RED);break;
- default:SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY |FOREGROUND_GREEN|FOREGROUND_BLUE |FOREGROUND_RED);break;
- }
- }
- void cls()
- {
- system ("cls");
- }
- void xy(int y,int x)
- {
- COORD coord;
- coord.X=x;
- coord.Y=y;
- HANDLE a=GetStdHandle(STD_OUTPUT_HANDLE);
- SetConsoleCursorPosition(a,coord);
- }
- void out(int x,int y,bool t)
- {
- if (kl)
- color(rand()%7+1);
- if (t)
- for (int i=0;i<5;i++,x++)
- {
- xy(x,y);
- for (int j=0;j<6;j++)
- }
- else
- for (int i=0;i<5;i++,x++)
- {
- xy(x,y);
- for (int j=0;j<6;j++)
- cout <<" ";
- }
- }
- void yuan()
- {
- for (int i=1;i<=n;i++)
- out (8,12*i-3,1);
- }
- void dong()
- {
- int a,b,i,t;
- a=rand()%n+1;
- do
- b=rand()%n+1;
- while (b==a);
- t=abs(12*a-12*b);
- swap (k[a],k[b]);
- out (8,12*a-3,0);
- out (8,12*b-3,0);
- for (i=7;i>=1;i--)
- {
- out (i,12*a-3,1);
- out (16-i,12*b-3,1);
- Sleep (sudu);
- out (i,12*a-3,0);
- out (16-i,12*b-3,0);
- }
- if (a>b)
- for (i=1;i<=t;i++)
- {
- out (1,a*12-3-i,1);
- out (15,b*12-3+i,1);
- Sleep (sudu);
- out (1,a*12-3-i,0);
- out (15,b*12-3+i,0);
- }
- else
- for (i=1;i<=t;i++)
- {
- out (15,b*12-3-i,1);
- out (1,a*12-3+i,1);
- Sleep (sudu);
- out (15,b*12-3-i,0);
- out (1,a*12-3+i,0);
- }
- for (i=1;i<=7;i++)
- {
- out (16-i,12*a-3,1);
- out (i,12*b-3,1);
- Sleep (sudu);
- out (16-i,12*a-3,0);
- out (i,12*b-3,0);
- }
- yuan();
- }
- int main()
- {
- system("mode con cols=130 lines=28");
- srand(int (0));
- int in,d;
- xy(0,5); cout <<"转杯子猜球:请选择难度星级:1 ~ 20 ( 1 最简单 ,20 最难,难度超过20会有惊喜呦,嘿嘿嘿)";
- xy(1,5); cin >>in;
- if (in<1) in=1;
- if (in>20) in=20,kl=1;
- Sleep (500);
- cls();
- xy(0,5); cout <<"转杯子猜球:请选择杯子个数:3 ~ 10";
- xy(1,5);
- cin >>n;
- if (n<3) n=3;
- if (n>10) n=10;
- sudu=round(20/n)-round(in/n);
- cls();
- yuan();
- for (int i=1;i<=7;i++)
- {
- xy(i,11); cout <<"○";
- Sleep (100);
- xy(i,11); cout <<" ";
- }
- for (int i=1;i<=c;i++)
- dong();
- xy(20,20);
- cout <<"转完了,请问球在哪个杯子里呢?";
- xy(22,20);
- cin >>in;
- for (int i=1;i<=n;i++)
- if (k[i])
- {
- d=i;
- break;
- }
- xy(24,20);
- if (in==d)
- cout <<"恭喜你猜对了!!";
- else
- cout <<"很遗憾,正确答案是" <
- Sleep(1000);
- xy(30,100);
- return 0;
- }
变量的名字有点奇怪,因为我是乱打的,请见谅。
主要思路:
做一大堆自定义函数,然后再将它们结合起来。
1、xy 函数:改变输出坐标,详见:C++ 如何改变输入输出光标的位置
2、yuan 函数:将杯子设为初始状态
3、cls 函数:等于 system ("cls") ;
4、color 函数:此函数可用于特殊情况,解决 BUG 2。
5、dong 函数:最重要的函数,用来制造杯子移动的动画效果。
终于打完了!
-
相关阅读:
memmove函数详解 看这一篇就够了-C语言(函数讲解、函数实现、使用用法举例、作用、自己实现函数 )
测试八股文-单元测试框架
SpringBoot集成Swagger的使用
在 Streamlit 中使用自定义 CSS 创建加密仪表板
JAVA泛型实现原理
C++11delete与default
限流的简单实现
另辟蹊径者 PoseiSwap:背靠潜力叙事,构建 DeFi 理想国
ProtoPie for Mac(高保真交互原型设计工具)
C#中的四种类型转换
-
原文地址:https://blog.csdn.net/DUXS11/article/details/126556343