貪食蛇游戲,c語(yǔ)言怎么實(shí)現(xiàn)多線程, 高懸賞
首先你要有控制蛇移動(dòng)方向的全局變量(定義在main以外因?yàn)榫€程函數(shù)也要調(diào)用它,每次鍵盤(pán)輸入都會(huì)修改它的值), 比如 char direction 'a' ==左 'w' == 右 'd'==上 's' == 下,然后你在移動(dòng)時(shí)應(yīng)該是在while里面操作的吧,你每移動(dòng)一步前都讀一下direction這個(gè)變量的數(shù)值然后再控制移動(dòng)方向(注意s這個(gè)鍵可以忽略因?yàn)椴粫?huì)倒著走)
然后你可以用pthread.h這個(gè)庫(kù)
例子是
pthread t;// 定義一個(gè)線程
pthread_create(&t, null, listen_keyboard_input, null);//建立線程執(zhí)行l(wèi)isten_keyboard_input這個(gè)函數(shù)
這個(gè)線程執(zhí)行的函數(shù)
void listen_keyboard_input(){
while(應(yīng)該通過(guò)某個(gè)信號(hào)來(lái)退出這個(gè)循環(huán),從而表示游戲結(jié)束){
direction =getchar();
}
}
但是這里存在同步問(wèn)題, 比如當(dāng)這個(gè)線程的getchar()在給direction輔助的同時(shí),你控制貪吃蛇移動(dòng)的線程正在調(diào)用 direction的值來(lái)判斷下一個(gè)移動(dòng)方向,這就會(huì)出問(wèn)題,所以要加一個(gè)鎖,叫 mutex lock;這個(gè)也定義成全局變量可以使各線程共享。
pthread_mutex_t mutex; //定義一個(gè)鎖
pthread_mutex_init(&mutex, null, null);//初始化
然后把函數(shù)修改成
void listen_keyboard_input(){
while(應(yīng)該通過(guò)某個(gè)信號(hào)來(lái)退出這個(gè)循環(huán),從而表示游戲結(jié)束){
pthread_mutex_lock(&mutex);
direction =getchar();
pthread_mutex_unlock(&mutex);
}
}
另外一個(gè)控制貪吃蛇移動(dòng)的時(shí)候也要加鎖
while(.....){
char c;
pthread_mutex_lock(&mutex);
c = direction;
pthread_mutex_unlock(&mutex);
switch(c){
................
}
...................................
}
這樣就好了
注意你的控制貪吃蛇移動(dòng)的部分也必須要放在另外一個(gè)pthread 里面執(zhí)行,如果放在主線程, 主線程會(huì)一直等listen_keyboard_input而什么事都不會(huì)做
你把這兩個(gè)線程用 pthread_create 創(chuàng)建完成后
用 t1.join();
t2.join();
就可以使這兩個(gè)線程并發(fā)執(zhí)行了
如果你用的是linux 來(lái)編譯的,你再輸入gcc 指令后加上 -lpthread 就可以了
還有什么不懂的你可以多找找 pthread 類的例子
薊袁13682437410: C語(yǔ)言編寫(xiě)貪吃蛇需要用哪些函數(shù)?? -
裕民縣運(yùn)動(dòng): ______ #include <graphics.h> #include <stdlib.h> #include <dos.h> /*引用的庫(kù)函數(shù)*/ #define LEFT 0x4b00 #define RIGHT 0x4d00 #define DOWN 0x5000 #define UP 0x4800 #define ESC 0x011b/*宏定義鍵名*/ #define N 200 int i,key; int level;/*游戲等...
薊袁13682437410: 用c語(yǔ)言編寫(xiě)的貪食蛇游戲 -
裕民縣運(yùn)動(dòng): ______ 這是一個(gè)成功的貪吃蛇代碼(c語(yǔ)言編寫(xiě)的),希望你能看懂!慢慢看: #define N 200 #include <graphics.h> #include <stdlib.h> #include <dos.h> #define LEFT 0x4b00 #define RIGHT 0x4d00 #define DOWN 0x5000 #define UP 0x4800 #define ...
薊袁13682437410: 用C語(yǔ)言設(shè)計(jì)貪食蛇程序(要求代碼后要有*注釋*) -
裕民縣運(yùn)動(dòng): ______ 貪吃蛇 #define N 200 #include #include #include #define LEFT 0x4b00 #define RIGHT 0x4d00 #define DOWN 0x5000 #define UP 0x4800 #define ESC 0x011b int i,key; int score=0;/*得分*/ int gamespeed=50000;/*游戲速度自己調(diào)整*/ struct...
薊袁13682437410: C語(yǔ)言寫(xiě)貪吃蛇 -
裕民縣運(yùn)動(dòng): ______ #include <stdio.h> #include <graphics.h> #include <stdlib.h> #include <dos.h> /*引用的庫(kù)函數(shù)*/ #define LEFT 0x4b00 #define RIGHT 0x4d00 #define DOWN 0x5000 #define UP 0x4800 #define ESC 0x011b/*宏定義鍵名*/ #define N 200 int i,key; ...
薊袁13682437410: TC(C語(yǔ)言)中的多線程
裕民縣運(yùn)動(dòng): ______ 可以不用.用C語(yǔ)言的計(jì)數(shù)器就好,不過(guò)比較麻煩... 如果用多線程,你首先需要了解線程的含義,另外編譯的時(shí)候需要加參數(shù), 編程的部分比較簡(jiǎn)單,頭文件需要: #include <process.h> 然后創(chuàng)建線程使用函數(shù): _beginthread() 銷(xiāo)毀線程函數(shù): _endthread() TC3.0也就是增加了個(gè)鼠標(biāo),修改了一些bug,更新了一下界面而已,編譯器是和2.0一樣的.
薊袁13682437410: 急急急!!!新版貪吃蛇(C語(yǔ)言程序設(shè)計(jì)) -
裕民縣運(yùn)動(dòng): ______ #define N 200 #include #include #include #define LEFT 0x4b00 #define RIGHT 0x4d00 #define DOWN 0x5000 #define U...
薊袁13682437410: 用C語(yǔ)言設(shè)計(jì)小游戲的程序??急!!! -
裕民縣運(yùn)動(dòng): ______ 用c++實(shí)現(xiàn)的"貪吃蛇"游戲源碼 // greedsnake.cpp #include #include #include #include #include #include #include "conf.h" typedef struct node { int x,y; struct node *next; }Node; typedef struct { Node *head,*tail; int length; }Snake; typedef struct ...
薊袁13682437410: C語(yǔ)言做貪吃蛇用什么軟件編寫(xiě)? -
裕民縣運(yùn)動(dòng): ______ 了解貪吃蛇設(shè)計(jì)思路 上圖中的紅色空心方框(□)表示邊框,是貪吃蛇的邊界,貪吃 蛇不能碰到它,否則就“死掉” ,游戲結(jié)束.綠色實(shí)心方框(■)表示 貪吃蛇的活動(dòng)范圍,貪吃蛇可以自由移動(dòng),食物(蘋(píng)果)也會(huì)隨機(jī)出 現(xiàn)在這個(gè)區(qū)域. 我...
薊袁13682437410: C語(yǔ)言小游戲貪吃蛇 如何實(shí)現(xiàn)顯示那條蛇,并讓它動(dòng)起來(lái)? 大概說(shuō)一下.(代碼也行但不要全部的貪吃蛇代碼) -
裕民縣運(yùn)動(dòng): ______ 很土很簡(jiǎn)單的實(shí)現(xiàn)方式 顯示:在屏幕上的指定坐標(biāo)打印一些斷續(xù)的點(diǎn)(或其他字符),每個(gè)點(diǎn)之間用空格或者其他字符來(lái)分隔.移動(dòng):打印第一次后間隔一段時(shí)間,如0.5秒或1秒等,clrscr清屏,順序移動(dòng)貪吃蛇上所有節(jié)點(diǎn)坐標(biāo)后再次打印 ,簡(jiǎn)...
薊袁13682437410: 貪吃蛇用c語(yǔ)言編寫(xiě) -
裕民縣運(yùn)動(dòng): ______ 設(shè)個(gè)while ,每次循環(huán)蛇頭節(jié)點(diǎn)向前走(要保存方向).然后后部節(jié)點(diǎn)逐一向前移動(dòng).如果長(zhǎng)得都一樣,可以直接把尾部節(jié)點(diǎn)移動(dòng)到頭部移動(dòng)方向的一個(gè)節(jié)點(diǎn) 然后sleep一段時(shí)間就好了
然后你可以用pthread.h這個(gè)庫(kù)
例子是
pthread t;// 定義一個(gè)線程
pthread_create(&t, null, listen_keyboard_input, null);//建立線程執(zhí)行l(wèi)isten_keyboard_input這個(gè)函數(shù)
這個(gè)線程執(zhí)行的函數(shù)
void listen_keyboard_input(){
while(應(yīng)該通過(guò)某個(gè)信號(hào)來(lái)退出這個(gè)循環(huán),從而表示游戲結(jié)束){
direction =getchar();
}
}
但是這里存在同步問(wèn)題, 比如當(dāng)這個(gè)線程的getchar()在給direction輔助的同時(shí),你控制貪吃蛇移動(dòng)的線程正在調(diào)用 direction的值來(lái)判斷下一個(gè)移動(dòng)方向,這就會(huì)出問(wèn)題,所以要加一個(gè)鎖,叫 mutex lock;這個(gè)也定義成全局變量可以使各線程共享。
pthread_mutex_t mutex; //定義一個(gè)鎖
pthread_mutex_init(&mutex, null, null);//初始化
然后把函數(shù)修改成
void listen_keyboard_input(){
while(應(yīng)該通過(guò)某個(gè)信號(hào)來(lái)退出這個(gè)循環(huán),從而表示游戲結(jié)束){
pthread_mutex_lock(&mutex);
direction =getchar();
pthread_mutex_unlock(&mutex);
}
}
另外一個(gè)控制貪吃蛇移動(dòng)的時(shí)候也要加鎖
while(.....){
char c;
pthread_mutex_lock(&mutex);
c = direction;
pthread_mutex_unlock(&mutex);
switch(c){
................
}
...................................
}
這樣就好了
注意你的控制貪吃蛇移動(dòng)的部分也必須要放在另外一個(gè)pthread 里面執(zhí)行,如果放在主線程, 主線程會(huì)一直等listen_keyboard_input而什么事都不會(huì)做
你把這兩個(gè)線程用 pthread_create 創(chuàng)建完成后
用 t1.join();
t2.join();
就可以使這兩個(gè)線程并發(fā)執(zhí)行了
如果你用的是linux 來(lái)編譯的,你再輸入gcc 指令后加上 -lpthread 就可以了
還有什么不懂的你可以多找找 pthread 類的例子
相關(guān)評(píng)說(shuō):
裕民縣運(yùn)動(dòng): ______ #include <graphics.h> #include <stdlib.h> #include <dos.h> /*引用的庫(kù)函數(shù)*/ #define LEFT 0x4b00 #define RIGHT 0x4d00 #define DOWN 0x5000 #define UP 0x4800 #define ESC 0x011b/*宏定義鍵名*/ #define N 200 int i,key; int level;/*游戲等...
裕民縣運(yùn)動(dòng): ______ 這是一個(gè)成功的貪吃蛇代碼(c語(yǔ)言編寫(xiě)的),希望你能看懂!慢慢看: #define N 200 #include <graphics.h> #include <stdlib.h> #include <dos.h> #define LEFT 0x4b00 #define RIGHT 0x4d00 #define DOWN 0x5000 #define UP 0x4800 #define ...
裕民縣運(yùn)動(dòng): ______ 貪吃蛇 #define N 200 #include #include #include #define LEFT 0x4b00 #define RIGHT 0x4d00 #define DOWN 0x5000 #define UP 0x4800 #define ESC 0x011b int i,key; int score=0;/*得分*/ int gamespeed=50000;/*游戲速度自己調(diào)整*/ struct...
裕民縣運(yùn)動(dòng): ______ #include <stdio.h> #include <graphics.h> #include <stdlib.h> #include <dos.h> /*引用的庫(kù)函數(shù)*/ #define LEFT 0x4b00 #define RIGHT 0x4d00 #define DOWN 0x5000 #define UP 0x4800 #define ESC 0x011b/*宏定義鍵名*/ #define N 200 int i,key; ...
裕民縣運(yùn)動(dòng): ______ 可以不用.用C語(yǔ)言的計(jì)數(shù)器就好,不過(guò)比較麻煩... 如果用多線程,你首先需要了解線程的含義,另外編譯的時(shí)候需要加參數(shù), 編程的部分比較簡(jiǎn)單,頭文件需要: #include <process.h> 然后創(chuàng)建線程使用函數(shù): _beginthread() 銷(xiāo)毀線程函數(shù): _endthread() TC3.0也就是增加了個(gè)鼠標(biāo),修改了一些bug,更新了一下界面而已,編譯器是和2.0一樣的.
裕民縣運(yùn)動(dòng): ______ #define N 200 #include #include #include #define LEFT 0x4b00 #define RIGHT 0x4d00 #define DOWN 0x5000 #define U...
裕民縣運(yùn)動(dòng): ______ 用c++實(shí)現(xiàn)的"貪吃蛇"游戲源碼 // greedsnake.cpp #include #include #include #include #include #include #include "conf.h" typedef struct node { int x,y; struct node *next; }Node; typedef struct { Node *head,*tail; int length; }Snake; typedef struct ...
裕民縣運(yùn)動(dòng): ______ 了解貪吃蛇設(shè)計(jì)思路 上圖中的紅色空心方框(□)表示邊框,是貪吃蛇的邊界,貪吃 蛇不能碰到它,否則就“死掉” ,游戲結(jié)束.綠色實(shí)心方框(■)表示 貪吃蛇的活動(dòng)范圍,貪吃蛇可以自由移動(dòng),食物(蘋(píng)果)也會(huì)隨機(jī)出 現(xiàn)在這個(gè)區(qū)域. 我...
裕民縣運(yùn)動(dòng): ______ 很土很簡(jiǎn)單的實(shí)現(xiàn)方式 顯示:在屏幕上的指定坐標(biāo)打印一些斷續(xù)的點(diǎn)(或其他字符),每個(gè)點(diǎn)之間用空格或者其他字符來(lái)分隔.移動(dòng):打印第一次后間隔一段時(shí)間,如0.5秒或1秒等,clrscr清屏,順序移動(dòng)貪吃蛇上所有節(jié)點(diǎn)坐標(biāo)后再次打印 ,簡(jiǎn)...
裕民縣運(yùn)動(dòng): ______ 設(shè)個(gè)while ,每次循環(huán)蛇頭節(jié)點(diǎn)向前走(要保存方向).然后后部節(jié)點(diǎn)逐一向前移動(dòng).如果長(zhǎng)得都一樣,可以直接把尾部節(jié)點(diǎn)移動(dòng)到頭部移動(dòng)方向的一個(gè)節(jié)點(diǎn) 然后sleep一段時(shí)間就好了