当前位置:

首页 > 编程开发 > Java如何实现动物换位游戏

Java如何实现动物换位游戏

效果展示一、效果展示1.游戏界面开始成功2.测试界面二、项目介绍1.总体需求(1)在水平排列的7块石头上的左右各有3个类型相同的2种动物,中间的石头上没有动物。(2)用鼠标单击一个动物:①若“该动物前方的石头”上没有动物,该动物就跳跃到该石头上。②若“该动物前方的石头”上有动物,但隔位的石头上无动物,该动物就越过自己前面的动物跳到隔位的石头上。③其他情形时,该动物不跳跃(跳跃时不能越过2块石头)。(3)左面的动物只能向右方跳跃,右面的动物只能向左方跳跃。(4)用户可以通过单击界面上提供的按钮,随时撤销上一

    效果展示

    Java如何实现动物换位游戏

    一、效果展示

    1.游戏界面

    开始

    Java如何实现动物换位游戏

    成功

    Java如何实现动物换位游戏

    2.测试界面

    Java如何实现动物换位游戏

    二、项目介绍

    1.总体需求

    (1)在水平排列的7块石头上的左右各有3个类型相同的2种动物,中间的石头上没有动物。

    (2)用鼠标单击一个动物:

    ①若“该动物前方的石头”上没有动物,该动物就跳跃到该石头上。

    ②若“该动物前方的石头”上有动物,但隔位的石头上无动物,该动物就越过自己前面的动物跳到隔位的石头上。

    ③其他情形时,该动物不跳跃(跳跃时不能越过2块石头)。

    (3)左面的动物只能向右方跳跃,右面的动物只能向左方跳跃。

    (4)用户可以通过单击界面上提供的按钮,随时撤销上一步的操作。

    (5)用户可以随时单击界面上的按钮,重新开始游戏。

    2.总体设计

    项目结构共四个package,分别是data,test,gui,view。具体实现封装的12个类如图所示:

    Java如何实现动物换位游戏

    三、代码展示

    1.图形界面设计(gui包)

    主类:AppWindows类

    AppWindow类负责创建动物换位的主窗口,该类含有main方法,程序从该类开始执行。

    package ch2.gui;
    import javax.swing.*;
    import java.awt.*;
    import ch2.view.GamePanel;
    public class AppWindow extends JFrame {
        GamePanel gamePanel;
        public AppWindow(){
           setTitle("动物换位游戏");
           gamePanel = new GamePanel();
           gamePanel.setAnimalCount(6);
           gamePanel.setLeftAnimalImage("程序发布/image/cat.jpg");
           gamePanel.setRightAnimalImage("程序发布/image/dog.jpg");
           add(gamePanel,BorderLayout.CENTER);
           gamePanel.setBackground(Color.white);
           JPanel northP = new JPanel();
           northP.add(gamePanel.buttonReStart);
           northP.add(gamePanel.buttonRedo);
           add(northP,BorderLayout.NORTH);        
           setBounds(60,60,9*gamePanel.width+9*gamePanel.gap,300);  
           validate();
           setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
           setVisible(true); 
        }
        public static void main(String args[] ){
           AppWindow win = new AppWindow();  
        }
    }

    2.用户操作设计(data包)

    ① Animal类

    Animal类创建的对象是AppWindow类的重要成员之一,用来表示“动物”。

    package ch2.data;
    public abstract class Animal {
        String name ;
        Point [] allCanAtPoint;    //全部点位置
        Point point;               //动物当前所在的点位置
        ViewForAnimal animalView;  //动物的外观视图
        public void setAtPoint(Point p) {
            if(p!=null){
               point = p;
               point.setIsHaveAnimal(true);
               point.setAtPointAnimal(this);
            } 
        }
        public Point getAtPoint() {
            return point;
        }
        public void setAllCanAtPoint(Point [] point){
            allCanAtPoint = point;
        }
        public void setAnimalView(ViewForAnimal animalView) {
            this.animalView = animalView;
            animalView.setAnimal(this);
        }
        public ViewForAnimal getAnimalView() {
             return animalView;
        }
        public void setName(String s) {
            name = s;
        }
        public String getName() {
            return name;
        }
        public abstract boolean move();
    }
    ② LeftAnimal类

    LeftAnimal类是Animal的一个子类,创建的对象是AppWindow类的成员之一,表示“左动物”。

    package ch2.data;
    public class LeftAnimal extends Animal{
       public boolean move(){
          int k = -1;
          boolean successMove = false;
          Point p = getAtPoint();
          for(int i=0;i
    ③ RightAnimal类

    RightAnimal类是Animal的一个子类,创建的对象是AppWindow类的成员之一,表示“右动物”。

    package ch2.data;
    public class RightAnimal extends Animal{
       public boolean move(){
          int k = -1;
          boolean successMove = false;
          Point p = getAtPoint();
          for(int i=0;i
    ④ Point类

    Point类负责创建确定位置的对象,使用Point对象,可以确定动物以及石头对象在窗体中的位置。

    package ch2.data;
    public class Point{
        int x,y; 
        boolean haveAnimal; 
        Animal animal=null; //在该点位置上的动物
        public void setX(int x){
            this.x=x;
        }
        public void setY(int y){
            this.y=y;
        }
        public boolean isHaveAnimal(){
            return haveAnimal;
        }
        public void setIsHaveAnimal(boolean boo){
            haveAnimal=boo;
        }
        public int getX(){
            return x;
        }
        public int getY(){
            return y;
        }
        public void setAtPointAnimal(Animal animal){
            this.animal=animal;
            if(animal!=null) {
               haveAnimal = true;
            }
            else {
               haveAnimal = false;
            }
        }
        public Animal getAtPointAnimal(){
            return animal;
        }
    }
    ⑤ ViewForAnimal类

    该类是JPanel类的一个子类,用于实现动物方法的定义。

    package ch2.data;
    import javax.swing.JPanel;
    public abstract class ViewForAnimal extends JPanel {
        public abstract void setAnimal(Animal animal);
        public abstract void setImage(String name);
        public abstract Animal getAnimal();
        public abstract void setAnimalViewLocation(int x,int y);
        public abstract void setAnimalViewSize(int w,int h);
    }

    3.游戏视图设计(view包)

    ① AnmialView类

    AnimalView类是ViewForAnimal的一个子类,实现对动物操作的各种方法。

    package ch2.view;
    import java.awt.*;
    import ch2.data.*;
    public class AnimalView extends ViewForAnimal{
       Animal animal;
       Image image;
       Toolkit tool;
       public AnimalView() {
          tool = getToolkit();
       }
       public void setAnimal(Animal animal){
          this.animal = animal;
       }
       public void setImage(String name){
          image = tool.getImage(name);
          repaint();
       }
       public Animal getAnimal() {
          return animal;
       }
       public void setAnimalViewLocation(int x,int y){
          setLocation(x,y);
       }
       public void setAnimalViewSize(int w,int h){
          setSize(w,h);
       }
       public void paintComponent(Graphics g){
          super.paintComponent(g);
          int w=getBounds().width;
          int h=getBounds().height;
          g.drawImage(image,0,0,w,h,this);
       }
    }
    ② GamePanel类

    GamePanel类是JPanel的子类,用于游戏视图的初始化。

    package ch2.view;
    import javax.swing.*;
    import java.awt.*;
    import ch2.data.Animal;
    import ch2.data.Point;
    import ch2.data.ViewForAnimal;
    import ch2.data.LeftAnimal;
    import ch2.data.RightAnimal;
    import java.util.*;
    import java.awt.geom.*; 
    public class GamePanel extends JPanel {
        public int animalCount = -1;
        public Point [] point ;
        Animal []  leftAnimal,rightAnimal; 
        public ViewForAnimal [] leftAnimalView,rightAnimalView;//动物视图
        public int width =90,height=70;  //动物视图的大小
        public int gap = 2;              //动物之间的间隙           
        public JButton buttonRedo;//撤销按钮
        public JButton buttonReStart;//重新开始游戏
        public Stack saveAnimalStep; //存放动物走动的位置,以便恢复
        HandleAnimalMove handleAnimalMove;//负责处理MouseEvent的监视器
        HandleRedo handleRedo;           //负责ActionEvent的监视器 
        HandleReStart handleReStart;    //负责ActionEvent的监视器
        public GamePanel(){
           setLayout(null);
           buttonRedo = new JButton("撤销");
           buttonReStart = new JButton("重新开始");
           saveAnimalStep = new Stack();
        }
        public void setAnimalCount(int n){
           if(n%2 != 0 ||n<=1) {
              System.out.println(n+"的个数不合理");
              System.exit(0);
           } 
           removeAll();  //首先移出曾添加到该容器中的全部组件
           animalCount = n;
           initPoitAndAnimal();  //初始化动物和位置对象
           initLeftAnimalView(); //初始化左边的动物视图
           initRightAnimalView();
           registerListener();   //注册监视器
        }
        private void initPoitAndAnimal(){//初始化动物和位置对象
           point = new Point[animalCount+1];
           int posionX = width; //点的位置的x坐标
           int posionY = height;
           for(int i=0;i
    ③ HandleAnimalMove类

    该类所创建的对象负责处理鼠标事件,实现动物位置的移动。

    package ch2.view;
    import java.awt.event.*;
    import javax.swing.JOptionPane;
    import ch2.data.Point;
    import ch2.data.Animal;
    import ch2.data.ViewForAnimal;
    import ch2.data.LeftAnimal;
    import ch2.data.RightAnimal;
    public class HandleAnimalMove extends MouseAdapter {
         GamePanel panel;
         HandleAnimalMove(GamePanel panel){
            this.panel = panel;
         } 
         public void mousePressed(MouseEvent e){
            ViewForAnimal animalView = (ViewForAnimal)e.getSource();
            Animal animal = animalView.getAnimal();
            Point pStart = animal.getAtPoint(); //得到动物移动前所在点
            if(animal.move()) {
               Point pEnd = animal.getAtPoint();//得到动物移动后所在点
               int x = pEnd.getX();
               int y = pEnd.getY();
               animalView.setAnimalViewLocation(x,y);//让动物视图所在位置和动物所在点相同
               panel.saveAnimalStep.push(pStart);
               panel.saveAnimalStep.push(pEnd);
            }
        } 
        public void mouseReleased(MouseEvent e){
             boolean success = true;
             int n =panel.animalCount/2;
             for(int i=0;i
    ④ HandleRedo类

    该类所创建的对象负责处理鼠标事件,实现鼠标操作的撤销。

    package ch2.view;
    import ch2.data.Point;
    import ch2.data.Animal;
    import ch2.data.ViewForAnimal;
    import java.awt.event.*;
    public class HandleRedo implements ActionListener {
         GamePanel panel;
         HandleRedo(GamePanel panel){
            this.panel = panel;
         } 
         public void actionPerformed(ActionEvent e){ //撤销移动动物的操作
               if(panel.saveAnimalStep.empty())
                   return;
               Point pEnd = panel.saveAnimalStep.pop();
               Point pStart = panel.saveAnimalStep.pop();
               Animal animal = pEnd.getAtPointAnimal(); 
               pEnd.setIsHaveAnimal(false);
               pEnd.setAtPointAnimal(null);
               animal.setAtPoint(pStart);
               ViewForAnimal animalView =animal.getAnimalView();
               int x = pStart.getX();
               int y = pStart.getY();
               animalView.setAnimalViewLocation(x,y);//让动物视图所在位置和动物所在点相同
        } 
    }
    ⑤ HandleReStart类

    该类所创建的对象负责处理鼠标事件,实现游戏的重开功能。

    package ch2.view;
    import ch2.data.ViewForAnimal;
    import java.awt.event.*;
    public class HandleReStart implements ActionListener {
         GamePanel panel;
         HandleReStart(GamePanel panel){
            this.panel = panel;
         } 
         public void actionPerformed(ActionEvent e){ //处理重新开始
           panel.saveAnimalStep.clear();
           for(int i=0;i

    四、代码测试

    这里我们创建test包,实现AppTest类来进行代码的测试,代码如下:

    package ch2.test;
    import ch2.data.*;
    public class AppTest {
       public static void main(String [] args) {
           Point [] point = new Point[7];
           for(int i=0;i                                    
    本文内容来源于互联网,如有侵权请联系删除。
    作者最新文章
    编程开发
    相关文章 更多
    谷歌浏览器Mac版入口
    谷歌浏览器Mac版入口

    谷歌浏览器Mac版官方安装指南 谷歌浏览器Mac版官方安装入口是https://www.google.com/chrome/,需macOS 12+系统、500MB空间,下载.dmg后拖入应用程序安装,支持多设备同步、性能优化与隐私保护功能。 苹果电脑Chrome的安装入口究竟在哪里?这个问题最近可是

    Chrome浏览器JS脚本不运行怎么办
    Chrome浏览器JS脚本不运行怎么办

    Chrome中JavaScript未执行需依次检查:一、移除站点级禁用并添加允许域名;二、开启全局JavaScript开关;三、禁用干扰扩展;四、在开发者工具中启用JavaScript;五、重置内容设置为默认。 有时在Chrome里打开网页,会发现交互按钮点了没反应,数据加载不出来,页面仿佛“静止”

    IE浏览器怀旧版在线网址
    IE浏览器怀旧版在线网址

    IE浏览器怀旧版在线网址:一次精准的技术时光回溯 最近,不少老用户和怀旧爱好者在反复搜索一个问题:那个经典的Internet Explorer,如今还能在哪里原汁原味地体验到?答案指向一个特定的地址:https://ie.microsoft.com/legacy/。 这个网站远不止是一个简单的“皮肤

    火狐浏览器有哪些设置功能
    火狐浏览器有哪些设置功能

    火狐浏览器五大核心设置功能:解锁高效、安全与个性化体验 火狐浏览器功能强大,但如果不仔细挖掘,很多能大幅提升效率和安全性的设置可能就“藏着掖着”了。这就好比拥有一台高性能设备,却只用了基础模式。那么,如何把它调整到最顺手、最安全的状态?接下来,我们就聚焦于当前版本(截至2025年末)最关键的五大设置

    chrome搜索免验证入口
    chrome搜索免验证入口

    Chrome官方免验证入口为https://www.google.cn/chrome/,提供全平台安装包、免登录即用、本地化安全机制及引擎级性能优化。 到底该去哪里找正版、免费且无需繁琐验证的Chrome浏览器入口?这个问题困扰了不少网友。今天,我们就来直通核心,为大家详细拆解Chrome引擎的官方

    java heap space 选型思路:使用场景与区别整理
    java heap space 选型思路:使用场景与区别整理

    Java堆是JVM存储对象的核心内存区域,配置需结合场景:单体应用适中设置;大数据处理需大堆并关注GC停顿;微服务强调快速启动;高并发需精细划分堆区域。关键参数-Xms和-Xmx建议等值以稳定性能。垃圾回收器选择影响效率,如G1适用于大堆,ZGC可实现低停顿。内存错误时需监控堆状态。

    java heap space 使用中遇到的问题怎么解决
    java heap space 使用中遇到的问题怎么解决

    Java堆内存溢出错误通常因内存泄漏、数据处理需求过大或JVM参数配置不当引起。排查时可借助jmap、堆转储及MAT等工具定位问题。解决方案包括调整JVM内存参数(如-Xmx)、修复代码中的内存泄漏、优化大数据处理逻辑,并建立持续监控与预防机制,以保障应用稳定运行。

    java xml 选型思路:使用场景与区别整理
    java xml 选型思路:使用场景与区别整理

    XML在Java开发中用于配置、数据交换等场景。解析方式主要有DOM、SAX、StAX及第三方库。DOM适合操作小文件,SAX/StAX适合处理大文件流,JAXB用于对象与XML映射。选型需结合数据大小、内存、性能及团队熟悉度,现代框架常封装底层解析。

    using namespace 使用中遇到的问题怎么解决
    using namespace 使用中遇到的问题怎么解决

    命名空间的基本概念与常见引入问题在C++等编程语言中,命名空间(namespace)是一种将代码标识符(如变量、函数、类名)封装在特定名称下的机制,其主要目的是避免命名冲突,尤其是在大型项目或使用多个第三方库时。使用“using namespace”指令可以将指定命名空间中的所有名称引入当前作用域,

    c语言函数递归 实操经验总结:这些技巧很实用
    c语言函数递归 实操经验总结:这些技巧很实用

    理解递归的基本原理在C语言中,递归是一种函数调用自身的编程技术。要掌握它,首先需要理解其核心思想:将一个复杂的大问题,分解为一个或几个与原问题相似但规模更小的子问题,直到子问题足够简单,可以直接求解。这个过程通常包含两个关键部分:递归出口和递归体。递归出口定义了问题何时不再继续分解,即最简单、可直接

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    macOS软件
    macOS软件

    正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

    Mac软件 更多
    灵活计算器
    灵活计算器
    macOS/iOS/Android

    灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

    赤友清理大师
    赤友清理大师
    macOS

    赤友清理大师是一款为 Mac 设计的智能清理优化工具,可精准扫描垃圾、大文件、重复文件等,释放磁盘空间。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

    极度公式
    极度公式
    Windows/macOS/Linux

    极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

    WINDOWS 更多
    Windows 10
    Windows 10
    Windows

    Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

    极度公式
    极度公式
    Windows/macOS/Linux

    极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

    密码键盘
    密码键盘
    Windows/macOS/iOS/Android

    密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。