C语言课设心得之倒计时和暂停的实现

前言:

本教程适用的C语言课设游戏类型:需要倒计时和暂停的游戏。

本文章不会耽误任何人做生意!

本人学艺不精,教程可能会有不严谨和错误的地方,希望大家多多批评,在评论区多多指出。需要视频教学的话,也可以联系我,我会考虑在b站出一些视频之类的,感谢!

目录

一.头文件及相关的变量

1.头文件需求

2.变量

二.倒计时的思路和代码实现

1.time_t变量写在哪里合适

2.time_t和tm结构体的代码实现

3.思路和代码实现

三.暂停的思路和实现

1.问题

2.追根溯源

3.解决办法


一.头文件及相关的变量

1.头文件需求

# include <time.h>

2.变量

(1)time_t:时间类型的变量

(2)tm:结构体

二.倒计时的思路和代码实现

1.time_t变量写在哪里合适

很多同学会把用户操作和交互写在一个函数里,并且在函数里面用while(1)循环保证操作能被持续读取(比如我这样);也会有很多同学会把while直接写在main函数里,依靠循环读取操作来实现。因此本教程根据这两种思路分别教大家在哪里写time_t变量合适。在下文我们把这类的函数叫为play函数

2.time_t和tm结构体的代码实现

首先定义一个简单的time_t类型变量,通过下面的代码来获取本地的时间,然后通过tm结构体获取可以读取的时分秒等。

time_t time;                          // 定义一个叫time的time_t变量
time(&time);                          // 获取本地时间
struct tm time_tm;                    // 定义一个叫time_tm的tm结构体
localtime_s(&time_tm, &time);         // 将time获取的本地时间信息,通过本函数转换到time_tm结构                    体里边,以便于后续操作
// 此时我们就可以通过time_tm来读取time获取的本地时间了
// 我们倒计时用到的就是 时分秒就够了
// 下面的操作就是将当前时间,如:14点12分36秒,全部转换成秒
int second = time_tm.tm_hour * 3600 + time_tm.tm_min * 60 + time_tm.tm_sec;
// 等价于 14h * 3600 + 12min * 60 + 36

注意:time_t的最小单位就是“秒”

3.思路和代码实现

(1)写法一:main函数里调用play函数,把while写到play函数里

简单的倒计时,我们首先要明确,需要两个time_t变量来实现。不妨设两个变量分别为begin和current。在进入本关的瞬间,我们只需要读取一次本地时间,存在begin里面。进入play函数的while循环之后,我们需要不断读取我们的current,即不断更新当前的时间。然后我们通过之前的转换法,把begin和current都转换为秒,然后作差,就能得到我们当前游玩的时间和游戏开始时间的差值。假如我们的倒计时是90秒,那么90-差值,就是我们的倒计时时间。我们的倒计时就做好了!剩下的绘图相信大家没问题了,这里就不写代码了

// 这只是一段示范的代码,只是为了展示核心思路,仅供参考int main(void)
{initgraph();play();xxxx;
}void play(传参传参.....)
{// current在循环内外定义都可,这里定义在了while里// 创建我们的starttime_t start;time(&start);struct tm start_tm;localtime_s(&start_tm, &start);// 进入游戏操作识别while(1){// 创建我们的currenttime_t current;// 更新currenttime(&current);// 计算倒计时struct tm current_tm;localtime_s(&current_tm, &current);// 倒计时为90秒int now = 90 - (current_tm.tm_hour * 3600 + current_tm.tm_min * 60 + current_tm.tm_sec) + (start_tm.tm_hour * 3600 + start_tm.tm_min * 60 + start_tm.tm_sec);// 打印代码outtextxy(xxxxx);// 读取指令的代码们balabalabal;}
}

有的同学可能会问:为什么需要小时和分钟呢?读取秒不就完了?

一旦我们玩游戏的时候,跨越了分钟,时钟的秒就会变为0,我们的时间就会乱。比如我们是在1点1分1秒玩的,当我们玩到了2分0秒的时候,我们看倒计时的公式,tm_sec那一部分就会跳回0,导致倒计时的时间反而又增加了60s。同理,跨小时玩游戏的时候也有这个问题。半夜玩游戏的时候还需要加入tm_day才能解决同样的问题,但是课设的话就没这个必要了。

(2)写法二:main函数里面写while,while循环调用play函数

同样的思路,不过我们的代码就需要小小的改变了,因为对于start变量,我们只需要读取一次本地时间

// 这只是一段示范的代码,只是为了展示核心思路,仅供参考int main(void)
{initgraph();xxxxxx;// 这里的指针定义最好挨着whiletime_t start;time_t current;time_t* Pcurrent;// 重点来了!!在进入循环之前记录我们的start本地时间time(&start);struct tm start_tm;localtime_s(&start_tm, &start);int a = (current_tm.tm_hour * 3600 + current_tm.tm_min * 60 + current_tm.tm_sec)while(1){// 循环调用play函数play(a, Pcurrent,传参传参.....);xxxxxx;}xxxx;
}void play(int a,time_t* current,传参传参.....)
{// 更新currenttime(current);// 计算倒计时struct tm current_tm;localtime_s(&current_tm, current);// 倒计时为90秒int now = 90 - a + (start_tm.tm_hour * 3600 + start_tm.tm_min * 60 + start_tm.tm_sec);// 打印代码outtextxy(xxxxx);// 读取指令的代码们balabalabal;}

有部分同学的游戏是多地图的,比如我的就是。我的play函数会传入一张地图的参数,只能玩一张地图,如果进入下一张,还得重新调用play,这时候我们的时间计入的策略也会有稍微的改进:

下面的代码是一个思路,大家的写代码逻辑都不一样,我只能提供一个小参考,希望能对大家有帮助。

// 假设我们的地图用一个数组存储,叫Map[10]
// main函数里面调用play的时候,可以这么写// 这里已经定义好start 和 current了
for(int i = 0; i < 10; i++)
{time(&start);struct tm start_tm;localtime_s(&start_tm, &start);    int a = (current_tm.tm_hour * 3600 + current_tm.tm_min * 60 + current_tm.tm_sec)play(Map[i], a, Pcurrent);
}

三.暂停的思路和实现

1.问题

相信很多同学在写暂停的时候会出现这么一个问题:

我设置好了游戏的暂停操作,进入游戏点击暂停了,倒计时也的确停止了。但是一旦恢复了游戏的游玩,发现时间直接减少了好多。这是为什么呢?

2.追根溯源

如果我们从暂停的一瞬间开始计时,然后恢复游玩的时候停止计时,那么我们就会发现,倒计时一下子减少的时间,和我们计时的时间完全一致。

仔细想想我们的代码,你就会发现问题了(这里只是诸多问我的同学们的代码中最常见的书写方法,只是一个示范):

while(1)
{// current更新区// 倒计时计算和绘制区if(暂停操作)// 暂停系统,并且卡住本次循环,触发某些条件再进行循环其他代码balabala
}

发现问题了么?我们虽然暂停了游戏的一切操作,但是我们电脑的本地时间可依然在流动,所以显然这种暂停方式是不可行的。

3.解决办法

很简单!用我们倒计时的思路再写一个函数就行!

void play(xxx){int pauseTime = 0;int* pnt = &pauseTime;// 获取暂停时间while(1){// current更新区// 倒计时计算和绘制区  做出更改!!!!!!int now = 90 - (current_tm.tm_hour * 3600 + current_tm.tm_min * 60 + current_tm.tm_sec) + (start_tm.tm_hour * 3600 + start_tm.tm_min * 60 + start_tm.tm_sec) + (*pnt);if(暂停操作)// 暂停系统,并且卡住本次循环,触发某些条件再进行循环{time_t pause;time(&pause);system("pause");// 提示用户按任意键恢复游戏的操作// 调用时间函数,返回暂停的时候流失的时间,加到now_time上;getPauseTime(pause,pnt);}其他代码balabala}
}void getPauseTime(time_t start, int* pnt)
{struct tm start_tm;    localtime_s(&star_tm, &start);int sum_start = 3600 * start_tm.tm_hour + 60 * start_tm.tm_min + start_tm.tm_sec;time_t current;time(&current_time);struct tm current_tm;localtime_s(&current_tm, &current);int sum_current = 3600 * current_tm.tm_hour + 60 * current_tm.tm_min + current_tm.tm_sec;(*pnt) =  (*pnt) + sum_current - sum_start_time;
}

我比较笨,这是我想出来的一个解决办法,就是利用system pause实现游戏的伪暂停,然后解除system pause之后用一个函数记录下暂停经过的时间,加在倒计时计算上,就ok了。

到这里,本文就到达尾声啦!希望本文章能帮助到大家!

特别鸣谢:

我的祖国

CSDN各位大佬的小教程帮助我完成了课设

C语言课设课及指导老师

河海大学童老师的网课

和我讨论的同学们,尤其是L同学提供的帮助

我的b站UID:23415007

C语言课设心得之倒计时和暂停的实现相关推荐

  1. C语言课设物资管理系统,C语言课设之物资管理系统.doc

    C语言课设之物资管理系统 C语言课程设计 目 录 1.需求分析: 2.系统总框图: 3.每个模块的设计分析: 4.列出所有定义的函数及说明: 5.举例说明1.2个比较有特点的算法: 6.数据分析.完备 ...

  2. 北京工业大学 C语言课设

    C语言课设94,使用环境是easyx 做了些拓展,记不清有哪些具体的了,可以看报告或者演示视频. https://download.csdn.net/download/Tainya_/87345807 ...

  3. 网吧管理系统------C语言课设

    网吧管理系统------C语言课设 1.课程设计报告的要求 2.实现管理员注册和登录模块的代码 3.实现管理员对用户的管理功能及简介如下,包括上下机,余额积分加减等功能. 4.主函数 5.存在的不足 ...

  4. c语言设计之歌曲信息管理系统,C语言课设之歌曲信息管理系统

    <C语言课设之歌曲信息管理系统>由会员分享,可在线阅读,更多相关<C语言课设之歌曲信息管理系统(10页珍藏版)>请在人人文库网上搜索. 1.C语言课程设计目 录1.题目要求2. ...

  5. c语言学生成绩查询课设报告,C语言课设报告(学生考试成绩查询程序)【荐】.doc...

    C语言课设报告(学生考试成绩查询程序)[荐].doc 学生考试成绩查询程序 学号:******** 姓名:***** 完成日期:****年月 通过键盘输入学生的考试信息,包括:学号.姓名.课程名称.学 ...

  6. 学生信息管理系统c语言课设,学生信息管理系统C语言课设.doc

    学生信息管理系统C语言课设 目录 一.需求分析2 二.概要设计2 三.详细设计4 四.调试分析9 五.用户手册9 六.测试数据9 七.附录10 一.需求分析学生学籍管理系统用数据文件存放学生的学籍,可 ...

  7. c语言学生学籍管理修改,C语言课设之学生学籍管理系统.doc

    C语言课设之学生学籍管理系统.doc 题目学生学籍管理系统 目录一.个人简介.二.报告摘要.三.报告目录.四.报告正文. 1.系统需求分析 2.系统总体设计 3.系统详细设计六.总结. 二.报告摘要 ...

  8. 电影院选票系统(C语言课设)

    这里给到大家介绍一个自己写的C语言课设的代码,代码功能不是很完善,只有很基础的增删改查 题目 :电影院选票系统 功能 :放映厅 ,电影信息的 增删改查,以及排序 系统要求实现以下功能: 1.输入功能: ...

  9. c语言售票系统主要函数,c语言课设电影院售票系统.docx

    struct inf { char rate[20]; char name[20]; int time_hour; int time_min; int seat; int sell; }inf[10] ...

最新文章

  1. ctf 文件头crc错误_[CTF隐写]png中CRC检验错误的分析
  2. 中科院脑科学与智能技术卓越创新中心:在“脑海”中突破进取
  3. hdu2544最短路
  4. 玩转oracle 11g(23):区分大小写和字符集不同
  5. javascript 显示一定范围内的素数(质数)
  6. 华为首批升级鸿蒙系统的手机,鸿蒙系统首批升级机型曝光!荣耀手机遗憾缺席,原因很简单...
  7. 慧林系统多服务器授权,慧林虚拟主机管理系统
  8. 【Hibernate3.3复习知识点一】 - 配置hibernate环境(XML)。
  9. 七月算法机器学习 6 特征工程
  10. 赵容弼(Cho Yong Pil) -《30周年纪念专辑》
  11. element UI日历组件自定义操作设置农历、阳历、节日展示、单日操作
  12. java线程状态(六种五种)
  13. selenium自动化测试随笔,安装selenium
  14. java定时执行bat_windows定时器配置执行java jar文件的方法详解
  15. Ubuntu20.04LTS环境下载STM32程序
  16. MySQL数据逻辑备份
  17. YOLO系列 yolov1 keras实现
  18. 各种“地”—— 各种“GND”
  19. 勒索软件致重要文件化为乌有?不重视备份将后悔莫及!
  20. 经过半年的摸爬滚打,入门机器学习如此简单

热门文章

  1. myeclipse中配置Resin4.0服务器
  2. 解决swiper轮播图显示最后一张图片问题
  3. 单链表结构体定义解析
  4. spooling技术
  5. SQL注入之天书学习
  6. oracle @spool,Oracle Spool详解
  7. T(n) = 25T(n/5)+n^2的时间复杂度,笔试啊笔试!
  8. Silverlight 2.5D RPG游戏技巧与特效处理:(十一)AI系统
  9. 7.29:正睿集训(人工智能峰会)day2
  10. php的strcmp函数,php中strcmp函数用法