1

ブラックジャックゲームを作っています。すべてが完了し、ゲームを最初からやり直すためのリセット ボタンを作成したいと考えました。ActionListener で all() を削除しましたが、Board() が再び開始されたときに、JButton の描画または折りたたみが追加されません。PS を助けてください Cards() コンストラクターはすべて私のカード画像ファイルです。

import javax.swing.*;
import java.io.*;
import java.util.ArrayList;
import javax.imageio.*;
import java.awt.*;
import java.awt.image.*;
import java.awt.event.*;

public class Board extends JPanel implements ActionListener
{
    Cards deck=new Cards();

    static ArrayList<BufferedImage> pcards=new ArrayList<BufferedImage>();
    static ArrayList<BufferedImage> ccards=new ArrayList<BufferedImage>();
    static BufferedImage back;

    static int w=1280/2;
    static int h=760/2;

    static ArrayList<String> p=new ArrayList<String>();
    static ArrayList<String> com=new ArrayList<String>();

    static Boolean last=true;
    static String end="";

    public Board()
    {
        setLayout(null);

        Color green=new Color(00,55,00);
        setBackground(green);

        try 
        {     
            String c="Deck\\"+deck.draw();
            p.add(c);           
            pcards.add(ImageIO.read(this.getClass().getResource(c)));
            c="Deck\\"+deck.draw();
            p.add(c);
            pcards.add(ImageIO.read(this.getClass().getResource(c)));
            c="Deck\\"+deck.draw();
            com.add(c);
            ccards.add(ImageIO.read(this.getClass().getResource(c)));
            c="Deck\\"+deck.draw();
            com.add(c);
            ccards.add(ImageIO.read(this.getClass().getResource(c)));

            back=(ImageIO.read(this.getClass().getResource("Deck\\b1fv.GIF")));
        } 
        catch (IOException e) 
        { 
          //Not handled. 
        }
        int cp=Integer.parseInt(Score(com));
        while(cp<17)
        {
            try
            {
                String c="Deck\\"+deck.draw();
                com.add(c);
                ccards.add(ImageIO.read(this.getClass().getResource(c)));
            }

            catch (IOException e) 
            { 
             //Not handled. 
            }
            cp=Integer.parseInt(Score(com));
        }

        JButton draw=new JButton("Draw");
        draw.setBounds(w-120,h-30,90,40);
        draw.setFont(new Font("Arabic", Font.PLAIN, 20));
        draw.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent a)
            {
                int pp=Integer.parseInt(Score(p));      
            if(pp>21||end.length()>0)
            {
                last=false;
                repaint();
            }
            else
            {
                try
                {
                    String c="Deck\\"+deck.draw();
                    p.add(c);           
                    pcards.add(ImageIO.read(this.getClass().getResource(c)));
                    repaint();
            }
                catch (IOException e) 
                { 
                //Not handled. 
                }
            }}
        });
        add(draw);


        JButton fold=new JButton("Fold");
        fold.setBounds(w+40,h-30,90,40);
        fold.setFont(new Font("Arabic", Font.PLAIN, 20));
        fold.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent a)
            {
                int pp=Integer.parseInt(Score(p));  
                int cp=Integer.parseInt(Score(com));
                end=End(pp,cp);
                last=false;
                repaint();
            }
        });
        add(fold);
    }

    public void paint(Graphics g)
    {
        super.paint(g);

        g.setFont(new Font("Arabic", Font.PLAIN, 50));
        g.setColor(Color.black);

        int pp=Integer.parseInt(Score(p));  
        int cp=Integer.parseInt(Score(com));
        if(pp>21)
        {
            end=End(pp,cp);
            last=false;
        }
        int i=0;
        for(BufferedImage temp:pcards)
        {
            g.drawImage(temp, (w-120)+i, (h+(h/2))-80,100,170, null);
            i+=60;
        }
        i=0;
        if(last)
        {
            for(BufferedImage temp:ccards)
            {
                g.drawImage(back, (w-120)+i, (h-(h/2))-100,100,170, null);
                i+=60;
            }
            g.drawString("Score:",(w-(w/2))-90,h-40);
            g.drawString("???", (w-(w/2))-70, h+40);
        }
        else
        {
            for(BufferedImage temp:ccards)
            {
                g.drawImage(temp, (w-120)+i, (h-(h/2))-100,100,170, null);
                i+=60;
            }
            g.drawString("Score:",w-(w/2)-90,h-40);
            g.drawString(Score(com), (w-(w/2))-50, h+40);
        }   
        g.drawString("Score:",w+(w/2)-50,h-40);
        g.drawString(Score(p), (w+(w/2)), h+40);

        int j=end.length();
        g.setFont(new Font("Arabic", Font.PLAIN, 70));
        Color l=new Color(66,153,204);
        g.setColor(l);
        g.drawString(end,(w-(j*20))+20,h-(h/2));

        if(end.length()>0)
        {
            g.setFont(new Font("Arabic", Font.PLAIN, 30));
            g.setColor(Color.black);
            g.drawString("Play Again?",(w-(w/2))-160,h+(h/2));

            JButton reset=new JButton("Yes");
            reset.setBounds((w-(w/2))-120,(h+(h/2))+30,90,40);
            reset.setFont(new Font("Arabic", Font.PLAIN, 20));
            reset.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent e)
                {
                    last=true;
                    end="";
                    pcards.clear();ccards.clear();p.clear();com.clear();
                    repaint();
                    removeAll();
                    new Board();

                }
            });
            add(reset);
        }
    }

    public void actionPerformed(ActionEvent e)
    {
    }

    public static String End(int x,int y)
    {
        if(x>21 && y<=21)
            end="You Busted! Computer Won!";
        else if(x<=21 && y>21)
            end="You Won! Computer Busted!";
        else if(x>21 && y>21)
            end="Both Busted! Draw!";
        else if(x>y)
            end="You Win!";
        else if(x<y)                
            end="You Lost!";
        else
            end="You and Computer Tied! Draw!";
        return end;
    }

    public static String Score(ArrayList<String> x)
    {
        int sum=0;
        for(int i=0; i<x.size(); i++)
        {
            String z=x.get(i);
            if(z.charAt(6)=='2')
                sum+=2;
            if(z.charAt(6)=='3')
                sum+=3;
            if(z.charAt(6)=='4')
                sum+=4;
            if(z.charAt(6)=='5')
                sum+=5;
            if(z.charAt(6)=='6')
                sum+=6;
            if(z.charAt(6)=='7')
                sum+=7;
            if(z.charAt(6)=='8')
                sum+=8;
            if(z.charAt(6)=='9')
                sum+=9;
            if(z.charAt(6)=='1')
                sum+=10;
            if(z.charAt(6)=='j')
                sum+=10;
            if(z.charAt(6)=='q')
                sum+=10;
            if(z.charAt(6)=='k')
                sum+=10;
            if(z.charAt(6)=='a')
            {
                if(sum<=10)
                    sum+=11;
                else
                    sum+=1;
            }                           
        }
        String score=""+sum;
        return score;   
    }
}
public class BlackJack extends JFrame
{
    public BlackJack()
    {
        add(new Board());       
        System.out.println("Starting BlackJack...");
        setTitle("Blackjack");
        setSize(getToolkit().getScreenSize().width, getToolkit().getScreenSize().height-40);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setResizable(false);
        setVisible(true);
    }
    public static void main(String args[]) 
    {
        new BlackJack();
    }
}
4

4 に答える 4

2

質問: 新しい Board オブジェクトを作成しましたが、何に追加しますか?

回答: 何も表示されないため、それ自体を表示する方法はありません。

そうは言っても、より良い解決策は新しい Board オブジェクトを作成することではなく、通常は現在の Board オブジェクトを初期状態にリセットする方法を見つけることです。

于 2013-05-03T23:47:58.070 に答える
2

paintどのメソッドからでも UI の状態を変更しないでください。これにより、新しい再描画要求が何度も何度も発生するだけです.... CPUを消費するまで(特異点になり、PCを忘却に吸い込みます...)

また、私たちがそれに取り組んでいる間は、オーバーライドするべきであり、 ではpaintComponentありませんpaint。Paint は、現在ペイントしているすべての子コンポーネントのペイントを担当します。これは、長い目で見れば、あなたに悲惨な終わりをもたらすことはありません.

于 2013-05-03T23:49:56.407 に答える
2
  1. 静的変数を使用しないでください。これを行う必要はありません。

  2. null レイアウトは使用しないでください。Swing は、レイアウト マネージャーで使用するように設計されています。

  3. paint() メソッドをオーバーライドしないでください。カスタム ペイントは、paintComponent() メソッドをオーバーライドすることによって行われます。

  4. どのペイント方法でもコンポーネントを追加/削除しないでください。

于 2013-05-03T23:52:52.990 に答える
1

「camickr」に同意します... 変数はstaticであるため、再起動されず、以前の設定と設定のままです。私はこれを提案します...

public class BlackJack
{
    public static JFrame frame;

    public BlackJack()
    {
        frame = new JFrame("BlackJack");

        add(new Board());       
        System.out.println("Starting BlackJack...");
        setSize(getToolkit().getScreenSize().width, getToolkit().getScreenSize().height-40);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setResizable(false);
        setVisible(true);
    }

    public static void main(String args[]) 
    {
        new BlackJack();
    }
}

BlackJack JFrame をstatic作成して、ボードを削除してから新しいボードを追加できるようにします。これを、ユーザーがリセットするために行う操作に追加します。JButtonのように、ActionListenerまたはユーザーが「R」のようなキーボードの文字をクリックすると、リセット… のように…</p>

public void reset()
{
    frame.remove(this);
    frame.add(new Board());
}

これで質問に答えられない場合は、お知らせください。これが誰にとっても合理的ではないと思われる場合は、私がそれを理解するのを手伝ってください. :D

于 2014-03-28T02:05:58.953 に答える