Javaの道 Javaに関する
 ニュースJava基本Servlet・JSPオープンソースFAQ掲示板
Javaの道 >  掲示板 >  掲示板(「神経衰弱」組み合わせが違うカードが裏返るラグの書き方など)
閲覧数:987
掲示板(「神経衰弱」組み合わせが違うカードが裏返るラグの書き方など)
名前
匿名
題名 「神経衰弱」組み合わせが違うカードが裏返るラグの書き方など
質問内容

質問を評価する
(0ポイント)
現在学校の授業で神経衰弱を作っています。
形は出来たのですが分からないことが2点あります。

・ペアにならないカードの場合、めくったカードを真っ
白のカードにするのですが、めくってすぐ真っ白のカー
ドに切り替わってしまうので2回目めくったカードの数
字が見れません。なので、めくる→カードが白くなる 
の間にラグを入れる処理のヒントをください。

・1〜8までの数字が入った配列を2つ作り中身をシャ
ッフルしてから各ボタンに入れています。現在のコード
だとボタン1〜8とボタン7〜16にそれぞれ1〜8の
数字が入ってしまって、実は隣に同じ数字がある。など
の場合が作れません。なのでボタン1〜16に数字1〜
8をペアでランダムに入れる書き方のヒントをくださ
い。

ソースは以下の通りです。

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.util.Random;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Arrays;


public class Test4 extends Frame
    implements ActionListener  {
        private Thread th;
        private boolean running;

    Label label = new Label("神経衰弱           
",Label.LEFT);
    Button resetbutton = new Button("リセッ
ト");
    Panel flow3 = new Panel(new 
FlowLayout(FlowLayout.LEFT,5,5));
    Panel grid2 = new Panel(new 
GridLayout(4,4,5,5));
    Panel border1 = new Panel(new 
BorderLayout(5,5));
    
    Button[] button = new Button[16];
    int[] map = new int[16];
    int[] tmp = new int[2];
    ArrayList<Integer> list1 = new 
ArrayList<Integer>();
    ArrayList<Integer> list2 = new 
ArrayList<Integer>();
    String disp ="";
    int count = 1;
    int clear = 0;
    
    public Test4() {
        super("test4");
        this.setResizable(true);
        
this.setBackground(SystemColor.control);
        
this.setForeground(SystemColor.controlText);
        
resetbutton.addActionListener(this);
        flow3.add(label);
        flow3.add(resetbutton);
        for(int i=0;i<16;i++){
            button[i] = new Button(" 
");
            
button[i].addActionListener(this);
            grid2.add(button[i]);
        }
        border1.add("North",flow3);
        border1.add("Center",grid2);
        add("Center",border1);
        pack();
        addWindowListener(new 
ClosingWindowListener());
        setSize(500,500);
        setVisible(true);
        
        for (int i=0;i<8;i++) {
            list1.add(i);
            list2.add(i);
        }
        Collections.shuffle(list1);
        Collections.shuffle(list2);
        for(int i=0;i<8;i++){
            map[i] = list1.get(i);
            map[i+8] = list2.get(i);
        }
    }

    public void actionPerformed(ActionEvent 
evt) {
    for(int i=0;i < 16;i++){
        if ( evt.getSource() == button[i]) 
{
            disp = "" + map[i];
            button[i].setLabel(disp);
            
            switch(count){
                case 1:
                    tmp[0] = 
i;
                    count = 2;
                    
button[i].setEnabled(false);
                    
System.out.println(map[tmp[0]]);
                    break;
                
                case 2:
                    tmp[1] = 
i;
                    
if(map[tmp[0]] == map[tmp[1]]){
                        
button[i].setEnabled(false);
                        
clear++;
                        
label.setText(clear + "組正解");
                    }else{
                        
button[tmp[0]].setLabel("");
                        
button[tmp[1]].setLabel("");
                        
button[tmp[0]].setEnabled(true);
                        
System.out.println(map[tmp[1]]);
                    }if(clear 
== 8){
                        
label.setText("Clear");
                    }
                    count = 1;
                    break;
            }
        }if(evt.getSource()==resetbutton){
            Arrays.fill(tmp,0);
            disp = "";
            count = 1;
            clear = 0;
            label.setText("神経衰弱           
");
            for(int j=0;j < 16;j++){
            
button[j].setEnabled(true);
            button[j].setLabel("");
            }
        }
    }
}

public static void main(String[] args){
      new Test4();
    }
    
    class ClosingWindowListener extends 
WindowAdapter{
      public void windowClosing(WindowEvent evt){
         System.exit(0);
      }
   }

}
質問日時 2013-10-17 12:17:54
名前
匿名
回答内容

回答を評価する
(0ポイント)
>ラグを入れる処理のヒントをください。
1.スリープ
2.タイマー

>ボタン1〜16に数字1〜
>8をペアでランダムに入れる書き方のヒントをくださ
なんで16の大きさの一つの配列じゃないの?
回答日時 2013-10-18 00:42:45
名前
匿名
回答内容

回答を評価する
(0ポイント)
主です。
>匿名さん
スリープとタイマーを組み合わせればラグ作れるんです
ね。ありがとうございます。

配列については神経衰弱の仕様上、1〜8までの数字を
2組作らないといけないのでリスト1と2にそれぞれ1
〜8を入れて、map[1]~map[8]に1〜8・
map[7]~map[16]に2組目の1〜8を入れてるのですが、
現状だと4*4の盤面の上部分に1組目の1〜8が入っ
て、下半分に2組目が入ってしまうんです。
なので、完璧にシャッフルして上半分でも同じ数字が入
るようにしたいんですけど。。。

すみません。こういう掲示板で質問など書き込むのは始
めてで回答や質問がハッキリ分からないかもしれません
が申し訳ありません;
回答日時 2013-10-18 01:29:09
名前
匿名
回答内容

回答を評価する
(0ポイント)
あれ、消えてる?投稿できなかったかな?

1と2はandではなくor。

後者は、なんでひとつのListに1〜8を2回線 追加してはだめか
という話。
回答日時 2013-10-19 19:35:50
名前
匿名
回答内容

回答を評価する
(0ポイント)
主です。
>匿名さん
なるほど。どちらか実装すればいいんですね。分かりまし
たありがとうございます。

すみません。私の解釈が間違っているかもしれないのでお
聞きしますが
list1と2で分けるのではなく、list1に1~8*2組の計16個入
れるという話でしょうか?
回答日時 2013-10-21 10:22:43
名前
匿名
回答内容

回答を評価する
(0ポイント)
主です。
>匿名さん

以前
    for (int i=0;i<8;i++) {
            list1.add(i);
        }
        Collections.shuffle(list1);
        for(int i=0;i<8;i++){
            map[i] = list1.get(i);
            map[i+8] = list1.get(i);
        }
に変更し実行したところ、下記の画像のように上下同じ
振り分けになったんですけど、匿名さんの考えとは違っ
たでしょうか?
http://gyazo.com/758074763bfef5bcac3864aac3888b62
回答日時 2013-10-21 10:35:18
名前
匿名
回答内容

回答を評価する
(0ポイント)
「線」が余計だな。これは予測変換で出たゴミ。

で、

>list1と2で分けるのではなく、list1に1~8*2組の計16個入
れるという話
これは試してみたのか?
試せることは試してから質問しよう。
これでは鸚鵡返しだ。
回答日時 2013-10-21 14:30:59
名前
匿名
回答内容

回答を評価する
(30ポイント)
主です。
>匿名さん
for (int i=0;i<8;i++) {
            list1.add(i);
            list1.add(i);
        }
        Collections.shuffle(list1);
        for(int i=0;i<16;i++){
            map[i] = list1.get(i);
        }
にしたら、無事希望通りの処理が出来ました。
スレッドのスリープでラグについても出来ました。
不慣れで不快な思いをさせてしまったと思いますが
無事完成しました。javaについても・掲示板の書き方に
ついても勉強になりました。
ありがとうございました
回答日時 2013-10-22 12:00:04
名前
匿名
回答内容

回答を評価する
(0ポイント)
不快になるのは、「答えるのが当然」てな態度で文句ばかり
言っている質問者だな。
度を越すと逆に笑えるけど。

8とか16とかのべたな数字はあまり使わない方がいい。
例えば呼び出し元から8を与えると、16は元の数×2で計算、
のようにね。
8を10に増やしたいとき、直すところが明確だろう。

Listから配列にはメソッド一発で変換できるが、今回の
ようなものはListをそのまま使い回して良いだろうな。
回答日時 2013-10-22 15:30:14
名前
匿名
回答内容

回答を評価する
(0ポイント)

今日は超嬉しかった!!通信販売で素敵な名ブランドバックを購入した。価額は1万円ぐらいしか使っていなかった。代金を支払って、5日後商品が着きました。
鞄の質がとてもいいですね。私は大変好きです。
この店にの商品は市場のと比べると、価格が安いですよ。
では、この店のウェブサイトを皆に教えます。
www.roiexjp.biz皆速く買いに行ってくださいね。
回答日時 2013-11-16 16:03:29
回答内容を入力し、「確認」ボタンをクリックしてください。
ログインしていません。ログインしなくても回答はできますが、ログインすると、質問・回答の管理、更新があった場合のメールでの通知を受けることができます。 ユーザIDをお持ちでない方は「ID登録」からユーザIDの登録を行ってください。
氏名 匿名
回答内容
 



このページのトップへ
 ニュースJava基本Servlet・JSPオープンソースFAQ掲示板
Javaの道_CopyrightJavaの道