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

ca56232b3bbedf9a539d07f37fffb99a.gif

3144d8b7615c79d9f638db40d5689d26.gif

a218af6549b45ee526caf607ebff1358.gif

0f8df0e29816ae721419de940fb833d1.gif

求助:最近在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;

}

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/552489.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android view显示隐藏动画效果,Android 根据手势顶部View自动展示与隐藏效果

首先来看一下效果&#xff1a;大体思路如下&#xff1a;总体布局用了一个自定义的ViewGroup&#xff0c;里面包了两个View(top View&#xff0c;bottomView)我在bottomView里放了ViewPager&#xff0c;里面又有Fragment&#xff0c;Fragment里放的是ListView原理&#xff1a;Vi…

android点击地址调用地图,Android 实现点击按钮 调用手机外部地图导航

//弹出Dialog 选择外部地图private void setMap(){final Dialog dianew AlertDialog.Builder(mContext).create();View viewLayoutInflater.from(mContext).inflate(R.layout.dialog_map, null);dia.show();dia.getWindow().setContentView(view);TextView tv_baidu(TextView) …

android webservices 返回多行多列数据,NoahWeb实现表格多行多列

用NoahWeb的表现层指令可以在动态生成的页面中非常容易的实现多行多列的表格。在正式学习以前我们需要先来了解一下怎么用NoahWeb的表现层来做动态内容显示。在NoahWeb设计器中新建或打开一项目以后&#xff0c;在Macromedia Dreamweaver MX 2004中新建了一个“空页面”&#x…

android程序 美食分享,下厨房Android产品分析

下厨房产品宣传图一、产品概况1、产品简介下厨房菜谱是一款简单实用的美食应用&#xff0c;可以帮助用户寻找想吃的美食&#xff0c;搜索精美食谱&#xff0c;使用购买清单选购食材&#xff0c;与朋友分享自己制作的美食。2、主要竞品美食杰、豆果美食、好豆菜谱、香哈菜谱。二…

html实现图片加载动画效果,HTML5+javascript实现图片加载进度动画效果

在网上找资料的时候&#xff0c;看到网上有图片加载进度的效果&#xff0c;手痒就自己也写了一个。图片加载完后&#xff0c;隐藏loading效果。想看加载效果&#xff0c;请ctrelF5强制刷新或者清理缓存。效果预览&#xff1a;0%代码如下&#xff1a;HTML5javascript实现图片加载…

html5开发app的缺点,全解HTML 5在移动Web应用的优劣势

关于HTML5HTML5具有语义学、本地存储、设备访问、连接性、多媒体、平面和三维效果、性能和集成和CSS3八大技术特征。让Web应用进入无插件时代&#xff0c;在功能和性能上逼近桌面应用。促使应用Web化&#xff0c;实现跨平台。HTML5规范草案将于2012年发布候选推荐版&#xff0c…

html怎么加断点快捷键,HTML添加断点 - osc_vyztkm1b的个人空间 - OSCHINA - 中文开源技术交流社区...

###1.前言 很多时候&#xff0c;页面的dom元素是动态添加的&#xff0c;而我们不知道具体是哪段js代码在操作这个dom元素&#xff0c;所以需要进行断点&#xff0c;对相应的dom元素进行断点监听&#xff0c;这样才能找出相关的js代码。在浏览器的调试工具中&#xff0c;切到ele…

html5 canvas 图像预览,html5-canvas 加载并显示图像

示例加载图像并将其放置在画布上var image new Image(); // 请参阅有关创建图像的注释image.src "imageURL";image.onload function(){ctx.drawImage(this,0,0);}创建图像有几种创建图像的方法new Image()document.createElement("img")作为HTML正文的…

html能插入背景的行级元素,Html元素类型:块级元素、行内元素(内联元素)和行内块级元素...

8种机械键盘轴体对比本人程序员&#xff0c;要买一个写代码的键盘&#xff0c;请问红轴和茶轴怎么选&#xff1f;html中的标签元素大体被分为三种不同的类型&#xff1a;块级元素、内联元素(又叫行内元素)和内联块级元素。事实上&#xff0c;我以前用的时候只是建立在对它们的初…

fox pro删除单条数据_Mac文件夹数据同步工具——Sync Folders Pro

Mac版同步文件夹Pro&#xff08;文件夹数据同步工具&#xff09;分享给大家&#xff01;Mac版同步文件夹Pro是一种功能强大的文件夹数据同步工具&#xff0c;可帮助您同步两一个文件夹的内容&#xff0c;包括任何子文件夹。使用文件夹同步软件&#xff0c;允许您在任一方向或两…

bp神经网络预测未来五年数据_预测 | 未来五年以太网收发器出货将达2.75亿只

新闻导读LC最新预测表明&#xff0c;从2021年到2025年间&#xff0c;供应商将售出2.75亿只以太网收发器&#xff0c;为其带来240亿美元的收入。但由于激烈的竞争、电信和企业网络投资的放缓&#xff0c;以及中美敌对升级可能导致中国云数据中心升级的延迟&#xff0c;LC下调了未…

计算机知识竞赛决赛流程,计算机知识竞赛决赛圆满结束!还不快戳?!

原标题&#xff1a;计算机知识竞赛决赛圆满结束&#xff01;还不快戳&#xff1f;&#xff01;温 馨 提 示 &#xff1a;热烈庆祝&#xff1a;青海大学 “计算机知识竞赛”圆满结束&#xff01;计算机莅临本场比赛的嘉宾有&#xff1a;计算机协会指导老师&#xff1a;贾金芳老师…

开关造成的毛刺_玻璃面板开关钻孔加工

玻璃面板开关&#xff0c;也叫做钢化玻璃开关。与传统的面板开关不同在于它是用钢化玻璃制作而成&#xff0c;但是同样能够达到控制电路的作用&#xff0c;这种开关的设计理念是为了能够达到简约时尚的作用&#xff0c;同时也具有美观与安全性&#xff0c;可以说是受到许多家庭…

html播放rtsp流,浏览器播放rtsp视频流解决方案

最近项目中需要实时播放摄像头rtsp视频流&#xff0c;于是就专门做了些研究。而浏览器不能直接播放&#xff0c;只有通过插件或者转码来实现这个需求。要实现这个目的&#xff0c;可以采用的方案非常得多&#xff0c;有商业的也有开源的&#xff0c;这里主要列举一些开源的方案…

本科计算机专业在车辆段,机电与轨道车辆工程系2021届毕业生参加成都铁路局车辆段及电务段认知实习...

2020年10月28日&#xff0c;在机电与轨道车辆工程系专业教师及辅导员们的带领下&#xff0c;轨道交通学院机电与轨道车辆工程系2017级本科车辆工程专业、机械设计制造及其自动化专业、2018级专科城市轨道交通车辆技术专业共108名学生&#xff0c;以及2017级本科电气工程专业45名…

java参数注解pam_吃透Java基础十:注解

一、什么是注解官方定义&#xff1a;注解是一系列元数据&#xff0c;它提供数据用来解释程序代码&#xff0c;但是注解并非是所解释的代码本身的一部分。注解对于代码的运行效果没有直接影响。注解有许多用处&#xff0c;主要如下&#xff1a;提供信息给编译器&#xff1a;编译…

广州计算机操作员培训,汕尾市计算机操作员报名考试时间地址及培训入口

生活习惯越来越多的计算机进入了人们的日常生活&#xff0c;随着计算机价格的逐步便宜&#xff0c;越来越多的家长为自己的孩子购置了计算机&#xff0c;但是计算机目前在我们的日常生活中&#xff0c;却没有扮演一个下面的角色&#xff0c;现在家庭中的计算机一般都是作为娱乐…

go get如何删除_Go 每日一库之 xorm

简介Go 标准库提供的数据库接口database/sql比较底层&#xff0c;使用它来操作数据库非常繁琐&#xff0c;而且容易出错。因而社区开源了不少第三方库&#xff0c;如上一篇文章中的sqlc工具&#xff0c;还有各式各样的 ORM (Object Relational Mapping&#xff0c;对象关系映射…

浮点加法器计算机组成原理,计算机组成原理 第二章运算方法与运算器

第二章运算方法与运算器运算方法&#xff1a;指算术(四则)运算和逻辑运算&#xff0c;在运算器的实现方法&#xff0c;而实现这两种运算的硬设备就是算术逻辑部件ALU(Arithmeticand Logic Unit)或称运算器由于逻辑运算及实现较简单&#xff0c;所以本章主要讨论计算机中算术四则…

wordpress添加html媒体文件,WordPress“添加媒体”文件时只显示上传到当前文章的附件图片...

最近子凡把很大一部分精力都分散在了泪雪建站的改版和泪雪网的运营中去了&#xff0c;随着泪雪网的定位和内容的新增&#xff0c;网站也需要有很多细节的升级&#xff0c;而在今天就给大家分享一个 WordPress 如何在编辑文章时“添加媒体”中默认只显示上传到本文中的附件的方法…