//不重复生成9个字母
public class BuChongFu implements Runnable
{
static String sz[]=new String[9];
static String Zi26="";
static String sc="";
static int s;
static Thread xianchen;
public static void main(String args[])
{
BuChongFu m=new BuChongFu();
m.zifuc();
xianchen=new Thread(m);
xianchen.start();
}
public void zifuc() //用来生成一个包含26个英文字母的字符串Zi26
{
for (int i=0;i<26;i++)
{
Zi26+=(char)((int)'A'+i);
}
}
public void fuzhi() //用来给sz[]负值.
{
int weizhi=(int)(Math.random()*26);
sz[s]=Zi26.substring(weizhi,weizhi+1);
s++;
while (s<9){
weizhi=(int)(Math.random()*26);
String tmp=Zi26.substring(weizhi,weizhi+1);
for (int i=s-1;i>=0;i--){
if (tmp.equals(sz[i])){
break;
}
if (i==0){ //这儿提示找不到变量i,怎么回事
sz[s]=tmp;
s++;
}
}
}
}
public void run(){
while (true){
s=0;
fuzhi();
shuchu();
System.out.println(sc);
sc="";
try{
xianchen.sleep(5000);
}catch(Exception e) {}
}
}
public void shuchu() //用来输出sz[]的值.
{
for (int i=0;i<9;i++){
sc+=sz[i];
}
}
}
我的思路就是:用后面欲生成的字母与前面的所有字母相比较,如果相同,则退出循环,否则,都不相同的话,就负值.
s=0;
s++;欲生成字母的下标.
先生成一个sz[0];然后用while(s<9)循环来控制,在循环中先生成一个临时的字母tmp,然后判断满足与所有字母都不相等,
如果相等就s++;否则,就退出for (int i=s-1;i>=0;i--);到while中继续生成tmp执行.
一个生成9个不重复字母的程序,上面是我用了线程后的结果,5秒执行生成一字.
同样的算法,思路,我改下程序后,拿到action script(flash脚本语言)中就有重码了!!!!!
我现在就在想,到底是我的思路有问题还是哪儿出错了呢!!!
请问大家,我的这个思路有问题吗??
还是我对AS不熟悉,语句有问题
我的AS代码(感觉和JAVA差不多呀)
大家只用看有红色的代码,这些代码就是利用上面的思路.
ww=Stage.width;
wh=Stage.height;
score=100;//生命
ajcs=0; //按键总数
right=0; //按正确的个数
pz=0;//碰枪次数
s=0;//s用来控制生成字母sz[]的下标
startgame=true; //游戏开始;
zifu26=new String("");
lx=new Array(6); //标签的X坐标
ly=new Array(6); //标签的Y坐标
xs=new Array(6); //标签左右移动速度
ys=new Array(6); //标签上下移动速度
sz=new Array(6); //屏幕上显示的6个字符
bjSound=new Sound();
bjSound.attachSound("bj");
bjSound.start(0,9999);
mySound=new Sound();
mySound.attachSound("sheny");
for (var i=0;i<26;i++){
zifu26+=String.fromCharCode(65+i);
}
sz[s]=zifu26.charAt(Math.floor(random(26)));
s++;
while(s<6){
tmp=new String(zifu26.charAt(Math.floor(random(26))));
for (i=s-1;i>=0;i--){
if (tmp==sz[i]){
break;
}
if (i==0){
sz[s]=tmp;
s++;
}
}
}//就是这儿用到了生成不重复字母,语法都基本一样了,这个执行却有重码!!!!1
for (var i=0;i<6;i++){
lx[i]=_root["label"+i]._x;
ly[i]=_root["label"+i]._y;
if (i%2==0) {
xs[i]=3;
}else {
xs[i]=-3;
}
ys[i]=5;
_root["label"+i].text=sz[i]; //执行时发现标签的值根本没变,怎么回事?
_root["label"+i]._x=lx[i];
_root["label"+i]._y=ly[i];
}
_root.t3.text=score;
//这些代码主要用来让第一帧中的动态文本负值,如动态文本的TEXT,X,Y坐标等.
//下面的代码用来监听用户鼠标操作
mouseListener=new Object();
mouseListener.onMouseDown=function(){
startgame=true;
}
Mouse.addListener(mouseListener);
//下面的代码用来监听用户按键
keyListener=new Object();
keyListener.onKeyDown=function(){
if (startgame==true){ //游戏是否开始
ajcs++;
asc= Key.getAscii();
if ((asc>=65 && asc<=90) || (asc>=97 && asc<=122)){ //判断按键是否在A-Z或a-z之间,就是大小写字母都可以
asc=chr(asc).toUpperCase();
for(var i=0;i<6;i++){ //判断铵键是否与显示的6个字符之间一个相等
if (asc==sz[i]){ //如果相等,就替换那个字符,并重新负Y,TEXT值
right++;
mySound.start();
k=0;
while (!(k==6)){
tmp=zifu26.charAt(Math.floor(random(26)));
for (;k<6;k++){
if (tmp==sz[k])
break;
if (k==5)
sz[i]=tmp;
}
}
ly[i]=Math.floor(100+Math.random(200));
_root["label"+i].text=sz[i];
_root["label"+i]._y=ly[i];
break;
}
}
}
}
}
Key.addListener(keyListener);
[此贴子已经被作者于2006-4-20 9:34:28编辑过]
----------------解决方案--------------------------------------------------------
----------------解决方案--------------------------------------------------------
你这个程序有什么错误吗?
----------------解决方案--------------------------------------------------------
不知道呀,我用JAVA很正常,用AS做的时候有重码,不知怎么回事
----------------解决方案--------------------------------------------------------
----------------解决方案--------------------------------------------------------