| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 757 人关注过本帖
标题:如何打中运动的气球,求解决
只看楼主 加入收藏
流年未知
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2012-12-23
结帖率:66.67%
收藏
已结贴  问题点数:20 回复次数:5 
如何打中运动的气球,求解决
气球与发射物均在运动,怎样才能实现气球被打中的效果?
搜索更多相关主题的帖子: 运动 气球 如何 
2012-12-23 16:08
yaobao
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:4
帖 子:1854
专家分:4121
注 册:2012-10-25
收藏
得分:20 
这是C的问题??冒失是物理的吧,我看是要考虑提前量

认认真真的学习,踏踏实实的走路:戒骄戒躁!!!
2012-12-23 16:11
流年未知
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2012-12-23
收藏
得分:0 
#include "graphics.h"
#include "stdio.h"
#include "math.h"
#include "conio.h"
#include<time.h>
//操作提醒函数
void remind()
{
    setbkcolor(GREEN);
    setbkmode(TRANSPARENT);
    setfont(50,0, _T("宋体"));
    setcolor(BLUE);
    outtextxy(500, 100, _T("*     向左移-----A"));
    outtextxy(500, 170, _T("*     向右移-----D"));
    outtextxy(450, 240, _T("*增 加 发射角度-----W"));
    outtextxy(450, 310, _T("*缩 小 发射角度-----S"));
    outtextxy(460, 380, _T("*   发 射 炮 弹------J"));
    setcolor(RED);
    outtextxy(480, 450, _T("*  退出游戏------E"));
}

//小人函数
void man(int x,int y){
    int r=10;
    y=y+5;
    x=x-15;
    setcolor(BLACK);
    circle(x,y,r);
    line(x,y+8,x,y+25);
    line(x,y+8,x+10,y+22);
    line(x,y+8,x-10,y+22);
    line(x,y+25,x+13,y+50);
    line(x,y+25,x-13,y+50);
}
//背景函数
void background(){
    float H=190;
    float S=1;
    float L=0.7f;
    for(int j=0;j<730;j++)
    {
        L+=0.0008f;
        H+=50;
        setcolor(HSLtoRGB(H,S,L));
        line(0,j,1366,j);
    }
    setfillstyle(BROWN);
    bar(0,730,1366,768);
    bar(145,700,170,730);
/*
for(j=580;j>-10;j--)
{
setcolor(WHITE);
setfillstyle(RED);
cleardevice();
fillellipse(1000,j,28,32);
//circle(100,j,30);
line(100,j+30,100,j+70);
//floodfill(100, j,WHITE);
delay(2);
}*/
}
//目标物函数
void goalbar(int x){
    setfillstyle(RED);
    setcolor(WHITE);
    fillellipse(1000,300,28,32);
    /*setfillstyle(BLACK);
    circle(x,710,30);*/
}
//小球函数
void ball(int x,int y){
    int r1=8;
    int r2=8;
    setcolor(BLACK);
    setfillstyle(BLACK);
    fillellipse(x,y,r1,r2);
}
//计分函数
void score(int x){
    char s[10];
    setbkmode(TRANSPARENT);
    setfont(50,0, _T("微软雅黑"));
    outtextxy(500, 20,_T("SCORE:"));
    sprintf(s, "%d", x);
    outtextrect(650,20,800,100,s);
}
//次数函数
void life(int x){
    char s[5];
    setbkmode(TRANSPARENT);
    setfont(50,0, _T("微软雅黑"));
    outtextxy(530,70,_T("LIFE:"));
    sprintf(s, "%d", x);
    outtextrect(630,70,800,100,s);
}
//打印“great”函数
void great(int x){
    setbkmode(TRANSPARENT);   
    setfont(70,0, _T("微软雅黑"));
    setcolor(RED);
    outtextxy(x-80, 400, _T("Great!"));

}
//打印未打中字样函数
void lose(int x,int anyx){
    if(x==0){
        setbkmode(TRANSPARENT);   
        setfont(60,0, _T("微软雅黑"));
        setcolor(BLUE);
        outtextxy(anyx-80, 500, _T("Oh! No!"));
    }
    if(x==1){
        setbkmode(TRANSPARENT);   
        setfont(60,0, _T("微软雅黑"));
        setcolor(BLUE);
        outtextxy(anyx-80, 500, _T("Hi! Boy!"));
    }
}
void Balloon(){
    int j;

    /*for(j=580;j>10;j--){BeginBatchDraw();
    setfillstyle(MAGENTA);
    setcolor(WHITE);
    cleardevice();
    circle(100,j,30);   
    floodfill(100, j,WHITE);
    delay(2);
    //fillellipse(1050,j,28,32);
    }
 EndBatchDraw();*/
}
void Zhujm(int startx,int starty,int realx,int realy,int anyx,int s,int l){
    BeginBatchDraw();
    background();
    Balloon();
    ball(startx,starty);
    man(realx,realy);
    setcolor(BLACK);
    line(startx,starty,realx,realy);
    goalbar(anyx);
    score(s);
    life(l);
    EndBatchDraw();
}
void countl(double i,int *x,int y,double sin,double cos,int startx,int starty,int realx,int realy,int anyx,int s,int l){

    for (i=0;;i=i+0.10){
    *x=(int)ceil(startx+220*cos*(i+1));
    y=(int)ceil(starty-(220*sin*(i+1)-25*(i+1)*(i+1)/2));
    if(*x>=1000)break;
    BeginBatchDraw();
    background();
    Balloon();
    ball(*x,y);
    man(realx,realy);
    goalbar(anyx);
    score(s);
    life(l);
    EndBatchDraw();
    delay(0);
    }
}
int main(){
    setinitmode(INIT_NOBORDER);
    char a,k[10];
    int x,y,startx,starty,rr,realx,realy,anyx,s,l;
    double i,cos,sin;
    s=0;
    l=10;
    realx=50;  
    realy=475;
    startx=realx+30;
    starty=realy-30;
   
    initgraph(1366,768);
    //delay(1000);title();delay(1500);
    cleardevice();        
    delay(800);
    remind();
    while(!kbhit())
    {
    //setfont(50,0, _T("微软雅黑"));
    setcolor(RED);
    outtextxy(500, 600, _T("按任意键开始游戏"));
    delay(200);
    setfillstyle(GREEN);
    bar(500,600,900,650);
    delay(200);
    }
    a=getch();

    //游戏界面
    while(l!=0){
        anyx=180+random(1000);
        Zhujm(startx,starty,realx,realy,anyx,s,l);

        rr=(startx-realx)*(startx-realx)+(starty-realy)*(starty-realy);
        
        a=getch();
        while(a!='e'){
            while(a!='k'){
                //按键控制
                //BeginBatchDraw();
                if(realy>=265&&realy<=680&&a=='w'){
                    realy=realy-3;
                    starty=starty-3;
                    Zhujm(startx,starty,realx,realy,anyx,s,l);                    

                }
                if(realy>=262&&realy<=677&&(a=='s')){
                    realy=realy+3;
                    starty=starty+3;
                    Zhujm(startx,starty,realx,realy,anyx,s,l);

                }
                if(startx>=(realx+30)&&startx<=(realx+42)&&(a=='a')){
                    startx=startx-1;
                    starty=int(realy-sqrt(rr-(startx-realx)*(startx-realx)));
                    Zhujm(startx,starty,realx,realy,anyx,s,l);
            
                }
                if(startx>=(realx+29)&&startx<=(realx+41)&&(a=='d')){
                    startx=startx+1;
                    starty=int(realy-sqrt(rr-(startx-realx)*(startx-realx)));
                    Zhujm(startx,starty,realx,realy,anyx,s,l);

                }
                a=getch();
                if(a=='e')break;
                //EndBatchDraw();
            }
            if(a=='e')break;
            sin=(realy-starty)/sqrt(rr);
            cos=(startx-realx)/sqrt(rr);
            //小球运行
           countl(i,&x,y,sin,cos,startx,starty,realx,realy,anyx,s,l);
                /*if(x>=(anyx-13)&&x<=(anyx+33)){
                    Zhujm(startx,starty,realx,realy,anyx,s,l);
                    great(x);
                    for(i=10;i<35;i=i+2){
                        setcolor(RED);
                        setfillstyle(RED);
                        fillellipse(x,720,(int)i,(int)i);
                        delay(0);   
                    }
                    delay(1000);
                    if(s%100==0&&s!=0)
                        l=l+1;
                    s=s+50;
                    anyx=180+random(1000);
                    Zhujm(startx,starty,realx,realy,anyx,s,l);

                }*/
                if(y>=200&&y<=1000){
                    
                    Zhujm(startx,starty,realx,realy,anyx,s,l);
                    great(y);
                    for(i=10;i<35;i=i+2){
                        setcolor(RED);
                        setfillstyle(RED);
                        fillellipse(y,720,(int)i,(int)i);
                        delay(10);   
                    }
                    delay(1000);
                    if(s%100==0&&s!=0)
                        l=l+1;
                    s=s+50;
                    //anyx=180+random(1000);
                    Zhujm(startx,starty,realx,realy,anyx,s,l);

                }
                //未命中目标
                else {
                     lose(random(2),x);

                    delay(1000);
                    l=l-1;
                    Zhujm(startx,starty,realx,realy,anyx,s,l);

                }
            //}
            //判断是否结束
            if(l==0){
                background();
                setfont(350,0, _T("微软雅黑"));
                 setcolor(RED);
                sprintf(k, "%d", s);
                outtextxy(460,200,k);
                setfont(50,0, _T("微软雅黑"));
                setcolor(BLUE);
                outtextxy(560, 550, _T("按任意键继续"));
                outtextxy(560, 600, _T(" 按 E 键退出"));
                l=10;
                s=0;
                a=getch();
                break;
            }
            else a=getch();
    }
    if(a=='e')break;
}
    closegraph();          // 关闭图形界面
    return 0;
}



怎样才能打中气球?才注册的账号,请见谅
2012-12-23 16:18
yaobao
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:4
帖 子:1854
专家分:4121
注 册:2012-10-25
收藏
得分:0 
吓死我了,好长啊。。。飘过吧

认认真真的学习,踏踏实实的走路:戒骄戒躁!!!
2012-12-23 16:22
lupeifeng123
Rank: 2
等 级:论坛游民
帖 子:74
专家分:47
注 册:2012-12-13
收藏
得分:0 
期待解决。。。。。

一步一个脚印,贵在坚持。
2012-12-23 16:41
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
关键是求两个质点的运动轨迹,两个都是直线,很好算的,弄出运动方程(x,y,t),坐标点接近到一定程度就算是碰撞——不要用精确等,这是浮点数。

授人以渔,不授人以鱼。
2012-12-23 17:31
快速回复:如何打中运动的气球,求解决
数据加载中...
 
   



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

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