Java程序设计基础实验报告
班级:学号:姓名:
实验题目:猜拳小游戏
实验要求:
用java编写一个人机对战的猜拳小游戏。人选择性出拳,电脑随机出拳,判断输赢,记录输赢情况。有基本的UI界面。
实验内容:
1、问题分析过程:
实验针对java的具体应用,设计了猜拳小游戏。根据游戏的规则,玩家可以和电脑进行对战。
成学的主要功能是使用标准的JDK进行编译和运行。定义玩家自己选择性出拳,电脑随机出拳,赢的记10分,输的记0分,平局都记10分。
本程序设计了Game、Person、Player、等多个类,通过程序设定的规则来实现游戏。
(登陆界面)
(初始界面)
(游戏界面)
2、主要实现代码:
******************************
// LoginFrame
package com.hsj.client;
import javax.swing.SwingUtilities;
import java.awt.BorderLayout;
import javax.swing.JPanel;
import javax.swing.JFrame;
import javax.swing.JLabel;
import java.awt.Rectangle;
import javax.swing.JComboBox;
import javax.swing.JScrollPane;
import javax.swing.JButton;
import com.hsj.domain.Game;
/**
* 猜拳小游戏的登录界面
* @author hsj
* @version 1.0
*
*/
public class LoginFrame extends JFrame {
private static final long serialVersionUID = 1L;
/**
* JFrame窗体的内容面板
*/
private JPanel jContentPane = null;
/**
* 玩家登录提示的标签
*/
private JLabel jLabel_player_tip = null;
/*
* 进行玩家选择的组合框控件
*/
private JComboBox jComboBox_player_list = null;
/**
* 为了美化组合框控件而拖出来的滚动面板控件
*/
private JScrollPane jScrollPane_player_list = null;
/**
* 玩家登录的按钮
*/
private JButton jButton_login = null;
/**
* 玩家退出的按钮
*/
private JButton jButton_close = null;
/**
* 通过这个方法进行实例化组合框控件
*
* @return javax.swing.JComboBox
*/
private JComboBox getJComboBox_player_list() {
if (jComboBox_player_list == null) {
//实例化组合框控件,并给组合框控件赋值
jComboBox_player_list = new JComboBox(Game.playerNames);
//指定默认处于选中状态的索引
jComboBox_player_list.setSelectedIndex(0);
}
return jComboBox_player_list;
}
/**
* 实例化滚动面板
*
* @return javax.swing.JScrollPane
*/
private JScrollPane getJScrollPane_player_list() {
if (jScrollPane_player_list == null) {
//实例化滚动面板
jScrollPane_player_list = new JScrollPane();
//设置面板的大小
jScrollPane_player_list.setBounds(new Rectangle(142, 33, 130, 30));
//在滚动面板上添加组合框控件
jScrollPane_player_list.setViewportView(getJComboBox_player_list());
}
return jScrollPane_player_list;
}
/**
* 实例化登录按钮
*
* @return javax.swing.JButton
*/
private JButton getJButton_login() {
if (jButton_login == null) {
jButton_login = new JButton();
jButton_login.setBounds(new Rectangle(56, 89, 93, 21));
//设置按钮的显示文本
jButton_login.setText("玩家登录");
//给登录按钮注册事件监听器,完成登录功能
jButton_login.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
//得到玩家列表的组合框控件
JComboBox playerList_combox=getJComboBox_player_list();
//得到用户选择的玩家名字
String playerName=playerList_combox.getSelectedItem().toString();
System.out.println("LoginFrame.playerName="+playerName);
//弹出提示窗口的快捷键:alt+?
MainFrame mainFrame=new MainFrame(playerName);
mainFrame.setVisible(true);
dispose();//关闭当前登录窗口
}
});
}
return jButton_login;
}
/**
* 实例化关闭按钮
*
* @return javax.swing.JButton
*/
private JButton getJButton_close() {
if (jButton_close == null) {
jButton_close = new JButton();
jButton_close.setBounds(new Rectangle(157, 89, 101, 24));
jButton_close.setText("玩家取消");
//给关闭按钮注册事件监听器,完成关闭窗口的功能
jButton_close.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent e) {
//关闭当前窗口
dispose();//销毁当前窗口
}
});
}
return jButton_close;
}
/**
* 程序的入口点
* @param args
*/
public static void main(String[] args) {
//当前程序启动时,会自动创建主线程
System.out.println("main begin:");
//得到当前线程的名字
System.out.println("main:"+Thread.currentThread().getName());
//启动一个AWT线程进行干活,在AWT线程干活的同时,main可以继续干自己的活
SwingUtilities.invokeLater(new Runnable() {
public void run() {
System.out.println("run:"+Thread.currentThread().getName());
//实例化LoginFrame窗体对象
LoginFrame thisClass = new LoginFrame();
//当用户单击窗体上的关闭按钮时退出程序
thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//将当前窗体设为可见
thisClass.setVisible(true);
}
});
System.out.println("main end");
}
/**
* 无参构造:
* 1.构造函数的特点:
* A:函数名和类名相同
* B:函数没有返回类型,即使void也不行
* 2.构造函数什么时候被执行:在用户实例化对象时编译器自动调用的,用户无法调用
* 3.构造函数完成什么样的工作:在用户实例化对象时完成实例变量(被static的变量)的初始化工作
*
*/
public LoginFrame() {
//显示调用父类的无参构造,不写的话,编译器会自动加上
super();
/**
* 完成组件的初始化
*/
initialize();
}
/**
* This method initializes this
*
* @return void
*/
private void initialize() {
//指定窗口的宽度和高度
this.setSize(300, 200);
//将内容面板添加到JFrame窗体上
this.setContentPane(getJContentPane());
//修改窗体的标题
this.setTitle("猜拳小游戏");
//让窗口居中显示
this.setLocationRelativeTo(null);
}
/**
* This method initializes jContentPane
*
* @return javax.swing.JPanel
*/
private JPanel getJContentPane() {
if (jContentPane == null) {
jLabel_player_tip = new JLabel();
jLabel_player_tip.setBounds(new Rectangle(49, 36, 86, 17));
jLabel_player_tip.setText("请选择玩家:");
//实例化内容面板
jContentPane = new JPanel();
//将内容面板的布局指定为null,表示当前窗体不使用任何的布局管理
jContentPane.setLayout(null);
//将玩家提示的JLabel组件添加到内容面板上
jContentPane.add(jLabel_player_tip, null);
//将滚动面板添加到内容面板(包含选择玩家的组合框控件)上
jContentPane.add(getJScrollPane_player_list(), null);
//将登录按钮添加到内容面板上
jContentPane.add(getJButton_login(), null);
//将关闭按钮添加到内容面板上s
jContentPane.add(getJButton_close(), null);
}
return jContentPane;
}
}
// LoginWindow.java
package com.hsj.client;
import javax.swing.SwingUtilities;
import java.awt.BorderLayout;
import javax.swing.JPanel;
import javax.swing.JFrame;
import https://www.wendangku.net/doc/3712209766.html,monOpe;
import com.hsj.domain.Game;
import javax.swing.JLabel;
import java.awt.Rectangle;
import javax.swing.JComboBox;
import javax.swing.JTextPane;
import javax.swing.JScrollPane;
import javax.swing.JButton;
public class LoginWindow extends JFrame {
private static final long serialVersionUID = 1L;
private JPanel jContentPane = null;
private JLabel jLabel_select_player = null;
private JComboBox jComboBox_player = null;
private JScrollPane jScrollPane_player = null;
private JButton jButton_login = null;
private JButton jButton_cancel = null;
/**
* This method initializes jComboBox_player
*
* @return javax.swing.JComboBox
*/
private JComboBox getJComboBox_player() {
if (jComboBox_player == null) {
jComboBox_player = new JComboBox();
//给组合框赋值
for(int i=0;i jComboBox_player.addItem(Game.playerNames[i]); } } return jComboBox_player; } /** * This method initializes jScrollPane_player * * @return javax.swing.JScrollPane */ private JScrollPane getJScrollPane_player() { if (jScrollPane_player == null) { jScrollPane_player = new JScrollPane(); jScrollPane_player.setBounds(new Rectangle(140, 25, 144, 23)); jScrollPane_player.setViewportView(getJComboBox_player()); } return jScrollPane_player; } /** * This method initializes jButton_login * @return javax.swing.JButton */ private JButton getJButton_login() { if (jButton_login == null) { jButton_login = new JButton(); jButton_login.setBounds(new Rectangle(77, 71, 101, 25)); jButton_login.setText("玩家登录"); //给登录按钮注册监听事件 jButton_login.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent e) { openMainWindow(); } }); } return jButton_login; } /** * 打开主窗口 */ private void openMainWindow() { //得到选手列表的索引 int player_index=jComboBox_player.getSelectedIndex(); //根据选手列表的索引创建主窗体 MainFrame mainWindow=new MainFrame(player_index); CommonOpe.initFrame(mainWindow); this.dispose();//销毁当前登录窗口 } /** * This method initializes jButton_cancel * * @return javax.swing.JButton private JButton getJButton_cancel() { if (jButton_cancel == null) { jButton_cancel = new JButton(); jButton_cancel.setBounds(new Rectangle(210, 71, 101, 25)); jButton_cancel.setText("取消登录"); //给取消按钮注册监听事件 jButton_cancel.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent e) { dispose();//销毁当前窗口 } }); } return jButton_cancel; } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub SwingUtilities.invokeLater(new Runnable() { public void run() { LoginWindow thisClass = new LoginWindow(); thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); CommonOpe.initFrame(thisClass); } }); } /** * This is the default constructor */ public LoginWindow() { super(); initialize(); } /** * This method initializes this * * @return void */ private void initialize() { this.setBounds(100, 100, 384, 163); this.setContentPane(getJContentPane()); this.setTitle("猜拳游戏"); } /** * This method initializes jContentPane * * @return javax.swing.JPanel */ private JPanel getJContentPane() { if (jContentPane == null) { jLabel_select_player = new JLabel(); jLabel_select_player.setBounds(new Rectangle(67, 29, 67, 15)); jLabel_select_player.setText("选择玩家"); jContentPane = new JPanel(); //不使用布局管理器 jContentPane.setLayout(null); jContentPane.add(jLabel_select_player, null); jContentPane.add(getJScrollPane_player(), null); jContentPane.add(getJButton_login(), null); jContentPane.add(getJButton_cancel(), null); } return jContentPane; } } // CommonOpe.java package https://www.wendangku.net/doc/3712209766.html,mon; import java.awt.Dimension; import java.awt.Toolkit; import javax.swing.JFrame; /** * 通过操作的类 * @author hsj * @version 1.0 * */ public class CommonOpe { /** * 初始化JFrame窗体对象 * @param frame JFrame窗体对象 */ public static void initFrame(JFrame frame){ //获得窗口大小的Dimension对象,这个对象封装了对象组件的宽和高 Dimension frameSize=frame.getSize(); //获取电脑屏幕大小的Dimension对象 Dimension screenSize=Toolkit.getDefaultToolkit().getScreenSize(); //如果窗口的宽度超出屏幕的宽度,则让窗口的宽度等于屏幕的宽度,防止超屏 if(frameSize.width>screenSize.width){ frameSize.width=screenSize.width; } //如果窗口的高度超出屏幕的高度,则让窗口的高度等于屏幕的高度,防止超屏 if(frameSize.height>screenSize.height){ frameSize.height=screenSize.height; } //设置窗口的位置 frame.setLocation((screenSize.width-frameSize.width)/2,(screenSize.height-frameSize.hei ght)/2); //让窗口大小不能改变 frame.setResizable(false); //使窗口可见 frame.setVisible(true); } } // Game.java package com.hsj.domain; import https://www.wendangku.net/doc/3712209766.html,.URL; import java.util.Random; import javax.swing.ImageIcon; public class Game { public static boolean isBegin; /** * 猜拳次数统计 */ public static int count; /** * 游戏标题 */ public static final String gameTitle="猜拳游戏"; /** * 选手列表 */ public static final String[] playerNames={"QQ","帅哥","美妹"}; /** * 选手头像图片路径 */ public static String[][] player_header_image={ {"/img/tou.gif","/img/win.gif","/img/tie.gif","/img/lost.gif"}, {"/img/tou1.gif","/img/win1.gif","/img/tie1.gif","/img/lost1.gif"}, {"/img/tou2.gif","/img/win2.gif","/img/tie2.gif","/img/lost2.gif"} }; /** * 出拳图片路径 */ public static String[] morra_image={"/img/jiandao.jpg","/img/shitou.jpg","/img/bu.jpg",""}; /** * 根据选手列表索引创建用户选手对象 * @param img_index * @return */ public static Player getUserPlayer(int img_index){ //false:表示是用户选手玩家,true:电脑玩家 Player player=new Player(playerNames[img_index],false); return player; } /** * * 创建电脑玩家 * @return 电脑玩家 */ public static Player getComputerPlayer(){ Player player=new Player("电脑",true); return player; } /** * 得到电脑出拳的图片索引 * @return 电脑出拳的图片索引 */ public static int getComputerMorraIndex(){ Random random=new Random(); //随机生成0,1,2,不包括3 int morra_index=random.nextInt(3); return morra_index; } /** * 根据索引得到出拳图片 * @param index 索引 * @return 出拳图片对象 */ public ImageIcon getMorraIcon(int index){ URL url=getClass().getResource(this.morra_image[index]); return new ImageIcon(url); } /** * 根据选手索引的猜拳状态创建ImageIcon对象 * @param player_index 选手索引 * @param state 猜拳状态,0:初始状态,1:赢状态;2:平局;3:输状态 * @return ImageIcon对象 */ public ImageIcon getPlayerIcon(int player_index,int state){ URL url=getClass().getResource(this.player_header_image[player_index][state]); return new ImageIcon(url); } public static String getResult(Player userPlayer,Player computerPlayer){ count++; int differ=userPlayer.getMorra_index()-computerPlayer.getMorra_index(); int state=0;//初始状态 String message="";//猜拳结果字符串 if(differ==0){ message="嘿,算你运气好,再来!"; state=2;//平局 userPlayer.setScore(userPlayer.getScore()+10); computerPlayer.setScore(computerPlayer.getScore()+10); /** * 剪刀 0 * 石头 1 * 布 2 * * 输的状态表示:结果=用户索引-电脑索引 * -1=0-1 * -1=1-2 * * 2=2-0 */ }else if(differ==-1 || differ==2){ message="输了,运气太差了,再来!"; state=3;//输了 computerPlayer.setScore(computerPlayer.getScore()+10); /** * 剪刀 0 * 石头 1 * 布 2 * * 输的状态表示:结果=用户索引-电脑索引 * 1=2-1 * 1=1-0 * -2=0-2 */ }else if(differ==1 || differ==-2){ message="赢了,恭喜你!"; state=1;//表示赢了 userPlayer.setScore(userPlayer.getScore()+10); } userPlayer.setState(state);//设置用户状态 return message; } } // MainFrame.java package com.hsj.client; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Font; import javax.swing.DebugGraphics; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.SwingConstants; import com.hsj.domain.Game; import com.hsj.domain.Player; import java.awt.Rectangle; import java.awt.GridBagLayout; import javax.swing.JLabel; import javax.swing.JButton; public class MainFrame extends JFrame { private static final long serialVersionUID = 1L; private JPanel jContentPane = null; /** * 用户选手对象 */ private Player userPlayer; /** * 电脑选手对象 private Player computerPlayer; /** * 猜拳结果字符串 */ private String message; private JPanel jPanel_Left = null; private JLabel jLabel_computer_tip = null; private JLabel jLabel_computer_morra = null; private JLabel jLabel_message = null; private JLabel jLabel_userMorra = null; private JLabel jLabel_user_morra_tip = null; private JButton jButton_begin = null; private JButton jButton_end = null; /** * 初始玩家图片索引 */ private int img_index; private JLabel jLabel_header_img = null; private JLabel jLabel_computerScoreTip = null; private JLabel jLabel_userScoreTip = null; private JPanel jPanel_computerScore = null; private JPanel jPanel_userScore = null; private JLabel jLabel_computerScore = null; private JLabel jLabel_userScore = null; private JLabel jLabel_bureau = null; private JLabel jLabel_first_tip = null; private JLabel jLabel_last_bureau = null; private JLabel jLabel_morra = null; private JButton jButton_forfex = null; private JButton jButton_stone = null; private JButton jButton_cloth = null;