c语言中怎么暂停一个一个游戏,求助:最近在linux下用c语言写了一个贪吃蛇程序,有几个问题,第一:贪吃蛇怎么实现暂停,第二:有时候同时输入上下左右中的两个键就会直接游戏结束...
求助:最近在linux下用c語言寫了一個貪吃蛇程序,有幾個問題,第一:貪吃蛇怎么實現暫停,第二:有時候同時輸入上下左右中的兩個鍵就會直接游戲結束
/*
以下是主要的邏輯代碼,還有些.c和.h就沒發了
*/
#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;
/*
函數功能: 創建游戲所需要用到的界面
*/
void inin_windows()
{??? /*newwin(nlines ,ncols,begin_y,begin_x)
newwin函數的作用是創建一個新的窗口,該窗口從屏幕位置(begin_y,begin_x)開始
行數和列數分別由參數nlines和ncols指定。
它返回一個指向新窗口的指針,如果新窗口創建失敗則返回null。*/
w_snake = newwin(MAP_HEIGHT,MAP_WIDTH, 4, 5);
w_title = newwin(3,20, 0, 20);
}
/*
函數功能: 初始化食物
*/
void draw_food()
{
int flag = 0;
srandom(time(NULL));//設置隨機數種子
while(1)
{
flag = 0;
food.x = random()%(MAP_WIDTH - 2) + 1;//從1到69隨機生成一個數
food.y = random()%(MAP_HEIGHT - 2) + 1;//從1到28隨機生成一個數
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坐標是奇數
{
break;
}
}
wmove(w_snake,food.y,food.x);
waddstr(w_snake,"*");//畫出食物
wrefresh(w_snake);
}
/*
初始化蛇
*/
void init_snake()
{
snake.len = 3;//設置蛇的初始長度
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]);//移動光標,依次顯示
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);//移動光標顯示上面的一行
waddstr(w_snake,"+ ");
wmove(w_snake,MAP_HEIGHT-1,i);//移動光標顯示下面的一行
waddstr(w_snake,"+ ");
}
for(i = 0;i < MAP_HEIGHT;i++)
{
wmove(w_snake,i,0);//移動光標顯示左邊的一行
waddstr(w_snake,"+");
wmove(w_snake,i,MAP_WIDTH-1);//移動光標顯示右邊的一行
waddstr(w_snake,"+");
}
wrefresh(w_snake);//刷新
init_snake();//投放蛇
}
/*
判斷游戲是否結束
返回值: 結束: 0
未結束: 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)//到達最大長度
{
return 1;
}
return 0;
}
/*
畫出每次更新的貪吃蛇
*/
void draw_snake()
{
int i;
for(i = 0;i < snake.len;i++)
{
wmove(w_snake,snake.y[i],snake.x[i]);//移動光標顯示
if(i == 0)
{
waddstr(w_snake,"0");//顯示蛇頭
}
else
{
waddstr(w_snake,"*");//顯示蛇身體
}
}
wrefresh(w_snake);//刷新
}
/*
函數功能:多線程獲取用戶輸入
*/
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)//原來蛇頭是向左,但輸入方向是向右,改回左
{
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();//創建游戲主界面
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);//顯示游戲名,作業,得分
draw_food();//投放食物
pthread_t tid;//實現多線程
pthread_create(&tid,NULL,fun_input,NULL);
while(1)
{
if(snake.x[0] == food.x &&snake.y[0] == food.y)//判斷是否吃到食物
{
snake.len ++;//吃到長度 +1,得分 +1,并投放新的食物
draw_food();
num++;
}
else//沒有吃到食物就照常
{
wmove(w_snake,snake.y[snake.len-1],snake.x[snake.len-1]);
waddstr(w_snake," ");//清空最后一個
wrefresh(w_snake);
}
int i;
for(i = snake.len - 1;i > 0;i--)//蛇身向他的前一個坐標移動
{
snake.x[i] = snake.x[i-1];
snake.y[i] = snake.y[i-1];
}
switch(SNAKE_DIRECTION)//判斷移動方向
{
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();//畫出更新后的蛇
if(num % x == 0 && num != 0)//每吃10個就速度變成原來的0.5倍
{
feed = feed * 0.5;
x *= 2;
}
wmove(w_title,2,6);//顯示更新后的分數
char buf[6]="";
sprintf(buf,"%d",num);
waddstr(w_title,buf);
wrefresh(w_title);
usleep(feed);//休眠時間
if(game_over())
{
wmove(w_snake,10,30);//游戲結束提示game over
waddstr(w_snake,"game over!");
wrefresh(w_snake);
sleep(1);
break;
}
}
}
總結
以上是生活随笔為你收集整理的c语言中怎么暂停一个一个游戏,求助:最近在linux下用c语言写了一个贪吃蛇程序,有几个问题,第一:贪吃蛇怎么实现暂停,第二:有时候同时输入上下左右中的两个键就会直接游戏结束...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ieda ts文件报错_使用TS开发微信
- 下一篇: jsp项目放入宝塔windows环境_商