上学期VB不及格。老师让我编一个VB游戏,我根本没学。朋友帮助我。我不想失败。帮我写一个。
Visual Basic Games:猜英雄相信很多读者都看过央视的《水浒传》。林冲、宋武和李悝jy等英雄们的音容笑貌仍历历在目。那么108的比赛你最喜欢谁?我做了一个小程序让电脑猜你的心思,程序界面如图。
为了简化问题,我选择了其中的27人,分成3组,每组9人。如果你最喜欢他们中的一个(比如石进),他出现在第一组,那就按“第一组”按钮。然后把这27个重新排一下,你就知道史进属于哪一组了。比如你发现他在第二组,只要按下“第二组”按钮,画面中的人物顺序就会再次被打乱,然后你就会发现史进属于哪一组……最多3次,电脑就会猜出你心中的英雄!知道了游戏玩法,我就来介绍一下程序是怎么实现的:
一、投机的奥秘——计算原理
猜的原理其实并不复杂。我们模拟一下猜的过程,大家就知道了。程序初始化时,1 ~ 27会被随机加扰到PageControl控件的三个选项卡中,每个选项卡中有9张图片。点击一次按钮后,顺序不是盲目打乱,而是过滤掉,把有用的图片(也就是点击的那组中的9张图片)过滤掉,平均分配到PageControl控件的三个选项卡上,然后把不需要的图片集中起来,平均分配到PageControl控件的三个选项卡上。最后,有用和无用的图片在每个标签页中被随机打乱,再次重新排列显示,从而完成猜测。
具体来说,当你第一次按下按钮时,意味着你喜欢的图片在其中一个标签页的9张图片中的一张。所以把这九张图分成三份,每份三张,分别发给三个tab,剩下的图就不考虑了。当你第二次按下按钮的时候,意味着你喜欢的图片在其中一个标签页的三张图片中,所以你把这三张图片分成三份,每份1,分别发给三个标签页。当你第三次按下按钮时,意味着你最喜欢的图片在其中一个标签页的1张图片中。毫无疑问,这张图片是你最喜欢的图片,所以程序显示这张图片。
扰乱重排算法
程序中很多地方都涉及到无序和重排的问题。下面简单介绍一下紊乱是如何实现的。
这里要实现的方法比较简单,就是多次交换数组不同位置的值,就像小学的时候老师让两个学生交换位置,老师一直随机抽取两个学生交换位置,最后学生的座位重新排列。
例如:
int i,temp1,temp2,a[2],b[27]
for(I = 1;我& lt=27;I++)//首先给数组赋一个初始值。
b[I]= I;
randomize();
for(I = 1;我& lt=500;i++)//i的大小决定了打乱的程度,循环越多打乱的程度越高。
{
temp 1 = random(27)+1;
temp 2 = random(27)+1;
a[1]= b[temp 1];
b[temp 1]= b[temp[2];
b[temp 2]= a[1];
}
//输出
listbox 1->;clear();
for(I = 1;我& lt=27;i++)
listbox 1->;项目-& gt;add(IntToStr(b[I]));
如上例所示,b[27]数组被打乱后就不再是老面孔了。
二、实现的关键——筛选算法介绍
在整个实现过程中,如何筛选每次中断后的字符是程序的关键点。处理不好,程序就没有结果。而且筛选很容易让你晕头转向,所以首先要把涉及到的各种数组之间的关系理顺,用一个例子来说明如何筛选。以按钮第一次点击次数,点击的按钮是Button1为例,思路如下:
首字母:
当第一次执行button事件并按下Button1时(表A中的数组是键数组):
将表A加扰后,分成三组,分别发送到内存缓冲区。
对表B和表C进行置乱后,平均分成三组,分别送入内存缓冲区(不重要数组),然后进行组合,有用和无用的搭配重新组合成三个表并显示:
表达整个筛选过程:
1.初始化:
打乱a[1-27]并把它
先给[1-9]一个[1-9]
A[10-18]被分配给第二个[1-9]
给第三个[1-9]一个[19-27]
2.第一个按钮事件(假设选择了第二个选项卡)
秒【1-9】被打乱后给Temp 1【1-3】,Temp 2【1-3】,Temp MP3【1-3】。
A[1-9]+a[19-27]赋给temp4[1-18]并被打乱。
temp 1[1-3]+temp 4[1-6]被赋值给first[1-9]并被中断。
temp 2[1-3]+temp 4[7-12]被分配给second[1-9]并被置乱。
temp 3[1-3]+temp 4[13-18]被赋值给third[1-9]并被中断。
3.第二个按钮事件(假设选择了第二个选项卡)
Temp2[1-3]被加扰并分配给temp5[1]、temp6[1]和temp7[1]。
temp 1[1-3]+temp 3[1-3]+temp 4[1-18]被分配给temp8[1-24]并被加扰。
Temp 5[1]+Temp 8[1-8]被分配给first[1-9]并被置乱。
Temp 5 [2]+Temp 8 [9-16]被分配给second[1-9]并被置乱。
Temp 5 [3]+Temp 8 [17-24]被分配给third[1-9]并被中断。
4.第三个按钮事件(如果选择了第二个选项卡)
只显示temp5[2]对应的图片。
最后,表A-表C可以分别被打乱后显示。二次和多次筛选的方法是一样的,只要注意阶段的英雄在哪个阵就行,不要搞错了。
三。摘要
最后的工作相对简单。可以设计一个友好的界面,然后在程序启动时给数组赋一个初始值,并显示出来;先判断每个按钮的次数,然后进行上面描述的处理,继续过滤,直到只剩下一个英雄,可以直接显示在界面下方。