报数游戏
今天偶然看到评论区争议比较多,来改一下大一的作业。重新用C++写了一下,加了一些判错,大家可以看看还有没有bug噢!
原题:中国古代民间有这样一个游戏:两个人从1开始轮流报数,每人每次可报一个数或两个连续的数,谁先报到30,谁为胜方。若要改成游戏者与计算机做这个游戏,则首先需要决定谁先报数,可以通过生成一个随机数来决定计算机和游戏者谁先报数。
计算机报数的原则为:若剩下数的个数除以3,余数为1,则报1个数,若剩下数的个数除以3,余数为2,则报2个数,否则随机报1个或2个数。
游戏者通过键盘输入自己报的数,所报的数必须符合游戏的规则。如果计算机和游戏者都未报到30,则可以接着报数。先报到30者即为胜方。请编程实现这个游戏,看一看游戏者和计算机谁能获胜。
修改后的代码(C++写的)
#include<iostream>
#include <ctime>
using namespace std;
#define N 30 //报到30就赢
int FirstPlayer(){
srand(time(NULL));
return rand() % 2 ;
}
int Computer(int p){
int rest = N - p;
int type = 1; //输出数字个数
if(rest%3==1){
type = 1;
}else if(rest%3==2){
type = 2;
}else{
srand(time(NULL));
type = 1 + rand()%2;
}
switch(type){
case 1:
p++;
cout<<"Computer:"<<p<<endl;
break;
case 2:
p=p+2;
cout<<"Computer:"<<p-1<<" "<<p<<endl;
break;
}
return p;
}
int Player(int p){
int temp;
int count=0;
cout<<"Player:";
while(cin>>temp){
if(count>=2){
cin.ignore(INT_MAX,'\n');//清空之前的输入,确保最多读入2个数字且不影响后续进行
break;
};
if(temp!=p+1){
cout<<"输入有误,请从"<<p+1<<"开始报1或2个数"<<endl;
cin.ignore(INT_MAX,'\n');//清空之前的输入
cout<<"Player:";
continue;
}else{
p=temp;
count++;
}
if(cin.get()=='\n'){
break;
}
}
return p;
}
int main(){
int cur = FirstPlayer(); //记录当前玩家,0为机,1为人
if(cur==0){
cout<<"Computer First"<<endl;
}else{
cout<<"You fisrt"<<endl;
}
int p=0; //维护一个p,记录当前轮到的数值
while(p>=0&&p<N){
if (cur==0){
p = Computer(p);
cur++;
}else{
p = Player(p);
cur--;
}
}
//退出while时,cur是指下一位玩家,所以cur是输家
if(cur==0){
cout<<"You win";
}else{
cout<<"Computer win";
}
}
原来大一的代码(做个保留,大家忽略掉就好):
//大一的代码
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int FirstPlayer (void); //决定报数先后
int Player (int i); //游戏者报数
int Computer (int i); //计算机报数
int main (void)
{
int i=0,fp;
fp=FirstPlayer();
if (fp==1)
{
printf("You first.\n");
do{
i=Player(i);
i=Computer(i);
}while(i!=30);
}
if (fp==0)
{
printf("Computer first.\n");
do{
i=Computer(i);
i=Player(i);
}while(i!=30);
}
return 0;
}
int FirstPlayer (void)
{
int fp;
srand(time(NULL));
fp=rand()%2;
return fp;
}
int Player (int i)
{
int count=0;
do{
scanf("%d",&i);
count++;
}while (getchar()!='\n'&&count<2);
if (i==30)
{
printf("You win!\n");
}
return i;
}
int Computer (int i)
{
int rest,a,flag=0;
rest=30-i;
if (rest%3==1)
{
printf("Computer:%d\n",i+1);
flag=1;
}
else if (rest%3==2)
{
printf("Computer:%d %d\n",i+1,i+2);
flag=2;
}
else
{
srand(time(NULL));
a=rand()%2;
switch (a)
{
case 0:
printf("Computer:%d\n",i+1);
flag=1;
break;
case 1:
printf("Computer:%d %d\n",i+1,i+2);
flag=2;
break;
}
}
if (flag==1)
{
if ((i+1)==30)
{
printf("Computer win!\n");
}
return i+1;
}
if (flag==2)
{
if ((i+2)==30)
{
printf("Computer win!\n");
}
return i+2;
}
return 0;
}
总结&需改进
- 没有检验用户输入的数是否符合规则
- 部分重复性步骤没有进行优化、分装(比如决定先后顺序的时候,在主函数用了两个if语句和do-while语句)(感觉不太好)
时间:2020/11/21 19:51
补充:
用C++重写了一下噢,朋友们可以看看还有什么bug,想改的时候我再改一下(随缘……)
时间:2022/12/24 18:51