反弹球 (反弹球又称作为)
反弹球 (反弹球又称作为)
主要就是代码用的函数和之前的很接近,都是要生成新的东西,感觉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的具体触发原因,修复无从下手
以上就是(反弹球 (反弹球又称作为))全部内容,收藏起来下次访问不迷路!