停车场Java考题,无聊时可以看看

问题三:
 模拟汽车在某个停车场内的活动。
 假设有某个5x5的停车场,横轴为-2到+2,纵轴为-2到 +2,一辆汽车停在中心(0,0),面向上方(称之为北方)。 
用户的输入有三种:前进一格(F),原地左转90度(L) ,原地右转90度(R)。
根据用户的输入序列,模拟汽车的活动。
 
程序结束的条件是, 
 1)当汽车超过点阵范围后,认为汽车掉入沟中(FALL )而不能动弹了,程序不再处理输入,结束; 
2)输入(S)后结束。
 
每一步动作后给出最终汽车所处的位置以及方向(用N,S,E ,W表示北、南、东、西)
 
编程要求: 用你认为合适的面向对象方式用java代码描述以上过程 ,并且能接受输入,得出结果。
输入可以用任何你认为方便的方式进行,例如stdin,读入文件 ,或者用某种方法固定写在某个启动类中,每次运行前修改亦可 。不必检查输入的合法性。
 
每一步都输出在stdout中。格式如下:输入内容,结果横坐标 ,纵坐标,方向
 
例子1:这是一个前进一步,左转两次,再前进到头的例子,
输入为:FLLFFFFFFFF
START,0,0,N
F,0,1,N
L,0,1,W
L,0,1,S
F,0,0,S
F,0,-1,S
F,0,-2,S
F,0,-3,S
FALL
 
例子2:输入:FRFRFRFRS
START,0,0,N
F,0,1,N
R,0,1,E
F,1,1,W
R,1,1,S
F,1,0,S
R,1,0,W
F,0,0,W
R,0,0,N
STOP
 
---------------------------------------------------------------------------------------
 
package cxg;
public class Car {
 private int stationX = 0;
 private int stationY = 0;
 private int direction = 1;
 
 public int getDirection() {
  return direction;
 }
 public void setDirection(int direction) {
  this.direction = direction;
 }
 public int getStationX() {
  return stationX;
 }
 public void setStationX(int stationX) {
  this.stationX = stationX;
 }
 public int getStationY() {
  return stationY;
 }
 public void setStationY(int stationY) {
  this.stationY = stationY;
 }
 
}
 
--------------------------------------------------------------------------------
 
package cxg;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class CoreProcess {
 
 private final int maxX = 2;
 private final int minX = -2;
 private final int maxY = 2;
 private final int minY = -2;
 
 private int nowX = 0;
 private int nowY = 0;
 private int directionNum;
 
 
 //N:1   E:2  S:3  W:4
 private final int[] dirNum = {1,2,3,4};
 private final char[] direction  = {'N','E','S','W'};
 private final char[] control = {'F','L','R'};
 private final char exit = 'S';
 //当前的VO,保存上一步的状态
 private Car tempVO = new Car();
 
 /*
  * stackMap{InfoVO}
  */
 private List stateList = new ArrayList();
 
 public static void main(String[] args){
  CoreProcess instance = new CoreProcess();
  instance.getInput();
  instance.viewPrint();
 }
 
 private void getInput(){
  try {
         BufferedReader stdIn = new BufferedReader(
                 new InputStreamReader(System.in));
         String userInput;
         userInput = stdIn.readLine();
      //while ((userInput = stdIn.readLine()) != null) {
        System.out.println("Custom input : " + userInput);
        System.out.println("START ,0,0,N");
        processInput(userInput);
      //}
      stdIn.close();
       
         }catch(IOException e){
          System.err.println("Couldn't get I/O .");
          System.exit(1);
         }
 }
 
 //处理控制台显示
 private void viewPrint(){
  //如果利用JDK1.5autoboxing 等处理更好
  Iterator ite = stateList.iterator();
  while(ite.hasNext()){
   Car vo = (Car)ite.next();
   //这里如果用jdk1.5printf()处理更方便些
   System.out.println(vo.getDirection()+","+vo.getStationX()+","+vo.getStationY());
  }
 }
 
 private boolean checkIsFall(int x,int y){
  boolean flag = true;
  if(x > maxX || x < minX){
   flag = false;
  }
  if(y > maxY || y < minY){
   flag = false;
  }
  //增加处理汽车掉坑里{1,1}{1,-1}
  if( (x == 1 && y == 1) || (x == 1 && y == -1) ) {
   flag = false;
   System.out.println("This Car has turn over at { x= "+x+",y= "+y+" }");
  }
  return flag;
 }
 
 private void processInput(String input){
  //没有考虑大小写
  char inChar;
  int len = input.length();
  for(int i=0;i<len;i++){
   inChar = input.charAt(i);
   if( !operation(inChar) ){
    break;
   }
  }
 }
 
 private boolean operation(char inChar){
  boolean flag = true;
  Car thisVO = new Car();
  
  //处理退出
  if(inChar == exit){
   System.exit(0);
  }
  
  //处理方向
  else if(inChar == control[1] || inChar == control[2]){
   directionNum = tempVO.getDirection();
   if(inChar == control[2]){
    directionNum = (directionNum + 1) % 4 ;
    doSetDirection(directionNum,thisVO);
   }else{
    if(directionNum > 1){
     directionNum = (directionNum - 1) % 4 ;
     doSetDirection(directionNum,thisVO);
    }else if(directionNum == 1){
     directionNum = 4;
     doSetDirection(directionNum,thisVO);
    }
   }
   
  //处理前进 
  }else if(inChar == control[0]){//F
   nowX = tempVO.getStationX();
   nowY = tempVO.getStationY();
   int fangxiang = tempVO.getDirection();
   
   if(fangxiang == dirNum[0]){//N:1
    nowY++;
    tempVO.setStationY(nowY);
    flag = doSetAllProperties(nowX,nowY,tempVO.getDirection(),thisVO);
   }
   else if(fangxiang == dirNum[1]){//E:2
    nowX++;
    tempVO.setStationX(nowX);
    flag = doSetAllProperties(nowX,nowY,tempVO.getDirection(),thisVO);
   }
   else if(fangxiang == dirNum[2]){//S:3
    nowY--;
    tempVO.setStationY(nowY);
    flag = doSetAllProperties(nowX,nowY,tempVO.getDirection(),thisVO);
   }
   else if(fangxiang == dirNum[3]){//W:3
    nowX--;
    tempVO.setStationX(nowX);
    flag = doSetAllProperties(nowX,nowY,tempVO.getDirection(),thisVO);
   }
   
  }//处理前进 end
  
  return true;
 }
 
 
 private void doSetDirection(int direction,Car vo){
  tempVO.setDirection(direction);
  vo.setDirection(direction);
  vo.setStationX(tempVO.getStationX());
  vo.setStationY(tempVO.getStationY());
  stateList.add(vo);
 }
 
 private boolean doSetAllProperties(int x,int y,int direction,Car vo){
  if(!checkIsFall(nowX,nowY)){
   return false;
  }
  vo.setDirection(direction);
  vo.setStationX(x);
  vo.setStationY(y);
  stateList.add(vo);
  
  return true;
 }
 
}
 
初始化停车场(确定停车区个数n,每个停车区的停车位,且初始停车场为空),说明:使用一个共享数组(临界资源)存储每个停车区中空闲停车位的个数,每一个停车区使用一个共享缓冲区可容纳一辆车,停车场公共通道允许通过两辆车通过。 停车场入口检查是否有空闲停位,如果有发放相关停车区的停车卡,允许停车。如果不存在空闲车位,等待到有空闲车位止。注,入口处应尽量发放不同停车区的停车卡,以获得更高的效率。停车场过道允许两辆车同通过。 停车场出口,回收停车卡,并修改相关停车区空闲车位数。注:同一刻只能有一个车出停车场。 每一个停车区,有一个待车位,供进入停车区车辆进入停车区。停车区只能有一辆车进或出。 每辆车每进入下一环节皆应停留一定间。每一个用户建立一个窗口,于窗口中显示当前将态。将状态转换可由人工确定亦可自动完成,但进入下状态需要停留学生一定的间,以保证多个用户“并行”工作。 本框架由四个类组成,这四个类分别是:InitFrame、WotkFram、carJFrame及carThread,由InitFrame启动。类InitFrame提供停车场初始化功能,完成初始任务后启动类WotkFram界面,执行停车场模拟程序,点击命令按扭“进入停车场”,建立一个线程(线程类名为carThread),线程建立一个carJFrame窗口(车辆进入、离开停车场操作程序)模拟车辆进入或离开停车场
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值