Java程序设计2023-第四次上机练习

8-1 三子棋

编写程序,实现简单的三子棋游戏。在三子棋中,双方在3×3的棋盘中轮流下棋,一方用*示,另一方用O表示。如果一方的3个棋子占据了同一行,同一列或者对角线,则该方获胜。如果棋盘已被棋子占满,但没有一方获胜则出现平局。在程序中,一方为用户,用户在界面上输入每次下棋的位置;另一方下棋的位置为随机自动生成。示例界面如图所示。

提示:(1) 采用Scanner类或者JOptionPane类中提供的方法输入,输出采用System.out中的方法或JOptionPane类提供的方法。
(2) 字符串处理可以使用String或StringBuffer类。

这里因为最大只有九步,所以可以用一个三维数组来储存所有的步数,方便撤销

import java.util.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

class Game extends JFrame{
    private JButton sendBtn;
    private JButton backBtn;
    private JTextField inputField;
    char[][][] map = new char[10][][];
    int step = 0;

    public Game(){
        Random rd = new Random();
        sendBtn = new JButton("确定");
        sendBtn.setBorderPainted(true);
        backBtn = new JButton("撤销");
        backBtn.setBorderPainted(true);
        inputField = new JTextField(10);
        map[0] = new char[][] { {'0', '1', '2'}, {'3', '4', '5'}, {'6', '7', '8'} };
        JPanel boardPanel = new JPanel();

        JPanel inputPanel = new JPanel();
        inputPanel.add(inputField);
        inputPanel.add(sendBtn);
        inputPanel.add(backBtn);
        inputPanel.setBackground(new Color(10,10,10));
        String s = "";
        s+="<html> -------------- <br>";
        s+="|  " + map[step][0][0] + "  |  " + map[step][0][1] + "  |  " + map[step][0][2] + "  |" + "<br>";
        s+=" -------------- <br>";
        s+="|  " + map[step][1][0] + "  |  " + map[step][1][1] + "  |  " + map[step][1][2] + "  |" + "<br>";
        s+=" -------------- <br>";
        s+="|  " + map[step][2][0] + "  |  " + map[step][2][1] + "  |  " + map[step][2][2] + "  |" + "<br>";
        s+=" -------------- <br>";

        JLabel label = new JLabel(s);
        boardPanel.add(label);

        sendBtn.addActionListener(new ActionListener() {

            //判断对局情况
            public int judge(){
                //colum
                for(int i=0;i<=2;i++){
                    if(map[step][i][0] == '*' && map[step][i][1] == '*' && map[step][i][2] == '*'){
                        return 1;
                    }
                    if(map[step][i][0] == 'O' && map[step][i][1] == 'O' && map[step][i][2] == 'O'){
                        return -1;
                    }
                    if(map[step][0][i] == '*' && map[step][1][i] == '*' && map[step][2][i] == '*'){
                        return 1;
                    }
                    if(map[step][0][i] == 'O' && map[step][1][i] == 'O' && map[step][2][i] == 'O'){
                        return -1;
                    }
                }
                if(map[step][0][0] == map[step][1][1] && map[step][2][2] == map[step][1][1] && map[step][1][1] == '*'){
                    return 1;
                }
                if(map[step][0][0] == map[step][1][1] && map[step][2][2] == map[step][1][1] && map[step][1][1] == 'O'){
                    return -1;
                }
                if(map[step][0][2] == map[step][1][1] && map[step][2][0] == map[step][1][1] && map[step][1][1] == '*'){
                    return 1;
                }
                if(map[step][0][2] == map[step][1][1] && map[step][2][0] == map[step][1][1] && map[step][1][1] == 'O'){
                    return -1;
                }
                return 0;
            }


            //获取新游戏面板
            public String update(){
                String s = "";
                s+="<html> -------------- <br>" ;
                s+="|  " + map[step][0][0] + "  |  " + map[step][0][1] + "  |  " + map[step][0][2] + "  |" + "<br>";
                s+=" -------------- <br>";
                s+="|  " + map[step][1][0] + "  |  " + map[step][1][1] + "  |  " + map[step][1][2] + "  |" + "<br>";
                s+=" -------------- <br>";
                s+="|  " + map[step][2][0] + "  |  " + map[step][2][1] + "  |  " + map[step][2][2] + "  |" + "<br>";
                s+=" -------------- <br>";
                return s;
            }

            @Override
            public void actionPerformed(ActionEvent e) {
                //输入坐标
                int position;
                int x;
                int y;
                try{
                    position = Integer.parseInt(inputField.getText());
                    x = position/3;
                    y = position%3;
                }catch(Exception err){
                    JOptionPane.showMessageDialog(null, "请输入数字");
                    return ;
                }
                

                //检查合法
                if(position >= 9 || position < 0){
                    JOptionPane.showMessageDialog(null, "别乱输入数字");
                    inputField.setText("");
                    return ;
                }
                if(map[step][x][y] == '*' || map[step][x][y] == 'O' ){
                    JOptionPane.showMessageDialog(null, "这里已经下过了嗷");
                    inputField.setText("");
                    return ;
                }  

                //更新游戏数据
                step++;
                map[step] = new char[3][];
                for(int i=0;i<=2;i++){
                    map[step][i] = Arrays.copyOf(map[step-1][i],map[step-1][i].length);
                }
                map[step][x][y] = '*';
                int robt = rd.nextInt(9);
                while(map[step][robt/3][robt%3] == '*' || map[step][robt/3][robt%3] == 'O'){
                    robt++;
                    robt%=9;
                    if(step == 5){
                        break;
                    }
                }
                if(step != 5){
                    map[step][robt/3][robt%3] = 'O';
                }

                //更新游戏面板
                inputField.setText("");
                boardPanel.removeAll();
                JLabel label = new JLabel(update()) ;
                boardPanel.add(label);
                boardPanel.updateUI();

                //判断对局情况 
                if(judge() == 1){
                    JOptionPane.showMessageDialog(null, "大聪明,你赢了");
                    return ;
                }
                if(judge() == -1){
                    JOptionPane.showMessageDialog(null, "机器人都打不过?");
                    return ;
                }
                if(step == 5){
                    JOptionPane.showMessageDialog(null, "平局");
                }
            }
        });


        backBtn.addActionListener(new ActionListener() {
            //获取新游戏面板
            public String update(){
                String s = "";
                s+="<html> -------------- <br>" ;
                s+="|  " + map[step][0][0] + "  |  " + map[step][0][1] + "  |  " + map[step][0][2] + "  |" + "<br>";
                s+=" -------------- <br>";
                s+="|  " + map[step][1][0] + "  |  " + map[step][1][1] + "  |  " + map[step][1][2] + "  |" + "<br>";
                s+=" -------------- <br>";
                s+="|  " + map[step][2][0] + "  |  " + map[step][2][1] + "  |  " + map[step][2][2] + "  |" + "<br>";
                s+=" -------------- <br>";
                return s;
            }

            @Override
            public void actionPerformed(ActionEvent e) {
                if(step == 0){
                    JOptionPane.showMessageDialog(null, "还点??");
                    return;
                }
                --step;  
                boardPanel.removeAll();
                JLabel label = new JLabel(update());
                boardPanel.add(label);
                boardPanel.updateUI();
            }
        });

        this.add(inputPanel,BorderLayout.SOUTH);
        this.add(boardPanel,BorderLayout.NORTH);
        this.setTitle("三子棋");
        this.setSize(280,220);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLocationRelativeTo(null);
        this.setVisible(true);
    }
}

public class Main{
    public static void main(String[] args){  
        new Game();
    }
}

 8-3 绘制随机图形

定义4个类,MyShape、MyLine、MyRectangle和MyOval,其中MyShape是其他三个类的父类。MyShape为抽象类,包括图形位置的四个坐标;一个无参的构造方法,将所有的坐标设置为0;一个带参的构造函数,将所有的坐标设置为相应值;每个坐标的设置和读取方法;abstract void draw(Graphics g)方法。MyLine类负责画直线,实现父类的draw方法;MyRectangle负责画矩形,实现父类的draw方法;MyOval负责画椭圆,实现父类的draw方法。编写一个应用程序,使用上面定义的类,随机选取位置和形状,绘制20个图形。示例输出如图所示。

2.png

提示:可以使用ArrayList来保存要绘制的多个图形。

import javax.swing.*;
import java.util.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

abstract class MyShape{
	int x = 0;
	int y = 0;
	int z = 0;
	int k = 0;

	public MyShape(){
		;
	}

	public abstract void draw(Graphics g);
}

class MyLine extends MyShape{
	Random rd = new Random();

	@Override
	public void draw(Graphics g){
		g.drawLine(x,y,z,k);
	}

	public MyLine(){
		int _x = rd.nextInt(200);
		int _y = rd.nextInt(200);
		int _z = rd.nextInt(200);
		int _k = rd.nextInt(200);

		x = _x;
		y = _y;
		z = _z;
		k = _k;

	}
}

class MyRectangle extends MyShape{
	Random rd = new Random();

	@Override
	public void draw(Graphics g){
		g.drawRect(x,y,z,k);
	}

	public MyRectangle(){
		int _x = rd.nextInt(200);
		int _y = rd.nextInt(200);
		int _z = rd.nextInt(200);
		int _k = rd.nextInt(200);

		x = _x;
		y = _y;
		z = _z;
		k = _k;
	}
}

class MyOval extends MyShape{
	Random rd = new Random();
	
	@Override
	public void draw(Graphics g){
		g.drawOval(x,y,z,k);
	}

	public MyOval(){
		int _x = rd.nextInt(200);
		int _y = rd.nextInt(200);
		int _z = rd.nextInt(200);
		int _k = rd.nextInt(200);

		x = _x;
		y = _y;
		z = _z;
		k = _k;
	}
}

class DrawComponent extends JComponent
{
	@Override
	public void paintComponent(Graphics g)
	{
		for(int i=0;i<20;i++) {
			if(i<6) {
				MyOval mo = new MyOval();
				mo.draw(g);
			}
			else if(i<12) {
				MyRectangle mr = new MyRectangle();
				mr.draw(g);
			}
			else {
				MyLine ml = new MyLine();
				ml.draw(g);
			}
		}
	}
}


class Game extends JFrame{
	Random rd = new Random();

	public Game(){
		this.add(new DrawComponent());
		this.setSize(600,600);
		this.setTitle("Graphics");
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLocationRelativeTo(null);
        this.setVisible(true);
	}
}

public class Main1{
	public static void main(String [] args){
		new Game();
	}
}

 8-4 猜数游戏

编写一个猜数程序,该程序随机在1到1000的范围中选择一个供用户猜测的整数。界面上提供一个文本框来接收用户输入的猜测的数,如果用户猜得太大,则背景变为红色,如果猜得太小,背景变为蓝色。用户猜对后,文本框变为不可编辑,同时提示用户猜对了。界面上提供一个按钮,使用户可以重新开始这个游戏。在界面上还需显示用户猜测的次数。示例输出如图所示。

3.png

实验步骤:

(1) 定义继承自JFrame的类,在该类中添加界面各部分;

(2) 定义事件监听器类完成事件处理;

(3) 定义一个包含main方法的测试类,在该类中创建框架类对象,并显示。

实验提示:

(1) 使用面板进行页面布局;

(2) 可以使用内部类定义事件监听器类;

(3) 按钮点击通过处理ActionEvent事件来完成响应。

import java.util.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

class Game extends JFrame{
	private JButton sendBtn;
    private JButton restartBtn;
    private JButton quitBtn;
    private JTextField inputField;
    int num;


    public Game(){
    	Random rd = new Random();
    	this.num = rd.nextInt(1000);

    	//options
    	JPanel optionPanel = new JPanel();
    	sendBtn = new JButton("send");
    	restartBtn = new JButton("restart");
    	quitBtn = new JButton("quit");
    	optionPanel.add(sendBtn);
    	optionPanel.add(restartBtn);
    	optionPanel.add(quitBtn);

    	//enter
    	JPanel inputPanel = new JPanel();
    	inputField = new JTextField(10);
    	JLabel label = new JLabel("please enter a num :");
    	inputPanel.add(label);
    	inputPanel.add(inputField);

    	//sendBtn
    	sendBtn.addActionListener(new ActionListener() {
    		@Override
            public void actionPerformed(ActionEvent e) {
            	//enter num
            	int get;
                try{
                    get = Integer.parseInt(inputField.getText());
                }catch(Exception err){
                    JOptionPane.showMessageDialog(null, "please enter Number");
                    return ;
                }

                if(get > num){
                	JOptionPane.showMessageDialog(null, "bigger");
                    return ;
                }
                if(get < num){
                	JOptionPane.showMessageDialog(null, "smaller");
                    return ;
                }
                if(get == num){
                	JOptionPane.showMessageDialog(null, "correct");
                    return ;
                }
            }
    	});

    	restartBtn.addActionListener(new ActionListener() {
    		public void actionPerformed(ActionEvent e) {
    			num = rd.nextInt(1000);
    			JOptionPane.showMessageDialog(null, "done!");
    		}
    	});

    	quitBtn.addActionListener(new ActionListener(){
    		public void actionPerformed(ActionEvent e) {
    			System.exit(0);
    		}
    	});

    	//system
    	this.add(optionPanel,BorderLayout.SOUTH);
        this.add(inputPanel,BorderLayout.CENTER);
        this.setTitle("guess");
        this.setSize(280,220);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLocationRelativeTo(null);
        this.setVisible(true);
    }
}

public class Main2{
	public static void main(String [] args){
		new Game();
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/117229.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

设置DevC++支持c++11标准

1.点击编译选项 2. 设置语言标准 3.点击确认 4.测试代码 使用auto成功 测试&#xff01;

【漏洞复现】Apache_HTTPD_多后缀解析漏洞

感谢互联网提供分享知识与智慧&#xff0c;在法治的社会里&#xff0c;请遵守有关法律法规 文章目录 1.1、漏洞描述1.2、漏洞复现1、基础环境2、漏洞验证 1.3、深度利用GetShell 1.4、修复建议 1.1、漏洞描述 Apache HTTPD 支持一个文件拥有多个后缀&#xff0c;并为不同后缀执…

统计学习方法 条件随机场

文章目录 统计学习方法 条件随机场随机场马尔可夫随机场定义因子分解 条件随机场定义参数化形式简化形式矩阵形式 概率预测问题前向-后向算法概率的计算期望值的计算 学习问题改进的迭代尺度法拟牛顿法 解码问题 统计学习方法 条件随机场 学习李航的《统计学习方法》时&#x…

STM32 IAP应用开发--bootloader升级程序

STM32 IAP应用开发--bootloader升级程序 Chapter1 STM32 IAP应用开发——通过串口/RS485实现固件升级&#xff08;方式2&#xff09;前言什么是IAP&#xff1f;什么是BootLoader&#xff1f; 方案介绍&#xff1a;1&#xff09;bootloader部分&#xff1a;2&#xff09;APP部分…

基于单片机的胎压监测系统的设计

收藏和点赞&#xff0c;您的关注是我创作的动力 文章目录 概要 一、系统整体设计方案二、 系统设计4.1 主流程图 三 系统仿真5.1 系统仿真调试实物 四、 结论 概要 本文以STC89C52单片机为控制核心&#xff0c;通过气压传感器模块对汽车各轮胎的胎压进行实时数据的采集与处理&…

【数据结构】树与二叉树(二):树的表示C语言:树形表示法、嵌套集合表示法、嵌套括号表示法 、凹入表示法

文章目录 5.1 树的基本概念5.1.1 树的定义5.1.2 森林的定义5.1.3 树的术语5.1.4 树的表示1&#xff0e;树形表示法2&#xff0e;嵌套集合表示法结构体创建树主函数 3&#xff0e;嵌套括号表示法结构体创建树嵌套括号表示法主函数 4&#xff0e;凹入表示法结构体创建树凹入表示法…

IDEA 设置代码注释模板

功能简介&#xff1a; 每次看别人代码时&#xff0c;面对毫无注释的类&#xff0c;除了头大还是头大&#xff0c; 以下提供了一种代码类注释模板 新建java类的时候&#xff0c;自动增加类注释&#xff0c;养成代码开发好习惯 效果展示&#xff1a; 代码模板&#xff1a; #if (…

多媒体应用设计师 2023年(含答案回忆版)

以下是小红书上的回忆版 软考考完疯狂回忆&#xff0c;多媒体应用设计师选择题 1.pattern 2.effective 3.merge 4.applications 5.graphic 6.udp 7.rtp 8.rtsp 9.10cm 10.永久 11…97 12.工作技术管理标准 13.管理型元数据 14.premiere 15.wave 16.500km/h 17.3M 18.44000 19.…

Capto2024专为Mac电脑设计的屏幕录制和视频编辑软件

不得不说视频编辑功能&#xff1a;Capto提供了多种视频编辑功能&#xff0c;例如剪辑、旋转、裁剪、调整音频和视频的音量、加入水印、添加注释等&#xff0c;你能够使用Capto编辑你的视频&#xff0c;使之更加专业和生动。有目共睹的是录制完成后&#xff0c;你能够使用Capto提…

深入理解WPF中的依赖注入和控制反转

在WPF开发中&#xff0c;依赖注入&#xff08;Dependency Injection&#xff09;和控制反转&#xff08;Inversion of Control&#xff09;是程序解耦的关键&#xff0c;在当今软件工程中占有举足轻重的地位&#xff0c;两者之间有着密不可分的联系。今天就以一个简单的小例子&…

Paddle炼丹炉炸了Unexpected BUS error encountered in DataLoader worker

Paddle训练报错&#xff0c;内存不足 python train.py -c config/ResNet_W18.yaml修改配置文件config/ResNet_W18.yaml # 原配置 loader:num_workers: 4use_shared_memory: True# 修改后 loader:num_workers: 2use_shared_memory: False

数据分析实战 | 关联规则分析——购物车分析

目录 一、数据及分析对象 二、目的及分析任务 三、方法及工具 四、数据读入 五、数据理解 六、数据预处理 七、生成频繁项集 八、计算关联度 九、可视化 一、数据及分析对象 数据集链接&#xff1a;Online Retail.xlsx 该数据集记录了2010年12月01日至2011年12月09日…

ChinaSoft 论坛巡礼 | 安全攸关软件的智能化开发方法论坛

2023年CCF中国软件大会&#xff08;CCF ChinaSoft 2023&#xff09;由CCF主办&#xff0c;CCF系统软件专委会、形式化方法专委会、软件工程专委会以及复旦大学联合承办&#xff0c;将于2023年12月1-3日在上海国际会议中心举行。 本次大会主题是“智能化软件创新推动数字经济与社…

贝锐向日葵亮相阿里云“云栖大会”:独创专利算法赋能全新云桌面

2023年10月31日-11月2日&#xff0c;一年一度的云栖大会如期举办&#xff0c;国产远程连接服务创领者贝锐受邀参与。活动现场&#xff0c;贝锐CTO张小峰进行了分享&#xff0c;宣布贝锐旗下国民级远程控制品牌“贝锐向日葵”与无影展开合作&#xff0c;同时全新的“云桌面”将于…

Docker 学习路线 4:Docker 基础知识

Docker是一个平台&#xff0c;简化了在轻量、可移植的容器中构建、打包和部署应用程序的过程。在本节中&#xff0c;我们将介绍Docker的基础知识、其组件以及您需要开始使用的关键命令。 容器是什么&#xff1f; 容器是一个轻量级、独立的可执行软件包&#xff0c;包含运行应…

数据结构--前缀树(Trie)

1. 简介 前缀树是一种数据结构&#xff0c;常用来字符搜索。 2. 实现 包含的操作主要是: 加入串搜索串 代码实现&#xff0c;直接用leetcode_208的题解咯。 代码 class Trie { public:Trie():isEnd(false){for ( int i 0; i < 26;i)child[i] nullptr;}~Trie() {fo…

python强大的hook函数

什么是hook&#xff1f; 钩子函数&#xff08;hook function&#xff09;&#xff0c;可以理解是一个挂钩&#xff0c;作用是有需要的时候挂一个东西上去。具体的解释是&#xff1a;钩子函数是把我们自己实现的hook函数在某一时刻挂接到目标挂载点上。 hook应用场景&#xff…

Java连接Redis并操作Redis中的常见数据类型

目录 一. Java连接Redis 1. 导入依赖 2. 建立连接 二. Java操作Redis的常见数据类型存储 1. Redis字符串(String) 2. Redis哈希(Hash) 3. Redis列表&#xff08;List&#xff09; 4. Redis集合&#xff08;Set&#xff09; 一. Java连接Redis 1. 导入依赖 pom依赖…

Unity中Shader的GI的间接光实现

文章目录 前言一、GI中 间接光照的实现1、看Unity的源码可知&#xff0c;在计算GI的间接光照时&#xff0c;最主要的实现是在UnityGI_Base函数中 二、分析 UnityGI_Base 中实现的功能1、ResetUnityGI的作用2、第一个#if中实现的功能&#xff1a;计算在Distance Shadowmask 中实…

【PC电脑windows-学习样例tusb_serial_device-ESP32的USB模拟串口程序+VScode建立工程+usb组件添加+-基础样例学习】

【PC电脑windows-学习样例tusb_serial_device-ESP32的USB模拟串口程序-基础样例学习】 1、概述2、实验环境3-1、 物品说明3-2、所遇问题&#xff1a;ESP32 cannot open source file "tinyusb.h"或者“tinyusb.h:No such file or directory ....”3-3、解决问题&#…