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());
	}
}
개인 도구
이름공간
변수
행위
둘러보기
구성원
연구
연구실
기타
도구모음
인쇄/내보내기