设计题目——石头剪刀布游戏
1.问题描述
用 JAVA 语言设计如下界面的石头剪刀布游戏。游戏的一方点击界面上石头、剪刀、布按钮,游戏的另一方计算机随机选择,然后给出游戏结果。
2.基本要求
按照下面给出的步骤设计石头剪刀布游戏,并完成以下工作:
- 在“//”后给出必要的注释;
- 为程序添加菜单;至少 2 个菜单:结果显示方式和关于游戏;结果显示方式菜单有 3 个菜单项:文本
显示、图形显示、结束游戏;实现菜单中的功能,自行搜索能体现石头、剪刀、布的图形或图片,用
这些图形或图片显示游戏结果。
注意: 加注释的代码直接在代码块中体现。不重复写了!
3.设计方案
1.定义work11方法 继承 JFrame 成为一个窗体。
2.在窗体中,声明 Jpanel JButton 组件
3.为每一个组件 注册事件监听器
4.在触发事件以后,给出事件处理机制。
4.功能模块划分
- GUI图形界面
- 事件处理机制
- 菜单栏选择结果显示
- 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文件同一目录下即可。也可以使用绝对路径:加盘符哦!