网页
资讯
视频
图片
知道
文库
贴吧
地图
采购
进入贴吧
全吧搜索
吧内搜索
搜贴
搜人
进吧
搜标签
日
一
二
三
四
五
六
签到排名:今日本吧第
个签到,
本吧因你更精彩,明天继续来努力!
本吧签到人数:0
一键签到
成为超级会员,使用一键签到
一键签到
本月漏签
0
次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行
补签
。
连续签到:
天 累计签到:
天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
04月18日
漏签
0
天
easyx吧
关注:
10,878
贴子:
46,618
看贴
图片
吧主推荐
游戏
1
2
下一页
尾页
16
回复贴,共
2
页
,跳到
页
确定
<<返回easyx吧
>0< 加载中...
求教高手!一个改编的程序运行不正常
只看楼主
收藏
回复
店小二nse
二年级
5
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
改编自这个程序:
http://tieba.baidu.com/p/1194742256
问题是:为什么当rc0<1时只能运行一个循环???????????我自己改了好久都没成功,希望各位高手帮帮忙,说一下哪里错了,代码见2楼。
店小二nse
二年级
5
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
//为什么当rc0<1时只能运行一个循环???????????
//模拟简易屏保程序(椭圆),由圆改编
#include<iostream>
#include<graphics.h>
#include<windows.h> //EasyX已包含,不包含也行
using namespace std;
int j(int r); //绝对值函数
int j(int r) //绝对值函数,保证r>0
{
if(r>0)return r;
else return -r;
}
int main(void)
{
int count,x,y,xm,ym,xc,yc,ms;
double rbm,ram,rmin,rc0,rc,ra,rb;
//以下想x至ms为赋值区域,所有与长度有关的常量单位都是取决于分辨率
//rmin,xc,yc,rc等常量可取负值外,其余量取非负整数,否则或多或少会影响程序运行
count=3; //0<=count<=3,设定初始方向(与xc、yc正负相关)与判定撞击边缘位置以及弹回方向的常量
x=500; //初始横坐标 rm<=x<=xm-r
y=300; //初始纵坐标 rm<=y<=ym-r
rbm=50; //最大短半径
ram=100; //最大长半径
rmin=0.5; //最小半径与最大半径的比值
xm=1002; //x最大值
ym=602; //y最大值
xc=8; //x变化率,为零时纵向
yc=2; //y变化率,为零时横向
rc0=0.8; //半径r变化率(0<rc<=1) ra*=rc,rb*=rc
ra=ram;
rb=rbm; //初始长、短半径为最大长、短半径
rc=rc0;
ms=20; //单位(毫秒),用来控制变化快慢
initgraph(xm,ym);
setcolor(RED);
for(int i=0;;i++)
{
if(count==0)
{
for(;y+j(rb)<=ym&&x+j(ra)<=xm&&x>=ra&&y>=rb;x+=xc,y+=yc,ra*=rc,rb*=rc) //向右下
{
cleardevice();
ellipse(x-ra,y-rb,x+ra,y+rb);
Sleep(ms);
if(ra<ram*rmin){
ra=ra/rc;
rb=rb/rc;
rc=1/rc;
}
if(ra>ram){
ra*=rc;
rb*=rc;
rc=rc0;
}
}
if(ym-y-rb>xm-x-ra){count=3;x=xm-ra;} //撞右壁,向左下
if(ym-y-rb<xm-x-ra){count=1;y=ym-rb;} //撞下壁,向右上
if(ym-y-rb==xm-x-ra){count=2;x=xm-ra;y=ym-rb;} //撞右下角,向左上
}
if(count==1)
{
for(;y+j(rb)<=ym&&x+j(ra)<=xm&&x>=ra&&y>=rb;x+=xc,y-=yc,ra*=rc,rb*=rc) //向右上
{
cleardevice();
ellipse(x-ra,y-rb,x+ra,y+rb);
Sleep(ms);
if(ra<ram*rmin){
店小二nse
二年级
5
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
ra=ra/rc;
rb=rb/rc;
rc=1/rc;
}
if(ra>ram){
ra*=rc;
rb*=rc;
rc=rc0;
}
}
if(y-rb>xm-x-ra){count=2;x=xm-ra;} //撞右壁,向左上
if(y-rb<xm-x-ra){count=0;y=rb;} //撞上壁,向右下
if(y-rb==xm-x-ra){count=3;y=rb;x=xm-ra;} //撞右上角,向左下
}
if(count==2)
{
for(;y+j(rb)<=ym&&x+j(ra)<=xm&&x>=ra&&y>=rb;x-=xc,y-=yc,ra*=rc,rb*=rc) //向左上
{
cleardevice();
ellipse(x-ra,y-rb,x+ra,y+rb);
Sleep(ms);
if(ra<ram*rmin){
ra=ra/rc;
rb=rb/rc;
rc=1/rc;
}
if(ra>ram){
ra*=rc;
rb*=rc;
rc=rc0;
}
}
if(y-rb>x-ra){count=1;x=ra;} //撞左壁,向右上
if(y-rb<x-ra){count=3;y=rb;} //撞上壁,向左下
if(y-rb==x-ra){count=0;x=ra;y=rb;} //撞左上角,向右下
}
if(count==3)
{
for(;y+j(rb)<=ym&&x+j(ra)<=xm&&x>=ra&&y>=rb;x-=xc,y+=yc,ra*=rc,rb*=rc) //向左下
{
cleardevice();
ellipse(x-ra,y-rb,x+ra,y+rb);
Sleep(ms);
if(ra<ram*rmin){
ra=ra/rc;
rb=rb/rc;
rc=1/rc;
}
if(ra>ram){
ra*=rc;
rb*=rc;
rc=rc0;
}
}
if(x-ra>ym-y-rb){count=2;y=ym-rb;} //撞下壁,向左上
if(x-ra<ym-y-rb){count=0;x=ra;} //撞左壁,向右下
if(x-ra==ym-y-rb){count=1;x=ra;y=ym-rb;} //撞左下角,向右上
}
}
// getchar(); //防止程序运行后因编程工具立即终止习惯加的语句
return 0;
}
yangw80
初三年级
12
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
我试过你另一帖子中写的代码没问题,是不是已经解决了?
yangw80
初三年级
12
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
我说的是这个:
http://tieba.baidu.com/p/1194742256
店小二nse
二年级
5
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
还是没找出来哪里错了……
yangw80
初三年级
12
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
你另一个帖子不是可以运行了吗?
店小二nse
二年级
5
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
但这个我运行几次了,都是只要椭圆会变就只能运行第一个循环,然后就不动了,我一直找不出来哪儿不对
yangw80
初三年级
12
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
你的另一个程序,圆一边改变大小,一边移动,这不就是你要的效果吗?
店小二nse
二年级
5
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
对啊,但是椭圆一边变幻一边移动就不能正常运行了
yangw80
初三年级
12
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
我给你加精华的那个,不就正常运行了吗?
店小二nse
二年级
5
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
还得过段时间再返回来看看细节,我来来回回的看实在看不出来哪儿出问题了
yangw80
初三年级
12
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
你把我说糊涂了。。。
你另一个帖子里面的程序不是运行的好好的吗?为什么你又说不知道怎么做呢?
店小二nse
二年级
5
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
我是不知道哪个地方出差错了,就是到底是类似那种少一个等于号的问题,还是哪个地方想错了,但事实就是只能运行第一步……我也晕了
yangw80
初三年级
12
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
哦,我知道了。
这样,你把 vc 弄小点,让 vc 和绘图窗口两边分开,然后按 F10,一步步的你看着执行哪行代码以及图像如何变化,你可以明显的看到程序在哪里循环,应该就知道问题所在了。
登录百度账号
扫二维码下载贴吧客户端
下载贴吧APP
看高清直播、视频!
贴吧页面意见反馈
违规贴吧举报反馈通道
贴吧违规信息处理公示