编写数字宫格(利用面向对象的思想 附图) 类似游戏闯关遇到转角转换方向。

/**
 * 枚举类:转角方向
 * @author Administrator
 *
 */
public enum Direction {
 right,
 down,
 left,
 up
}

 

 

 

import java.util.Scanner;

public class Help {
 /**
  * 处理用户输入不合法的异常
  * @return
  */
 public int inputNum()
 {
  Scanner s = new Scanner(System.in);
  int num = 0;
  try {
   num  = s.nextInt();
  } catch (Exception e) {
   //System.out.println(e);
   System.out.print("输入的值不合法:请重新输入:");
   num = inputNum();//递归调用
  }
  return num;
 }

}

 

 


public class Pointer {

 public int x;
 public int y;
 public Direction dire;
 /**
  * 在某一个转角点,为了继续前行,是否已尝试过改变方向
  */
 public boolean isChangeDirection;
 
 /**
  *
  * @param x:横坐标
  * @param y:纵坐标
  * @param dire:移动方向
  * @param ischange 是否曾改变过方向
  */
 public Pointer(int x, int y,Direction dire,boolean ischange){
  this.x=x;
  this.y=y;
  this.dire=dire;
  this.isChangeDirection=ischange;
 }
}

 

 

 


public class EndResult {
 public static void main(String[] args) {
  System.out.print("请输入你要输入的宫格的行数:");
  int rows = new Help().inputNum();
  System.out.print("请输入你要输入的宫格的列数:");
  int cols=new Help().inputNum();
  
  //创建二维数组保存格式
  int[][] nums=new int[rows][cols];
  
  //给左上角赋初始值
  nums[0][0]=1;
  
  /*先由左上角向右移动*/
  Pointer p=new Pointer(0,0,Direction.right,false);
  
  /*循环到指针不能移动为止*/
  while(moveNext(p,nums)){
   
  }
  printnums(nums);//输出结果
 }
 
 /**
  * 打印输出结果
  */
 public static void printnums(int[][] nums){
  for (int i = 0; i < nums.length; i++) {
   for (int j = 0; j < nums[i].length; j++) {
    System.out.print(nums[i][j]+"\t");
   }
   System.out.println();
  }
 }
 
 /**
  * @param p 指针移动的方向
  * @param nums 传入的宫格格式
  * @return 是否移动过方向:若移动过或者遇到阻碍返回false
  */
 public static boolean moveNext(Pointer p, int[][] nums){

  if(p.dire==Direction.right){
   if(p.x==nums[0].length - 1||nums[p.y][p.x+1]!=0){
    //右边受到阻碍(边界或已有值)
    if(p.isChangeDirection){
     return false;
    }
    else{
     p.dire=Direction.down;
     p.isChangeDirection=true;
     return moveNext(p,nums);
    }
   }
   else{
    p.x++;//没有阻碍继续前行
    nums[p.y][p.x]=nums[p.y][p.x-1]+1;
    p.isChangeDirection=false;
    return true;
   }
  }
  else if(p.dire==Direction.down){
   if(p.y==nums.length - 1||nums[p.y+1][p.x]!=0){
    //下边受到阻碍(边界或已有值)
    if(p.isChangeDirection){
     return false;
    }
    else{
     p.dire=Direction.left;
     p.isChangeDirection=true;
     return moveNext(p,nums);
    }
   }
   else{
    p.y++;//没有阻碍继续前行
    nums[p.y][p.x]=nums[p.y -1][p.x]+1;
    p.isChangeDirection=false;
    return true;
   }
  }
  else if(p.dire==Direction.left){
   if(p.x==0||nums[p.y][p.x-1]!=0){
    //左边受到阻碍(边界或已有值)
    if(p.isChangeDirection){
     return false;
    }
    else{
     p.dire=Direction.up;
     p.isChangeDirection=true;
     return moveNext(p,nums);
    }
   }
   else{
    p.x--;//没有阻碍继续前行
    nums[p.y][p.x]=nums[p.y][p.x+1]+1;
    p.isChangeDirection=false;
    return true;
   }
  }
  else{
   if(p.y==0||nums[p.y-1][p.x]!=0){
    //上边受到阻碍(边界或已有值)
    if(p.isChangeDirection){
     return false;
    }
    else{
     p.dire=Direction.right;
     p.isChangeDirection=true;
     return moveNext(p,nums);
    }
   }
   else{
    p.y--;//没有阻碍继续前行
    nums[p.y][p.x]=nums[p.y+1][p.x]+1;
    p.isChangeDirection=false;
    return true;
   }
  }
 }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值