轻松入门c语言的锦囊妙计

来源:互联网 发布:网络办公室管理规定 编辑:程序博客网 时间:2024/05/24 05:36

很多人认为c语言是一门很深奥很复杂很不容易学习的计算机编程语言,尤其看到他大面积的编程代码,很快就为之却步了,但是对我来说,说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;

}

}

}

终于有点规模了...

好,就说到此,如果理解了,就给这个游戏加上一个显示正确数字的功能(投降),另外,让其能猜多几局也是个不错的主意.

(其实,能改进的还很多,你自己思考吧)

原创粉丝点击