1.1 问题
这是一个记忆测试游戏。计算机会在屏幕上将一串数字显示很短的时间。玩家必须在数字消失之前记住他们,然后输入这串数字。每次过关后,计算机会显示更长的一串数字,让玩家继续玩下去。玩家应尽可能使这个过程重复更多的次数;
1.2 分析
程序的逻辑很简单。程序必须产生一连串0-9的整数使它们在屏幕屏幕上显示1秒钟之后删除它们。接着玩家试着输入这串数字。如果玩家能正确输入这串数字,程序就显示一个更长的数字串,直到玩家输入错误为止;根据成功的次数和所花的时间来计分,然后程序会询问玩家,是否继续玩。
下图中可说明此程序的逻辑:
每个方块表示程序中的一个动作,菱形表示判断。显然,玩家通常至少玩一次游戏,所以循环的检查就放在循环结束的地方,三次成功地输入数字串后,下一个数字串的长度就会增加。输入不正确的数字串,会结束游戏。下面将使用这个流程图作为编写程序的基础。
1.3 解决方案
以下将介绍解决方案的步骤,程序中介绍了管理键盘输入的其他一些方面,还会解释如何在程序中控制操作的时间。
1. 步骤1
首先确定代码的基本功能块,包括游戏的主循环。循环的检查应放在循环结束的地方,所以do-while循环在这里是最合适不过了。最初的程序代码如下:
//记数小游戏
#include //For input and output
#include //For toupper() function
int main (void)
{
char another_game='Y';//记录是否要开始下一个游戏;
const unsigned int DELAY=1;//固定的整数值,指定显示的秒数;
/*更多的程序变量声明*/
//描述这个游戏如何玩;
printf("\nTo play simple game, (玩一个简单的游戏) ");
printf("watch the screen for a sequence of digits.(看屏幕上的数据序列.)");
printf("\nwatch carefully, as the digits are only displayed for %u second%s,(仔细看,这些数据序列只会显示1秒钟)",DELAY,DELAY>1 ? "s!":"!");
printf("\nThe conputer will remove them,and then prompt you(计算机将移除它他,并提示你) ");
printf("\nto enter the same sequence.(输入相同的数据序列。)");
printf("\nwhen you do,you must put spaces between the digits.(当你在输入时,你必须在数据间输入空格。)\n");
printf("\nGood Luck!\nPress Enter to play.(祝你好运!输入回车开始游戏。)\n");
scanf("%c,&another_game");
do
{
/*初始化一个游戏*/
/*此处使用内循环来玩游戏*/
/*游戏结束时,输出分数*/
//检查是否需要开始一个新游戏
printf("\nDo you want to play again (y/n)?(你希望再玩一次吗(y/n)?)");
scanf("%c,&another_game");//输入y(Y)或者n(N)告诉计算机是否想再玩一次;
} while(toupper(another_game)=='Y');//判断用户输入的值;
return 0;
}
在当前游戏结束时,在main()开始定义的another_game变量确定是否要开始下一个游戏,在游戏的主循环末尾,把键盘上的一个字符读入这个变量,在循环条件中检查其值。如果输入了Y或者y,循环就继续,开始下一个游戏,否则,游戏就结束。把another_game转换为大写形式,就可以避免检查y和Y。
DELAY变量是一个固定整数值,指定数字串在消失之前的显示秒数。它用于控制程序在删除数字串之前的等待时间。这里它是1,但可以增加它,使游戏更容易玩。
在以下语句中,当DELAY多于1秒时,这个语句也使用条件运算符把“s!”添加到输出上,来替代“!”。
printf("\nwatch carefully, as the digits are only displayed for %u second%s",DELAY,DELAY>1 ? "s!":"!");
2. 步骤2
下一步,添加另一个变量correct的声音,程序需要记录玩家输入的数字项是否正确。这个变量用于控制玩一次游戏的循环次数。
//记数小游戏
#include //For input and output
#include //For toupper() function
#include //For bool,true,false
int main (void)
{
char another_game='Y';//记录是否要开始下一个游戏;
const unsigned int DELAY=1;//固定的整数值,指定显示的秒数;
bool correct=true;//若为正确的数据序列correct的值为true,否则为false;
/*更多的程序变量声明*/
//描述这个游戏如何玩;
printf("\nTo play simple game, (玩一个简单的游戏) ");
printf("watch the screen for a sequence of digits.(看屏幕上的数据序列.)");
printf("\nwatch carefully, as the digits are only displayed for %u second%s,(仔细看,这些数据序列只会显示1秒钟)",DELAY,DELAY>1 ? "s!":"!");
printf("\nThe conputer will remove them,and then prompt you(计算机将移除它他,并提示你) ");
printf("\nto enter the same sequence.(输入相同的数据序列。)");
printf("\nwhen you do,you must put spaces between the digits.(当你在输入时,你必须在数据间输入空格。)\n");
printf("\nGood Luck!\nPress Enter to play.(祝你好运!输入回车开始游戏。)\n");
scanf("%c,&another_game");
do
{
correct=true;//表示输入了正确的数据序列;
//只要输入的数据序列正确,以下内循环就继续运行;
while(correct)
{
/*通过这里的语句来循环执行游戏*/
}
/*游戏结束时,输出分数*/
//检查是否需要开始一个新游戏
printf("\nDo you want to play again (y/n)?(你希望再玩一次吗(y/n)?)");
scanf("%c,&another_game");//输入y(Y)或者n(N)告诉计算机是否想再玩一次;
} while(toupper(another_game)=='Y');//判断用户输入的值;
return 0;
}
这里使用了_bool变量correct,但因为给头文件添加了#include指令,所以可以将bool用作类型外。头文件还定义了符号true和false,它们分别对应1和0.只要correct的值是true,while循环就继续。玩家输入不正确的数字串时,就把correct设置为false。
注意:代码可以进行编译了,而且应该编译它,但还不应该执行它,如果执行它,程序就不会停止,因为它包含一个无限循环。内部的while循环是个无限循环。这个循环的条件永远是true,因为该循环没有对correct进行任何改变。稍后将在此添加一些代码。
在开发程序时,应确保每步编写的代码都能编译,如果试图一口气编写出所有的程序代码,就可能出现上百个错误需要修正,而且更正了一个错误后,又出现其他更多的错误,这很令人气馁,每添加一些代码就检查程序,错误就比较容易处理,开发也比较快!
3. 步骤3
//未完待续