|
1楼 还没入门不要紧...也不要认为学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楼 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楼 |
|
|
| 218.25.35.* |
5楼 |
|
|
| 218.25.91.* |
6楼 |
|
|
| 218.75.233.* |
7楼 |
|
|
| 218.75.244.* |
8楼 可不符合课程设计的要求呀 还有也没有蚧面设计划 |
|
|
| 218.5.83.* |
11楼 做的不错。。 算得上有黑客精神了。。 网络就应该这样。。有问题大家一起来。 互相帮助嘛。。 叫一生老师不为过。。 哎,我现在 很累哈。,刚毕业。C懂一点。可是没高手带。。 一个人学的太累。。 想进公司实习都没人要。 不知道怎么办哦。。 ~~~~~~~~~~~~~~~~~~ |
|
|
| 202.196.235.* |
12楼 |
|
|
| 218.94.246.* |
13楼 #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楼 |
|
|
| 221.0.95.* |
15楼 |
|
|
| 60.220.2.* |
16楼 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楼 看看符合你的要求不? #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); } |
|
|
|
|
24楼 刚看一点 脑袋撞显示器上面了 为了复伤 决定明天一大早从头开始 现在晚上2.30 哭着离开 对不起~~~~~~~~~~~~~~~~~` |
|
|
|
| 218.65.7.* |
26楼 |
|
|
| 211.139.151.* |
27楼 |
|
|
|
29楼 只要你喜欢C语言,你就可以进来...学习可以使人进步,交流可以使人成长,相信自己,你就是C高手~~~ 群号: 18559651 ——══☆━━┄——══☆━━┄ |
|
|
|
| 218.75.124.* |
30楼 |
|
|
