假如有n个学生排成一圈,编号从1到n,每个人有初始积分,不防设为100。从1号开始掷骰子,骰子出现后,根据点数减去掷骰人的相应积分,如减去 10*(6 - 投掷点数),然后根据点数多少,就依次向后数掷骰的点数同等数量的人,被数到的最后一个人继续掷骰子,计算积分,依此类推。如果某人掷骰后,其积分小于等于0则出列,余下的人继续按照此法进行游戏,直到剩下最后一个人,为胜利者。要求打印每次出列的人的编号,掷骰子的次数,当前积分。并打印最后胜利者的相应信息。
#include <iostream>
#include <cstdlib>
#include <ctime>
#define N 100
using namespace std;
int Rnum() //产生掷点数。
{
srand((unsigned)time(NULL));
int n;
n=rand()%6+1;
return n;
}
int main()
{
int m,n; //学生数m,掷点数n。
int a[N]={0},a1[N]={0},i=1,j=0,k=0,cnt=0; //学生编号i,出局人数cnt。
cout<<"学生数为:";
cin>>m;
for(i=0;i<N;i++){
a[i]=100;
}
n=Rnum();
a[1]=100-10*(6-n);
do{
i++;
if(i>m)
i=1;
if(a[i]>0){ //未出局。
k++;
if(k==n){ //能掷骰子。
n=Rnum();
a[i]=100-10*(6-n);
j=i;
a1[j]++;
k=0;
if(a[i]<=0){ //出局。
cnt++;
}
}
}
}while(cnt!=m-1);
for(i=1;i<=m;i++){
if(a[i]>0){
j=i;
cout<<"胜利者编号:"<<i<<endl;
cout<<"胜利者掷骰子次数:"<<a1[j]<<endl;
cout<<"胜利者当前积分:"<<a[i]<<endl;
}else{
j=i;
cout<<"出列学生编号:"<<i<<endl;
cout<<"出列学生掷骰子次数:"<<a1[j]<<endl;
cout<<"出列学生当前积分:"<<a[i]<<endl;
}
}
return 0;
}
运行无结果输入
解答我写出的代码问题所在,感谢
}while(cnt!=m-1);---这个条件要求仅当cnt 等于m-1时才会退出循环,要确认不出现死循环
36行 a[i]=100-10*(6-n);应该有问题,应该是a[i] -= 10*(6-n); 经过多轮后,a[i]不再是基础的100分啊,你不能每次都是100减去一个值,这样a[i]永远不会小于40,就不会淘汰,死循环
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!