Java::拼图小游戏::

思路:
1,生成一个拼图棋盘
2,准备一个正确的数组格式,一个给用户拼的数组
3,每次移动要看用户是否拼完

/**
 * FileName: Puzzle
 * Author:   86186
 * Date:     2022/3/22 12:23
 * Description: Puzzle
 * History:
 * <author>          <time>          <version>          <desc>
 * 作者姓名           修改时间           版本号              描述
 */
package project;

import java.util.Random;
import java.util.Scanner;

/**
 * 〈一句话功能简述〉<br> 
 * 〈Puzzle〉
 *
 * @author Hacker
 * @create 2022/3/22
 * @since 1.0.0
 */

public class Puzzle {
    public static int level;//数组长度
    public static int[][] resultArr;
    public static Scanner input = new Scanner(System.in);
    public static int x;//0的横坐标
    public static int y;//0的纵坐标
    public static int step;//记录用户移动的步数
    public static boolean signs = true;//判断是否可以移动
    public static void main(String[] args) {
        System.out.println("==拼图游戏==");
        System.out.println("请输入难度: 1 简单 2 普通 3 困难");
        level = input.nextInt();
        level += 2;
        System.out.println("开始游戏");
       int[][] pazzle =  buildPuzzle();//给用户拼的数组
       Random r = new Random();
      char[] sign = {'w','s','a','d'};
       //任意打乱
        char[] fings = new char[20];
        findZeor(pazzle);
        for(int i = 0;i < 20;i ++){
            int temp = r.nextInt(4);
            char t = sign[temp];
//            System.out.println(t);

            switch (t){
                case 'w':
                    signs = moverUp(pazzle);
                    break;
                case 's':
                    signs = moverDown(pazzle);
                    break;
                case 'a':
                    signs = shiftLeft(pazzle);
                    break;
                case 'd':
                    signs = shiftRight(pazzle);
                    break;

            }
            if(signs){
                if(t == 'a'){
                    fings[i] = 'd';

                }else if(t == 'd'){
                    fings[i] = 'a';

                }else if(t == 'w'){
                    fings[i] = 's';
                }else{
                    fings[i] = 'w';
                }
            }

        }

        show(resultArr);
        System.out.println("======================");
        show(pazzle);
        while(true){

            System.out.println("请选择: w 上移:s 下移:a 左移:d 右移");
            String chocie = input.next();
            switch (chocie){
                case "w":
                    signs = moverUp(pazzle);
                    break;
                case "s":
                    signs = moverDown(pazzle);
                    break;
                case "a":
                    signs = shiftLeft(pazzle);
                    break;
                case "d":
                    signs = shiftRight(pazzle);
                    break;
                    //以下俩个方式,用户是不知道的!!!!嘿嘿
                case "chenqian"://一键完成
                    pazzle = resultArr;
                    break;
                case "fings"://得到正确结果的步骤
                    for(int i = fings.length - 1;i >= 0;i --){
                        System.out.print(fings[i] + " ");
                    }
                    System.out.println();
                    break;

            }
            if(!signs){
                System.out.println("不能移动!!!!!");
            }
            step ++;
            show(pazzle);
            if(success(pazzle)){
                System.out.println("恭喜你拼图完成!!!,你一共走了" + step + "步");
                break;

            }


        }



    }

    //比较是否完成
    public static boolean success(int[][] array){
        for(int i = 0;i < array.length;i ++){
            for(int j = 0;j < array[i].length;j ++){
                if(resultArr[i][j] != array[i][j]){
                    return false;
                }
            }

        }
        return true;

    }
    //右移
    public static boolean shiftRight(int[][] array){
        if(y == 0){

            return false;
        }
        int temp = array[x][y];
        array[x][y] = array[x][y - 1];
        array[x][y - 1] = temp;
        y --;
        return true;

    }
    //左移
    public static boolean shiftLeft(int[][] array){
        if(y == level - 1){
//            System.out.println("不能移动");
            return false;
        }
        int temp = array[x][y];
        array[x][y] = array[x][y + 1];
        array[x][y + 1] = temp;
        y ++;
        return true;
    }
    //下移
    public static boolean moverDown(int[][] array){
        if(x == 0){
//            System.out.println("不能移动!!!");
            return false;
        }
        int temp = array[x][y];
        array[x][y] = array[x - 1][y];
        array[x - 1][y] = temp;
        x --;
        return true;
    }
    //上移
    public static boolean moverUp(int[][] array){
        if(x == level - 1){
            return false;
        }
        int temp = array[x][y];
        array[x][y] = array[x + 1][y];
        array[x + 1][y] = temp;
        x ++;
        return true;
    }

    //找零
    public static void findZeor(int[][] pazzle){
        for(int i = 0;i < pazzle.length;i ++){
            for(int j = 0;j < pazzle[i].length;j ++){
                if(pazzle[i][j] == 0){
                    x = i;
                    y = j;
                    return;
                }
            }

        }
    }

    //创建拼图
    public static int[][] buildPuzzle(){
        resultArr = oneToTwo(buildArr());
        int[] t = buildArr();
        //upSet(t);
        int[][] pazzle = oneToTwo(t);
        return pazzle;
    }
    //显示数组
    public static void show(int[][] array){
        for(int[] t : array){
            for(int i : t){
                System.out.print(i + "\t");

            }
            System.out.println();

        }
    }
    //数组的打乱
    public static void upSet(int[] array){
        Random r = new Random();
        for(int i = 0;i < array.length - 2;i ++){
            int index1 = r.nextInt(array.length - i - 1);
            int index2 = array.length - i - 1;
            int temp = array[index1];
            array[index1] = array[index2];
            array[index2] = temp;
        }
    }
    //一维数组转为二维数组
    public static int[][] oneToTwo(int[] array){
        int[][] buildArr = new int[level][level];
        for(int i = 0;i < array.length;i ++){
            buildArr[i / level][i % level] = array[i];
        }
        return buildArr;
    }
    //创建一个一维数组
    public static int[] buildArr(){
        int[] newArr = new int[level * level];
        for(int i = 0;i < newArr.length - 1;i ++){
            newArr[i] = i + 1;
        }
        newArr[newArr.length - 1] = 0;
        return newArr;

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值