贪食蛇游戏,c语言怎么实现多线程, 高悬赏
c语言做的一个贪食蛇游戏,其他功能已全部做好,只差最后一个功能。就是蛇可以在自动移动的同时又可以通过键盘的输入来改变运动方向。我的函数有蛇头增加一个节点的函数Add(LL...
c语言做的一个贪食蛇游戏,其他功能已全部做好,只差最后一个功能。就是蛇可以在自动移动的同时又可以通过键盘的输入来改变运动方向。我的函数有蛇头增加一个节点的函数Add(LList&L,char c),L就是链表,c就是改变方向的键(wsad键),还有删除最后一个节点的函数Delete(),现在只能实现按一次w/s/a/d键就移动一次,不能实现自动移动的同时还可以读取输入。我查了资料说要用多线程,但不知道怎么弄,求助大神,要怎么样使用多线程?具体代码怎么写?
展开
1个回答
展开全部
首先你要有控制蛇移动方向的全局变量(定义在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 就可以了
还有什么不懂的你可以多找找 pthread 类的例子
然后你可以用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 就可以了
还有什么不懂的你可以多找找 pthread 类的例子
追问
我的编译器是vs2013,为什么连pthread.h库都无法打开?
追答
拿那么高端的平台开发那么底层的语言 O_O
ftp://sourceware.org/pub/pthreads-win32/pthreads-snap-2005-03-08.tar.gz
把这个下了以后把里面的所有文件放在你的工程文档里然后在vs里面引用.同时你要把
pthread.h 这个文件里面的 #include 改成 #include "sched.h"
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询