M03-Aiwin 2021-12-25 18:40 采纳率: 75%
浏览 182
已结题

java多线程和swing实现猜拳游戏

猜拳游戏:有甲乙双方猜拳,投注其中一方,猜赢家,猜中即赢,猜错即输,四个按钮,一个是“甲方赢”,一个是“乙方赢”,一个“开始”,一个“停止”;两个图片,分别是甲乙方的石头剪刀布其中一个的图片。先点击“甲方赢”或“乙方赢”,然后点击“开始”,图片开始随机变换,最后点击“停止”,图片停止变换,输出一个输赢结果。

import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JLabel;
import java.lang.Thread;
import javax.swing.JTextField;
import java.util.Random;
import java.lang.Runnable;
public class caiiquan extends JFrame 
{
 public  int flag1;
 public static void main(String[] args)
{
thread t1=new thread(0);
thread1 t2=new thread1(0);
Thread tt1=new Thread(t1);
Thread tt2=new Thread(t2);
caiquan c2=new caiquan();
JFrame frame=new JFrame();
JPanel panel1=new JPanel();
JPanel panel2=new JPanel();
JPanel panel3=new JPanel();
JButton jiawin=new JButton("甲方赢");
JButton yiwin=new JButton("乙方赢");
JButton begin=new JButton("开始");
JButton stop=new JButton("停止");
JLabel scissors,fist,cloth;
JLabel j=new JLabel("请玩家选择按钮:");
JLabel jia=new JLabel("甲出:");
JLabel yi=new JLabel("乙出:");
frame.setTitle("猜拳游戏");
frame.setLayout(null);
frame.setSize(1200,1200);
frame.setVisible(true);
panel1.setSize(600,600);
panel2.setBounds(0,600,800,800);
panel3.setBounds(0,300,800,800);
frame.add(panel1);
frame.add(panel2);
frame.add(panel3);
j.setBounds(100,500,50,50);
j.setFont(new Font("宋体",Font.BOLD,20));
jia.setFont(new Font("宋体",Font.BOLD,20));
yi.setFont(new Font("宋体",Font.BOLD,20));
panel.add(j);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jiawin.setBounds(100,500,100,100);
yiwin.setBounds(200,500,100,100);
begin.setBounds(300,500,100,100);
stop.setBounds(400,500,100,100);
jia.setBounds(100,700,100,100);
yi.setBounds(300,700,100,100);
panel1.add(yiwin);
panel1.add(jiawin);
panel1.add(begin);
panel1.add(stop);
JLabel j1=new JLabel("结果:");
j1.setFont(new Font("宋体",Font.BOLD,20));
panel2.add(j1);
JTextField t=new JTextField(30);
t.setSize(100,100);
t.setEditable(false);
panell.add(t);
JButton btn1=new JButton();
JButton btn=new JButton();
panel3.add(jia);
panel3.add(btn);
panel3.add(yi);
panel3.add(btn1);
jiawin.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
 c2.flag1=1;

             }
});
yiwin.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
             c2.flag1=2;

 }
});
begin.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
tt1.start();
tt2.start();
   }
});
stop.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
tt1.stop();
tt2.stop();
if((t1.flag==0&&t2.flag==2&&c2.flag1==1)||(t1.flag==1&&t2.flag==0&&c2.flag1==1)||(t1.flag==2&&t2.flag==1&&c2.flag1==1))
{
t.setText("你赢了");

}
else if((t1.flag==0&&t2.flag==1&&c2.flag1==2)||(t1.flag==1&&t2.flag==2&&c2.flag1==2)||(t1.flag==2&&t2.flag==0&&c2.flag1==2))
{
t.setText("你赢了");

}
else if((t1.flag==t2.flag&&c2.flag1==1)||(t1.flag==t2.flag&&c2.flag1==2))
{
t.setText("平局");

}
else if((t1.flag==0&&t2.flag==2&&c2.flag1==2)||(t1.flag==1&&t2.flag==0&&c2.flag1==2)||(t1.flag==2&&t2.flag==1&&c2.flag1==2))
{
t.setText("你输了");
}
else if((t1.flag==0&&t2.flag==1&&c2.flag1==1)||(t1.flag==1&&t2.flag==2&&c2.flag1==1)||(t1.flag==2&&t2.flag==0&&c2.flag1==1))
{
t.setText("你输了");
}
   }
});
class thread implements Runnable
{
public int flag;
public void run()
{
try
{
for(int i=0;;i++)
{
flag=(int)(Math.random()*3);
 if(flag==0)
{btn.setIcon(new ImageIcon("A:\\zhaiwa\\eclipse\\bu.jpg")); }//else if (flag==1)
{btn.setIcon(new ImageIcon("A:\\zhaiwa\\eclipse\\jiandao.jpg")); }
 else if(flag==2){btn.setIcon(new ImageIcon("A:\\zhaiwa\\eclipse\\shitou.jpg")); }
}}
catch(Exception e)
{e.printStackTrace();}
}
}
class thread1 implements Runnable
{
    public int flag;
public void run()
{
try
{
for(int i=0;;i++)
{
flag=(int)(Math.random()*3);
 if(flag==0)
{btn1.setIcon(new ImageIcon("A:\\zhaiwa\\eclipse\\bu.jpg")); }
else if (flag==1)
{btn1.setIcon(new ImageIcon("A:\\zhaiwa\\eclipse\\jiandao.jpg")); }
 else if(flag==2){btn1.setIcon(new ImageIcon("A:\\zhaiwa\\eclipse\\shitou.jpg")); }
}}
catch(Exception e)
{e.printStackTrace();}
}
}

}}



我点击开始按钮的时候为什么会弹出两个新的窗口变换图片?停止的时候结果也不正确,有什么办法能让两张图片转换显示在panel3中,代码该怎么改?

  • 写回答

2条回答 默认 最新

  • 关注

    改变一下思路,猜拳类封装成独立的类,当做线程共享数据,只需要创建一个线程类,启动2个线程对象,猜拳类对象与显示结果的控件当做参数传入线程。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 1月3日
  • 已采纳回答 12月26日
  • 创建了问题 12月25日

悬赏问题

  • ¥15 这种微信登录授权 谁可以做啊
  • ¥15 请问我该如何添加自己的数据去运行蚁群算法代码
  • ¥20 用HslCommunication 连接欧姆龙 plc有时会连接失败。报异常为“未知错误”
  • ¥15 网络设备配置与管理这个该怎么弄
  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来