当前位置:

首页 > 编程开发 > 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                                    
      本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
      作者最新文章
      编程开发 Java
      相关文章 更多
      Java单元测试入门:使用JUnit 5编写第一个测试用例
      Java单元测试入门:使用JUnit 5编写第一个测试用例

      面向初学者的JUnit 5实用入门指南。从测试概念、Maven依赖配置,到手把手编写首个单元测试用例及断言验证,助你掌握Java单元测试的核心流程。

      Java变量未初始化报错解析:局部变量与成员变量默认值差异
      Java变量未初始化报错解析:局部变量与成员变量默认值差异

      深入解析Java中局部变量未初始化编译报错与成员变量自动赋予默认值的机制差异,涵盖JVM内存分配、编译期确定性赋值检查与实际排查修复方案。

      Java获取当前时间并格式化输出:DateTimeFormatter与SimpleDateFormat
      Java获取当前时间并格式化输出:DateTimeFormatter与SimpleDateFormat

      详细讲解在Java中获取当前系统时间并进行格式化输出的两种核心方案:基于Java 8全新日期时间API的DateTimeFormatter与传统遗留的SimpleDateFormat,包含完整代码示例、线程安全机制对比及生产选型建议。

      Java中final与static final常量的定义及初始化规则
      Java中final与static final常量的定义及初始化规则

      深入解析Java中final变量与static final常量的定义、内存语义、初始化时机及合法赋值路径,涵盖编译期常量优化与实战避坑指南。

      Java抽象方法与接口方法的区别及选型建议
      Java抽象方法与接口方法的区别及选型建议

      深入对比Java中抽象类抽象方法与接口方法的语法演进、设计意图及运行期差异,并提供清晰的架构选型决策流程与实战范例。

      Java实现HTTP请求与JSON解析的完整代码示例
      Java实现HTTP请求与JSON解析的完整代码示例

      本文提供Java标准库HttpClient发起HTTP GET/POST请求并结合Jackson进行JSON数据反序列化与序列化的完整代码示例与工程实践指南。

      Java递归出现StackOverflowError的原因分析及栈空间优化方案
      Java递归出现StackOverflowError的原因分析及栈空间优化方案

      详细分析Java递归调用出现StackOverflowError的原因,结合代码说明线程栈、栈帧和递归深度之间的关系,并介绍终止条件排查、迭代改写、减少栈帧开销以及通过-Xss调整JVM栈空间的方法。

      Java空指针异常(NPE)的代码排查与修复实例
      Java空指针异常(NPE)的代码排查与修复实例

      针对Java中常见的NullPointerException(NPE),本文从堆栈日志定位、典型代码触发场景、具体修复代码对比到防御体系进行系统讲解,提供实用且易上手的排查与修复方案。

      selenium上传文件教程本地文件路径设置方法
      selenium上传文件教程本地文件路径设置方法

      深入解析Selenium处理文件上传的技术细节,涵盖标准HTML控件的路径直接注入法与非标准控件的系统级模拟方案,提供Windows与Linux环境下的路径设置最佳实践及常见异常排查。

      大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景
      大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景

      针对大数据工程场景,系统对比Java、Scala与Python在执行性能、生态结合、开发效率和维护成本上的核心差异,给出清晰的架构选型依据与落地方案。

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

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

      Windows
      Windows

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

      PDF教程
      PDF教程

      正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

      Mac软件 更多
      讯飞智作 网页版
      讯飞智作 网页版
      Windows/ macOS/ Linux

      讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

      火山引擎 网页版
      火山引擎 网页版
      Windows/ macOS/ Linux

      火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

      Aperty macOS版
      Aperty macOS版
      macOS

      Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

      WINDOWS 更多
      讯飞智作 网页版
      讯飞智作 网页版
      Windows/ macOS/ Linux

      讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

      火山引擎 网页版
      火山引擎 网页版
      Windows/ macOS/ Linux

      火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

      PixTV 网页版
      PixTV 网页版
      Windows

      PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。