KeyEventKarelProgram3 (KarelOOP2)
Retired DISLab
/* * Copyright 2020 Sangwon Park @ DISLab, HUFS */ package cp.java.week11.thread; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.util.LinkedList; import hufs.dislab.karel.IKarel; import hufs.dislab.karel.IKarelProgram; import hufs.dislab.karel.SimpleKarel; /** * 메시지 큐 연습 2 * @since KarelOOP 2 (2020.10.7) */ class RunnableKarel3 extends SimpleKarel { private LinkedList<String> msgQ = new LinkedList<String>(); private synchronized void addMsg(String msg) { msgQ.addLast(msg); } private synchronized String removeMsg() { return msgQ.isEmpty() ? null : msgQ.removeFirst(); } @Override public void move() { addMsg("move"); } @Override public void turnLeft() { addMsg("turnLeft"); } @Override public void turnRight() { addMsg("turnRight"); } @Override public void turnAround() { addMsg("turnAround"); } @Override public void run() { while (true) { String msg = removeMsg(); if (msg == null) continue; if (msg.equals("move")) { if (frontIsClear()) super.move(); } else if (msg.equals("turnLeft")) { super.turnLeft(); } else if (msg.equals("turnRight")) { super.turnRight(); } else if (msg.equals("turnAround")) { super.turnAround(); } } } } @SuppressWarnings("serial") public class KeyEventKarelProgram3 extends IKarelProgram { RunnableKarel3 karel; @Override protected void onInit() { karel = (RunnableKarel3) getIKarel(); addIKarel(karel, getWorldWidth() / 2, getWorldHeight() / 2, EAST, 0); // Event 처리를 transparent하게 처리함 this.addWorldKeyListener(new KeyListener() { void print(KeyEvent e) { String threadstr = Thread.currentThread().toString(); threadstr = threadstr.substring(0, threadstr.indexOf(",")) + "]"; String k2str = karel.toString(); k2str = k2str.substring(k2str.lastIndexOf('.') + 1); String estr = e.toString(); estr = estr.substring(estr.indexOf("[")); estr = estr.substring(0, estr.indexOf(",keyLocation")) + "]"; System.out.println(threadstr + ":" + k2str + ":" + estr); } @Override public void keyTyped(KeyEvent e) { } @Override public void keyPressed(KeyEvent e) { print(e); switch (e.getKeyCode()) { case KeyEvent.VK_UP : if (karel.frontIsClear()) karel.move(); break; case KeyEvent.VK_LEFT : karel.turnLeft(); break; case KeyEvent.VK_RIGHT : karel.turnRight(); break; case KeyEvent.VK_DOWN : karel.turnAround(); break; } } @Override public void keyReleased(KeyEvent e) { } }); } @Override protected void onStart() { System.out.println(Thread.currentThread()); Thread th = new Thread(karel); th.start(); } public void moveToWall(IKarel karel) { while (karel.frontIsClear()) karel.move(); } public static void main(String[] args) { IKarelProgram.main(args, new RunnableKarel3()); } }