为了账号安全,请及时绑定邮箱和手机立即绑定

请问下面的内容该怎样可以实现?

请问下面的内容该怎样可以实现?

C
蓝山帝景 2023-03-03 14:10:22
我先编写了一个倒计时的函数void time(){int hour, minute, second,i,j;hour = 0;minute = 0;second = 5;for (;;){printf("-------------------------\n");printf("*\t%02d:%02d:%02d\t*\n", hour, minute, second);printf("-------------------------\n");Sleep(1000);system("cls");second--;if (second == 0){if (minute == 0){if (hour == 0)break;hour--;minute = 60;}if (minute == 0 && hour == 0)break;minute--;second = 59;}if (minute == 0 && hour == 0&&second==0)break;}printf("-------------------------\n");printf("*\t时间到!!!\t*\n");printf("-------------------------\n");}如果想要它能在运行主函数的游戏内容时起到计时的作用,就必须让这个函数和主函数同时运行。
查看完整描述

1 回答

?
胡子哥哥

TA贡献1825条经验 获得超6个赞

首先你要有控制蛇移动方向的全局变量(定义在main以外因为线程函数也要调用它,每次键盘输入都会修改它的值), 比如 char direction 'a' ==左 'w' == 右 'd'==上 's' == 下,然后你在移动时应该是在while里面操作的吧,你每移动一步前都读一下direction这个变量的数值然后再控制移动方向(注意s这个键可以忽略因为不会倒着走) 然后你可以用pthread.h这个库 例子是 pthread t;// 定义一个线程 pthread_create(&t, null, listen_keyboard_input, null);//建立线程执行listen_keyboard_input这个函数 这个线程执行的函数 void listen_keyboard_input(){ while(应该通过某个信号来退出这个循环,从而表示游戏结束){ direction =getchar(); } } 但是这里存在同步问题, 比如当这个线程的getchar()在给direction辅助的同时,你控制贪吃蛇移动的线程正在调用 direction的值来判断下一个移动方向,这就会出问题,所以要加一个锁,叫 mutex lock;这个也定义成全局变量可以使各线程共享。 pthread_mutex_t mutex; //定义一个锁 pthread_mutex_init(&mutex, null, null);//初始化 然后把函数修改成 void listen_keyboard_input(){ while(应该通过某个信号来退出这个循环,从而表示游戏结束){ pthread_mutex_lock(&mutex); direction =getchar(); pthread_mutex_unlock(&mutex); } } 另外一个控制贪吃蛇移动的时候也要加锁 while(.....){ char c; pthread_mutex_lock(&mutex); c = direction; pthread_mutex_unlock(&mutex); switch(c){ ................ } ................................... } 这样就好了 注意你的控制贪吃蛇移动的部分也必须要放在另外一个pthread 里面执行,如果放在主线程, 主线程会一直等listen_keyboard_input而什么事都不会做 你把这两个线程用 pthread_create 创建完成后 用 t1.join(); t2.join(); 就可以使这两个线程并发执行了 如果你用的是linux 来编译的,你再输入gcc 指令后加上 -lpthread 就可以了 

查看完整回答
反对 回复 2023-03-06
  • 1 回答
  • 0 关注
  • 43 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信