【JavaFx】实现用手势表现石头剪刀布

本文仅供学习与复习使用,权当记录。本人是萌新一枚,打算用课程设计所做的JavaFx程序来试着撰写自己的第一篇博客,若有不足之处,还望指正。

Java课程设计题目2

选自教材《Java程序设计教程》P160的PP5.7题目

实验题目

编写一个和计算机交互的“石头-剪刀-布”游戏程序。当两个人玩的时候,每个人要同时选择一项(用手势表示),然后决出胜负。规则为石头赢剪刀,剪刀赢布,布赢石头。程序必须随机选取一项但不显示给玩家,然后提示用户选择。当用户选择后,程序同时显示出计算机和用户的选择并且输出游戏结果。游戏一直进行到用户退出为止,然后输出双方输赢的次数及和局的次数。

目录结构

算法思想与基本思路

本题目的要求由两个类实现,主驱动类RSP调用自己编写的一个面板类RSP_Pane,其中RSP的含义是由Rock(石头),Scissors(剪刀),Paper(布)这三个单词的首字母组合而成的。RSP类只有最基本的start方法和main方法,重心放在RSP_Pane类中。

RSP_Pane类扩展了GridPane类,首先定义了九个将要放进网格面板中的结点,以及一些计数用的数据,然后在构造方法中把这些结点实例化并添置进网格面板中并设置相关的监听事件,最后将监听事件分为三个函数,分别对应:①Rock,Scissors,Paper这三个按钮。②Stop按钮。③Restart按钮。

关于出拳的细节问题,电脑端的出拳完全由Random类的对象指定,是随机产生的,玩家端的出拳则是由Switch语句和if-else语句嵌套联系按钮监听事件产生的。

实验代码

MainApplication:

package Topic2;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class RSP extends Application {
    public void start(Stage primaryStage) {
        Scene scene = new Scene(new RSP_Pane(), 1200, 600);

        primaryStage.setTitle("RSP");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }

}

MainController:

package Topic2;

import java.util.Random;
import javafx.event.ActionEvent;
import javafx.geometry.HPos;
import javafx.scene.control.Button;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.GridPane;
import javafx.scene.text.Font;
import javafx.scene.text.Text;

public class RSP_Pane extends GridPane {
    int i = 0, j = 0, k = 0, l = 0;// i记录总局数,j记录玩家赢的局数,k记录玩家平局局数,l记录玩家输的局数//
    // 以下预先定义网格面板中的控件为全局变量,以便不同函数间方便控制变量//
    private Button Rock, Scissors, Paper, Stop, Restart;
    private Text computer, player;
    private ImageView PCImage, PlayerImage;

    public RSP_Pane() {
        Font font = new Font(40);// 初始化一个字体字号
        // 以下创建两个Image对象并分别放置到对应的ImageView中,变成结点类型,便于放置在网格面板中,功能是实现手势表示//
        Image PCResult = new Image("File:src/Image/Unknow.jpg");
        PCImage = new ImageView(PCResult);
        GridPane.setHalignment(PCImage, HPos.CENTER);
        Image PlayerResult = new Image("File:src/Image/Unknow.jpg");
        PlayerImage = new ImageView(PlayerResult);
        GridPane.setHalignment(PlayerImage, HPos.CENTER);
        // 注:以问号的图片初始化猜拳手势//

        // 以下创建五个按钮控件,其中三个为玩家的猜拳手势,另外两个控制游戏结束与重新开始//
        Rock = new Button("石头");
        Rock.setOnAction(this::processButtonPress);
        Rock.setFont(font);
        Scissors = new Button("剪刀");
        Scissors.setOnAction(this::processButtonPress);
        Scissors.setFont(font);
        Paper = new Button("布");
        Paper.setOnAction(this::processButtonPress);
        Paper.setFont(font);
        Stop = new Button("结束");
        Stop.setOnAction(this::processStopButton);
        Stop.setFont(font);
        Restart = new Button("重开");
        Restart.setOnAction(this::processRestartButton);
        Restart.setFont(font);

        // 以下创建两个文本,用于界面中区分电脑端与玩家端//
        computer = new Text("Computer:");
        GridPane.setHalignment(computer, HPos.RIGHT);
        computer.setFont(font);
        player = new Text("Player:");
        GridPane.setHalignment(player, HPos.LEFT);
        player.setFont(font);

        // 将九个控件放置在网格面板中//
        add(computer, 0, 0);
        add(Restart, 1, 0);
        add(player, 2, 0);
        add(PCImage, 0, 1);
        add(Stop, 1, 1);
        add(PlayerImage, 2, 1);
        add(Rock, 0, 2);
        add(Scissors, 1, 2);
        add(Paper, 2, 2);
        setHgap(150);
        setVgap(75);
    }

    public void processButtonPress(ActionEvent event) {
        Random rand = new Random();
        // 新建三个Image对象以表示三个猜拳手势//
        Image rockImage = new Image("File:src/Image/Rock.jpg");
        Image scissorsImage = new Image("File:src/Image/Scissors.jpg");
        Image paperImage = new Image("File:src/Image/Paper.jpg");

        // 0代表PC端出石头,1代表PC端出剪刀,2代表PC端出布//
        switch (rand.nextInt(3)) {
        case 0:// 0代表石头
            if (event.getSource() == Rock) {
                PCImage.setImage(rockImage);
                PlayerImage.setImage(rockImage);
                System.out.println("本局游戏平局!");
                k++;
            } else if (event.getSource() == Scissors) {
                PCImage.setImage(rockImage);
                PlayerImage.setImage(scissorsImage);
                System.out.println("本局游戏您输了,再接再厉!");
                l++;
            } else {
                PCImage.setImage(rockImage);
                PlayerImage.setImage(paperImage);
                System.out.println("本局游戏您赢了,太棒啦!");
                j++;
            }
            break;
        case 1:// 1代表剪刀
            if (event.getSource() == Rock) {
                PCImage.setImage(scissorsImage);
                PlayerImage.setImage(rockImage);
                System.out.println("本局游戏您赢了,太棒啦!");
                j++;
            } else if (event.getSource() == Scissors) {
                PCImage.setImage(scissorsImage);
                PlayerImage.setImage(scissorsImage);
                System.out.println("本局游戏平局!");
                k++;
            } else {
                PCImage.setImage(scissorsImage);
                PlayerImage.setImage(paperImage);
                System.out.println("本局游戏您输了,再接再厉!");
                l++;
            }
            break;
        case 2:// 2代表布
            if (event.getSource() == Rock) {
                PCImage.setImage(paperImage);
                PlayerImage.setImage(rockImage);
                System.out.println("本局游戏您输了,再接再厉!");
                l++;
            } else if (event.getSource() == Scissors) {
                PCImage.setImage(paperImage);
                PlayerImage.setImage(scissorsImage);
                System.out.println("本局游戏您赢了,太棒啦!");
                j++;
            } else {
                PCImage.setImage(paperImage);
                PlayerImage.setImage(paperImage);
                System.out.println("本局游戏平局!");
                k++;
            }
            break;
        }
        i++;
    }

    public void processStopButton(ActionEvent event) {
        if (event.getSource() == Stop)
            System.out.println("本次游戏共进行了" + i + "局,您赢了" + j + "局," + "输了" + l + "局," + "平局" + k + "次。");
    }

    public void processRestartButton(ActionEvent event) {
        System.out.println("已重新开始, 以下是新游戏:");
        i = 0;
        j = 0;
        k = 0;
        l = 0;
    }
}

实验运行结果

  • 初始界面

  • 进行游戏

  • 结束游戏

  • 重开游戏

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值