日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > linux >内容正文

linux

c语言中怎么暂停一个一个游戏,求助:最近在linux下用c语言写了一个贪吃蛇程序,有几个问题,第一:贪吃蛇怎么实现暂停,第二:有时候同时输入上下左右中的两个键就会直接游戏结束...

發(fā)布時(shí)間:2025/3/11 linux 47 豆豆

求助:最近在linux下用c語(yǔ)言寫(xiě)了一個(gè)貪吃蛇程序,有幾個(gè)問(wèn)題,第一:貪吃蛇怎么實(shí)現(xiàn)暫停,第二:有時(shí)候同時(shí)輸入上下左右中的兩個(gè)鍵就會(huì)直接游戲結(jié)束

/*

以下是主要的邏輯代碼,還有些.c和.h就沒(méi)發(fā)了

*/

#include

#include

#include

#include "snake.h"

#include "input.h"

#include

#include//多線程

WINDOW*w_snake = NULL;

WINDOW*w_title = NULL;

int SNAKE_DIRECTION = UP;

struct snake snake;

struct food food;

/*

函數(shù)功能: 創(chuàng)建游戲所需要用到的界面

*/

void inin_windows()

{??? /*newwin(nlines ,ncols,begin_y,begin_x)

newwin函數(shù)的作用是創(chuàng)建一個(gè)新的窗口,該窗口從屏幕位置(begin_y,begin_x)開(kāi)始

行數(shù)和列數(shù)分別由參數(shù)nlines和ncols指定。

它返回一個(gè)指向新窗口的指針,如果新窗口創(chuàng)建失敗則返回null。*/

w_snake = newwin(MAP_HEIGHT,MAP_WIDTH, 4, 5);

w_title = newwin(3,20, 0, 20);

}

/*

函數(shù)功能: 初始化食物

*/

void draw_food()

{

int flag = 0;

srandom(time(NULL));//設(shè)置隨機(jī)數(shù)種子

while(1)

{

flag = 0;

food.x = random()%(MAP_WIDTH - 2) + 1;//從1到69隨機(jī)生成一個(gè)數(shù)

food.y = random()%(MAP_HEIGHT - 2) + 1;//從1到28隨機(jī)生成一個(gè)數(shù)

int i;

for(i = 0;i

{

if(snake.x[i] == food.x && snake.y[i] == food.y)//不能生成到蛇身體上

{

flag = 1;

break;

}

}

if(flag == 0 && food.x % 2 == 0)//食物的x坐標(biāo)是奇數(shù)

{

break;

}

}

wmove(w_snake,food.y,food.x);

waddstr(w_snake,"*");//畫(huà)出食物

wrefresh(w_snake);

}

/*

初始化蛇

*/

void init_snake()

{

snake.len = 3;//設(shè)置蛇的初始長(zhǎng)度

int i;

for(i = 0;i < snake.len;i++)

{

snake.x[i] = MAP_WIDTH/2 - i*2 + 1;

snake.y[i] = MAP_HEIGHT/2;

wmove(w_snake,snake.y[i],snake.x[i]);//移動(dòng)光標(biāo),依次顯示

if(i == 0)

{

waddstr(w_snake,"@");

}

else

{

waddstr(w_snake,"* ");

}

}

wrefresh(w_snake);//刷新

}

/*

顯示游戲框圖

*/

void draw_snake_map()

{

int i;

for(i = 0;i < MAP_WIDTH;i+=2)

{

wmove(w_snake,0,i);//移動(dòng)光標(biāo)顯示上面的一行

waddstr(w_snake,"+ ");

wmove(w_snake,MAP_HEIGHT-1,i);//移動(dòng)光標(biāo)顯示下面的一行

waddstr(w_snake,"+ ");

}

for(i = 0;i < MAP_HEIGHT;i++)

{

wmove(w_snake,i,0);//移動(dòng)光標(biāo)顯示左邊的一行

waddstr(w_snake,"+");

wmove(w_snake,i,MAP_WIDTH-1);//移動(dòng)光標(biāo)顯示右邊的一行

waddstr(w_snake,"+");

}

wrefresh(w_snake);//刷新

init_snake();//投放蛇

}

/*

判斷游戲是否結(jié)束

返回值: 結(jié)束: 0

未結(jié)束: 1

*/

int game_over()

{

if(snake.y[0] == 0 || snake.y[0] == MAP_HEIGHT - 1)//撞到上下墻壁

{

return 1;

}

if(snake.x[0] == 0 || snake.x[0] >= MAP_WIDTH - 2)//撞到左右墻壁

{

return 1;

}

int i;

for(i = 1;i < snake.len;i++)//撞到自己身體

{

if(snake.x[i] == snake.x[0] && snake.y[i] == snake.y[0])

{

return 1;

}

}

if(snake.len == MAX_SIZE)//到達(dá)最大長(zhǎng)度

{

return 1;

}

return 0;

}

/*

畫(huà)出每次更新的貪吃蛇

*/

void draw_snake()

{

int i;

for(i = 0;i < snake.len;i++)

{

wmove(w_snake,snake.y[i],snake.x[i]);//移動(dòng)光標(biāo)顯示

if(i == 0)

{

waddstr(w_snake,"0");//顯示蛇頭

}

else

{

waddstr(w_snake,"*");//顯示蛇身體

}

}

wrefresh(w_snake);//刷新

}

/*

函數(shù)功能:多線程獲取用戶輸入

*/

void* fun_input(void *yy)

{

while(1)

{

int mv = get_use_input();//保存原先方向

int pre_key = SNAKE_DIRECTION;

SNAKE_DIRECTION = mv;

if(pre_key == LEFT && mv == RIGHT)//原來(lái)蛇頭是向左,但輸入方向是向右,改回左

{

SNAKE_DIRECTION = LEFT;

}

if(pre_key == RIGHT && mv == LEFT)

{

SNAKE_DIRECTION = RIGHT;

}

if(pre_key == UP && mv == DOWN)

{

SNAKE_DIRECTION = UP;

}

if(pre_key == DOWN && mv == UP)

{

SNAKE_DIRECTION = DOWN;

}

if(pre_key != DOWN && pre_key != RIGHT && pre_key != LEFT && pre_key != UP && pre_key != QUIT)

{

SNAKE_DIRECTION = pre_key;

}

}

}

/*

game_snake:貪吃蛇游戲

*/

void game_snake()

{

int num = 0;

int x = 10;

int feed = 500000;

system("clear");

inin_windows();//創(chuàng)建游戲主界面

draw_snake_map();//顯示游戲框圖

wmove(w_title,0,0);

waddstr(w_title,"Snake_Game");

wmove(w_title,1,0);

waddstr(w_title,"Author: hui");

wmove(w_title,2,0);

waddstr(w_title,"score:");

wmove(w_title,2,6);

char buf[6]="";

sprintf(buf,"%d",num);

waddstr(w_title,buf);

wrefresh(w_title);//顯示游戲名,作業(yè),得分

draw_food();//投放食物

pthread_t tid;//實(shí)現(xiàn)多線程

pthread_create(&tid,NULL,fun_input,NULL);

while(1)

{

if(snake.x[0] == food.x &&snake.y[0] == food.y)//判斷是否吃到食物

{

snake.len ++;//吃到長(zhǎng)度 +1,得分 +1,并投放新的食物

draw_food();

num++;

}

else//沒(méi)有吃到食物就照常

{

wmove(w_snake,snake.y[snake.len-1],snake.x[snake.len-1]);

waddstr(w_snake," ");//清空最后一個(gè)

wrefresh(w_snake);

}

int i;

for(i = snake.len - 1;i > 0;i--)//蛇身向他的前一個(gè)坐標(biāo)移動(dòng)

{

snake.x[i] = snake.x[i-1];

snake.y[i] = snake.y[i-1];

}

switch(SNAKE_DIRECTION)//判斷移動(dòng)方向

{

case UP:

snake.y[0]--;

break;

case DOWN:

snake.y[0]++;

break;

case LEFT:

snake.x[0]-= 2;

break;

case RIGHT:

snake.x[0]+= 2;

break;

}

draw_snake();//畫(huà)出更新后的蛇

if(num % x == 0 && num != 0)//每吃10個(gè)就速度變成原來(lái)的0.5倍

{

feed = feed * 0.5;

x *= 2;

}

wmove(w_title,2,6);//顯示更新后的分?jǐn)?shù)

char buf[6]="";

sprintf(buf,"%d",num);

waddstr(w_title,buf);

wrefresh(w_title);

usleep(feed);//休眠時(shí)間

if(game_over())

{

wmove(w_snake,10,30);//游戲結(jié)束提示game over

waddstr(w_snake,"game over!");

wrefresh(w_snake);

sleep(1);

break;

}

}

}

總結(jié)

以上是生活随笔為你收集整理的c语言中怎么暂停一个一个游戏,求助:最近在linux下用c语言写了一个贪吃蛇程序,有几个问题,第一:贪吃蛇怎么实现暂停,第二:有时候同时输入上下左右中的两个键就会直接游戏结束...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。