当前位置:首页 > 阅读 > 

反弹球 (反弹球又称作为)

反弹球 (反弹球又称作为)

反弹球 (反弹球又称作为)

主要就是代码用的函数和之前的很接近,都是要生成新的东西,感觉Pummel Party把这些小游戏放一起也是有道理的:

//头文件

#include iostream

#include cstdlib

#include ctime

#include ctype.h

#include vector

#include math.h

#include iomanip

#include graphics.h

#include conio.h

#include windows.h

#include fstream

#include string

using namespace std;

struct Node

{

int lifenum;

double posx,posy;

double vx,vy;

};

Node box[21];

double pi=3.141592653;

clock_t t1,t2,t3,t4;

int fy,fx,L,W;

int exit1;

int seed1;

double speed1,speed2;

void initialization()

{

initgraph(400,400);

setbkcolor(WHITE);

cleardevice();

fy=200;

fx=200;

L=20;

W=40;

seed1=10;

exit1=0;

speed1=5;

int i;

for(i=0;i=20;i++){

box[i].lifenum=0;

}

}

void creact()

{

int i,j,k;

for(i=0;i=20;i++){

if(box[i].lifenum==0){

box[i].lifenum=1;

box[i].posx=200;

box[i].posy=200;

box[i].vx=speed1*(fx-box[i].posx)/sqrt((fx-box[i].posx)*(fx-box[i].posx)+(fy-box[i].posy)*(fy-box[i].posy));

box[i].vy=speed1*(fy-box[i].posy)/sqrt((fx-box[i].posx)*(fx-box[i].posx)+(fy-box[i].posy)*(fy-box[i].posy));

while(box[i].vx==0||box[i].vy==0){

seed1++;

srand(seed1);

box[i].vx=rand()%7-3;

seed1++;

srand(seed1);

box[i].vy=rand()%7-3;

}

break;

}

}

}

void destroy(){

int i,j=0;

double k;

for(i=0;i=20;i++){

if(box[i].lifenum==1){

if((box[i].posx10+Lbox[i].posx0)||(box[i].posx400-Lbox[i].posx400)){

if(fy-W=box[i].posyfy+W=box[i].posy){

if(box[i].posx10+L)box[i].posx=10+L;

else if(box[i].posx400-L)box[i].posx=400-L;

box[i].vx=-box[i].vx;

box[i].vy=box[i].vy;

}

}

else if((box[i].posy10+Lbox[i].posy0)||(box[i].posy400-Lbox[i].posy400)){

if(fx-W=box[i].posxfx+W=box[i].posx){

if(box[i].posy10+L)box[i].posy=10+L;

else if(box[i].posy400-L)box[i].posy=400-L;

box[i].vx=box[i].vx;

box[i].vy=-box[i].vy;

}

}

if(box[i].posx=0||box[i].posy=0||box[i].posy=400||box[i].posx=400){

box[i].lifenum=0;

}

}

}

j=0;

for(i=0;i=20;i++){

if(box[i].lifenum==1){

j++;

}

}

if(j==0){

exit1=1;

}

}

void move(){

int i;

double k;

char j;

t1=clock();

t2=clock();

t3=clock();

t4=clock();

setfillcolor(BLACK);

BeginBatchDraw();

creact();

while(exit1==0){

FlushBatchDraw();

cleardevice();

t4=clock();

if(t4-t3=10){

t3=clock();

for(i=0;i=20;i++){

if(box[i].lifenum==1){

box[i].posx+=0.2*box[i].vx;

box[i].posy+=0.2*box[i].vy;

}

}

}

for(i=0;i=20;i++){

if(box[i].lifenum==1){

fillcircle(box[i].posx,box[i].posy,10);

}

}

fillcircle(200,200,3);

solidrectangle(fx-W,0,fx+W,L);

solidrectangle(fx-W,400-L,fx+W,400);

solidrectangle(0,fy-W,L,fy+W);

solidrectangle(400-L,fy-W,400,fy+W);

destroy();

if (_kbhit()){

j=_getch();

switch(j){

case w:fy-=20;if(fy0){fy+=20;}break;

case d:fx+=20;if(fy0){fx-=20;}break;

case s:fy+=20;if(fy400){fy-=20;}break;

case a:fx-=20;if(fy400){fx+=20;}break;

default:break;

}

}

t2=clock();

if(t2-t1=10000){

t1=clock();

creact();

}

}

EndBatchDraw();

}

void carry()

{

initialization();

_getch();

move();

_getch();

closegraph();

}

int main()

{

carry();

return 0;

}

最后是演示gif图,我测试这个游戏,可能是有bug的,如果是球沿屏幕正对角线射入可能会直接穿过挡板,我不是很确定,因为这个情况很稀少,即使出现了也不是百分百有问题(因为看着像但不一定就是正对角线):

不知道bug的具体触发原因,修复无从下手

以上就是(反弹球 (反弹球又称作为))全部内容,收藏起来下次访问不迷路!