初学者c语言

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++;
/*判断次数*/
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;
}
}
}

posted @ 2014-12-19 17:12  ︶ㄣK__ぺ  阅读(174)  评论(0编辑  收藏  举报