(一)游戏涉及的语法知识
- do while()循环
- 函数
- switch语句
- printf与scanf
- rand()生成随机数
- srand()设置随机数种子
- time()时间戳
(二)构建游戏主框架
请看下面这段代码:
#include<stdio.h>
void menu()
{
printf("###########\n");
printf("###1.play##\n");
printf("###0.exit##\n");
printf("###########\n");
}
int main()
{
int input = 0;
do
{
menu();
printf("请输入你的选择:");//提示用户输入
//int input = 0;
scanf("%d",&input);
switch(input) //由于input只有0,1两种(有限且离散)情况,所以用switch
{
case 1:
//玩游戏
break;
case 0:
//退出游戏
break;
default:
//非法输入
break;
}
}while(input);//此处用input控制循环是因为恰好input==0时既满足了退出游戏的情况,
//也满足了退出循环情况
return 0;
}
上面switch旁注释提到,变量的情况“有限且离散”用switch合适。那么分支语句if.. elseif...和switch该怎么选择呢?请看下面示例
#include<stdio.h>
int main()
{
int age = 0;
scanf("%d",&age);
if(age<18)
{
printf("未成年\n");
}
else if(age<=45)
{
printf("青年\n");
}
else if(age<60)
{
printf("中年\n");
}
else
{
printf("老年\n");
}
return 0;
}
可以看到,当变量的情况是“范围”时,用if....elseif合适。
(三)填充实现细节
好,回到本主题,接下里我们现在需要完善switch语句的case1,case0,default
switch(input)
{
case 1:
game();//调用函数
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("输入非法,请重新输入\n");
break;
}
函数game()的实现如下:
void game()
{
int r = rand()%100+1;//在此之前需要设置随机数种子,不然生成的随机数是伪随机的
int guess=0;
while(1) //一直猜,直到猜中位置,猜中用break跳出
{
printf("请输入你猜的数字\n")
scanf("%d",&guess);
if(guess>r)
{
printf("大了\n");
}
else if(guess<r)
{
printf("小了\n");
}
else
{
printf("猜中了\n");
break;
}
}
}
上面提到,要设置随机数种子,我们c语言中,利用srand()来设置种子,并且只需要在程序一开始设置一次就好了。如下:
int main()
{
int input = 0;
srand((unsigned int)time(NULL))//在程序一开始就设置种子
//此处time()是时间戳,用于动态设置种子
do
{
menu();
printf("请输入你的选择:");
scanf("%d",&input);
switch(input)
{
case 1:
//玩游戏
break;
case 0:
//退出游戏
break;
default:
//非法输入
break;
}
}while(input);
return 0;
}
(四)整合及运行效果
最后整合在一起:
#include<stdio.h>
#include<time.h>
void menu()
{
printf("###########\n");
printf("###1.play##\n");
printf("###0.exit##\n");
printf("###########\n");
}
void game()
{
int r = rand() % 100 + 1;//在此之前需要设置随机数种子,不然生成的随机数是伪随机的
int guess = 0;
while (1) //一直猜,直到猜中位置,猜中用break跳出
{
printf("请输入你猜的数字:");
scanf("%d", &guess);
if (guess > r)
{
printf("大了\n");
}
else if (guess < r)
{
printf("小了\n");
}
else
{
printf("猜中了\n");
break;
}
}
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));//在程序一开始就设置种子
//此处time()是时间戳,用于动态设置种子
do
{
menu();
printf("请输入你的选择:");//提示用户输入
//int input = 0;
scanf("%d", &input);
switch (input) //由于input只有0,1两种(有限且离散)情况,所以用switch
{
case 1:
game();//调用函数
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("输入非法,请重新输入\n");
break;
}
} while (input);//此处用input控制循环是因为恰好input==0时既满足了退出游戏的情况,
//也满足了退出循环情况
return 0;
}
运行效果如下: