我觉得解决这个问题有几点要注意:实现方面:生成随机数、防止待猜测的数中重复数字
异常方面:处理输入不为四位的情况。
我练习输入输出、类型转换的时候做过一个类似功能的,但是有些地方不完善。
guess0.cpp
// Guess0.cpp : Defines the entry point for the console application.
//
//最后一次正确时,运行不正确
//猜数字
//产生的随机数每次都是1740,而给result赋值时每次都是1242。
//前者原因:rand的问题,该方法需要与srand一起使用;后者是类型转化过程出错
//可以考虑加上时间,按照时间长短给予不同提示。
#include "StdAfx.h"
#include "head.h"
#include <string.h>
#include <stdlib.h>
#include <afx.h>
#define ARRAY_SIZE 4 //宏,定义要猜的数字位数,默认为4,可以修改
#define CHANCE 10 //可以猜测的次数
char result[ARRAY_SIZE+1]={0};//要猜的数字数组;多定义一位,用于存储结束符
int counter = 0;//记录次数,不得大于CHANCE
int main(int argc, char* argv[])
{
char ans;
do{
process();
printf("是否继续?(是,输入“y”;否输入“n”)");
scanf("%c",&ans);
fflush(stdin);
}while(ans=='y'||ans=='Y');
return 0;
}
void myRand()//生成一个4位数字
{//应该在初始化中首次调用此方法
//把值传给result时容易出错,注意选择方式
//先 生成随机数,截取其各位数字,当有重复时重新生成。
memset(result,0,ARRAY_SIZE);
result[ARRAY_SIZE] = 0;
int i,j;
int nums[ARRAY_SIZE];//中间数组
memset(nums,0,ARRAY_SIZE);
char temp[ARRAY_SIZE][1];//注意!temp[]以及它以后的存储区域都是连续的,不能用temp首地址输出。
for(i=0;i<ARRAY_SIZE;i++)
{
memset(temp[i],'\0',1);
}
srand((unsigned)time(NULL));//使从当前时刻开始生成的随机数不存在重复
//若无此语句,程序每次执行,产生的随机数是按照顺序来的,依次为1740,9482。。。
for (i=0;i<ARRAY_SIZE;i++)
{
nums[i] = rand();
nums[i] = nums[i]%10;
for (j=0;j<i;j++) //消除重复数字
{ //新生成的数字要和前面所有数字比较
while(nums[i]==nums[j]) //遇到重复数字时,重新生成;
{ //此处不可用if,因为重新生成的数字也需要比较一次
nums[i] = rand();
nums[i] = nums[i]%10;
j=0; //一旦重新生成就重新开始比较,计数置0
}
}
sprintf(temp[i],"%d",nums[i]);
result[i] = temp[i][0];//把处理好的数字赋给result
}
result[ARRAY_SIZE] = '0'; //结束符
}
void process()//将获得的数字与已生成数字比较
{
//在菜单中说明
printf("欢迎进入本游戏。\n");
printf("程序将随机生成一个不含重复数字的四位数,然后请您猜测这个四位数。\n");
printf("在猜测的过程中我讲给您适当提示,其中\n");
printf("A代表结果中有且位置正确的数字,B代表结果中有但位置不正确的数字。\n");
printf("在一次游戏结束后,您可以查看结果或者重新开始。\n");
/*
CString inpt;//下面的GetAt调用出现问题,给inpt赋值可以解决
//但是赋值比如为0的话,又会提示长度不对;赋值为0000的话会提示重复数字
//明明在读入的时候,初始赋值已经改变了。
//调试发现虽然inpt已经获得了输入,但是其长度却未改变,应该是接受输入的过程出错
//根本原因在于用scanf读入CString对象的值。虽然能读入,但那只是一个临时值,随时
//会发生“不可预知”的错误。
//所以,改用字符数组或者字符指针实现这一问题
*/
/* //使用字符指针
char *inpt;//缓存输入
inpt = (char *)malloc(ARRAY_SIZE+1);
……
free(inpt);
*/
char inpt[]={0,0,0,'-',0};
char ans=NULL;
do
{
myRand();
printf("请输入一个不含重复数字的%d位数(多于四位将只处理前四位):\n", ARRAY_SIZE);
int count1 = 0, //结果中含该数字、位置正确,即A的值
count2 = 0;//结果中含该数字、位置不正确,即B的值
while(counter<CHANCE)
{
scanf("%s",inpt);
fflush(stdin);
while (judge_length(inpt)||judge_repeat(inpt))
{
printf("请重新输入:\n");
scanf("%s",inpt);
fflush(stdin);
}
int i,j;
count1 = 0;
count2 = 0;
for (i=0;i<ARRAY_SIZE;i++)
{
for (j=0;j<ARRAY_SIZE;j++)
{
if (inpt[j]==result[i])
{
if (i!=j)
count2++;
else
count1++;
}
}
}
if (count1==ARRAY_SIZE)
{
printf("恭喜您,猜对了!\n");
break;
}
else
{
printf("%s %d%c%d%c\n",inpt, count1, 'A', count2, 'B');
}
counter++;
}
if (counter==CHANCE)
{
printf("对不起,您已经用完了10次机会!您可以查看结果或者重新开始。");
printf("您可以输入0来查看正确结果。\n");
char choice;
scanf("%c",&choice);
if (choice=='0')
{
printf("正确结果是%s\n",result);
}
}
counter=0;
printf("继续?(y/n)\n");
scanf("%c",&ans);
fflush(stdin);
} while (ans=='y'||ans=='Y');
}
bool judge_repeat(char inpt[])//判断有无重复数字
{
int i,j;
for(i=0;i<ARRAY_SIZE;i++)
{
for (j=0;j<i;j++)
{
if (inpt[i]==inpt[j])
{
printf("您的输入含有重复数字。\n");
return true;
}
}
}
return false;
}
bool judge_length(char inpt[])//判断输入数字的位数
{
if (inpt[ARRAY_SIZE-1]=='-')//如果C/C++数组名可以调用类似length的
{ //函数,那样实现比较理想
//在声明inpt多加一位,加上条件inpt[ARRAY_SIZE]!=(指定字符),应该可以处理超出的输入
printf("您的输入长度不对。\n");
printf("inpt[ARRAY_SIZE-1] = %c\n",inpt[ARRAY_SIZE-1]);
printf("inpt[ARRAY_SIZE] = %c",inpt[ARRAY_SIZE]);
return true;
}
return false;
}
guess0.h
#include "StdAfx.h"
#include <afx.h>
void process();
bool judge_repeat(char inp[]);
bool judge_length(char inp[]);
温馨提示:内容为网友见解,仅供参考
求解编程题目<猜数字>C++\/C
printf("A代表结果中有且位置正确的数字,B代表结果中有但位置不正确的数字。\\n");printf("在一次游戏结束后,您可以查看结果或者重新开始。\\n");\/ CString inpt;\/\/下面的GetAt调用出现问题,给inpt赋值可以解决 \/\/但是赋值比如为0的话,又会提示长度不对;赋值为0000的话会提示重复数字 \/\/明明...
求反猜数字C\/C++原代码
这游戏老外管它叫 Bulls And Cows(Bulls 是 A,Cows 是 B)。用 C++ 可以这样写:include <iostream> include <string> include <sstream> include <set> include <cstdlib> include <ctime> using namespace std;\/\/ Returns bulls and cows scored by guess on secretNumber.string bullsAndCows...
C++的猜数字题目 和考试的不太一样 是大专生的期末考试 所以各位大虾...
include <stdio.h> include <stdlib.h> include <time.h> int main() { int i,result,an;srand((unsigned)time(NULL));do { result = (unsigned)rand()%90 + 10;for(i = 0; i < 10; ++i) { printf("输入你的答案 : ");scanf("%d",&an);if(an == result) { if(i < 3...
C语言编程题(设计一个猜数字的小游戏)满意再加200分!!!
if(cf>c)printf("第三个数应该比 %d 小一点!\\n",cf); if(cf==c)printf("恭喜!第三个数字对了!就是: %d\\n",cf); \/\/数字比较 if(cf<c)printf("第三个数应该比 %d 大一点!\\n",cf); if(df>d)printf("第四个数应该比 %d 小一点!\\n",df); if(df==d)printf("恭喜!第四个数字对了!
《C语言程序设计课程设计》任务书 设计题目:猜数字游戏
void main(void){ int answer[4]={1,3,5,2},guess,a,b,times=0,i,j;printf("please guess \\n");while (a!=4){a=0;b=0;times++;printf("%d ",times);scanf("%d",&guess);for(i=3;i>-1;i--){ for(j=0;j<4;j++){if((int) (guess\/pow(10,i))==answer[j...
编程高手请进!(C语言)
1.include <stdio.h> include<stdlib.h> include<ctype.h> main(){ int count;\/*猜数字的次数*\/ int number;\/*系统产生的随机数字*\/ int guess;\/*程序员输入数字*\/ char yes='Y';clrscr();printf("\\nNow let us play the game.\\n Guess the number:");while (toupper(yes)=='Y'...
C语言,C语言源代码到底是什么意思
然后写个猜数字 控制台程序 接下来用MFC给他写个界面 让大家知道学习这些算法到底有什么用 再往后,我可能会一直教界面编程 直到你们感觉到自己的算法需要深入学习 然后再回过头去学算法 别用什么垃圾TC了,这都什么年代了 新手建议VC6即可,又可以学算法 也能开发MFC界面程序 对电脑配置要求也不搞 ...
C语言编程题(设计一个猜数字的小游戏)满意再加200分!!!
int a,b,c,d; int af,bf,cf,df; if(aa==num) { printf("恭喜!你猜对了!四个数就是:%d\\n",num); return(0); } else { a=(num-num%1000)\/1000; b=(num%1000-(num%1000)%100)\/100; c=((num%1000)%100-((num%1000)%100)%10)\/10; \/\/获取默认四个数字 d=((num%1000)%100)%...