猜数字小游戏
答辩视频
c语言程序设计报告答辩自述视频
题目描述
编写程序,实现一个猜数字小游戏。游戏规则:两个玩家,一方为电脑,一方为人。一方出数字,一方猜。出数字的一方首先想好一个正整数,不告诉另一方,然后告知另一方开始猜测。
功能需求
(1)用户可以从菜单中选择相应的功能。具体包括:开始游戏,继续游戏,退出游戏。
(2)用户可以自主选择玩家身份,包含有人或电脑这两种玩家,若选择人为玩家,即为猜的一方,那么电脑为给出正确数的一方。
(3)要求给出的正确数是由随机数产生的,且范围为1~100之间,并且玩家需要用二分法实现猜数。
(4)玩家持续猜测,若猜错,会提示:猜大了或猜小了,直到猜中为止,随后,会显示:回答正确!最后,显示这一轮玩家游戏时长。
(5)这一轮游戏结束后,玩家可以选择继续或退出游戏,若继续,玩家会重复上一轮相同的操作;若退出,会显示出本次(即总轮数)玩家游戏总时长。
(6)用户选择退出时,会显示出:谢谢使用,随后退出游戏。
重点问题描述
(1)对于1.4题,能随机生成给出的正确数字是重点。C语言中,rand()函数是按指定的顺序来产生整数,因此在每一轮猜数字小游戏中,每次执行上面的语句都会产生一个随机数。而且在程序中,用用rand()生成随机数前,先用初始化函数 srand(time(NULL))(需引用头文件【2】stdlib.h)。
(2)对于1.4题需要时间相关函数头文件:#include <ctime.h> ,先使用定义随机数种子函数(以当前时间为种子,不同时间随机数不同):srand(time(NULL)); 函数返回 x-1~x+y-1 范围的随机整数:rand()%x+y;如产生1~100 范围的随机数:rand()%100+1。
测试情况
系统主要功能模块的运行结果如图1.4.1~1.4.8所示:
图1.4.1 系统主菜单1(开始界面)
图1.4.2 系统菜单2(继续界面)
图1.4.3 输入合法选择项的运行结果(开始,玩家:B)
以及输出玩家游戏此轮时长
图1.4.4 输入合法选择项的运行结果(继续,玩家:A)
以及输出玩家游戏此轮时长
图1.4.5 输入不合法选择项的运行结果(开始界面)
图1.4.6 输入不合法选择项的运行结果(继续界面)
图1.4.7 退出系统(开始界面)
图1.4.8 输出玩家游戏总时长以及退出系统(继续界面)
课设海报
课设文档
课设答辩
代码内容
/************************************
program:(C)1.4:猜数字小游戏
wrintten by Duan Linchuan.
01/01/2024.Copyright 2024
************************************/
//copyeight 中文翻译:版权
/*********************************************************
>>>设计思路:
>>>编写程序,实现一个猜数字小游戏。
1.首先,写出相应的头文件,声明相应的函数,
并写出两个界面函数,
其一为开始界面,即start1();
其二为继续界面,即start2();
2.其次,写出主函数,其包含相应的
选择功能,多轮游戏功能,判断是否回答正确的功能,
以及记录每轮游戏的时长与每次游戏的总时长的功能这四种功能。
(1)选择功能:
首先,会出现界面I,其包含有开始或退出游戏这两个功能;
若选择开始游戏后,会输出选择游戏玩家的身份,分别为人或电脑;
随后,会输出人或电脑给出正确的数字;
然后,玩家依次给出猜的数字,直到与正确的答案,才停止猜测。
(2)判断功能:
若玩家给出猜的数字是错误的,人或电脑会提示:猜大了或猜小了,
并且输出:第几次答案错误,请再次输入。
直到玩家猜对为止,随后人或电脑会提示:回答正确,
并且输出:第几次答案正确,本轮游戏结束。
(3)多轮游戏功能:
在第一轮游戏结束后,
会输出界面2,其包含有继续与退出游戏这两个功能。
若选择继续游戏后,会进行下一轮游戏,以此类推。
若选择退出游戏,界面关闭,随后退出。
(4)记录时长功能:
*在选择开始游戏之前,
用clock_t来定义开始变量start,结束变量end,
随后用start=clock()来记录本次游戏的开始时间,
若进行多轮游戏后选择退出游戏,
此时,用end=clock()来记录本次游戏的结束时间,
即可算出玩家游戏总时长。
*在进行每轮游戏之前,
用clock_t来定义开始变量start1,结束变量end1,
随后用start1=clock()来记录本轮游戏的开始时间,
若进行多轮游戏后选择退出游戏,
此时,用end1=clock()来记录本轮游戏的结束时间,
即可算出此轮玩家游戏时长。
3.最后,程序还有其他优点:
(1)在选择功能中,若出现选择项,输入的选项必须正确且合法,
不然会一直进行输入,直到输入正确且合法为止。
(2)有良好的交互界面,其包含有较多的文字叙述,
运用较多的停顿函数Sleep()函数,以增可观感。
(3)并且所定义的函数以及变量,以英文来命名。
例如:开始,用英文start来命名;选择,用英文chioce来命名;
猜测数,用英文guess来命名;正确数,用英文magic来命名;
以此来增加程序的可读性,便于阅读与理解。
>>>总体来说,猜数字小游戏 ,其所写的程序可读性较高,
所体现的功能较完善,所体现的交互性也较完善。
简言而之,这程序基本可运行,可实现相应的功能。
*********************************************************/
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <unistd.h>
#include <windows.h>
//声明函数
int main(); //主函数
void start1(); //初始界面1,开始
void start2(); //初始界面2,继续
void start1() //初始界面1,开始
{
printf("\t\t\t\t---------------------------------------\n");
printf("\t\t\t\t| 欢迎使用猜数字小游戏 |\n");
printf("\t\t\t\t---------------------------------------\n");
printf("\t\t\t\t| 0.开始游戏 |\n");
printf("\t\t\t\t---------------------------------------\n");
printf("\t\t\t\t| 2.退出游戏 |\n");
printf("\t\t\t\t---------------------------------------\n");
printf("\t\t\t\t*请选择功能: ");
}
void start2() //初始界面2,继续
{
printf("\t\t\t\t---------------------------------------\n");
printf("\t\t\t\t| 欢迎使用猜数字小游戏 |\n");
printf("\t\t\t\t---------------------------------------\n");
printf("\t\t\t\t| 1.继续游戏 |\n");
printf("\t\t\t\t---------------------------------------\n");
printf("\t\t\t\t| 2.退出游戏 |\n");
printf("\t\t\t\t---------------------------------------\n");
printf("\t\t\t\t*请选择功能: ");
}
int main() //主函数
{
char x[3][20]={"开始游戏","继续游戏","退出游戏"};
char y[2][10]={"电脑","人"};
int a,b;
char choicea;
start1(); //初始界面1,开始
while(1) //判断输入的字符是否合法正确
{
scanf(" %c",&choicea);
if(choicea=='0'||choicea=='2') break;
else printf("\t\t\t\t*请重新选择:");
}
a=choicea-48;
if(a==2) //退出游戏
{
printf("\n\t\t\t\t\t\t%s\n",x[a]);
puts("\n\t\t\t\t\t<<<<****谢谢使用****>>>>");
Sleep(2000); 停顿2秒
}
else if(a==0) //开始游戏
{
//定义两个变量,表此次游戏开始与结束的时间
clock_t start,end;
start=clock(); //此次游戏开始时间
printf("\n\t\t\t\t\t\t%s\n",x[a]);
while(1)
{
//定义两个变量,表此轮游戏开始与结束的时间
clock_t start1,end1;
start1=clock(); //此轮游戏开始时间
char choiceb;
printf("1.请选择游戏玩家的身份(A:电脑;B:人):");
while(1) //判断输入的字符是否合法正确
{
scanf(" %c",&choiceb);
if(choiceb=='A'||choiceb=='B') break;
else printf("\n*请重新选择玩家身份:");
}
//choiceb-17表示是将大写字母字符变为数字字符,再-48表示是将其变为整型数字
b=choiceb-17-48;
printf(">>>此轮游戏玩家为:%s\n",y[b]);
puts("");
if(b==0)
b=1,printf("2.%s给出正确数字为:",y[b]);
else if(b==1)
b=0,printf("2.%s给出正确数字为:",y[b]);
int guess,magic; //guess表猜的数字,magic表正确的数字
int up=100,down=1; //定义最大的变量为100,定义最小的变量为1;
srand(time(NULL));
magic=rand()%100+1; //产生随机数
printf("%d\n",magic);
puts("");
int count=1;
while(1) //进行判断猜的与正确的是否相同,并输出相应的提示
{
printf("(%d)玩家给出猜的数字为:",count);
guess=(up+down)/2; //用二分查找
if(magic!=99)
printf("%d\n",guess);
else printf("%d\n",guess+1); //若等于99,输出100
if(guess>magic)
{
printf(" *%s提示:猜大了!!\n",y[b]);
up=guess;
}
else if(guess<magic)
{
printf(" *%s提示:猜小了!!\n",y[b]);
down=guess;
}
if(guess!=magic)
{
printf(" <%d>第%d次答案错误,请再次输入\n",count,count);
printf("\n");
}
else if(guess==magic)
{
printf(" *%s提示:回答正确!!\n",y[b]);
printf("\n");
printf("[%d]第%d次答案正确,本轮游戏结束\n",count,count);
break;
}
if(guess==99) magic--; //若猜的数为99,正确数减1
count++;
Sleep(1000); //停顿1秒
}
end1=clock(); //此轮游戏结束时间
printf("本轮玩家游戏时长:%.2lf秒\n",(double)(end1-start1)/CLOCKS_PER_SEC);
printf("\t\t\t\t\t\t此轮结束\n");
system("pause"); //输出:请按任意键继续. . .
system("cls"); //将上一次输出清屏
start2(); //初始界面2,继续
while(1) //判断输入的字符是否合法正确
{
scanf(" %c",&choicea);
if(choicea=='1'||choicea=='2') break;
else printf("\t\t\t\t*请重新选择:");
}
a=choicea-48;
if(a==1) //继续游戏
printf("\n\t\t\t\t\t\t%s\n",x[a]);
else if(a==2) //退出游戏
{
end=clock(); //此次游戏结束时间
puts("");
printf("\t\t\t\t*本次玩家游戏总时长:%.2lf秒\n",(double)(end-start)/CLOCKS_PER_SEC);
printf("\n\t\t\t\t\t\t%s\n",x[a]);
puts("\n\t\t\t\t\t<<<<****谢谢使用****>>>>");
Sleep(5000); //停顿5秒
break;
}
}
}
return 0;
}