文档库 最新最全的文档下载
当前位置:文档库 › 人机猜拳小游戏

人机猜拳小游戏

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;

相关文档