c语言贪吃蛇黑方框,[求助][贪吃蛇]源程序,请教其中一个问题。

[求助][贪吃蛇]源程序,请教其中一个问题。

源程序如下: 我的问题是,调节游戏速度时,数字为什么越大时,有时候竟然越快?

#define N 200

#include

#include

#include

#define LEFT 0x4b00 /* 将这些特殊字符的ACSII值(这里主要的是扩展的)定义宏,来方便使用 */

#define RIGHT 0x4d00

#define DOWN 0x5000

#define UP 0x4800

#define ESC 0x011b

int i,key;

int score=0;/*得分*/

int gamespeed=60000;/*游戏速度自己调整 这个值应该是越小蛇运动的越快,但是我在Win-TC1.9.1运行时,当我把gamespeed增大时,在某些值下会反而会增快,不知道为什么*/

struct Food

{

int x;/*食物的横坐标*/

int y;/*食物的纵坐标*/

int yes;/*判断是否要出现食物的变量*/

}food;/*食物的结构体*/

struct Snake

{

int x[N];

int y[N];

int node;/*蛇的节数*/

int direction;/*蛇移动方向*/

int life;/* 蛇的生命,0活着,1死亡*/

}snake;

void Init(void);/*图形驱动*/

void Close(void);/*图形结束*/

void DrawK(void);/*开始画面*/

void GameOver(void);/*结束游戏*/

void GamePlay(void);/*玩游戏具体过程*/

void PrScore(void);/*输出成绩*/

/*主函数*/

void main(void)

{

Init();/*图形驱动*/

DrawK();/*开始画面*/

GamePlay();/*玩游戏具体过程*/

Close();/*图形结束*/

}

/*图形驱动*/

void Init(void)

{

int gd=DETECT,gm;

initgraph(&gd,&gm,"d:\\tc\program"); /* 初始化图形系统, d:\\tc\program 为EGA VGA.bgi所在路径 */

cleardevice(); /* 清除屏幕函数 */

}

/*开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙,不过画完后围墙的内圈是(60,50)(600,450)*/

void DrawK(void)

{

/*setbkcolor(LIGHTGREEN);*/ /* 设置背景颜色,可以添加 */

setcolor(11);/* 函数setcolor()设置当前绘图颜色(或称做前景色)。 */

setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*设置线型 为画线函数设置当前线型,包括线型、线图样和线宽。此处为实线加宽 */

for(i=50;i<=600;i+=10)/*画围墙*/

{

rectangle(i,40,i+10,49); /*上边  画矩形函数用当前绘图色、线型及线宽,画一个给定左上角与右下角的矩形 */

rectangle(i,451,i+10,460);/*下边 此函数调用方式为void rectangle(int left,int top,int right,int bottom); */

}/* 以一个小格为一个单位来画围墙的上下两行 */

for(i=40;i<=450;i+=10)

{

rectangle(50,i,59,i+10); /*左边*/

rectangle(601,i,610,i+10);/*右边*/

}/* 以一个小格为一个单位来画围墙的左右两行 */

}

/*玩游戏具体过程*/

void GamePlay(void)

{

randomize();/*随机数发生器*/

food.yes=1;/*1表示需要出现新食物,0表示已经存在食物*/

snake.life=0;/*活着*/

snake.direction=1;/*方向往右*/

snake.x[0]=100;snake.y[0]=100;/*蛇头 初始化位置*/

snake.x[1]=110;snake.y[1]=100;

snake.node=2;/*节数*/

PrScore();/*输出得分*/

while(1)/*可以重复玩游戏,压ESC键结束*/

{

while(!kbhit())/*检查当前按下的键 在没有按键的情况下,蛇自己移动身体*/

{/* 关于kbhit()的返回值,查找有些地方都说检查到按键返回1没有检查到返回0但本人在Win-TC1.9.1上测试为检查到返回-1没检查到返回0 */

/* 所以kbhit()没检查到时返回0检查到返回非0相对准确些 */

/* 再说一点,该函数只是检查当前是否有按键信息,却不捕获该信息。也就是说你按下一个'Q'它知道你有按下键,后面如果有捕获按键信息的函数,那么那个函数仍然可以捕获这个'Q'信息的 */

if(food.yes==1) /*需要出现新食物*/

{

food.x=rand()%400+60;/* rand()产生随机数。rand()%400+60这个表达式说明产生的随机数范围是[60,460) */

food.y=rand()%350+60;

while(food.x%10!=0)/*食物随机出现后必须让食物能够在整格内,这样才可以让蛇吃到,因为作者把每个小格的大小定义为10*10,所以蛇头的位置必然在横(列)中是10的整数倍 */

food.x++;

while(food.y%10!=0)

food.y++;

food.yes=0;/*画面上有食物了*/

}

if(food.yes==0)/*画面上有食物了就要显示*/

{

setcolor(GREEN);

rectangle(food.x,food.y,food.x+10,food.y-10);/* 根据刚才设置的食物的位置画出食物来 */

}

for(i=snake.node-1;i>0;i--)/*蛇的每个环节往前移动,也就是贪吃蛇的关键算法*/

{

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

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

}

/*1,2,3,4表示右,左,上,下四个方向,通过这个判断来移动蛇头*/

switch(snake.direction)

{

case 1:snake.x[0]+=10;break; /* 向右 */

case 2: snake.x[0]-=10;break; /* 向左 */

case 3: snake.y[0]-=10;break; /* 向上 */

case 4: snake.y[0]+=10;break; /* 向下 */

}

for(i=3;i

{

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

{

GameOver();/*显示失败*/

snake.life=1;

break;

}

}

if(snake.x[0]<55||snake.x[0]>595||snake.y[0]<55||snake.y[0]>455)/*蛇是否撞到墙壁这里的数字都是内壁与外壁的中点,来判断蛇头是否超过了内壁*/

{

GameOver();/*本次游戏结束*/

snake.life=1; /*蛇死*/

}

if(snake.life==1)/*以上两种判断以后,如果蛇死就跳出内循环,重新开始*/

break;

if(snake.x[0]==food.x&&snake.y[0]==food.y)/*吃到食物以后*/

{

setcolor(0);/*把画面上的食物东西去掉*/

rectangle(food.x,food.y,food.x+10,food.y-10);

snake.x[snake.node]=-20;snake.y[snake.node]=-20;

/*新的一节先放在看不见的位置,下次循环就取前一节的位置,此时虽然这节没有显示出来,不过蛇结构确实已经有了这节的数据*/

snake.node++;/*蛇的身体长一节*/

food.yes=1;/*画面上需要出现新的食物*/

score+=10;

PrScore();/*输出新得分*/

}

setcolor(4);/*画出蛇 这里4是红色 */

for(i=0;i

rectangle(snake.x[i],snake.y[i],snake.x[i]+10,snake.y[i]-10);

delay(gamespeed);/* 将程序的执行暂停一段时间(毫秒) void delay(unsigned milliseconds); 程序暂停就是蛇在停止 */

setcolor(0);/*用黑色(作者说是黑色不过我测试的结果为setcolor(0)是设置成背景色,也就是说不管你的背景色设置成什么颜色,该函数都会使得绘图色于背景色一样,从而实现"不显色"蛇最后一节,但setbkcolor(0)确实将背景色设置为黑色)去除蛇的的最后一节*/

rectangle(snake.x[snake.node-1],snake.y[snake.node-1],snake.x[snake.node-1]+10,snake.y[snake.node-1]-10); /* 当程序休息过,先去掉蛇的最后一节,因为在重新画蛇的时候(for语句)并没有去掉蛇尾巴的过程 */

} /*end:while(!kbhit)*/

if(snake.life==1)/*如果蛇死就跳出循环*/

break;

key=bioskey(0);/*接收按键函数bioskey()的原型为: int bioskey(int cmd); */

/* 当cmd==0时,bioskey()返回按健的键值,该值是2 个字节的整型数。当按下时,若返回值的低8 位为非零,则表示为普通键,其值代表该键的ASCII 码。若返回值的低8 位为0,则高8 位表示为扩展的ASCII码,表示按下的是特殊功能键*/

/* 由于while(!kbhit())的“再说一点”所以这里bioskey()函数仍然能捕获这个按键的信息。 */

if(key==ESC)/*按ESC键退出*/

break;

else if(key==UP&&snake.direction!=4)

/*判断是否往相反的方向移动,如果不是相反方向才确认新的方向*/

snake.direction=3;

else if(key==RIGHT&&snake.direction!=2)

snake.direction=1;

else if(key==LEFT&&snake.direction!=1)

snake.direction=2;

else if(key==DOWN&&snake.direction!=3)

snake.direction=4;

}/*end:while(1)*/

}

/*游戏结束*/

void GameOver(void)

{

cleardevice(); /* 清除整个屏幕,并且将当前位置移到屏幕原点。该函数类似于文本模式下的函数clrscr(),但clrscr()函数不能在图形方式下工作;同样cleardevice()函数不能在文本模式下工作。 */

PrScore();

setcolor(15); /* 以下三个函数见PrScore()中说明 */

settextstyle(0,0,4);

outtextxy(200,200,"GAME OVER");

getch();

}

/*输出成绩*/

void PrScore(void)

{

char str[10];

setfillstyle(SOLID_FILL,14); /* 为各种图形函数设置填充图样和颜色 */

bar(50,15,220,35); /* 用当前填充图样和填充色(注意不是给图色)画出一个指定上左上角与右下角的实心长条形(长方块或正方块),但没有四条边线 */

/* bar()函数调用方式为void bar(int left,int top,int right,int bottom);调用此函数前,可用setfillstyle()或setfillpattern()设置当前填充图样和填充色。 */

setcolor(6); /* 函数setcolor()设置当前绘图颜色(或称做前景色)。voids setcolor(int color);在低分辨率显示模式(320X200)下,选取的color是调色板颜色号,不是实际色彩值。 */

settextstyle(0,0,2); /* 为图形输出设置当前的文本属性 void far settextstyle (int font, int direction, char size); 设置图形文本当前字体、文本显示方向(水平显示或垂直显示)以及字符大小。 */

sprintf(str,"score:%d",score); /* score已经被定义成了全局变量,score内容格式化到str */

outtextxy(55,20,str); /* 在(x,y)处显示字符串 */

}

/*图形结束*/

void Close(void)

{

getch();

closegraph(); /* 关闭图形系统 */

}

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

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

相关文章

如何理解android的函数,通过Android源码理解回调函数

概述我们先看一下维基百科对回调函数的定义:在计算机程序设计中&#xff0c;回调函数&#xff0c;或简称回调(Callback 即call then back 被主函数调用运算后会返回主函数)&#xff0c;是指通过函数参数传递到其它代码的&#xff0c;某一块可执行代码的引用。这一设计允许了底层…

盒子 Box

UVa1587 思路&#xff1a; 1.输入每个面的长宽并将每个面较长的一边放在前面 2.判断是否存在三对面分别相等 3.判断是否存在三组四棱相等 #include <stdio.h> #include <stdlib.h> #define maxn 100int cmp(const void* e1, const void* e2) {return (int)(*(d…

android 复用标题栏,Android基础---使用ToolBar教你打造一个通用的标题栏

现在项目中一般都会使用标题栏&#xff0c;谷歌在2014年推出了新的app bar---ToolBar&#xff0c;代替了以前使用的ActionBar。在做项目中会经常用到这个ToolBar&#xff0c;虽然用的很多&#xff0c;但是自己对它如何用还不是很明白&#xff0c;今天就来简单的学习下这个控件的…

android html 显示表格边框,tablelayout表格布局详解

如果你已经下载好MT4软件(很多专业外汇平台都有提供下载的)&#xff0c;在手机桌面找到图表打开&#xff0c;然后选择好交易商&#xff0c;输入账号密码就可以了。TableLayout怎样实现表格布局表格布局的子对象不能指定 layout_width 属性.宽度永远是 MATCH_PARENT。不过子对象…

android jdbc 连接mysql数据库,android怎么用JDBC方法连接mysql数据库

2016-11-21 回答用android程序去直连mysql数据库&#xff0c;觉得这样做不好&#xff0c;出于安全等方面考虑。数据库地址&#xff0c;用户名密码&#xff0c;查询sql什么的都存在程序里&#xff0c;很容易被反编译等方法看到。建议把表示层和数据层逻辑分开&#xff0c;数据层…

华为注册鸿蒙商标与三海经,华为注册了一本《山海经》?除了鸿蒙商标,还有很多...

原标题&#xff1a;华为注册了一本《山海经》&#xff1f;除了鸿蒙商标&#xff0c;还有很多5月25日消息 昨天IT之家报道&#xff0c; 国家知识产权商标局网站显示&#xff0c;&#xff0c;适用于第9类别和第42类别。申请日期为2018年8月24日。此前传闻称&#xff0c;华为OS操作…

android开机渲染视频太久,Android过度渲染优化解决方案

过度绘制是发生的每一次应用要求系统上别的画的东西。“调试GPU透支”工具覆盖上你的屏幕的色彩显示多少次像素被重绘。通过查看GPU透支来改善应用程序的渲染时间。方法1&#xff1a;打开手机设置—>开发人员工具选项—>调试GPU过度绘制—>显示GPU视图更新&#xff0c…

小米android停止,小米由于错误而停止将Android 10推广到MiA3

当小米上周宣布将为Mi A3和Redmi Note 8用户推出Android 10更新时&#xff0c;用户为最终升级他们的设备(至少在软件方面)感到非常兴奋。但是&#xff0c;这种喜悦似乎是短暂的。用户抱怨说&#xff0c;尽管收到更新通知&#xff0c;但他们仍无法下载更新。有些人甚至看到更新在…

html两张图片无缝合成一张,怎么用PS把两张图片合成一张 PS无缝拼图边缘如何处理...

PS怎么把两张图片合成一张&#xff1f;PS无缝贴图怎么用&#xff1f;PS无缝拼接要用什么工具&#xff1f;PS无缝拼图快捷键是什么&#xff1f;PS无缝拼图有色差怎么办&#xff1f;PS把两张图片合成一张边缘怎么修&#xff1f;PS无缝拼接图片边缘如何处理&#xff1f;PS把一张图…

html输入公式得到混合运算结果,excel表格如何用公式计算加减乘除混合运算-excel乘法如何计算,excel函数怎么计算乘法...

Excel支持数学中的四则运算&#xff0c;直接在目标单元格写相应的公式即可。例百如求A1减B1的差&#xff0c;在C1单元格可输入&#xff1a;A1-B1需注意&#xff1a;Excel里面任何公式(包括数学四则运算)都是需要以等号度开头。Excel里面的号用反斜杠/表示。乘法问中的x用星号*表…

汇编html文档,欢迎走进HTML的世界汇编.ppt

欢迎走进HTML的世界汇编在HTML里用和划分段落,可以不成对出现。 欢迎使用 HTML这会是一种很有趣的体验 另一个段落元素 段落划分 使用对齐属性修饰段落 学习HTML这会是一种很有趣的体验 右对齐 Left&#xff1a;左对齐 Center&#xff1a;居中 Right&#xff1a;右对齐 使用对…

html点击事件传参 php,HTML通过事件传递参数到js详解及实例

目标处理函数为selectAttr(test)1.直接传递给定参数如:οnclick"selectAttr(1);οnclick"selectAttr(a);2.传递某属性值οnclick"selectAttr(typeName.value);οnclick"selectAttr(nameId.value);3.传递this对象οnclick"selectAttr(this);通过this对…

html 属于mvvm框架,前端MVVM框架avalon揭秘 - HTML编译器

MVVM试图更加清晰的讲用户界面(UI)开发从应用程序的业务逻辑与行为中心分离&#xff0c;由于&#xff0c;不少这样的模式的实现都须要利用声明式数据绑定来实现讲View(视图)工做从其余层分离css因此出现了一大堆自定义的声明式的语法&#xff1a;html如:Avalonnode顾名思义,自定…

台式电脑怎么找不到计算机在哪,台式机没有蓝牙怎么办

台式机没有蓝牙&#xff0c;想上个蓝牙&#xff0c;该怎么样解决呢?下面由小编给你做出详细的台式机没有蓝牙解决方法介绍!希望对你有帮助!台式机没有蓝牙解决方法一&#xff1a;可以安装USB蓝牙设备知识延伸&#xff1a;给台式机安装USB蓝牙设备与台式机蓝牙连接1***先将电脑…

html的opacity标签,css中opacity是什么意思

css样式 给div样式opacity:0 是什么意思透明度 注意 ie低版本要实现透明度必须用ie特有的滤镜 而非简单的opacityCSS中 not(.active) { opacity: 0.3; } 是什么意思css的opacity让div和里面的div透明了怎样才让div里面的div不透明&#xff1f;不透明度会作用于整个元素以及它所…

使用计算机时 正确的关机顺序是( ),《计算机应用基础》半期考试卷

内容简介&#xff1a;《计算机应用基础》半期考试卷。一、选择题 (每题 2分)1.使用计算机时&#xff0c;正确的关机顺序是__A__________A先关主机&#xff0c;再关显示器&#xff0c;打印机 B先关显示器&#xff0c;再关主机&#xff0c;打印机C先关显示器&#xff0c;再关打印…

北交计算机学硕培养计划,北京交通大学硕士研究生培养方案——交通信息工程及控制...

交通信息工程及控制(专业代码&#xff1a;082302授予工学硕士学位)一、培养目标本专业研究生培养方案强调自动化与控制领域先进应用技术的研究与开发能力&#xff0c;但不忽略基础理论的培养。其培养目标是培养在控制与信息工程、自动化工程领域具有一定的理论基础、较宽的知识…

frm考试可以用计算机,FRM考试,考生自己可以携带计算器吗?

因为FRM考试有大量的计算题&#xff0c;是需要用到计算器的&#xff0c;近日有考生咨询&#xff0c;参加考试&#xff0c;可以自己携带FRM计算器吗&#xff1f;答案当然是肯定&#xff0c;考生是可以携带FRM计算器的&#xff0c;但是要携带协会官方要求的型号&#xff0c;不是什…

华为手机里html是什么意思,华为手机出现“HD”图标,究竟代表什么意思?看完这些你明白了...

华为手机信号栏为什么会出现“HD”的小图标&#xff1f; 华为手机出现“HD”代表什么意思&#xff1f;它的出现会给手机带来哪些影响和作用&#xff1f;今天就来为大家揭秘一下华为手机“HD”图标的含义及作用&#xff0c;还不知道的赶紧看过来吧&#xff01;1、华为手机出现“…

手工编程是指利用计算机完成,西安交通大学17年3月课程考试《CAD CAM》作业考核试题...

B. 下层结点可与几个上层结点连接C. 上层结点只能与一个下层结点连接D. 上层结点与下层结点间没有连接关系正确答案&#xff1a;29. 计算机集成制造系统简称为( )A. CAEB. GTC. CIMSD. CMS正确答案&#xff1a;30. 在实体造型中以物体的边界为基础来定义和描述几何形体&#xf…