java实现马踏棋盘游戏

用java实现马踏棋盘游戏算法,供大家参考,具体内容如下

在4399小游戏中有这样一个游戏

这是代码实现

package com.HorseChess;

import java.awt.*;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Scanner;

public class HorseChess {
    private static int X;
    private static int Y;
    private static boolean visited[];
    private static boolean finished;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入行:");
        X = sc.nextInt();
        System.out.println("请输入列:");
        Y = sc.nextInt();
        System.out.println("请输入棋子所在行:");
        int row = sc.nextInt();
        System.out.println("请输入棋子所在列:");
        int column = sc.nextInt();
        int [][] chessboard = new int[X][Y];
        visited = new boolean[X*Y];
        traverchess(chessboard,row-1,column-1,1);
        for(int[] rows : chessboard){
            for (int step : rows){
                System.out.print(step + "\t");
            }
            System.out.println();
        }
    }

    public static void traverchess(int[][] chessboard,int row,int column,int step){
        chessboard[row][column] = step;
        visited[row * X+column] = true;
        ArrayList<Point> ps = next(new Point(column,row));
        sort(ps);
        while (!ps.isEmpty()){
            Point p = ps.remove(0);
            if(!visited[p.y*X+p.x]){
                traverchess(chessboard,p.y,p.x,step+1);
            }
        }

        if(step<X*Y&&!finished){
            chessboard[row][column] = 0;
            visited[row * X + column] = false;
        }
        else {
            finished = true;
        }
    }
    //判断当前棋子下一个可以走的所有位置数组
    public static ArrayList<Point> next(Point curpoint){
        ArrayList<Point> ps = new ArrayList<Point>();
        Point p1 = new Point();
        if((p1.x = curpoint.x - 2)>=0&&(p1.y = curpoint.y - 1)>=0){
            ps.add(new Point(p1));
        }
        if((p1.x = curpoint.x - 1)>=0&&(p1.y = curpoint.y - 2)>=0){
            ps.add(new Point(p1));
        }
        if((p1.x = curpoint.x + 1)< X && (p1.y = curpoint.y - 2)>=0){
            ps.add(new Point(p1));
        }
        if((p1.x = curpoint.x + 2)< X && (p1.y = curpoint.y - 1)>=0){
            ps.add(new Point(p1));
        }
        if((p1.x = curpoint.x + 2)<X&&(p1.y = curpoint.y + 1)<Y){
            ps.add(new Point(p1));
        }
        if((p1.x = curpoint.x + 1)<X&&(p1.y = curpoint.y + 2)<Y){
            ps.add(new Point(p1));
        }
        if((p1.x = curpoint.x - 1)>=0&&(p1.y = curpoint.y + 2)<Y){
            ps.add(new Point(p1));
        }
        if((p1.x = curpoint.x - 2)>=0&&(p1.y = curpoint.y + 1)<Y){
            ps.add(new Point(p1));
        }
        return ps;
    }

    //使用贪心算法提高算法运行速度
    public static void sort(ArrayList<Point> ps){
        ps.sort(new Comparator<Point>() {
            @Override
            public int compare(Point o1, Point o2) {
                int count1 = next(o1).size();
                int count2 = next(o2).size();
                if(count1<count2){
                    return  -1;
                }else if (count1 == count2){
                    return 0;
                }
                else {
                    return  1;
                }
            }
        });
    }
}

然后照着步骤一步一步下就可以了

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Java实现两人五子棋游戏(二) 画出棋盘

    本文为大家分享了java画出五子棋游戏棋盘的方法,供大家参考,具体内容如下 棋盘模块: 画五子棋棋盘:19条横线.19条竖线 步骤一:显示棋盘 我有一张名为chessboard.png的棋盘,位置为根目录/res/drawable/chessboard/png,现在我要显示这张图片. DrawChessBoard.java package xchen.test.simpleGobang; import java.awt.Graphics; import java.awt.Image; impor

  • Java实现简单棋盘存档和读取功能

    最近实现研究了下五子棋的存档,主要实现是将残局的五子棋棋盘保存到本地文件中,需要读取棋局时能够从本地文件获取,并展示出原有的残局局面. 主要思路 如上图所示,第一个表格是11*11的棋局,可以转换成11行11列的二维数组,1代表黑子,2代表蓝子,转换成第二个表格所示的二维数组.在保存时,考虑到二维数组中0大部分是没有被占用的空间,所以我将二维数组转换成了一个n行3列的稀疏数组,将所占用的空间压缩,保存到本地文件中.其中稀疏数组的第一行row表示11行,col表示11列,val表示除0以外的有效数

  • java使用swing绘制国际象棋棋盘

    本文实例为大家分享了java使用swing绘制国际象棋棋盘的具体代码,供大家参考,具体内容如下 1.完整代码 import java.awt.Color; import java.awt.Point; import javax.swing.BorderFactory; import javax.swing.JFrame; import javax.swing.JLabel; public class guo_ji_xiang_qi_qipan { public static void main(

  • java绘制国际象棋与中国象棋棋盘

    JAVA API 中的绘制图形类的paint()方法,我们可以轻松绘制中国象棋与国际象棋的棋盘.详见代码:  一.中国象棋棋盘代码 import java.awt.Font; import java.awt.Frame; import java.awt.Graphics; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; public class ChineseChese extends Frame{

  • java打印国际象棋棋盘的方法

    本文实例为大家分享了java打印出国际象棋棋盘的具体代码,供大家参考,具体内容如下 问题分析 观察国际象棋棋盘的图案,可以发现其中的规律:棋盘由八行八列黑白方块相间组成,可以用i控制行,j来控制列,根据i+j的和的变化来控制输出黑方块还是白方块.这里我们使用了Swing的标签组件JLable,通过设置JLabel组件的背景色和透明度来实现黑白方块. (1)确定程序框架 这是一个绘图案例,这里我们采用JFrame创建窗口,然后在窗口里添加JLabel标签组件,通过前面的问题分析可知,JLabel标

  • java编程实现国际象棋棋盘

    本文实例为大家分享了java编程实现国际象棋棋盘的具体代码,供大家参考,具体内容如下 问题描述: 打印出国际象棋棋盘(黑白交错) 问题分析: 棋盘由八块黑白相间的方块组成,通过swing编程实现.其中用标签来实现方块,在方块中填充黑或白色.通过i,j来遍历行和列,以i和j的值来判断填充什么颜色 代码分析 import javax.swing.*; import java.awt.*; public class _2ChessBoard { public static void main(Stri

  • java绘制五子棋棋盘

    本文实例为大家分享了java绘制五子棋棋盘的具体代码,供大家参考,具体内容如下 源码: import javax.imageio.ImageIO; import javax.swing.*; import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; public class Demo extends JFrame { //背景图片 Buffere

  • Java基于分治算法实现的棋盘覆盖问题示例

    本文实例讲述了Java基于分治算法实现的棋盘覆盖问题.分享给大家供大家参考,具体如下: 在一个2^k * 2^k个方格组成的棋盘中,有一个方格与其它的不同,若使用以下四种L型骨牌覆盖除这个特殊方格的其它方格,如何覆盖.四个L型骨牌如下图: 棋盘中的特殊方格如图: 实现的基本原理是将2^k * 2^k的棋盘分成四块2^(k - 1) * 2^(k - 1)的子棋盘,特殊方格一定在其中的一个子棋盘中,如果特殊方格在某一个子棋盘中,继续递归处理这个子棋盘,直到这个子棋盘中只有一个方格为止如果特殊方格不

  • java实现马踏棋盘的完整版

    本文实例为大家分享了java实现马踏棋盘的具体代码,供大家参考,具体内容如下 马踏棋盘很好实现,但有时运行起来特别慢,还可能出不来结果,在这里要用到贪心算法来优化,即找出最难走的路径,也就是下下步可下棋的位置最少. 下面给出该算法完整代码: /*      * 马踏棋盘问题:(贪婪法求解)      * 棋盘有64个位置,"日"字走法,刚好走满整个棋盘      */     //下一个走法的方向类     class Direction{         int x;        

  • java实现马踏棋盘游戏

    用java实现马踏棋盘游戏算法,供大家参考,具体内容如下 在4399小游戏中有这样一个游戏 这是代码实现 package com.HorseChess; import java.awt.*; import java.util.ArrayList; import java.util.Comparator; import java.util.Scanner; public class HorseChess {     private static int X;     private static

  • 基于Java实现马踏棋盘游戏算法

    马踏棋盘很好实现,但有时运行起来特别慢,还可能出不来结果,最常用的就是深度优先遍历+回溯,相信大家都学过数据结构,对图的深度遍历都有了解,下面就是代码的实现,如果对代码理解有困难,可以先熟悉一下图的深度优先遍历 大家可以把棋盘改小一些测试,8x8的确实很慢 import java.util.Arrays; /**  * 骑士周游问题  * @author LM_Code  * @create 2019-03-17-18:57  */ public class KnightProblem {  

  • Java实现马踏棋盘算法

    本文实例为大家分享了Java实现马踏棋盘的具体代码,供大家参考,具体内容如下 马在某个点最多可能有8种走法,用递归和回溯实现. 注:代码中,查找下一个可走坐标是从右下第一个开始的,也就是图中的4.可以通过修改a,b...h的值来改变顺序. 代码: /**  * 马踏棋盘算法   * 递归和回溯  *  */ public class HorseStep {          public static int X = 8;     public static int Y = 8;        

  • java实现马踏棋盘的算法

    本文实例为大家分享了java实现马踏棋盘的具体代码,供大家参考,具体内容如下 马踏棋盘算法介绍 8X8棋盘,马走日字,要求每个方格只进入一次,走遍棋盘上全部64个方格. 代码: public class HorseChessBoard {     private static int X;//棋盘的列数     private static int Y;//棋盘的行数     //创建一个数组,标记棋盘的各个位置是否被访问过     private static boolean visited[

  • java实现马踏棋盘算法(骑士周游问题)

    骑士周游问题 在8x8的国际棋盘上,按照马走日的规则,验证是否能够走遍棋盘. 解题思路 1.创建棋盘 chessBoard,是一个二维数组.2.将当前位置设置为已经访问,然后根据当前位置,计算马儿还能走哪些位置,并放入到一个集合中(ArrayList),最多有8个位置,每走一步,就使用step+1.3.遍历ArrayList中存放的所有位置,看看哪个可以走通,如果走通,就继续,走不通,就回溯.4.判断马儿是否完成了任务,使用step和应该走的步数比较,如果没有达到数量,则表示没有完成任务,将整个

  • java数据结构和算法之马踏棋盘算法

    本文实例为大家分享了java实现算法之马踏棋盘的具体代码,供大家参考,具体内容如下 一.马踏棋盘算法介绍 马踏棋盘算法也被称为骑士周游问题将马随机放在国际象棋的8×8棋盘Board[0-7][0-7]的某个方格中,马按走棋规则(马走日字)进行移动.要求每个方格只进入一次,走遍棋盘上全部64个方格 二.骑士周游问题的思路分析 1.创建棋盘 chessBoard , 是一个二维数组2.将当前位置设置为已经访问,然后根据当前位置,计算马儿还能走哪些位置,并放入到一个集合中(ArrayList), 最多

  • java学习笔记之马踏棋盘算法

    马踏棋盘或骑士周游问题 1.马踏棋盘算法也被称为骑士周游问题2.将马随机放在国际象棋的 8×8 棋盘 Board[0-7][0-7]的某个方格中,马按走棋规则(马走日字)进行移动.要求每个方格只进入一次,走遍棋盘上全部 64 个方格 思路 会使用到深度优先思想和类似迷宫问题的寻路策略问题,和八皇后问题也有相似. 1.用一个二维数组建立整张棋盘.用另外一个二维数组保存棋盘的每一个位置是否走过2.马在棋盘上有一个初始位置,将这个位置设为已走过,并将步数设为1.3.获得在这个位置上,马下一步能走的位置

  • java数据结构与算法之马踏棋盘

    本文实例为大家分享了java数据结构与算法之马踏棋盘的具体代码,供大家参考,具体内容如下 马踏棋盘算法也被称为骑士周游问题 将马随机放在过期象棋的8x8棋盘的某个方格中,马按走棋规则进行移动,要求每个方格只进入一次,走遍棋盘上全部64个方格 骑士周游问题结局步骤和思路 1.创建棋盘chessBoard,是一个二维数组2.将当前位置设置为已个访问,然后根据当前位置,计算马儿还能走那些位置,并放到一个集合中(ArrayList),最多8个位置3.变量ArrayList存放的所有位置,看看哪个可以走通

  • Python基于回溯法子集树模板解决马踏棋盘问题示例

    本文实例讲述了Python基于回溯法子集树模板解决马踏棋盘问题.分享给大家供大家参考,具体如下: 问题 将马放到国际象棋的8*8棋盘board上的某个方格中,马按走棋规则进行移动,走遍棋盘上的64个方格,要求每个方格进入且只进入一次,找出一种可行的方案. 分析 说明:这个图是5*5的棋盘. 类似于迷宫问题,只不过此问题的解长度固定为64 每到一格,就有[(-2,1),(-1,2),(1,2),(2,1),(2,-1),(1,-2),(-1,-2),(-2,-1)]顺时针8个方向可以选择. 走到一

随机推荐