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语言写了一个贪吃蛇程序,有几个问题,第一:贪吃蛇怎么实现暂停,第二:有时候同时输入上下左右中的两个键就会直接游戏结束...相关推荐
- c mysql连接池_在LINUX下用C/C++写了一个连接池(访问MYSQL)的类
一.头文件[存为:connPool.h] #ifndef __CONNECTION_POOL_H__ #define __CONNECTION_POOL_H__ #include "mute ...
- deepin终端编译c程序_大神支招 如何在Linux下运行C语言程序
刚入门学习C语言程序的小伙伴比较常遇到的其中一个问题是:如何在Linux下运行C语言程序.今天针对这个热门问题,小编为大家准备了详细的教程! 小编先给大家普及一些关于C语言程序的基本常识:首先大家要清 ...
- 打怪游戏Java课程设计_java 课程设计大作业 写的一个RPG游戏(代码+文档)
[实例简介] java 课程设计大作业 写的一个RPG游戏(代码+文档) java 课程设计大作业 写的一个RPG游戏(代码+文档) [实例截图] [核心代码] Rebellion-master ├─ ...
- linux下cp复制目录时排除某些目录的方法分享,Linux 下复制(cp)目录时排除一个或者多个目录的方法...
cp 貌似没有排除目录的功能,可以使用 rsync 命令来实现了,如: [案例] /home/52php目录里面有data目录,data目录里面有 a.b.c.d.e 五个目录,现在要把data目录里 ...
- 第4章 Linux下的C语言开发基础
第4章 Linux下的C语言开发基础 4.1 C语言开发的基本步骤 C语言源程序开发的基本步骤如下: 根据项目需求划分功能模块 编辑.利用文本编辑器vi或gedit编写C源程序并保存,文件的后缀为.c ...
- linux下的C语言开发
在很多人的眼里,C语言和linux常常是分不开的.这其中的原因很多,其中最重要的一部分我认为是linux本身就是C语言的杰出作品.当然,linux操作系统本身对C语言的支持也是相当到位的.作为一个真正 ...
- linux下用C语言实现TCP/IP服务器与客户端互相发送数据的socket编程
linux下用C语言实现TCP/IP服务器与客户端互相发送数据的socket编程 server.c #include <sys/stat.h>#include <fcntl.h> ...
- Third Week :Linux下的C语言
Linux下的C语言 1. 搭建C语言开发环境/运行环境 1. 文本编辑 2. 编译器 3. 头文件和系统预装文件 4. make 工具 5. echo 2. 标准输入流/输出流/错误流 1. 重定向 ...
- Linux下用C语言实现文件的写入
C语言自带的文件写入机制是非常不错的选择 我们可以通过一下代码来轻松完成文件的写入 C语言中对文件操作的标准库函数以下所示: 文件的打开操作 fopen 打开一个文件 文件的关闭操作 fclose ...
最新文章
- html display布局,Web布局:display属性
- onmousemove和onmouseout事件的调用,和js使用双引号、单引号的时候应该注意的问题...
- 作者:孙宗哲(1991-),男,东北大学软件学院硕士生
- X大佬:建议被降级降薪员工主动辞职,网友炸了
- 宿华辞任快手CEO 联合创始人程一笑接任
- JavaScript 邮件正则练习
- git删除文件需要注意的事项
- python产生随机数组_Python生成随机数组的方法小结
- Jmeter安装TPS插件
- 干货!大话EXT4文件系统完整版
- 什么是一级域名?一级域名和二级域名的区别是什么?
- 杭州小伙逆行-没有生活,只有活着
- 爬虫-爬取中国诗歌网中中国好诗栏目 - 统计词汇出现频数 - 副本
- Codeforces Round #554 (Div. 2) A. Neko Finds Grapes
- 2004年南京美食地图 [转载]
- 年过完了,收心吧!送给大家送一波前端新书!
- Talk预告 | 阿里巴巴达摩院算法工程师许贤哲:DAMO-YOLO:兼顾速度与精度的高效目标检测框架
- CPU的设计与实现(2)--逻辑电路设计
- 常见的纸张及相片尺寸
- 内存管理之Tagged pointer
热门文章
- Mybatis配置文件参数定义
- 启动TOMCAT报错 java.util.zip.ZipException: invalid LOC header (bad signature)
- 12.JAVA基本数据类型
- linux系统常见操作,Linux系统基本操作
- 干煸线椒的做法_美食:农家蒸土鸡,剁椒梅鲚鱼干,干煸茶树菇,芹菜炒牛肉的做法...
- 加拿大计算机专业学什么,加拿大哥伦比亚大学计算机专业课程
- html5中单选框被选中把值传给后台_HTML5的表单设计
- java 远程调用url_使用Java的URL/HttpURLConnection进行远程调用(POST请求)
- [转载] Java8 Stream流遍历 如何使用索引
- computed set 自定义参数_深入理解vmodel之自定义组件用法