JAVA课程设计——石头剪刀布

设计题目——石头剪刀布游戏

1.问题描述

用 JAVA 语言设计如下界面的石头剪刀布游戏。游戏的一方点击界面上石头、剪刀、布按钮,游戏的另一方计算机随机选择,然后给出游戏结果。
效果图

2.基本要求

按照下面给出的步骤设计石头剪刀布游戏,并完成以下工作:

  1. 在“//”后给出必要的注释;
  2. 为程序添加菜单;至少 2 个菜单:结果显示方式和关于游戏;结果显示方式菜单有 3 个菜单项:文本
    显示、图形显示、结束游戏;实现菜单中的功能,自行搜索能体现石头、剪刀、布的图形或图片,用
    这些图形或图片显示游戏结果。
注意: 加注释的代码直接在代码块中体现。不重复写了!

3.设计方案

1.定义work11方法 继承 JFrame 成为一个窗体。
2.在窗体中,声明 Jpanel JButton 组件
3.为每一个组件 注册事件监听器
4.在触发事件以后,给出事件处理机制。

4.功能模块划分

  1. GUI图形界面
  2. 事件处理机制
  3. 菜单栏选择结果显示
  4. Main方法

5.算法思想

在GUI编程中,使用对应的布局管理器。设置Jpanel 和 Jbutton 的样式
事件处理机制中,在触发事件源以后,进行事件处理。能够在不同的模块之间反复跳跃。
改变结果显示,使之前的显示消失。并且不能重新声明对象。

6.代码实现

package FingerGuess;
import java.awt.*; //引入抽象窗口工具包 		setVisible BorderLayout JFrame 继承
import java.awt.event.*; //引入事件处理机制	panel ActionListener  Actionevent
import javax.swing.*;//引入swing 组件 设置窗口 setDefaultCloseOperation  setText(JLabel)组件
//第二步,定义一个窗口类,并实现 ActionListener 接口,把需要的组件定义放到类里为了方便调用; 
public class work11 extends JFrame  {
	/*这涉及到序列化机制的问题,序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。
	 当把对象写进流里就会根据此机制生成一个相应的序号,从流里读取对象时就根据这个序号来检查对象的完整性,
	 生成序号的过程有点繁琐,而当你在一个实现了serializable的类里声明一个static final serialVersionUID的long型常量以后,
	 序列化机制就不会计算它的序号了,而是直接使用这个常量作为以后提取对象的依据。
	 */
	//如果不添加这两个字段会有程序警告:serializable 类 work11 未声明类型为 long 的静态终态 serialVersionUID 字段
	private static long xxxxxxL;
	private static final long serialVersionUID = xxxxxxL;
	
	JButton jiandao,shitou,bu,clear; //定义 JButton 对象;
	JPanel panel2,panel1; // 定义 JPanel 对象
	JLabel label; //	定义JLabel对象
	//设置窗体。构造函数
	public work11() {
		setTitle("石头剪刀布游戏"); //设置窗体标题,修改标题为“石头剪刀布游戏”;
		setLocation(250,250); //设置窗体左上顶点坐标;- 4 -
		setSize(400,350); //设置窗体大小,修改窗体大小为:350×350; 这里为例方便之后的图形显示,我将长度改为了400px。
	//根据需求建立对象,这里只需要 4 个 JButton 对象,2 个 JPanel 对象,1 个 JLabel 对象;
	panel1 =new JPanel(); // 实例化JPanel对象 
	panel1.setBackground(Color.yellow); // 修改panel1的背景颜色 黄色
	shitou = new JButton("石头"); // 实例化 Jbutton 对象
	jiandao =new JButton("剪刀"); //实例化 Jbutton 对象
	bu = new JButton("布"); //实例化 Jbutton 对象
	clear = new JButton("清空"); //实例化 Jbutton 对象
	panel2=new JPanel(); // 实例化 JPanel2 对象
	panel2.setBackground(Color.green); // 修改JPanel2 背景颜色 为绿色
	label =new JLabel("选择剪刀、石头、布开始游戏"); // 新建一个Jlabel对象
	//设置按钮大小
	shitou.setPreferredSize(new Dimension(80,40));
	jiandao.setPreferredSize(new Dimension(80,40));
	bu.setPreferredSize(new Dimension(80,40));
	clear.setPreferredSize(new Dimension(80,40));
	//给所有 JButton 对象注册事件监听器;
	shitou.addActionListener(new jbutton());     //在事件触发后,调用actionPerformed 做相应处理
	jiandao.addActionListener(new jbutton());	//这里的this 指的是 本类中的成员方法(事件处理机制)
	bu.addActionListener(new jbutton());
	clear.addActionListener(new jbutton());
	
	// 把所有的新添加的对象都放进去窗体里面,先放进组件类,再放进窗体类
	panel1.add(shitou);//JPanel 默认布局 FlowLayOut 一直水平排列按钮。窗口大小不合适,可能会导致按钮无法显示
	panel1.add(jiandao);
	panel1.add(bu);
	panel1.add(clear);
	panel2.add(label);
	//定义 panel1 和panel2的 位置
	add(panel1, BorderLayout.NORTH); //JFrame类 继承的方法 用于添加组件  
	add(panel2, BorderLayout.CENTER);//该语法 相当于 this.add  this 指的是窗体
	
	//创建菜单
	 JMenuBar menuBar = new JMenuBar();// 创建菜单栏对象
	 setJMenuBar(menuBar);// 将菜单栏对象添加到窗体的菜单栏中
	 
	 JMenu menu1 = new JMenu("结果显示方式");// 创建菜单对象
     menuBar.add(menu1);// 将菜单对象添加到菜单栏对象中
     
     JMenuItem menuItem1 = new JMenuItem("文本显示");// 创建菜单项对象
     menuItem1.addActionListener(new ItemListener());// 为菜单项添加事件监听器
     menu1.add(menuItem1);// 将菜单项对象添加到菜单对象中
     
     JMenuItem menuItem2 = new JMenuItem("图形显示");// 创建菜单项对象
     menuItem2.addActionListener(new ItemListener());// 为菜单项添加事件监听器
     menu1.add(menuItem2);// 将菜单项对象添加到菜单对象中
     
     JMenuItem menuItem3 = new JMenuItem("结束游戏");// 创建菜单项对象
     menuItem3.addActionListener(new ItemListener());// 为菜单项添加事件监听器
     menu1.add(menuItem3);// 将菜单项对象添加到菜单对象中
     
     JMenu menu2 = new JMenu("关于游戏");// 创建菜单对象
     menuBar.add(menu2);// 将菜单对象添加到菜单栏对象中
     
     JMenuItem menuItem4 = new JMenuItem("小帅工作室");
     //menuItem4.addActionListener(new ItemListener());// 为菜单项添加事件监听器
     menu2.add(menuItem4);// 将菜单项对象添加到菜单对象中
     
     JMenuItem menuItem5 = new JMenuItem("联系方式:");
     //menuItem5.addActionListener(new ItemListener());// 为菜单项添加事件监听器
     menu2.add(menuItem5);// 将菜单项对象添加到菜单对象中
     
     JMenuItem menuItem6 = new JMenuItem("QQ:88888");
     //menuItem6.addActionListener(new ItemListener());// 为菜单项添加事件监听器
     menu2.add(menuItem6);// 将菜单项对象添加到菜单对象中
	}
	boolean flag = true;
	//jbutton实现 ActionListener 接口方法,使得按下按钮后执行方法里的代码	可以称为事件响应器;
	public class jbutton implements ActionListener{
		public void actionPerformed(ActionEvent e) {
			int i = ((int)(Math.random()*10))%3;
			//System.out.print(i + " ");测试点击按钮是否正确相应代码
			if(flag) {
				if(e.getSource() == shitou) {
				//int i = ((int)(Math.random()*10))%3;//电脑随机出拳  0代表石头 1代表剪刀 2代表布
				switch(i) {
					case 0:
						label.setText("你出石头,电脑出石头,平局!"); //label 显示文本
						break;
					case 1:
						label.setText("你出石头,电脑出剪刀,恭喜你赢了!");//label 显示文本
						break;
					case 2:
						label.setText("你出石头,电脑出布,很遗憾你输了!");//label 显示文本
						break;
				}
			}else if(e.getSource() == jiandao){
				//int i = ((int)(Math.random()*10))%3;//电脑随机出拳  0代表石头 1代表剪刀 2代表布
				switch(i) {
					case 0:
						label.setText("你出剪刀,电脑出石头,很遗憾你输了!");//label 显示文本
						break;
					case 1:
						label.setText("你出剪刀,电脑出剪刀,平局!");//label 显示文本
						break;
					case 2:
						label.setText("你出剪刀,电脑出布,恭喜你赢了!");//label 显示文本
						break;
				}
			}else if(e.getSource() == bu){
				//int i = ((int)(Math.random()*10))%3;//电脑随机出拳  0代表石头 1代表剪刀 2代表布
				switch(i) {
					case 0:
						label.setText("你出布,电脑出石头,恭喜你赢了!");//label 显示文本
						break;
					case 1:
						label.setText("你出布,电脑出剪刀,很遗憾你输了!");//label 显示文本
						break;
					case 2:
						label.setText("你出布,电脑出布,平局!");//label 显示文本
						break;
				}
			}else if(e.getSource() == clear) {
				label.setText("选择剪刀, 石头, 布开始游戏!");//label 显示文本
			}
		}else {
			if(e.getSource() == shitou) {
				//int i = ((int)(Math.random()*10))%3;//电脑随机出拳  0代表石头 1代表剪刀 2代表布
				switch(i) {
					case 0:
						label.setIcon(new ImageIcon("src\\FingerGuess\\shitouequalshitou.png")); //label 显示图片
						label.setText("");//设置文本为空
						break;
					case 1:
						label.setIcon(new ImageIcon("src\\FingerGuess\\shitouwinjiandao.png"));//label 显示图片
						label.setText("");//设置文本为空
						break;
					case 2:
						label.setIcon(new ImageIcon("src\\FingerGuess\\shitoudefeatbu.png"));//label 显示图片
						label.setText("");//设置文本为空
						break;
				}
			}else if(e.getSource() == jiandao){
				//int i = ((int)(Math.random()*10))%3;//电脑随机出拳  0代表石头 1代表剪刀 2代表布
				switch(i) {
					case 0:
						label.setIcon(new ImageIcon("src\\FingerGuess\\jiandaodefeatshitou.png"));//label 显示图片
						label.setText("");//设置文本为空
						break;
					case 1:
						label.setIcon(new ImageIcon("src\\FingerGuess\\jiandaoequaljiandao.png"));//label 显示图片
						label.setText("");//设置文本为空
						break;
					case 2:
						label.setIcon(new ImageIcon("src\\FingerGuess\\jiandaowinbu.png"));//label 显示图片
						label.setText("");//设置文本为空
						break;
				}
			}else if(e.getSource() == bu){
				//int i = ((int)(Math.random()*10))%3;//电脑随机出拳  0代表石头 1代表剪刀 2代表布
				switch(i) {
					case 0:
						label.setIcon(new ImageIcon("src\\FingerGuess\\buwinshitou.png"));//label 显示图片
						label.setText("");//设置文本为空
						break;
					case 1:
						label.setIcon(new ImageIcon("src\\FingerGuess\\budefeatjiandao.png"));//label 显示图片
						label.setText("");//设置文本为空
						break;
					case 2:
						label.setIcon(new ImageIcon("src\\FingerGuess\\buequalbu.png"));//label 显示图片
						label.setText("");//设置文本为空
						break;
				}
			}else if(e.getSource() == clear) {
				label.setText("选择剪刀, 石头, 布开始游戏!");//label 显示文本
				label.setIcon(new ImageIcon("sec\\FingerGuess\\white.png"));//设置显示图片为空
			}
		}
	}
}
	//ItenListener 实现ActionListener接口,用于给菜单栏添加事件处理机制
	public class ItemListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            //JMenuItem menuItem = (JMenuItem) e.getSource();
            //System.out.println("您单击的是菜单项:" + menuItem.getText());测试点击菜单按钮是否有相应的过程代码
    			if(e.getActionCommand().equals("图形显示")) {
    				ImageIcon icon1 = new ImageIcon("src\\FingerGuess\\shitou.png");//实例化图片对象
    				ImageIcon icon2 = new ImageIcon("src\\FingerGuess\\jiandao.png");
    				ImageIcon icon3 = new ImageIcon("src\\FingerGuess\\bu.png");
    				ImageIcon icon4 = new ImageIcon("src\\FingerGuess\\clear.jpg");
    				icon1.setImage(icon1.getImage().getScaledInstance(40,40,0));//设置图片大小 ,适配按钮大小
    				icon2.setImage(icon2.getImage().getScaledInstance(40,40,0));
    				icon3.setImage(icon3.getImage().getScaledInstance(40,40,0));
    				icon4.setImage(icon4.getImage().getScaledInstance(40,40,0));
    				shitou.setText("");//修改按钮文本为空
    				jiandao.setText("");
    				bu.setText("");
    				clear.setText("");
    				shitou.setIcon(icon1);//给按钮添加图片
    				jiandao.setIcon(icon2);
    				bu.setIcon(icon3);
    				clear.setIcon(icon4);
    				//修改label 显示图形
    				flag = false;//修改flag 改变显示效果
    			}
    			if(e.getActionCommand().equals("文本显示")) {
    				shitou.setText("石头");
        			jiandao.setText("剪刀");
        			bu.setText("布");
        			clear.setText("清空");
        			shitou.setForeground(Color.black);
        			jiandao.setForeground(Color.black);
        			bu.setForeground(Color.black);
        			clear.setForeground(Color.black);
        			ImageIcon icon1 = new ImageIcon(" ");
        			
        			shitou.setIcon(icon1);
        			jiandao.setIcon(icon1);
        			bu.setIcon(icon1);
        			clear.setIcon(icon1);
        			//修改label 显示文本
        			flag = true;//修改flag 改变显示方式
        			label.setIcon(new ImageIcon(" "));//设置显示图片为空
        			label.setText("选择剪刀, 石头, 布开始游戏!");//设置文本显示文字
    			}
    			if(e.getActionCommand().equals("结束游戏")) {
    				System.exit(0);//退出
    			}
    			
        }
    }
	//主函数 测试
	public static void main(String[] args) {
			work11 frame = new work11();	//声明并实例化对象
			frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);     // 设置窗体关闭按钮
			frame.setVisible(true);                                  // 使窗体可见
		}
}
注:程序中使用的图片链接 链接:https://pan.baidu.com/s/1bVTNZ8MeZ3Ll4tnCuabJ7Q

提取码:4cl2
若失效 请私信我!

在代码中所用的图片我使用相对路径。大家把下载好的图片放到和java文件同一目录下即可。也可以使用绝对路径:加盘符哦!

  • 10
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值