◣菜菜鸟必看◥:编个猜数字,增强信心

到百度贴吧首页
新闻   网页   贴吧   知道   MP3   图片   视频   百科
    吧内搜索 | 帮助

◣菜菜鸟必看◥:编个猜数字,增强信心

1楼

C语言,带你入门...

还没入门不要紧...也不要认为学C就要很多的数学知识!
最要紧的,你要明白C语言是多么的好玩.
跟着下面的例子,你写完后会很有成就感.以后学起来就轻松了.

(高手勿看)

我们现在来做一个<猜数字>游戏...
游戏规则参照文曲星里的猜数字:

输入四入不重复的数字(中间用空格隔开)按<回车>后结果显示在后边,
形式为 " ? A ? B", 四个数中位置和数字都正确为 A,数字相同位置不同为 B,
当 4 A 0 B 时为猜对,每一局有8次机会.

如:原四个数为1234,则
1234  4 A 0 B
5678  0 A 0 B  没有一个对.
1243  2 A 2 B  3,4虽对但位置错.

明白了规则后,下手就容易了,也许你还没头绪,没关系,一步一步来.

1.首先明白自己的游戏要做什么?
  由玩家输入四个数字,验证这四个数和正确答案的关系,提供一个" X A X B"的
  提示给玩家,再输入...直至玩家猜对或到达八次.

2.游戏需要什么资源?
  这个游戏并不需要什么特别的,只要一个printf,和scanf获得输入.

  所以程序开头:

#include <stdio.h>
  加入标准输入输出,没有它Turbo C不知道printf和scanf在哪来.

好,程序设计开始...

main(){
}

先把这个函数写下来,这个叫主函数,一个程序就只有一个,也称为程序入口函数,
你的程序就是从这里开始执行的.(是不是有点废话?)

(以下操作都在main()中)
设定四个变量储存正确答案:(也可以结个初值)
int a1,a2,a3,a4;
再设定四个变量诸存玩家的输入:
int b1,b2,b3,b4;
设定一个变量诸存猜的次数并赋初值:
int n = 0;
设定两个变量诸存结果A,B的个数:
int cA,cB;

准备工作完成,设定正确答案:
a1 = 3;
a2 = 5;
a3 = 9;
a4 = 7;
(当然你会抱怨正确答案是固定的,不要紧,下面会告诉你怎么产生随机的效果,慢慢来.)

仔细想一想整个游戏流程...
大概是这样的:

循环执行:
输入;
对比正确答案;
输出提示;
判断是否猜对;
  是:显示胜利并退出循环,否:不理会;
次数加1;
判断次数是否超出;
  是:显示失败并退出循环;
循环结束;

那么,为了更容易理解,我们使用死循环,但要注意一点:里面必须有使循环结束的语句!
break;就是这个语句.

那么:

while(1){
...
break;
...
}

就写下吧.while(XX){YYYY}是这样工作的:
XX是不是0 (真)
  不是:
    执行 YYYY
  是:退出循环
再检查XX是不是不为0
...
不过你必须明确:break;会强制退出循环.

好,就这样:

printf("\n\t Guess Numbers!\n\n"); /*打印一点提示信息*/
while(1){ /*开始用户的输入和程序输出*/
printf("%d:  ",n+1); /*打印当前是第几次输入*/
scanf("%d %d %d %d",&b1,&b2,&b3,&b3);
/*先不要知道为什么要在b1,b2这前加&,先认为,scanf就要这样*/
cA=0;
cB=0; /*对比就要开始,先把结果置0*/

/*对比开始,我们用一堆if来为我们做事*/
/*虽然这有点累赘,但谁叫我们是初学者呢?不过告诉你,这种表达效率是最高的*/
if(a1 == b1) cA++;
if(a2 == b2) cA++;
if(a3 == b3) cA++;
if(a4 == b4) cA++; /*逐个检查增加A的数量*/

if(a1 == b2 || a1 == b3 || a1 == b4) cB++;
if(a2 == b1 || a2 == b3 || a2 == b4) cB++;
if(a3 == b1 || a3 == b2 || a3 == b4) cB++;
if(a4 == b1 || a4 == b2 || a4 == b3) cB++;
/*穷举检查得到B的数量*/
/*当然,你必须保证玩家输入的都不一样,不然就会闹出笑话*/
/*检查对比结束*/

/*打印提示*/
printf("\t\t%d A %d B\n",cA,cB);
/*判断是否胜利*/
if(cA == 4){
printf("\n\tWell Done!\n");
getch(); /*getch()的功能是输入一个字符,不需要回车,也不会显示到屏幕*/
/*通常用来暂停程序*/
break; /*退出循环*/
}
/*次数加一*/
n++;
/*判断次数*/

2楼

if(n > 7){
printf("\nYou Lose!\n");
getch();
break;
}
}

整个游戏过程完成.

整理一下:

/*guess.c*/
#include <stdio.h>
main(){
int a1 = 0,a2 = 0,a3 = 0,a4 = 0;
int b1 = 0,b2 = 0,b3 = 0,b4 = 0;
int n = 0;
int cA,cB;

a1 = 3;
a2 = 5;
a3 = 9;
a4 = 7;

printf("\n\t Guess Numbers!\n\n");
while(1){
printf("%d:  ",n+1);
scanf("%d %d %d %d",&b1,&b2,&b3,&b4);
cA=0;
cB=0;

if(a1 == b1) cA++;
if(a2 == b2) cA++;
if(a3 == b3) cA++;
if(a4 == b4) cA++;

if(a1 == b2 || a1 == b3 || a1 == b4) cB++;
if(a2 == b1 || a2 == b3 || a2 == b4) cB++;
if(a3 == b1 || a3 == b2 || a3 == b4) cB++;
if(a4 == b1 || a4 == b2 || a4 == b3) cB++;

printf("\t\t%d A %d B\n",cA,cB);

if(cA == 4){
printf("\n\tWell Done!\n");
getch();
break;
}
n++;
if(n > 7){
printf("\nYou Lose!\n");
getch();
break;
}
}
}

这样一个简单的猜数字游戏就做成了.
不过你可能得意不起来,因为这样规定正确答案实在不能算个游戏,你说呢?
另外,我们还需验证玩家的输入是不是符合规定的"不重复"和"不出界".
于是我们来给这个游戏润色润色.

(以下部分要多一点C语言知识,如简单数组)
第一:取得随机的不重复的答案.

C标准函数库stdlib里有两个预定义的函数:
randomize() 复位随机发生器.
int random(num) 生成一个0到num-1的随机数.

好,说干就干!
可问题就来了,要怎么产生呢?
我们不能保证随机产生的四个数都不同啊?
不过你可能会想,每次都随机产生一个数直至与现有的不同,不就可以了么?
这的确是个不错的想法,用在这里是不会产生问题的.
不过这种想法不符合程序设计的思想...我们无法确定这个过程在什么时候完成,
因为有可能三分钟内没有"生"出与其它不同的数,虽然可能性近乎不可能...
另外,如果要在1亿个数中挑出5000万个,怎么办?显然这是不可行的...

下面演示了一个新的算法:

1.创建一个诸存着0,1,2,...,9的数组.(10个元素)
2.打散这个数.
3.取数组的前四个(其它的也可以,不过是固定的)

打散数组可以这样表达:
随机取得数组的两个位置,然后交换.当然做一两次效果不明显,我们让它做500次或更多
就"看起来很无规律"了.

下面是代码:

#include <stdlib.h> /*要用到随机发生函数*/

在main()里:

int arr[10]={0,1,2,3,4,5,6,7,8,9); /*声明数组,用来两两交换*/
int i,index1,index2; /*一个用于循环计数,index1,2用来保存产生的两个随机生成的数组位置*/
int temp; /*声明临时变量,你会体会到交换两个数时临时变量的作用*/

randomize(); /*复位随机发生器,你可试一试没有这句会有什么结果*/
for(i=0;i<500;i++){ /*做500次交换*/
index1=random(10);
index2=random(10); /*随机产生0~9,刚好符合数组的下标最大小值*/
temp=arr[index1]; /*将arr[index1]的值保存到temp中*/
arr[index1]=arr[index2]; /*将arr[index2]放到arr[index1]中*/
arr[index2]=temp; /*从temp中取出原来arr[index1]的值给[index2]*/
}

a1=arr[0];
a2=arr[1];
a3=arr[2];
a4=arr[3]; /*取出前四个作为问题的答案,当然不一定前四个*/

........
下面解决玩家的"不守规距"问题.

玩家的输入有时是不可预料的,也就是说,我们必须检测并在有错时让玩家重输.
重输的话,超过这重循环,直接进入下一层循环而不往下执行 就行了,因为我们用的是死循环.
他再怎么错都不怕循环会用完,并且次数本身不会被改.

首先,在玩家输入之前给b1~b4,重新赋值,使其不合法.
b1=11;
b2=11;
b3=11;
b4=11;

在玩家输入之后:
(这里又要用到穷举法了,当然还有其它的方法,自己想)

if(b1==b2 || b1==b3 || b1==b4 || b2==b3 || b2==b4 || b3==b4){ /*四个数两两比较用六次*/
printf("Input error!\n");
continue;
}
if(b1<0 || b1>9 || b2<0 || b2>9 || b3<0 || b3>9 || b4<0 || b4>9){ /*不用理会这么长的if*/
printf("Input error!\n");
continue;
}

这样的话,我们的代码就这样了:


/*guess.c*/
#include <stdio.h>
#include <stdlib.h>
main(){
int a1 = 0,a2 = 0,a3 = 0,a4 = 0;
int b1 = 0,b2 = 0,b3 = 0,b4 = 0;
int n = 0;

int cA,cB;
int arr[10]={0,1,2,3,4,5,6,7,8,9};
int i,index1,index2;
int temp;

randomize();
for(i=0;i<500;i++){
index1=random(10);
index2=random(10);
temp=arr[index1];
arr[index1]=arr[index2];
arr[index2]=temp;
}

a1=arr[0];
a2=arr[1];
a3=arr[2];
a4=arr[3];

printf("\n\t Guess Numbers!\n\n");
while(1){
printf("%d:  ",n+1);

b1=11;
b2=11;
b3=11;
b4=11;

scanf("%d %d %d %d",&b1,&b2,&b3,&b4);

if(b1==b2 || b1==b3 || b1==b4 || b2==b3 || b2==b4 || b3==b4){
printf("Input error!\n");
continue;
}
if(b1<0 || b1>9 || b2<0 || b2>9 || b3<0 || b3>9 || b4<0 || b4>9){
printf("Input error!\n");
continue;
}

cA=0;
cB=0;

if(a1 == b1) cA++;
if(a2 == b2) cA++;
if(a3 == b3) cA++;
if(a4 == b4) cA++;

if(a1 == b2 || a1 == b3 || a1 == b4) cB++;
if(a2 == b1 || a2 == b3 || a2 == b4) cB++;
if(a3 == b1 || a3 == b2 || a3 == b4) cB++;
if(a4 == b1 || a4 == b2 || a4 == b3) cB++;

printf("\t\t%d A %d B\n",cA,cB);

if(cA == 4){
printf("\n\tWell Done!\n");
getch();
break;
}
n++;
if(n > 7){
printf("\nYou Lose!\n");
getch();
break;
}
}
}

终于有点规模了...
好,就说到此,如果理解了,就给这个游戏加上一个显示正确数字的功能(投降),另外,让其能猜多几局也是个不错的主意.
(其实,能改进的还很多,你自己思考吧)

编程,就这么简单!

218.62.43.*

3楼

谢谢你

4楼

算是手把手教了~~
谢谢~

218.25.35.*

5楼

非常好呀
218.25.91.*

6楼

好贴~~~
218.75.233.*

7楼

真是个高手啊,你不象我们这些菜鸟 ,什么都不会啊
218.75.244.*

8楼

程序是出来了
可不符合课程设计的要求呀
还有也没有蚧面设计划

9楼

那就不好意思了,怎么你课程设计不符合我的游戏啊?

10楼

好厉害哦~
218.5.83.*

11楼

这位兄弟。。。
做的不错。。
算得上有黑客精神了。。
网络就应该这样。。有问题大家一起来。
互相帮助嘛。。
叫一生老师不为过。。
哎,我现在 很累哈。,刚毕业。C懂一点。可是没高手带。。
一个人学的太累。。
想进公司实习都没人要。
不知道怎么办哦。。
~~~~~~~~~~~~~~~~~~

202.196.235.*

12楼

多谢高手不吝赐教!!!!!!!!!!!!!!1
218.94.246.*

13楼

#include<iostream>
#include<cmath>
#include<cstdlib>
using namespace std;
//success()
void success()
{void play();
cout<<"你真聪明,还要再练练吗?y/n"<<endl;
 char choice='a';
 while(choice!='y'&&choice!='Y'&&choice!='n'&&choice!='N')
 { cin>>choice;
 if(choice=='y'||choice=='Y') play();
 if(choice=='n'||choice=='N') exit(1);
 }
}
//fail()
void fail()
{void play();
cout<<"失败了,可惜啊!再来一局怎么样?y/n"<<endl;
 char choice='a';
 while(choice!='y'&&choice!='Y'&&choice!='n'&&choice!='N')
 { cin>>choice;
 if(choice=='y'||choice=='Y') play();
 if(choice=='n'||choice=='N') exit(1);
 }
}
//play()
void play()
{int a[4]; //答案
int b[4]; //用户输入的数字
int n=0,i=0; //用户使用的猜测次数
int na=0,nb=0; //用于储存a,b的次数
a[0]=10*rand()/32767;
a[1]=10*rand()/32767;
a[2]=10*rand()/32767;
a[3]=10*rand()/32767;
//begin
while(n<8)
{for(int i=0;i<4;i++)
 cin>>b[i];
if(b[0]==a[1]||b[0]==a[2]||b[0]==a[3]) nb++;
if(b[1]==a[0]||b[1]==a[2]||b[1]==a[3]) nb++;
if(b[2]==a[1]||b[2]==a[3]||b[2]==a[0]) nb++;
if(b[3]==a[1]||b[3]==a[2]||b[3]==a[0]) nb++;
if(b[0]==a[0]) na++;
if(b[1]==a[1]) na++;
if(b[2]==a[2]) na++;
if(b[3]==b[3]) na++;
cout<<na<<"A"<<nb<<"B"<<endl;
na=nb=0;
n++;
if(n<=8&&na==4) success();
else if(n>8)
{ cout<<"正确答案:"<<a[0]<<" "<<a[1]<<" "<<a[2]<<" "<<a[3]<<endl;
 fail();
}
}
}
int main()
{cout<<"本程序用于模拟猜数字游戏,你有8次猜测机会(好好加油哦!)"<<endl;
getchar();
play();
return 0;
}
大侠帮忙修改一下,此程序运行可以,但是一次play()以后就自动结束了!谢谢了!

222.209.208.*

14楼

晕C语言游戏编程上的第一个例子
221.0.95.*

15楼

不能用!!!!!!!!!!!!!!!!!
60.220.2.*

16楼

for(i=0;i<4;i++)
 for(j=0;j<4;j++)
 {if(a[i]==b[j])
 {if(i==j)A++;
 else B++;}}
穷举法换成这个循环可以吗?

17楼

顶你一个 谢谢楼主 楼主辛苦了 ^_^
222.22.20.*

18楼

太感动了~~~
这下期末考试有着落了~~`

19楼

编写一个猜数字的程序

计算机随机产生1——100之间的数字,用户猜其大小,系统给出提示,告诉用户才的数是大了还是小,直到用户猜到为止,并给出猜的次数
这个题目怎么做啊?

20楼

13楼的 我改了下下
看看符合你的要求不?
#include<iostream> 
#include<cmath> 
#include<cstdlib> 
using namespace std; 
int j=0;
//success() 
void success() 
{
cout<<"你真聪明,还要再练练吗?y/n"<<endl; 
 char choice='a'; 
 while(choice!='y'&&choice!='Y'&&choice!='n'&&choice!='N') 
 { cin>>choice; 
 if(choice=='y'||choice=='Y') cout<<"再次加油哦!"<<endl; 
 if(choice=='n'||choice=='N') j=12000;; 
 } 

//fail() 
void fail() 
{
cout<<"失败了,可惜啊!再来一局怎么样?y/n"<<endl; 
 char choice='a'; 
 while(choice!='y'&&choice!='Y'&&choice!='n'&&choice!='N') 
 { cin>>choice; 
 if(choice=='y'||choice=='Y') cout<<"再次加油哦!"<<endl; 
 if(choice=='n'||choice=='N') j=12000; 
 } 

//play() 
void play() 
{int a[4]; //答案 
int b[4]; //用户输入的数字 
int n=0,i=0; //用户使用的猜测次数 
int na=0,nb=0; //用于储存a,b的次数 
a[0]=10*rand()/32767; 
a[1]=10*rand()/32767; 
a[2]=10*rand()/32767; 
a[3]=10*rand()/32767; 
//begin 
 while(n<8) 
 {
na=nb=0; 
for(int i=0;i<4;i++) 
 cin>>b[i]; 
if(b[0]==a[1]||b[0]==a[2]||b[0]==a[3]) nb++; 
if(b[1]==a[0]||b[1]==a[2]||b[1]==a[3]) nb++; 
if(b[2]==a[1]||b[2]==a[3]||b[2]==a[0]) nb++; 
if(b[3]==a[1]||b[3]==a[2]||b[3]==a[0]) nb++; 
if(b[0]==a[0]) na++; 
if(b[1]==a[1]) na++; 
if(b[2]==a[2]) na++; 
if(b[3]==b[3]) na++; 
cout<<na<<"A"<<nb<<"B"<<endl; 

n++; 
 if(n<=8&&na==4) 
{ success(); 
 break;}
 
 else 
if(n>=8)
{ cout<<"正确答案:"<<a[0]<<" "<<a[1]<<" "<<a[2]<<" "<<a[3]<<endl; 
 fail(); 
 break;


 }
 

int main() 
{cout<<"本程序用于模拟猜数字游戏,你有8次猜测机会(好好加油哦!)"<<endl; 
while(j<10000)
{
j++;
cout<<"j="<<j;
 play(); 
}
return 0; 
}

21楼

偶也来一个
#include <iostream>
#include <time.h>


using namespace std;


 
 
main(){
 time_t tttt;
 srand(time(&tttt));
 int i,k,j,pos,num,a[5],t;
 char h;
 lopp:
 t=0;
 pos=0;
 num=0;
 cout<<"Guess my number here(5 numbers):"<<endl;
 for(i=0;i<5;i++)
 {
 loop2:
 a[i]=rand()/1000%10;
 if(i==0&&a[i]==0)goto loop2;
 else
 for(j=0;j<i;j++){
 if(a[j]==a[i])goto loop2;}
 
 
 } 
 
 
 loop1:
 t++;
 for(j=0;j<5;j++){
 cin>>h;
 
 for(k=0;k<5;k++){
 if(a[k]==atoi(&h)){
 num++;
 break;
 }
 }
 if(a[j]==atoi(&h))pos++;
 }
 if(pos==5){
 cout<<"congratulations! the number is right ";
 for(i=0;i<5;i++)
 {
 
 cout<<a[i];
 
 }
 cout<<endl<<"It took you "<<t<<" times to guess"<<endl; 
 
 
 if(t<7)
 cout<<"your level is Brilliant!!";
 else if(6<t<15)
 cout<<"your level is Average!";
 else
 cout<<"sorry for you intelligence...";
 }
 else{
 
 cout<<num<<" numbers is right, "<<pos<<" numbers in position"<<endl;
 pos=0;
 num=0;
 goto loop1;
 }
 cin.ignore(cin.rdbuf()->in_avail()+1);
 wwo:
 cout<<endl<<"again?"<<endl<<"(Y)es or (N)o"<<endl;
 cin>>h;
 switch(h)
 {
 case 'y':goto lopp;break;
 case 'n':break;
 default :goto wwo;
 }
 
 cout<<endl<<"press enter...";
 cin.ignore(cin.rdbuf()->in_avail()+1);
 }

22楼

谢谢!~你才称的上是高手!~
大哥!~

23楼

好贴

24楼

偶正宗的菜菜鸟来看了
刚看一点
脑袋撞显示器上面了
为了复伤
决定明天一大早从头开始
现在晚上2.30
哭着离开
对不起~~~~~~~~~~~~~~~~~`

25楼

不知道无效到底怎么学的.....不服不行啊/............什么时候教再仔细看看你的俄罗斯....
218.65.7.*

26楼

楼主辛苦了!做的太好了!
211.139.151.*

27楼

用s w i tc h   c a s e 可能更好玩…感觉也好多了…

28楼

对于菜鸟来说楼主的贴子最好了
后面发的就有点不实在了

29楼

有问题一起讨论...
只要你喜欢C语言,你就可以进来...学习可以使人进步,交流可以使人成长,相信自己,你就是C高手~~~ 
群号: 18559651 
——══☆━━┄——══☆━━┄

218.75.124.*

30楼

楼主的程序太好了,可是能不能在家一点可一计算玩家用时的公能呢?

发表回复

内 容:
用户名:
  
©2010 Baidu 贴吧协议  意见反馈