荔园在线
荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀
[回到开始]
[上一篇][下一篇]
发信人: noid (奥运在北京), 信区: Program
标 题: Re: 想用tc做个泡泡龙的程序,有什么好建议?
发信站: 荔园晨风BBS站 (Tue Dec 18 18:40:08 2001), 转信
源程序已经初步写出来了....还很不完善,
#include "graphics.h"
#include "stdlib.h"
#include "bios.h"
#include "math.h"
#define CENX 320
#define CENY 460
#define BL 10
#define BR 630
#define SIZE 20
#define BCLR 0
#define ASPD 3
#define TYPE 6
#define MAXSPD 600
#define ADDSPD 1
#define MINSPD 100
int pos[(BR-BL)/(SIZE*2)+2][CENY/SIZE],clr[TYPE+1],over=0,speed=MAXSPD;
int pmx=(BR-BL)/(SIZE*2)+2,pmy=CENY/SIZE,cc,pp,ppx[25],ppy[25];
long score=0;
double ang=90;
void draw();
void move(int);
void setoff();
void pd(int,int);
void xl(int,int,int);
int pox(int,int);
int poy(int,int);
int tx(int,int);
int ty(int,int);
main()
{
int gd,gm,i=1,j=1,k;
char key;
gd=DETECT;
randomize();
registerbgidriver(EGAVGA_driver);/*如果提示这句出错就删了它吧*/
initgraph(&gd,&gm,"");
setbkcolor(BCLR);
do{
if(j==BCLR||j==6) j++;
clr[i]=j;
i++;
j++;
}while(i<=TYPE);
for(i=0;i<pmx;i++)
for(j=0;j<pmy;j++)
pos[i][j]=0;
cc=random(TYPE)+1;
draw();
while(!over){
do{
k=getch();
move(k);
}while(k!=' ');
setoff();
draw();
}
printf(" GAME OVER!!!,press 0 to quit!");
while(getch()!='0');
}
void draw()
{
int i,j;
setcolor(14);
line(BL-2,0,BL-2,CENY);
line(BL-2,CENY,BR+2,CENY);
line(BR+2,CENY,BR+2,0);
line(BL-2,0,BR+2,0);
setcolor(clr[cc]);
line(CENX,CENY,
CENX+cos(ang*3.1416/180)*3*SIZE,
CENY-sin(ang*3.1416/180)*3*SIZE);
for(i=0;i<pmx;i++)
for(j=0;j<pmy;j++)
if(pos[i][j]){
setcolor(clr[pos[i][j]]);
circle(tx(i,j),ty(i,j),SIZE);
}
}
void move(int key)
{
if(key==75){
setcolor(0);
line(CENX,CENY,
CENX+cos(ang*3.1416/180)*3*SIZE,
CENY-sin(ang*3.1416/180)*3*SIZE);
ang=ang+1;
if(ang>178) ang=178;
setcolor(clr[cc]);
line(CENX,CENY,
CENX+cos(ang*3.1416/180)*3*SIZE,
CENY-sin(ang*3.1416/180)*3*SIZE);
}
if(key==77){
setcolor(0);
line(CENX,CENY,
CENX+cos(ang*3.1416/180)*3*SIZE,
CENY-sin(ang*3.1416/180)*3*SIZE);
ang=ang-1;
if(ang<2) ang=2;
setcolor(clr[cc]);
line(CENX,CENY,
CENX+cos(ang*3.1416/180)*3*SIZE,
CENY-sin(ang*3.1416/180)*3*SIZE);
}
}
void setoff()
{
int xx,yy,c,fx=1,fy=1,bx,by,i,q,w;
double ta;
ta=ang;
bx=CENX;
by=CENY;
c=cc;
cc=random(TYPE)+1;
draw();
i=4*SIZE;
i=4*SIZE;
for(;;){
xx=bx+(cos(ta*3.1416/180)*i);
yy=by-(sin(ta*3.1416/180)*i);
if(bioskey(1)!=''){
if(bioskey(1)==19200) move(75);
else if(bioskey(1)==19712) move(77);
bioskey(0);
}
fx=pox(xx,yy);
fy=poy(xx,yy);
if(yy-SIZE<=1){
pos[fx][fy]=c;
setcolor(clr[c]);
circle(tx(fx,fy),ty(fx,fy),SIZE);
pd(fx,fy);
return;
}
for(q=-1;q<2;q++)
for(w=-1;w<2;w++){
if(fx+q<0||fy+w<0) continue;
if(((tx(q+fx,w+fy)-xx)*(tx(q+fx,w+fy)-xx)+
(ty(q+fx,w+fy)-yy)*(ty(q+fx,w+fy)-yy)<
(SIZE-1)*(SIZE-1)*4)&&pos[q+fx][w+fy]){
pos[fx][fy]=c;
setcolor(clr[c]);
circle(tx(fx,fy),ty(fx,fy),SIZE);
if(ty(fx,fy)+5*SIZE>=CENY) over=1;
else pd(fx,fy);
return;
}
}
if(xx+SIZE>=BR&&i>10){
ta=180-ta;
bx=xx;by=yy;
i=1;
}
else{
if((xx-SIZE)<=BL&&i>10){
ta=180-ta;
bx=xx;by=yy;
i=1;
}
}
setcolor(clr[c]);
circle(xx,yy,SIZE);
delay(speed);
setcolor(0);
circle(xx,yy,SIZE);
i=i+2;
}
}
void pd(int x,int y)
{
int i,j;
pp=1;
ppx[0]=x;
ppy[0]=y;
xl(x,y,pos[x][y]);
if(pp>=3){
delay(8000);
for(i=0;i<pp;i++){
pos[ppx[i]][ppy[i]]=0;
setcolor(0);
circle(tx(ppx[i],ppy[i]),ty(ppx[i],ppy[i]),SIZE);
}
for(i=0;i<pmx;i++)
for(j=1;j<pmy;j++){
pos[i][j]=pos[i][j]*(-1);
}
for(i=0;i<pmx;i++) if(pos[i][0]!=0) xl(i,0,0);
for(i=0;i<pmx;i++)
for(j=1;j<pmy;j++){
if(pos[i][j]<0){
delay(3500);
pos[i][j]=0;
setcolor(0);
circle(tx(i,j),ty(i,j),SIZE);
}
}
}
}
void xl(int x,int y,int c)
{
int i,j,xx,yy,k;
for(i=-1;i<=1;i++)
for(j=-1;j<=1;j++){
if(y%2&&j&&i==-1) continue;
if((!y%2)&&j&&i==1) continue;
if(!(i||j)) continue;
xx=x+i;
yy=y+j;
if(xx<0||yy<0) continue;
if(c!=0){
if(pos[xx][yy]==c){
for(k=0;k<pp;k++)
if(xx==ppx[k]&&yy==ppy[k])
break;
if(k==pp){
ppx[pp]=xx;
ppy[pp]=yy;
pp++;
xl(xx,yy,c);
}
}
}
else{
if(pos[xx][yy]<0){
pos[xx][yy]=pos[xx][yy]*(-1);
xl(xx,yy,0);
}
}
}
}
int pox(int x,int y)
{
if(poy(x,y)%2) return (int)((x-SIZE-BL)/(2*SIZE));
return (int)((x-BL)/(2*SIZE));
}
int poy(int x,int y)
{
return (int)((y-SIZE)/(1.8*SIZE)+0.5);
}
int tx(int x,int y)
{
if(y%2) return (x+1)*SIZE*2+BL;
return x*SIZE*2+SIZE+BL;
}
int ty(int x,int y)
{
return SIZE+y*SIZE*1.8;
}
【 在 WinXP (winxp) 的大作中提到: 】
: 源程序写出来共享,呵呵,不胜感激
: 【 在 noid (奥运在北京) 的大作中提到: 】
: : 用什么方法实现比较好?大家说说自己的想法吧..
--
※ 修改:·noid 於 Dec 18 19:43:13 修改本文·[FROM: 192.168.32.243]
※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.32.243]
[回到开始]
[上一篇][下一篇]
荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店