| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1099 人关注过本帖
标题:我用2天写的撞砖程序,呵呵呵呵呵
只看楼主 加入收藏
angelofwzh
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2008-1-9
收藏
 问题点数:0 回复次数:6 
我用2天写的撞砖程序,呵呵呵呵呵
#include <graphics.h>
#include <stdlib.h>
#include <dos.h>
#include <stdio.h>
#include <conio.h>
#include <time.h>


int broad_length=100;/*挡板长度*/
int mousebutton,mouseexist,mouseX,mouseY;/*鼠标状态*/
float setp=2;/*X的修正步长*/
int speed=6000;/*延时大小*/
int sum;/*弹球总数目*/
int score=0;/*总分*/
int qutoa=1000;/*奖励积分最高限额*/
int setp_qutoa=500;/*跃进积分*/

struct
{
   int x0;/*X坐标*/
 int y0; /*Y坐标*/
   int length; /*挡板长度*/
}broad[4];/*挡板结构体*/


typedef struct
{
int x;/*X坐标*/
int y;/*Y坐标*/
float state_a;/*线性函数y=ax+b中的A*/
float state_b;/*同上中的B*/
int r;/*半径*/
int speed_side;/*递增方向*/
int type;/*弹球类型*/
float respond;/*折射效率*/
struct ball *next;/*下接指针*/
}ball;/*弹球结构体*/



ball* balllist;/*ball的列表*/



void mouseload();/*鼠标的加载操作*/
void mousereset();/*鼠标活动区域限制*/
void mousesetX(int lx,int rx);/*设置鼠标X坐标*/
void mousesetY(int uy,int dy);/*设置鼠标Y坐标*/
void mousegetXY();/*获取当前鼠标坐标*/
void set_broad();/*设置调整挡板*/
void draw_broad();/*重画挡板操作*/
void countball();/*弹球总数更新*/
void initball();/*初始化弹球参数*/
void addball(int type);/*增加弹球,其中TYPE为类型参数-1为头指针,0为普通弹球,1为加速奖励,2为减速奖励,3为增大挡板长度奖励,4为减少挡板长度奖励,5为使球的数量翻倍奖励*/
void draw_ball();/*重绘弹球*/
void incrsespeed();/*增加球速*/
void decrsespeed();/*减少球速*/
void updatemouseset();/*更新鼠标范围大小*/
void incrsebroadlength();/*增加挡板长度*/
void decrsebroadlength();/*减少挡板长度*/
void doubleball();/*翻倍弹球数目*/
void computer_ball();/*计算弹球下一状态的位置*/
void delball(ball* b);/*删除弹球,其中B为弹球的指针*/
void check_over(ball* b);/*检查B弹球是否合乎反弹规则*/
void getrespondangle(ball* b);/*获取B弹球的折射角度*/
void transfrom_ball(int a,ball* b);/*线性函数的递增状态的改变(为A),其中B为该弹球的指针*/
void set_ball_xy(int x,int y,ball* b);/*设置B弹球的XY坐标*/
void chose();/*对到达边界的弹球进行判断看其是否合乎反弹规则*/
void countball();/*更新弹球数目*/
void printfscorse();/*打印右边的说明文档*/
void chosemark();/*选取适当的奖励标签*/
void check_qutoa();/*看其是否达到奖励积分边界*/


/*
mouseload();
鼠标的加载操作
mousereset();
鼠标活动区域限制
mousesetX(int lx,int rx);
设置鼠标X坐标
mousesetY(int uy,int dy);
设置鼠标Y坐标
mousegetXY();
获取当前鼠标的坐标值
以上的函数用于对鼠标的控制
*/




/*
(1)、功能00H

功能描述: 初始化鼠标,该操作只需要执行一次
入口参数: AX=00H
出口参数: AX=0000H——不支持鼠标功能,FFFFH——支持鼠标功能
BX=鼠标按钮个数(在支持鼠标功能时)
在支持鼠标功能的情况下,鼠标还被设置如下参数: 1、 鼠标指针放在屏幕中央
2、 如果当前鼠标指针是显示的,则操作后,鼠标指针被隐藏
3、 鼠标指针的显示页为0
4、 根据屏幕的显示模式显示鼠标指针:文本—反向显示矩形块,图形—尖头形状
5、 水平象素比=8:8,垂直象素比=16:8
6、 设置水平和垂直的显示边界为当前显示模式的最大边界
7、 允许光笔仿真
8、 双速门槛值=64
*/
void mouseload()
{
_AX=0x00;/*用于表示鼠标状态,此状态表明鼠标在激活中*/
geninterrupt(0x33);/*0x33是DOS中断,是在DOS下通过调用中断来对鼠标进行操作.*/
mouseexist=_AX;
mousebutton=_BX;
}



/*
(2)、功能01H

功能描述: 显示鼠标指针,通常在鼠标初始化后,用此功能显示其指针
入口参数: AX=01H
出口参数: 无
*/
void mousereset()
{
_AX=0x00;
geninterrupt(0x33);
}




/*
(8)、功能07H

功能描述: 设置鼠标水平边界
入口参数: AX=07H
CX=最小水平位置
DX=最大水平位置
出口参数: 无,鼠标有可能因新区域变小而自动移进新区域内
*/
void mousesetX(int lx,int rx)
{
_CX=lx;
_DX=rx;
_AX=0x07;
geninterrupt(0x33);
}



/*
(9)、功能08H

功能描述: 设置鼠标垂直边界
入口参数: AX=08H
CX=最小垂直位置
DX=最大垂直位置
出口参数: 无,鼠标有可能因新区域变小而自动移进新区域内
*/
void mousesetY(int uy,int dy)
{
_CX=uy;
_DX=dy;
_AX=0x08;
geninterrupt(0x33);
}



/*
(4)、功能03H

功能描述: 读取鼠标位置及其按钮状态
入口参数: AX=03H
出口参数: BX=按键状态: 位0=1——按下左键
位1=1——按下右键
位2=1——按下中键
其它位——保留,内部使用
CX=水平位置
DX=垂直位置
*/
void mousegetXY()
{
_AX=0x03;
geninterrupt(0x33);
mouseX=_CX;
mouseY=_DX;

}


/*
设置挡板初始位置
调整结构体的状态
*/
void set_broad()
{
broad[0].x0=10;
broad[0].y0=240;
broad[0].length=broad_length;

broad[1].x0=400;
broad[1].y0=240;
broad[1].length=broad_length;

broad[2].x0=220;
broad[2].y0=320;
broad[2].length=broad_length;

broad[3].x0=220;
broad[3].y0=10;
broad[3].length=broad_length;
}


/*
重写挡板
*/
void draw_broad()
{
/*读取鼠标坐标的状态进入挡板程序*/
broad[0].y0=mouseY;
broad[1].y0=mouseY;
broad[2].x0=mouseX;
broad[3].x0=mouseX;

/*line函数进行绘制直线*/
line(10,broad[0].y0,10,broad[0].y0+broad[0].length);
line(400,broad[1].y0,400,broad[1].y0+broad[1].length);
line(broad[2].x0,470,broad[2].x0+broad[2].length,470);
line(broad[3].x0,10,broad[3].x0+broad[3].length,10);

}


/*
计算现有的弹球数目
*/
void countball()
{
ball* b=balllist;
sum=0;
/*弹球链表的一次循环*/
while(b)
{
if(b->type==0) sum++;/*只计算弹球类型为普通的总数*/
b=b->next;
}

}



/*
初始化弹球链表程序
*/
void initball()
{
balllist=(ball*)malloc(sizeof(ball));

  balllist->type=-1;/*设置弹球类型为头指针*/
balllist->next=NULL;
sum=0;/*初始化总数数目*/
}


/*
增加弹球数目
其中type为:
-1头指针
0普通弹球
1为加速奖励
2为减速奖励
3为增大挡板长度奖励
4为减少挡板长度奖励
5为使球的数量翻倍奖励
*/
void addball(int type)
{

int a;
ball* x;
ball* L=(ball*)malloc(sizeof(ball));
ball* p=balllist;  

/*初始化新建弹球的状态*/
L->next=NULL;
L->respond=(float)(-1);
L->x=180;
L->y=205;
L->r=5;
L->type=type;

/*用random函数用来随机选取BOOL的值*/
L->speed_side=(int)random(2);

if(L->speed_side==0)
{
L->speed_side=-1;
}
else
{
L->speed_side=1;
}

if((int)random(2)==0)
{
a=-1;
}
else
{
a=1;
}

/*计算出y=ax+b中的A,B值*/
L->state_a=(float)random(1000000)/10000*((float)a);
L->state_b=(float)L->y-(float)L->x*L->state_a;


x=p;
p=p->next;
x->next=L;
L->next=p;

}






/*
重画弹球函数
*/
void draw_ball()
{
ball* p=balllist;
while(p)
{

/*对应每种类型重新确定绘制函数*/
if(p->type==0)
{
circle(p->x,p->y,p->r);
}

if(p->type==1)
{
 setfillstyle(1,4);
bar(p->x-p->r,p->y-p->r,p->x+p->r,p->y+p->r);
}


if(p->type==2)
{
 setfillstyle(1,2);
bar(p->x-p->r,p->y-p->r,p->x+p->r,p->y+p->r);
}




if(p->type==3)
{
 setfillstyle(1,4);
pieslice(p->x,p->y,0,360,p->r);
}


if(p->type==4)
{
 setfillstyle(1,2);
pieslice(p->x,p->y,0,360,p->r);
}


if(p->type==5)
{
setfillstyle(1,14);
pieslice(p->x,p->y,-180,0,p->r);
}



 p=p->next;
}

}



/*
速度的增加
speed越小表示越快
setp越大表示越快
*/
void incrsespeed()
{
setp=setp*4;
speed=speed/2;
}




/*
速度的减少
speed越大表示越慢
setp越小表示越慢
*/
void decrsespeed()
{
speed=16000;
setp=2;
}



/*
重新制定鼠标范围
*/
void updatemouseset()
{
/*计算相应的X,Y值*/
int rex=350-broad_length+50;
int rey=420-broad_length+50;
broad[0].length=broad_length;
broad[1].length=broad_length;
broad[2].length=broad_length;
broad[3].length=broad_length;

mousesetX(11,rex);
mousesetY(11,rey);
}



/*
增加挡板长度
*/
void incrsebroadlength()
{

/*限制挡板长度的最大值*/
if(broad_length==300)
return;
broad_length=broad_length+50;
 updatemouseset();
}



/*
减少挡板长度
*/
void decrsebroadlength()
{

/*限制挡板长度的最小值*/
if(broad_length==50)
return;
broad_length=broad_length-50;
 updatemouseset();
}



/*
弹球数量翻倍
*/
void doubleball()
{


int sum1,temp;
countball();
sum1=sum;
temp=0;

/*用于普通弹球的增加*/
while(temp<sum1)
{
addball(0);
temp++;
}
}




/*
计算弹球的下一状态的x位置
*/
void computer_ball()
{
ball* b=balllist;

while(b)
{

/*设置下一状态的x值,利用相应的y=ax+b来计算出y的值*/
b->x=b->x+b->speed_side*setp;
b->y=(int)((float)b->x*b->state_a+b->state_b);
b=b->next;
}

}




/*
弹球的删除,包括奖励性的弹球
*/
void delball(ball* b)
{

ball* list=balllist;
ball* post=b->next;
sum=0;

/*计算出要删除的弹球的指针值*/
while(list)
{
if(list->next==b) break;
list=list->next;
}


list->next=post;
free(b);

/*重新设置弹球的总数*/
while(list)
{
list=list->next;
sum++;
}

}




/*
检查是否超出边界
*/
void check_over(ball* b)
{

delball(b);
}






/*
计算折射角
*/
void getrespondangle(ball* b)
{

int x,y;
x=b->x;
y=b->y;

if(b->type==0)
{

if(x==11)
{

int temp;
float as;

/*计算出相应挡板的中心值*/
temp=(int)(broad[0].y0+broad[0].length/2);
as=(float)(temp-y);

if((int)as<0)
{
as=(float)(-1)*as;
}

/*计算出折射度*/
b->respond=(float)((float)random(200)/100)*(float)(-1);


}

if(x==395)
{

int temp;
float as;

temp=(int)(broad[1].y0+broad[1].length/2);

as=(float)(temp-y);

if((int)as<0)
{
as=(float)(-1)*as;
}



b->respond=(float)((float)random(200)/100)*(float)(-1);
}


if(y==11)
{
int temp;
float as;
temp=(int)(broad[3].x0+broad[3].length/2);
as=(float)(temp-x);

if((int)as<0)
{
as=(float)(-1)*as;
}




b->respond=(float)((float)random(200)/100)*(float)(-1);
}


if(y==465)
{
int temp;
float as;

temp=(int)(broad[2].x0+broad[2].length/2);
as=(float)(temp-x);

if((int)as<0)
{
as=(float)(-1)*as;
}





b->respond=(float)((float)random(200)/100)*(float)(-1);
}


/*防止折射度大于0*/
if(b->respond>0)
{
b->respond=(float)(-1)*b->respond;
}
}


/*对应每个奖励弹球的类型得到相应的处理措施*/
if(b->type==1)
{
incrsespeed();
delball(b);
}


if(b->type==2)
{
decrsespeed();
delball(b);
}


if(b->type==3)
{
incrsebroadlength();
updatemouseset();
delball(b);
}


if(b->type==4)
{
decrsebroadlength();
updatemouseset();
delball(b);
}


if(b->type==5)
{
doubleball();
delball(b);
}
}




/*
用于计算弹球碰到挡板时的处理
*/
void transfrom_ball(int a,ball* b)
{
score=score+100;
getrespondangle(b);

/*重新获取y=ax+b的a,b值*/
b->state_a=(float)((b->respond)*(float)(b->state_a));
b->speed_side=(int)(b->speed_side*a);
b->state_b=(float)b->y-(float)b->x*b->state_a;
}






/*
设置相应弹球的位置坐标
*/
void set_ball_xy(int x,int y,ball* b)
{
b->x=x;
b->y=y;
}





/*
计算出弹球设置反弹法则
*/
void chose()
{


ball* list=balllist;
while(list)
{
int x,y;
x=list->x;
y=list->y;


if(x<11)
{

/*计算是否击中挡板*/
int temp0=broad[0].y0+broad[0].length/2;
if(abs(y-temp0)>broad[0].length/2)
{check_over(list);}

set_ball_xy(11,y,list);
transfrom_ball(-1,list);
}

if(x>395)
{
int temp1=broad[1].y0+broad[1].length/2;
if(abs(y-temp1)>broad[1].length/2)
 {check_over(list);}

set_ball_xy(395,y,list);
transfrom_ball(-1,list);

}


if(y<11)
{
int temp3=broad[3].x0+broad[3].length/2;
if(abs(x-temp3)>broad[3].length/2)
 {check_over(list);}

set_ball_xy(x,11,list);

transfrom_ball(1,list);
}


if(y>465)
{

int temp2=broad[2].x0+broad[2].length/2;
if(abs(x-temp2)>broad[2].length/2)
{check_over(list);}

set_ball_xy(x,465,list);
transfrom_ball(1,list);

}



list=list->next;
}

}








/*
打印右边的积分项目
*/
void printfscorse()
{
  char score_ch[20];   
char *text="Scroce:";  

/*转换函数,由数字直接转换为字符*/
itoa(score,   score_ch,   10);   
outtextxy(430, 100, text);
 outtextxy(540, 100, score_ch);


text="Speed:";
itoa(speed,   score_ch,   10);   
outtextxy(430, 120, text);
 outtextxy(540, 120, score_ch);



text="Broad length:";
itoa(broad_length,   score_ch,   10);   
outtextxy(430, 140, text);
 outtextxy(540, 140, score_ch);


text="Total balls:";
itoa(sum,   score_ch,   10);   
outtextxy(430, 160, text);
 outtextxy(540, 160, score_ch);



rectangle(410, 90, 610, 180);



text="Award mark:";
outtextxy(430, 220, text);

 
setfillstyle(1,4);
bar(425,240,435,250);
text="Speed accelerate";
outtextxy(460, 240, text);



setfillstyle(1,2);
bar(425,270,435,280);
text="Speed slowdown";
outtextxy(460, 270, text);



setfillstyle(1,4);
pieslice(430,305,0,360,10);
text="Broad lengthened";
outtextxy(460, 305, text);



setfillstyle(1,2);
pieslice(430,340,0,360,10);
text="Broad shortening";
outtextxy(460, 340, text);



setfillstyle(1,14);
pieslice(430,375,-180,0,10);
text="Ball number double";
outtextxy(460, 375, text);



rectangle(410, 200, 610, 400);





}





/*
选择奖励球
*/
void chosemark()
{
int index;
index=random(5)+1;
if(index==1) addball(1);
if(index==2) addball(2);
if(index==3) addball(3);
if(index==4) addball(4);
if(index==5) addball(5);
}




/*
检查是否到达奖励积分
*/
void check_qutoa()
{

/*到达积分就实行增加积分限额*/
if(score>=qutoa)
{
chosemark();
qutoa=qutoa+setp_qutoa;
}

}





main()
{

int gdrive=DETECT,gmode;
 registerbgidriver(EGAVGA_driver);

  initgraph(&gdrive,&gmode,"");
  cleardevice();
set_broad();
mouseload();
mousereset();
updatemouseset();
initball();
addball(0);
cleardevice();
while(1)
{
  cleardevice();
draw_ball();
countball();
if(sum==0) exit(0);
chose();
computer_ball();
mousegetXY();
draw_broad();
printfscorse();
check_qutoa();
delay(speed);
}

 closegraph();


}
搜索更多相关主题的帖子: 挡板 坐标 include speed 
2008-01-09 16:15
NO.Tomato
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2008-1-5
收藏
得分:0 
该程序的作用是啥?
大家说说!!

Let's do it now.
2008-01-09 16:18
cdmalcl
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:24
帖 子:4091
专家分:524
注 册:2005-9-23
收藏
得分:0 
不错 挺有意思
因为最近时间太紧没有细看
你的清屏方法是不是间断性的整体清屏啊
这样效率很低啊
再添加点游戏菜单功能就更好了

LZ有空可以把游戏改到WIN环境下
现在TC淘汰了 没必要在这浪费时间了
2008-01-09 17:21
雨中飞燕
Rank: 3Rank: 3
等 级:禁止访问
威 望:8
帖 子:2200
专家分:0
注 册:2007-8-9
收藏
得分:0 
同上,偶的机子还不怎么支持DOS程序
建议研究GDI,研究GDI都比研究DOS图形有意义
2008-01-09 17:54
xianshizhe111
Rank: 1
等 级:新手上路
帖 子:1451
专家分:0
注 册:2007-12-8
收藏
得分:0 
有个建立独立图形的地方还得注释一下
如不注释 就得在 TC 目录下设置一下
随然没太懂但两天时间也不易
挺大的
2008-01-09 17:58
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
收藏
得分:0 
很强啊.看得懂,但是让我自己写很困难啊.用tc2.0编译帮助文件没法看啊.不支持汉字.
2008-01-09 19:00
yushiguangze
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2008-1-9
收藏
得分:0 
听牛的啊
2008-01-09 23:11
快速回复:我用2天写的撞砖程序,呵呵呵呵呵
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.023178 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved