我用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();
}