帮帮忙!怎么样才可以,随机的改变button的位置?比如:form1上有10个button,怎样才能每次运行的时候,随机的互相交换各个button的位置呢???

  • 主题发起人 主题发起人 a2020a
  • 开始时间 开始时间
A

a2020a

Unregistered / Unconfirmed
GUEST, unregistred user!
帮帮忙!怎么样才可以,随机的改变button的位置?比如:form1上有10个button,怎样才能每次运行的时候,随机的互相交换各个button的位置呢???救急,谢谢。(100分)<br />怎么样才可以,随机的改变button的位置?
比如:form1上有10个button,怎样才能每次运行的时候,
随机的互相交换各个button的位置呢???救急,谢谢。
 
最简单的办法是
每次运行:
case Trunc(Random(10)) of
0:方案一的位置
1:方案二的位置
2:
。。。。
 
首先用一个数组记录每个button的位置,然后每个button随机从中选择一个赋值

-----
http://www.8421.org
 
如果位置被占用,循环啊!建数组记录所有按钮xy位置和占用情况(boolean)

for i:=0 to componentcount-1 do
begin
if components is tbutton then
begin
bl:=true;
while bl do
begin
i:=random(数组长度);
bl:=zysz; //zysz表示占用数组
end;
Tbutton(components).left:=button_x; //数组
Tbutton(components).left:=button_y; //数组
end;
end;
 
在窗体上已经存在10个控件,
应该做9个随机运算,
1.位置一随机取得一个控件,从10个控件中,
2.位置二随机取得一个控件,从9个控件中,
... ...
可惜我对随机函数没有研究,否则我会写个实例。
 
我是个新手,能不能具体一些啊,最好举个例子,加上注释,谢谢谢谢。
 
我是个新手,能不能具体一些啊,最好举个例子,加上注释,谢谢谢谢。
还有,我的意思是让button随机互相交换位置,不是让他们在窗体上的任意位置随机出现。
 
//这个问题主要涉及随机数和指针问题
//经过几天研究终于做了一半——指针问题解决
//随机数问题前几天还看到一篇文章,可惜一时找不到
//我定义了一个过程如下,我在onshow事件中调用此过程,并且获得预期效果
//文章中有不妥的地方请各位指教
procedure TForm1.where;
type
btp=^tbutton;

var
place:array[1..10,1..2] of integer;
component:array[1..10] of btp;
buttonex:btp;
i,ran:integer;

function crandom(const i:integer):integer;
begin
randomize;
result:=random(i);
while result=0 do result:=1;//random(i);
{delphi的随机数函数有些问题,第一次取值总为0.
值取多了,还会找到规律.我这里每次取值都赋值为1}
end;

begin
component[1]:=@button1; //指针指向控件
component[2]:=@button2;
component[3]:=@button3;
component[4]:=@button4;
component[5]:=@button5;
component[6]:=@button6;
component[7]:=@button7;
component[8]:=@button8;
component[9]:=@button9;
component[10]:=@button10;

for i:=1 to 10 do //得到控件坐标
begin
place[i,1]:=component^.Left;
place[i,2]:=component^.Top;
end;

for i:=10 downto 1 do //从位置10到位置1依次随机取值。
//即:选择放在此处的控件
begin
ran:=crandom(i);
component[ran]^.Left:=place[i,1]; //控件1得到控件i的位置
component[ran]^.Top :=place[i,2];

buttonex:=component[ran]; //被安排好位置的控件和数组第i个控件交换;
component[ran]:=component;
component:=buttonex;
end;

end;

//你既然是新手一定要记得声明这个过程呀
 
我对随机数问题最后解决如下,修改过程:

function crandom(const i:integer):integer;
var j:integer;
begin
randomize;
for j:=1 to 3 do result:=random(i-1)+1;//取第3次的值,也可以是第x次;只要不是第一次
end;


现找到两帖你可以借鉴:

一: http://www.delphibbs.com/delphibbs/dispq.asp?lid=650976


二:发信人: guoer (过儿), 信区: Delphi
标 题: Re: 关于随机数问题
发信站: BBS 水木清华站 (Sat Feb 26 17:23:22 2000)

【 在 darkdark (无为) 的大作中提到: 】
∶ 在DELPHI中随机数函数的功能好象并不随机,每次的结果好象都有规律。
∶ 如何实现真正的随机?(我指的是Random(range)函数)

其实可以自己写一个伪随机数发生器的。
如果需要整数随机数的话,参看下面的线性反馈移位法制作的伪随机数:
function LFSR: integer;
var ShiftRegister: LongWord;
begin
ShiftRegister := 1;
ShiftRegister := ((((ShiftRegister shr 31)
xor (ShiftRegister shr 6)
xor (ShiftRegister shr 2)
xor (ShiftRegister shr 1)
xor ShiftRegister))
and $00000001)
shl 31)
or (ShifteRegister shr 1);
Result := ShiftRegister and $00000001;
end;

如果需要浮点数伪随机数发生器的话,参看下面的线性同余发生器:
随机数范围在-2e31+85 ~ 2e31-85
初始变量s1,s2可以设置在1~2147483398之间

var s1,s2: LongWord;

procedure initLCG(initS1,initS2: LongWord);
begin
s1 := initS1;
s2 := initS2;
end;

procedure MODMULT(a,b,c,m: LongWord; var s: LongWord);
var q: LongWord;
begin
q := s div a;
s := b*(s-a*q)-c*q;
if (s<0) then s := s+m;
end;

function combinedLCG: double;
var z: LongWord;
begin
MODMULT(53668,40014,12211,2147483563,s1);
MODMULT(52774,40692,3791,2147483399,s2);
z := s1-s2;
if z<1 then
z := z+2147483562;
Result := z*4.656613E-10;
end;
initialization
s1 := 1;
s2 := 1;
----
 
接受答案了.
 
后退
顶部