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

news2024/11/20 21:37:15

8-1三子棋

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

参考代码 有所修改

import java.util.Random;
import javax.swing.*;
class CheckerBoard{
    static final Integer BOUNDARY = 3;
    char[][] board;
    int count;
    int[] route;
    boolean firstPlayer;
    public CheckerBoard() {
        count = 0;
        int num = 1;
        route = new int[10];
        board = new char[5][5];
        for(int i = 1; i <= BOUNDARY; i++){
            for(int j = 1; j <= BOUNDARY; j++){
                board[i][j] = (char) ('0' + num++);
            }
        }
    }
    public void update(int local, char c) {
        int i = (local + 3 - 1) / 3;
        int j = (local - 1) % 3 + 1;
        board[i][j] = c;
        count++;
        route[count] = local;
    }
    public boolean goBack(){
        if(count <= 1){
            return false;
        }
        count-=2;
        for(int k = 1; k <= 2; k++){
            int local = route[count + k];
            int i = (local + 3 - 1) / 3;
            int j = (local - 1) % 3 + 1;
            board[i][j] = (char) (local + '0');
        }
        return true;
    }
    public boolean check(int local) {
        int i = (local + 3 - 1) / 3;
        int j = (local - 1) % 3 + 1;
        return board[i][j] == '*' || board[i][j] == 'o';
    }
    public String output() {
        StringBuilder str = new StringBuilder("-----------------------\n");
        for(int i = 1; i <= BOUNDARY; i++) {
            str.append(" |   ").append(board[i][1]).append("   |   ").append(board[i][2]).append("   |   ").append(board[i][3]).append("   |\n");
            str.append("------------------------\n");       
        }
        return str.toString();
    }
    public boolean isExceed(int local) {return local < 1 || local > 9 ;}
    public boolean isWin() {
        //判断行列
        for(int i = 1; i <= BOUNDARY; i++) {
            if(board[i][1] == board[i][3] && board[i][2] == board[i][1])return true;
            if(board[1][i] == board[3][i] && board[2][i] == board[1][i])return true;
        }
        //判断对角线
        if(board[1][1] == board[3][3] && board[1][1] == board[2][2])return true;
        return board[1][3] == board[3][1] && board[1][3] == board[2][2];
    }
}
public class TicTacToe {
    static CheckerBoard b = new CheckerBoard();
    public static void robotPut () {
        Random rand = new Random();
        int local = rand.nextInt(9) + 1;
        while(b.check(local)) {
            local = rand.nextInt(9) + 1;
        }
        b.update(local, 'o');
    }
    public static void userPut() {
        UIManager.put("OptionPane.cancelButtonText", "撤销");
        String s = JOptionPane.showInputDialog(b.output() + "请输入位置:");
        while("".equals(s) || s == null || b.isExceed(Integer.parseInt(s)) || b.check(Integer.parseInt(s))) {
            if(s == null){
                if(b.goBack()){
                    JOptionPane.showMessageDialog(null, "撤销成功!");
                }else{
                    JOptionPane.showMessageDialog(null, "撤销失败!","提示",JOptionPane.ERROR_MESSAGE);
                }
                userPut();
                return;
            }
            JOptionPane.showMessageDialog(null, "输入有误, 请重新输入!","提示",JOptionPane.ERROR_MESSAGE);
            s = JOptionPane.showInputDialog(b.output() + "请输入位置:");
        }
        b.update(Integer.parseInt(s), '*');
    }
    public static void main(String[] args) {
    	int f=JOptionPane.showConfirmDialog(null,"你是否要先下?","选择",JOptionPane.YES_NO_CANCEL_OPTION);
    	boolean curPlayer=true;
    	if(f==0) {curPlayer=true;JOptionPane.showMessageDialog(null,"你先下!");}
    	else if(f==1){curPlayer=false;JOptionPane.showMessageDialog(null,"机器人先下!");}
    	else System.exit(0);
        if(curPlayer) {
            userPut();
        } else {
            robotPut();
        }
        curPlayer = !curPlayer;
        while(!b.isWin()) {
            if(b.count == 9) {//判断是否平局
                JOptionPane.showMessageDialog(null,b.output() + "平局!");
                System.exit(0);
            }
            if(curPlayer) {
                userPut();
            } else {
                robotPut();
            }
            curPlayer = !curPlayer;
        }
        String str = curPlayer ? "机器人" : "你";
        if(str.equals("机器人"))JOptionPane.showMessageDialog(null, b.output()+"很遗憾,你输了!");
        JOptionPane.showMessageDialog(null, b.output() + "恭喜你赢了!");
        System.exit(0);
    }
}

8-3绘制随机图形

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

参考代码

package ticTacToe.pack;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Line2D;
import java.awt.geom.Rectangle2D;
import javax.swing.JComponent;
import javax.swing.JFrame;
 
abstract class MyShape{
	double a;double b;double c;double d;
	public MyShape(){
		a=0;b=0;c=0;d=0;
	}
	public MyShape(double a,double b,double c,double d) {
		this.a=a;this.b=b;this.c=c;this.d=d;
	}
	public double getA() {
		return a;
	}
	public void setA(int a) {
		this.a = a;
	}
	public double getB() {
		return b;
	}
	public void setB(int b) {
		this.b = b;
	}
	public double getC() {
		return c;
	}
	public void setC(int c) {
		this.C = c;
	}
	public double getD() {
		return d;
	}
	public void setD(int d) {
		this.d = d;
	}
	abstract void draw(Graphics g);
}
class MyLine extends MyShape{
	public MyLine(double a,double b,double c,double d) {
		super(a,b,c,d);
	}
	void draw(Graphics g) {
		Graphics2D g2=(Graphics2D )g;
		Line2D line=new Line2D.Double(this.a,this.b,this.c,this.d);
		g2.draw(line);
	}
}
class MyRectangle extends MyShape{
	public MyRectangle(double a,double b,double c,double d) {
		super(a,b,c,d);
	}
	void draw(Graphics g) {
		Graphics2D g2=(Graphics2D )g;
		Rectangle2D rectangle=new Rectangle2D.Double(this.a,this.b,this.c,this.d);
		g2.draw(rectangle);
	}
}
class MyOval extends MyShape{
	public MyOval(double a,double b,double c,double d) {
		super(a,b,c,d);
	}
	void draw(Graphics g) {
		Graphics2D g2=(Graphics2D )g;
		Ellipse2D ellipse=new Ellipse2D.Double(this.a,this.b,this.c,this.d);
		g2.draw(ellipse);
	}
}
 
public class Paint{
	public static void main(String []args) {
		EventQueue.invokeLater(new Runnable()
	   	{
	   	   public void run()
		   {
              JFrame Frame = new JFrame();
              Frame.add(new DrawComponent());
              Frame.pack();
              Frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              Frame.setVisible(true);
		  }
	  });
		
	}
}
class DrawComponent extends JComponent
{
	private static final int DEFAULT_WIDTH=500;
	private static final int DEFAULT_HEIGHT=500;
 
	public void paintComponent(Graphics g)
	{
		for(int i=0;i<20;i++) {
			double a = Math.random()*300;
			double b = Math.random()*300;
			double c = Math.random()*300;
			double d = Math.random()*300;
			if(i<6) {
				MyOval aMyOval = new MyOval(a, b, c, d);
				aMyOval.draw(g);
			}
			else if(i<12) {
				MyRectangle aMyRectangle = new MyRectangle(a, b, c, d);
				aMyRectangle.draw(g);
			}
			else {
				MyLine aLine = new MyLine(a, b, c, d);
				aLine.draw(g);
			}
		}
	}
 
   public Dimension getPreferredSize()
   {
	  	return new Dimension(DEFAULT_WIDTH,DEFAULT_HEIGHT);
   }
}

8-4猜数游戏

编写一个猜数程序,该程序随机在1到1000的范围中选择一个供用户猜测的整数。界面上提供一个文本框来接收用户输入的猜测的数,如果用户猜得太大,则背景变为红色,如果猜得太小,背景变为蓝色。用户猜对后,文本框变为不可编辑,同时提示用户猜对了。界面上提供一个按钮,使用户可以重新开始这个游戏。在界面上还需显示用户猜测的次数。
实验步骤:
(1) 定义继承自JFrame的类,在该类中添加界面各部分;
(2) 定义事件监听器类完成事件处理;
(3) 定义一个包含main方法的测试类,在该类中创建框架类对象,并显示。
实验提示:
(1) 使用面板进行页面布局;
(2) 可以使用内部类定义事件监听器类;
(3) 按钮点击通过处理ActionEvent事件来完成响应。
在这里插入图片描述

参考代码

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Random;
class Gs extends JPanel implements ActionListener{
   private int cnt;
   private int truenb;
   private JPanel all;
   private JLabel lb1,lb2,lb3,lb4,lb5;
   private JButton bnt1,bnt2,bnt3;
   private JTextField inp;
   private JFrame jf;
   public void generate(){
      //生成随机数作为答案
      Random r=new Random();
      truenb=r.nextInt(1000)+1;
   }
   public Gs(){
      cnt=0;
      generate();
      //生成所有物件的容器
      all=new JPanel();
      all.setLayout(null);  
       all.setBounds(100,80,350,200);

      // JLabel提示信息
      lb1= new JLabel("你已经猜了"+cnt+"次"); //已经猜了x次
      lb1.setBounds(0, 5, 150, 20);
      lb1.setFont(new Font("宋体",Font.BOLD,14));
      // lb1.setVisible(true);
      all.add(lb1);

      lb2=new JLabel(); //输入猜测的数
      lb2.setText("输入猜测的数");
      lb2.setFont(new Font("宋体",Font.BOLD,14));
      lb2.setBounds(10, 40, 110, 20);
      all.add(lb2);     

       inp=new JTextField(); //输入框
      inp.setBounds(110, 40, 120, 20);
      inp.setBackground(Color.WHITE);
      all.add(inp);
      
      lb3=new JLabel(); //太大or太小
      lb3.setFont(new Font("宋体",Font.BOLD,14));
      lb3.setBounds(240, 40, 120, 20);
      lb3.setVisible(false);
      all.add(lb3);

      lb4=new JLabel("恭喜你猜对了");
      lb4.setFont(new Font("宋体",Font.BOLD,14));
      lb4.setBounds(10, 125, 120, 20);
      lb4.setVisible(false);
      all.add(lb4);

      lb5=new JLabel("猜测范围在1—~1000之间");
      lb5.setFont(new Font("宋体",Font.BOLD,14));
      lb5.setBounds(10,60,180,20);
      all.add(lb5);
      
      bnt1=new JButton("确定");
      bnt1.setBounds(10, 90, 90, 30);
      all.add(bnt1);

      bnt2=new JButton("重新开始");
      bnt2.setBounds(120, 90, 90, 30);
      
      all.add(bnt2);

      bnt3=new JButton("退出");
      bnt3.setBounds(230, 90, 90, 30);
      all.add(bnt3);

      //给按钮添加事件监听
      bnt1.addActionListener(this);    //传this指针方便判断
      bnt2.addActionListener(this);
      bnt3.addActionListener(this);

      //将Jpanel加入Jframe
      jf=new JFrame();
      jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      jf.setTitle("猜数游戏");
      // jf.setLayout(null);
      jf.setBounds(250,200,350,200);
      jf.add(all);
      jf.setVisible(true);
   }
   public void actionPerformed(ActionEvent e){
      if(e.getSource()==bnt1){   //确定按钮
         cnt++;
         lb1.setText("您已经猜了"+cnt+"次");
         int gus=Integer.valueOf(inp.getText());
         if(gus<truenb){   //太小
            lb3.setVisible(true);
            lb3.setText("太小");
            all.setBackground(Color.BLUE);
         }
         else if(gus>truenb){    //太大
            lb3.setVisible(true);
            lb3.setText("太大!");
            all.setBackground(Color.RED);
         }
         else{    //猜对了
            lb4.setVisible(true);
            inp.setEditable(false);    //禁止用户编辑
            bnt1.setEnabled(false);    //禁止按确认按钮
            lb3.setVisible(false);
            all.setBackground(Color.GREEN);
         }
      }else if(e.getSource()==bnt2)     //重开
      {
         cnt=0;      //重开次数置零
         lb1.setText("您已经猜了"+cnt+"次");
         generate(); //生成新数
         all.setBackground(null);   //清除背景色
         inp.setText(null);      //清空输入框
         inp.setEditable(true);
         lb4.setVisible(false);  //胜利提示关掉
         bnt1.setEnabled(true);    //允许按确认按钮
         lb3.setVisible(false);
      }else {       //退出
         System.exit(0);
      }
   }
}
public class guess {
   public static void main(String[] args) {
      new Gs();
   }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LLM实战(二)| 使用ChatGPT API提取文本topic

在大模型前时代&#xff0c;构建机器学习模型通常需要标注数据&#xff0c;然后使用这些标注数据来训练机器学习模型&#xff0c;这个过程一般需要几个月的时间&#xff0c;然而&#xff0c;在大模型时代下&#xff0c;几个小时就可以完成&#xff0c;比如情感分类&#xff0c;…

Windows环境如何使用Zblog+cpoalr搭建个人网站并远程访问?

文章目录 1. 前言2. Z-blog网站搭建2.1 XAMPP环境设置2.2 Z-blog安装2.3 Z-blog网页测试2.4 Cpolar安装和注册 3. 本地网页发布3.1. Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1. 前言 想要成为一个合格的技术宅或程序员&#xff0c;自己搭建网站制作网页是绕…

sql server 生成连续日期和数字

在sqlserver里&#xff0c;可以利用系统表master..spt_values里面存储的连续数字0到2047&#xff0c;结合dateadd&#xff08;&#xff09;函数生成连续的日期 select convert (varchar(10),dateadd(d, number, getdate()),23) as workday from master..spt_values where type…

深入篇【Linux】学习必备:进程环境变量/进程切换

深入篇【Linux】学习必备&#xff1a;进程环境变量/进程切换 Ⅰ.环境变量Ⅱ.深层意义Ⅲ.全局属性Ⅳ.进程切换 Ⅰ.环境变量 1.环境变量是什么&#xff1f;&#xff1a;环境变量是系统提供的一组name/value形式的变量&#xff0c;不同的环境变量有不同的用户。 一般是用来指定操作…

【QT开发笔记-基础篇】| 第四章 事件QEvent | 4.9 右键菜单事件

本节对应的视频讲解&#xff1a;B_站_链_接 【QT开发笔记-基础篇】 第4章 事件 4.9 右键菜单事件 本章要实现的整体效果如下&#xff1a; QEvent::ContextMenu ​ 在窗口/控件上点击鼠标右键时&#xff0c;触发该事件&#xff0c;它对应的子类是 QContextMenuEvent 首先&…

无人值守变电站运维技术模式及应用-安科瑞黄安南

近年来&#xff0c;市场电子资源需求量的逐步上升&#xff0c;使变电系统建设逐步向复杂环境拓展。为保障变电系统运行稳定性及人员管理安全性&#xff0c;无人值班变电站技术运用势在必行&#xff0c;是解决复杂条件下变电设备运行不稳定及人员设备管理效益低下问题的重要核心…

打工人神器(随时会删,抓紧看)

今天是一期打工人神器&#xff0c;相信大家在工作上多多少少都遇到过一些这样的难题&#xff0c;比如找不到素材&#xff1f;写不出文案&#xff1f;等等之类&#xff0c;如果你遇到过以上这些情况&#xff0c;那么今天的干货分享一定要看完&#xff01; 一、犀牛视频下载器 视…

k8s-----10、Controller-Deployment

Controller-Deployment 1、什么是controller2、 pod和controller关系3、Deployment控制器应用场景3.1 部署时yaml文件书写3.2 实际部署应用3.3 升级回滚3.3.1 升级3.3.2 回滚 3.4 弹性伸缩 1、什么是controller 在集群上管理和运行容器的对象 2、 pod和controller关系 pod是…

怎么用一个二维码展示多个内容?二维码汇总一个的方法

怎么将多个二维码内容组合到一个二维码中呢&#xff1f;最近有些小伙伴在问&#xff0c;在让别人扫码展示内容时&#xff0c;如何将其他二维码内容做成列表的形式&#xff0c;被浏览信息的人选择点击跳转到其他二维码展示对应的内容。比如制作旅游景点攻略&#xff0c;点击对应…

Python基础教程:列表(List)的常用操作

嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 列表是Python中最基本的数据结构&#xff0c;列表是最常用的Python数据类型&#xff0c;列表的数据项不需要具有相同的类型。 列表中的每个元素都分配一个数字 -…

java--赋值运算符

1.基本赋值运算符 1.1.就是“”&#xff0c;从右边往左看。 2.扩展赋值运算符 注意&#xff1a;扩展的赋值运算符隐含了强制类型转换。 byte x 10; byte y 20; x x y ;//这样写会报错 x y;/*这样不会报错&#xff0c;原因是java默认的都是int形式的 &#xff0c;然后上面…

HIMA F3236 Z7138 Z7116全面的边缘人工智能解决方案

HIMA F3236 Z7138 Z7116全面的边缘人工智能解决方案 这一联合、完整的edge AI解决方案将结合Variscite的i.MX 8平台和Hailo的迷你PCIe AI模块&#xff0c;使企业能够更高效、更可持续地运行基于全面深度学习(DL)的应用&#xff0c;同时大幅降低成本。 Variscite的DART-MX8M-…

MAC地址修改工具 WiFiSpoof 简体中文

WiFiSpoof的功能优势主要在于其能够伪装和修改设备的MAC地址&#xff0c;以及支持随机生成MAC地址。这使得用户可以在连接Wi-Fi网络时隐藏自己的真实设备身份&#xff0c;增加网络安全性和隐私保护。同时&#xff0c;该功能还具有简单易用、兼容性强等特点&#xff0c;适用于多…

2023新版软件测试八股文及答案解析

前言 前面看到了一些面试题&#xff0c;总感觉会用得到&#xff0c;但是看一遍又记不住&#xff0c;所以我把面试题都整合在一起&#xff0c;都是来自各路大佬的分享&#xff0c;为了方便以后自己需要的时候刷一刷&#xff0c;不用再到处找题&#xff0c;今天把自己整理的这些…

3D模型格式转换工具HOOPS Exchange助力SIMCON搭建注塑项目

行业&#xff1a;设计与制造 / 注塑成型 / 模拟 挑战&#xff1a;注塑成型商面临着以高效的方式为客户生产零件的挑战。需要大量的试验才能生产出适合的零件&#xff0c;同时模具需要进行多次物理修改&#xff0c;每次修改周期最长需要四个星期&#xff0c;成本高达四到五位数…

接口自动化测试小结

一、接口测试的概念 1、接口&#xff1a;指系统或组件之间的交互点&#xff0c;通过这些交互点可以实现数据之间的交互。(数据交互的通道) 2、接口测试&#xff1a;对系统或组件之间的接口进行测试&#xff0c;主要用于检测外部系统与系统之间以及系统内部之间的数据交换、传…

PKU 概率论+数理统计+建模 期中考复习总结

目录 计算条件概率计算概率&#xff08;放回与不放回&#xff09;生成随机数算法Linear Congruential Method判断是否是full period Uniformity (test of frequency)1.Chi-Square testmethodreminderexample 2.Kolmogorov-Sminov testmethodexample Independence (test of auto…

vscode远程连接服务器+Xming:图形化界面

背景 用本地电脑连接服务器跑代码&#xff0c;服务器运行出现图形化的界面&#xff08;例如plt.show()是一张图片&#xff09;&#xff0c;本地电脑端显示不出来。因此&#xff0c;我们利用Xming解决这个问题。 主要步骤参考&#xff1a;link 注意点&#xff1a; 虽然&#x…

星途星纪元 ES,用艺术思维表达工程技术

10月8日&#xff0c;星途星纪元ES携手世界级成都爱乐首席乐团、旅德青年钢琴家王超&#xff0c;在成都打造了一场“万物星声”超舒适音乐会视听盛宴。这是星途星纪元首次跨界音乐圈、牵手音乐挚友&#xff0c;共同演绎音乐和汽车的美学协奏曲&#xff0c;开启高端超舒适美学新纪…

Ansys Zemax | 用于眼睛像差评估的Shack‑Hartmann传感器建模

介绍 无论是在研究中还是通过工业设备开发后用于临床目的&#xff0c;Shack‑Hartmann 传感器被广泛应用于测量人眼所产生的像差。 原理 这种装置的基本原理可以描述如下&#xff1a;光束聚焦在用作光扩散器的视网膜上&#xff0c;尽管出于安全考虑优选使用近红外进行测量&am…