c语言打飞碟游戏过程的讲解

作者&投稿:裘谦 (若有异议请与网页底部的电邮联系)
c语言打飞碟程序讲解~

这个程序是dos下的程序, 很多鸟东西我想你不知道的,什么是near, far指针什么是中断你知道吧?
如果不知道看来是很难给你说懂这程序的。毕竟现在谁还玩dos下的编程呢?

喜欢可以与我交流,86711527
我的想法是,在各个身体部位的运动当中,后一个方块的下一个位置坐标,总是前一个方块的x1,y1,
也就是说后面的方块总是按前面的方块的轨迹运动 .
而且第一个方块是不能回头的,所以用到if((a[0].x0!=(a[1].x0-dx))).......这一句。

我也想编类似贪吃蛇的游戏.....别人写的没有没有注释,看不太懂..所以我先依自已的想法,写了
一个小实验品,写得差不多了,但是很多细节处理不好!!如:我没有写如果蛇碰到自已会死;还有
就是食物随机出现的位置有可能出现在身体正在的位置,这样的话就看不见它了。。等等。
*/

#include"stdio.h"
#include"graphics.h"
#include"stdlib.h"

#define RIGHT 0x4d00
#define LEFT 0x4b00
#define UP 0x4800
#define DOWN 0x5000
#define ESC 0x011b

int dx; /*移动时X轴身体变化距离*/
int dy; /*移动时Y轴身体变化距离*/
int N=4; /*身体节数*/


/*存放身体每一部份的信息*/
struct body
{
int x0,y0; /*每个方块的左上角的坐标,当物体移动时它最先改变*/
int x1,y1; /*每个块的左上角坐标,但主要是为了给它后面的方块指定他下一位置的坐标*/
}a[80]={{300,100,300,100},
{290,100,290,100}, /*定义了四块身体*/
{280,100,280,100},
{270,100,270,100}
};

/*存放每一块食物的信息*/
struct boX
{
int x; /*食物左上角横坐标*/
int y; /*食物左上角纵坐标*/
int live; /*食物是否存在,1:存在,0:不存在*/
}box; /*定义一个食物变量*/

/*初始化图形*/
void initgr()
{
int gd=DETECT,gm;
initgraph(&gd,&gm,"");
setcolor(YELLOW);
setlinestyle(0,0,3);
rectangle(200,150,440,200);
setcolor(7);
settextstyle(0,0,4);
setcolor(9);
outtextxy(240,160,"SNAKE");
settextstyle(0,0,1);
setcolor(7);
outtextxy(280,220,"By UFOZH");
outtextxy(230,240,"press any key to continue...");
getch();
cleardevice();
setfillstyle(1,BLUE);
bar(150,80,450,380);
}


/*****************************************************************************/
main()
{
int n,i;
int key; /*存放按键值*/
dx=10; /*每个方块每次移动长度*/
dy=10;

initgr();

setlinestyle(0,0,1);
setcolor(WH99vE);
randomize(); /*游戏开始前画出第一个要吃掉的方块*/
box.x=300+10*(rand()%14+1);
box.y=100+10*(rand()%26+1);
box.live=1;
rectangle(box.x,box.y,box.x+10,box.y+10);

/*默认刚开始条形是向右移动*/
while(!kbhit())
{
a[0].x0=a[0].x0+dx;
for(i=1;i<N;i++)
{
a[i].x0=a[i-1].x1;
a[i].y0=a[i-1].y1;
}
setcolor(BLUE);
for(n=0;n<4;n++)
rectangle(a[n].x1,a[n].y1,a[n].x1+dx,a[n].y1+dy);
setcolor(WH99vE);
delay(3000);
for(n=0;n<4;n++)
rectangle(a[n].x0,a[n].y0,a[n].x0+dx,a[n].y0+dy);
for(i=0;i<N;i++)
{
a[i].x1=a[i].x0;
a[i].y1=a[i].y0;
}
delay(50000);
}

key=bioskey(0);
while(1)
{
switch(key)
{
case RIGHT:if((a[0].x0!=(a[1].x0-dx))) /*当第一个方块不是在第二个的正左边时,条形向右移,否则执行case LEFT*/
{
while(!kbhit())
{
if(a[0].x0450||a[0].y0380) /*当第一个方块出个任四个界时,退出*/
exit(0);

if(box.live==0) /*当食物不存在时,随机位置增加一食物*/
{
box.x=10*(rand()%30+15);
box.y=10*(rand()%30+8);
rectangle(box.x,box.y,box.x+10,box.y+10);
box.live=1; /*食物变为存在*/
}

/*当蛇头在食物的正左方且食物存在时,食物被吃掉*/
if(((a[0].x0==(box.x-10))&&(a[0].y0==box.y))&&(box.live==1))
{
for(i=N;i>=1;i--) /*把现有的身体统一向后移一个单位*/
{
a[i].x0=a[i-1].x0;
a[i].x1=a[i-1].x1;
a[i].y0=a[i-1].y0;
a[i].y1=a[i-1].y1;
a[0].x0=box.x; /*把食物当做身体加入蛇头*/
a[0].y0=box.y;
a[0].x1=a[0].x0;
a[0].y1=a[0].y0;
N++; /*身体节数加1*/
box.live=0; /*食物消失*/
}

loat x,y;/*飞碟的坐标*/
int mx,my;
int i,num=0;
for(i=40;i<640;i+=30)
DrawFly(i,65,WHITE);
mx=my=300;
setcolor(15);
line(0,80,640,80);
randomize();
while(num<20)

定义的mx 和my是什么。还有for循环中的i是干什么的。 。。 。
Steal.inMyth 12:31:04
mx。my应该是子弹的坐标吧
杨 12:31:28
i呢。
Steal.inMyth 12:31:59
for循环应该就是画出所有的飞机
杨 12:32:51
if(y>490&&col+x>col)/*自动消失*/
break;
}
if(y<490)
{
setcolor(RED);
line(40+num*30-10,55,40+num*30+10,75);
line(40+num*30-10,75,40+num*30+10,55);
}
num++;

这一部分是完全没知道是什么意思的。 。。 。 。
Steal.inMyth 12:34:08
应该是超出某个范围(比方说屏幕)然后就消失
杨 12:34:16
void Init()/*初始*/
{ int gd=DETECT,gm;
initgraph(&gd,&gm,"c:\\tc");
cleardevice();
InstallKeyboard();
}

在这里又一个初始是什么意思?
Steal.inMyth 12:34:44
初始化图形界面
先把游戏的地图画出来
杨 12:35:04
再初始化一次?
在开始的时候不是初始化过了,是新的一轮么?
Steal.inMyth 12:35:26
这里面还有个初始化键盘
这应该是游戏开始之前进行的初始化
杨 12:35:47
嗯,在程序开始前也有一个。。。
Steal.inMyth 12:35:50
每局
杨 12:35:55
o。。。~
void Close()/*关闭*/
{
ShutDownKeyboard();
closegraph();
}
DrawFly(int x,int y,int color)/*画飞碟*/
{
setcolor(BLACK);
setfillstyle(SOLID_FILL,color);
fillellipse(col+x,y,10,6);
}
void far interrupt NewInt9(void)
{
unsigned char ScanCode,temp;
ScanCode=inportb(0x60);
temp=inportb(0x61);
outportb(0x61,temp | 0x80);
outportb(0x61,temp & 0x7f);
if(ScanCode&0x80)
{
ScanCode&=0x7f;
key_state[ScanCode]=0;
}
else
{
key_state[ScanCode]=1;
key_pressed[ScanCode]=1;
}
outportb(0x20,0x20);
}

void InstallKeyboard(void)
{
int i;
for(i=0;i<128;i++)
key_state[i]=key_pressed[i]=0;
OldInt9Handler=getvect(9); /*中断向量值*/
setvect(9,NewInt9); /*中断程序NewInt9地址存入指定的中断向量表中INT 09H*/
}

void ShutDownKeyboard(void)
{
setvect(9,OldInt9Handler);
}

int GetKey(int ScanCode)
{
int res;
res=key_state[ScanCode]|key_pressed[ScanCode];
key_pressed[ScanCode]=0;
return res;
}

这个也是完全看不懂的= =。。。

安全提示:如果聊天中有涉及财产的操作,请一定先核实好友身份。发送验证问题或点击举报
Steal.inMyth 12:38:06
close函数式关闭界面,drawfly是画出飞机,installkeyboard是初始化键盘,另一个不用管,这些东西就了解一下就行了,不会细问的
杨 12:38:56
唉,好吧,再问一下,那个中断是中断的什么?
Steal.inMyth 12:39:16
哪个中断?
interupt? 12:39:33
恩恩。。 。
Steal.inMyth 12:40:42
应该是监视键盘的一个函数,检查每个时刻有没有中断请求,这个不是计算机专业的不会考的..

void PlayGame()/*游戏过程*/
{
float x,y;/*飞碟的坐标*/
int mx,my;
int i,num=0;
for(i=40;i<640;i+=30)
DrawFly(i,65,WHITE);
mx=my=300;
setcolor(15);
line(0,80,640,80);
randomize();
while(num<20)
{
PrScore();/*输出成绩*/
col=random(10);/*中心坐标随机*/
col=col*20+200;
speed=2+random(2);/*飞碟速度随机*/
for(x=-250;x<=250;x+=speed)/*飞碟移动全过程*/
{
y=pow((x/10),2)+200;/*求y坐标*/
DrawFly(x,y,WHITE);
DrawM(mx,my,YELLOW);
delay(gamespeed);/*间隔*/
DrawM(mx,my,BLACK);
DrawFly(x,y,BLACK);
if(GetKey(KEY_ESC))/*结束游戏*/
break;
if(GetKey(KEY_LEFT))
mx-=4;
if(GetKey(KEY_RIGHT))
mx+=4;
if(GetKey(KEY_DOWN))
my+=4;
if(GetKey(KEY_UP)&&my>100)
my-=4;
if(GetKey(KEY_SPACE))/*发子弹*/
{
if(((x+col+10)>=(mx-2)&&x<=(mx+2))&&(y>=(my-2)&&y<=(my+2)))/*这里控制精确度*/
{
score++;
DrawFly(x,y,BLACK);
DrawM(mx,my,YELLOW);
PrScore();
DrawM(mx,my,BLACK);
break;
}
}
if(y>490&&col+x>col)/*自动消失*/
break;
}
if(y<490)
{
setcolor(RED);
line(40+num*30-10,55,40+num*30+10,75);
line(40+num*30-10,75,40+num*30+10,55);
}
num++;
if(GetKey(KEY_ESC))/*结束游戏*/
break;
}
Win();
while(1)
{
if(GetKey(KEY_ESC))
break;
}
}
void Init()/*初始*/
{ int gd=DETECT,gm;
initgraph(&gd,&gm,"c:\\tc");
cleardevice();
InstallKeyboard();
}
void Close()/*关闭*/
{
ShutDownKeyboard();
closegraph();
}
DrawFly(int x,int y,int color)/*画飞碟*/
{
setcolor(BLACK);
setfillstyle(SOLID_FILL,color);
fillellipse(col+x,y,10,6);
}
void far interrupt NewInt9(void)
{
unsigned char ScanCode,temp;
ScanCode=inportb(0x60);
temp=inportb(0x61);
outportb(0x61,temp | 0x80);
outportb(0x61,temp & 0x7f);
if(ScanCode&0x80)
{
ScanCode&=0x7f;
key_state[ScanCode]=0;
}
else
{
key_state[ScanCode]=1;
key_pressed[ScanCode]=1;
}
outportb(0x20,0x20);
}

void InstallKeyboard(void)
{
int i;
for(i=0;i<128;i++)
key_state[i]=key_pressed[i]=0;
OldInt9Handler=getvect(9); /*中断向量值*/
setvect(9,NewInt9); /*中断程序NewInt9地址存入指定的中断向量表中INT 09H*/
}

void ShutDownKeyboard(void)
{
setvect(9,OldInt9Handler);
}

int GetKey(int ScanCode)
{
int res;
res=key_state[ScanCode]|key_pressed[ScanCode];
key_pressed[ScanCode]=0;
return res;
}

????


fc飞碟大战
下载地址:http:\/\/www.xyx09.com\/239802\/ 类型:安卓游戏-动作闯关 版本:v5.37.0 大小:67.27M 语言:中文 平台:安卓APK 推荐星级(评分):★★★ 游戏标签: 飞碟大战 冒险游戏 飞碟大战游戏是一款经典的星际战斗手游,这款游戏能为玩家打造一个非常火热的竞技模式,并且还有超多...

超级飞碟基本信息
超级飞碟,一款经典的动作街机游戏,以其独特的魅力吸引着玩家。这款游戏的英文名为Wind Jammers,它的名字本身就充满了动感和活力。这款游戏的大小适中,仅为7.0MB,对于当时的计算机配置来说,运行起来非常流畅。它的语言版本为英文,对于热爱挑战的玩家,这无疑增加了游戏的国际性体验。超级飞碟的发售...

五年级作文飞碟杯的启示
在她一岁半的时候,一场重病使她变成了一个又聋又瞎的残疾人,她没有放弃,她经过艰苦卓绝的努力,学会了英、法、德、拉丁等五种语言,后来,她又爱上了文学,成了一名作家,她写过:《假如给我三天光明》、《石墙之歌》、《冲出黑暗》、《我是怎样成为一名社会主义者》……等许多文章。世界上没...

世界上有UFO吗?
值得一提的还有飞碟。许多人看到了它。也猜想它就是外星人驾驶的飞船,可这也仅仅是一种猜想而已。 那么,到底有没有外星人呢?科学家分析,宇宙间象地球这样这样的行星肯定还很多,某些与地球环境相似的行星确实很可能有外星人,但是由于我们的航天、通讯技术尚未足够发达,要找到他们我们还必须加倍努力才行。 某人于1995...

幼儿园大班综合活动 教案:“动手做、游戏乐”——飞入太空
在孩子们的提议下,我们与全班幼儿共同商讨指定了一系列的活动,并将游戏命名为:“进入太空的梦想”由孩子自己动手动脑,在区域活动中进行绘画、利用积木拼插各种飞行器的活动。很多孩子都能掌握一些简单飞行器,如小飞机、飞碟的制作方法,并且在制作过程中能充分体现自己的想象力和创造力。2、2003年10月...

幼儿园小班教案
4、培养幼儿边玩边记录的学习技能,并能够用自己简短、流利的语言表达自己记录的意思。 ●纸球玩法: 1.夹纸球:学习用双脚前部夹纸球,跳起用力抛出。 2.踢着纸球跑:边把纸球踢向前方,边跟着纸球跑。 3.投掷纸球:朝墙壁投掷纸球。 ●游戏:投掷飞碟 将幼儿分成人数相同的两组,两位教师分别顶着雨伞变身...

谁知道飞碟的秘密???
国际上通称UFO,俗称飞碟。 20世纪以前较完整的目击报告有300件以上。据目击者报告,不明飞行物外形多呈圆盘状(碟状)、球状和雪茄状。20世纪40年代末起,不明飞行物目击事件急剧增多,引起了科学界的争论。持否定态度的科学家认为很多目击报告不可信,不明飞行物并不存在,只不过是人们的幻觉或是目击者对自然现象的一...

w星球历险记_1000字
李克明在飞碟上迷迷糊糊地睡着了,一觉醒来,发现自己睡在一间整洁的小房子里,窗外小院中有许多奇怪的小花,院门关着。一会儿,发出“咣啷”“咣啷”的响声,门“吱呀”一声开了,走进来一个样子十分灵巧的机器人。李克明对机器人说:“这是什么地方?,离我们地球有多远?”机器人说了好多种语言...

关于UFO的电影
罗斯威尔(TV)又名: Roswell \/ Roswell (TV)导演: Jeremy Kagan 主演: Kevin D. Randle \/ Donald R. Schmitt \/ Kyle MacLachlan \/ Martin Sheen \/ Dwight Yoakam \/ Xander Berkeley \/ Bob Gunton \/ Kim Greist \/ Peter MacNicol 上映年度: 1994 语言: 英语 \/ 普通话 制片国家\/地区: 美国 剧情...

香肠派对飞碟正式服安卓APK如何下载
下载地址:http:\/\/www.37moyu.com\/azyx\/sjqz\/xiangchangpaiduifeidiezhengshifuv905.html 类型:安卓游戏-射击枪战 版本:香肠派对飞碟正式服v9.05 大小:1150.05M 语言:中文 平台:安卓APK 推荐星级(评分):★★★ 游戏标签: 吃鸡游戏 香肠人游戏 香肠派对外星飞碟先行服手游带给...

当涂县13445562456: c语言打飞碟游戏的详细解释
重爱烧伤: 孩子,好好学习,不要投机取巧

当涂县13445562456: c语言设计游戏时怎么设计障碍物在空中来回移动 -
重爱烧伤: includelt;stdio.h; void move(char x,char y) { printf(%c--;%c;n,x,y); } void hanoi(int n,char one ,char two,char three) { if(n==1) move(one,three); else { hanoi(n-1,one,three,two); move(one,three); hanoi(n-1,two,one,three); } } main() { int m; printf(input the ...

当涂县13445562456: 一只小狗和主人玩飞碟游戏,已知飞碟在空中飞行t0=10s后落地,飞碟在水平方向上做匀速直线运动,v0=9m/s;
重爱烧伤: 飞碟飞了s0=v0*t0=9*10=90m 小狗加速度a=v/2=4m/s^2,从启动到匀速跑了s1=at^2/2=4*2^2/2=8m 也就是小狗要在剩下的10-2=8s正好接住飞碟,也就是跑了8*8=64m,一共跑了64+8=72m 所以小狗要离主人90-72=18m

当涂县13445562456: 用C语言编一个小游戏,注明编码,(简单易懂的游戏,不要复杂) -
重爱烧伤: 我这有许多C的小游戏.给你一个基础的简单的汉诺塔程序.你看看:这是个汉诺塔程序,在调试的时候,输入的数字最好不要大于15,因为每大一个数 所得的结果的步骤都会多一倍.如果你有耐心等待结果的话除外.汉诺塔是在欧洲 流行的...

当涂县13445562456: c语言 简单猜数游戏 急 -
重爱烧伤: #include <stdio.h> #include<stdlib.h> #include <time.h> main() {int a,b,i=1;srand((unsigned)time(NULL));//产生随机数种子a=rand()%100+1;//产生随机数printf("\n\t------------------- 欢迎进入猜数游戏 -------------------\n\n");printf(" @游...

当涂县13445562456: c语言中怎么写打地鼠的游戏 -
重爱烧伤: 在一个二维数组中,存放标记. 设置难度:分:一次只显示一个 一次只显示二个 一次只显示三个 对应产生2*N个随机数,对应(x,y),设置为1,其它空的设置为0.大概的游戏流程循环: 结束条件: 打到M个停止. 1,产生随机数,且不相同 2,在对应的坐标中,画出地鼠, 在N秒内,没有击中,地鼠消失;击中,加分. (击中的坐标,要与用户点的坐标想比较即可,在这个范围就得分)

当涂县13445562456: 我在做导弹打飞机的C语言课设游戏,请问一下在TC下如何写一个碰撞判断函数啊?那个导弹是可以多方向的. -
重爱烧伤: 补充一个老一点的算法:设置弹道用一个三维数组来向函数传递导弹的位置,再用三个一维数组来确定目标物体,当三个值相等时,表示已经相撞了.请楼主试一试.

当涂县13445562456: C语言小游戏坦克大战发射子弹的问题 -
重爱烧伤: 捕获按键 判断按键是否为发射键 若是则改变子弹的坐标 给你写了个简单的你参考下 按z发射#include #include void gotoxy(int x, int y) //定位到第y行的第x列 {int xx=0x0b;HANDLE hOutput;COORD loc;loc.X = x;loc.Y=y;hOutput = ...

当涂县13445562456: 用c语言做一个石头剪刀布的游戏 -
重爱烧伤: 用1、2、3来表示剪刀、石头、布,然后先用scanf函数读取用户的输入,再用rand函数产生一个随机数,最后进行比较就可以了. #include #include #include void main() { int com,user; char c; srand((unsigned)time(NULL)); //初始化随机数,如...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网