在Linux中运行Simon游戏(C语言)

C语言是一门基础语言,使用判断语句,循环语句就可以写出一个简单的Simon游戏。

这个Simon游戏的简介:

计算机会在屏幕上将一串数字显示很短的时间。玩家必须在数字消失之前记住他们,然后输入这串数字。每次过关后,计算机会显示更长的一串数字,让玩家继续玩下去玩家尽可能使这个过程重复更多的次数。

这个游戏的逻辑非常简单:

 

以下是代码部分:

/*一个简单的游戏 write for C language*/
#include<stdio.h> //用于输入输出函数
#include<ctype.h> //toupper()函数
#include<stdbool.h> //布尔值 true 或 false
#include<stdlib.h> // rand() 和 srand() 函数
#include<time.h> //time() 函数

int main(void)
{
char another_game = 'Y'; //游戏循环询问
const unsigned int DELAY = 1; //数列显示时间
bool correct = true ; //记录玩家输入的序列是否正确,用于控制玩一次游戏的循环次数
unsigned int tries = 0; //序列长度的成功目数
unsigned int digits = 0; //序列中的位数
time_t seed = 0; //随机数序列的种子值
unsigned int number = 0; //存储输入数字
time_t wait_start = 0; //存储当前时间
clock_t start_time = 0; //游戏开起时间
unsigned int score = 0; //游戏的得分
unsigned int total_digits = 0; //在游戏中输入的总数字
unsigned int game_time = 0; //游戏进行了多少秒


/*输出游戏规则*/
printf("\nTo play Simple Simon, ");
printf("watch the screen for a sequence of digits.");
printf("\nWatch carefully, as the digits are only displayed"
" for %u second%s ", DELAY, DELAY > 1 ? "s!" :"!");
printf("\nThe computer will remove them, and then prompt you ");
printf("to 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-while 循环语句,最少执行一次*/
do
{
correct = true ; //表示输入的序列正确
tries = 0; //初始化成功次数
digits = 2; //数字序列的初始长度
start_time = clock(); //记录游戏开始时的时间

while(correct)
{
++tries; //新的尝试
wait_start = clock(); //记录序列的开起时间

/*生成一个数字序列并显示*/
srand(time(&seed)); //初始化随机序列
for(unsigned int i = 1; i <= digits ; ++i)
printf("%d ", rand() % 10); //输出一个随机数

for(; clock() - wait_start < DELAY*CLOCKS_PER_SEC ;); //等待 DELAY 秒

/*现在覆盖数字序列*/
printf("\r"); //去行的开头
for(unsigned int i = 1 ; i <= digits ; ++i)
printf(" "); //输出两个空格

if(tries == 1) //仅输出第一次尝试的消息
printf("\nNow you enter the sequence - don't forget"
" the spaces\n");
else
printf("\r"); // 回到行的开头

srand(seed); //重新初始化随机序列

/*读取输入并检查原始数据*/
for(unsigned int i = 1; i <= digits; ++i)
{
scanf("%u",&number);
if(number != rand() % 10) //与生成的序列比较
{
correct = false;
break;
}
}

if(correct && ((tries % 3) == 0)) //如果三次正确输入,增加序列长度
++digits;

printf("%s\n", correct ? "Correct!" : "Wrong!");
}

/*游戏得分计算*/
score = 10*(digits - ((tries % 3) == 1)); //序列长度
total_digits = digits*(((tries % 3) == 0) ? 3 : tries % 3);
if(digits > 2)
total_digits += 3*((digits - 1)*(digits - 2)/2 - 1);

game_time = (clock() - start_time)/CLOCKS_PER_SEC - tries*DELAY;

if(total_digits > game_time)
score += 10*(game_time - total_digits); //为速度添加点数
printf("\n\nGame time was %u seconds. Your score is %u", game_time, score);

fflush(stdin); //清除输入缓冲区

/*询问是否开起新游戏*/
printf("\nDo you want to play again (y/n)? ");
scanf("%c",&another_game);
}while(toupper(another_game) == 'Y');

return 0;
}

如果想延长数字串显示的时间,可以修改DELAY这个变量。

些代码直接在Linux下用gcc编译运行是不正常的,但是在Windows 下是可以正常运行的 :pen: 。其中问题有两个:

  • Linux下清除输入缓冲区是使用setbuf()函数,例:setbuf(stdin , NULL);
  • 不知道是不是因为关于时间的函数在Linux下不正常,导致数字串没有显示

解决这个问题其实很简单,只需要在Windows下编译构建一个exe的可执行文件(注意,一定是64位的程序,Linux系统一般是都是在x86的平台运行的),然后在Linux下使用wine这个软件运行就可以完美解决了。另外,因为在Linux显示不了中文,所以一些关于输出的游戏提示都翻译为英文了, :huaji: 

下面附上一张效果图:

在Windows下怎么构建64位的程序,可以在在这篇文章(点击跳转)找到我推荐的一个C语言的轻量级的编译器。关于C语言怎么生成伪随机数,可以看看这篇文章(点击跳转)。

如果不知道怎么编译运行或者懒得编译运行,可以下载我提供的程序:

:huaji2: :yinxian:  :huaji: 

2018-09-30 00:45:36  星期日

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注