public void command(final int aPlayer, final Command aCommand) throws CommandException {

		ChessmenEntity coma = aCommand.getChessmen();
		PositionEntity pos = aCommand.getPosition();
		if (coma.isPlayer()) {
			ChessmenData target = chessmens.get(coma.getId());
			int toX = pos.getX(); // ړ摊X
			int toY = pos.getY(); // ړ摊Y
			int toFixX = convertX(aPlayer, toX); // ړX
			int toFixY = convertY(aPlayer, toY); // ړY
			// System.out.println("to=" + toX + ":" + toY);
			// System.out.println("toFix=" + toFixX + ":" + toFixY);

			if (0 > toFixX || MAX_X <= toFixX || 0 > toFixY || MAX_Y <= toFixY) {
				throw new CommandException(aPlayer, "Ք͈͊Ow肳܂B");
			}

			if (target.isBoard()) {
				int fromFixX = target.getFixX(); // ړX
				int fromFixY = target.getFixY(); // ړY
				int fromX = convertX(aPlayer, fromFixX); // ړX
				int fromY = convertY(aPlayer, fromFixY); // ړY
				// System.out.println("from=" + fromX + ":" + fromY);
				// System.out.println("fromFix=" + fromFixX + ":" + fromFixY);

				if (!JchessRule.isMove(target.getType(), toX - fromX, toY - fromY, target.isPromote())) {
					throw new CommandException(aPlayer, "̋ł͈ړoȂʒuw肳܂B");
				}

				if (Type.Lance == target.getType()) {
					int y = fromY - 1;
					while (y > toY) {
						if (isChessmen(fromX, y)) {
							throw new CommandException(aPlayer, "ړrɋ݂܂B");
						}
						y--;
					}
				} else if (Type.Rook == target.getType()) {
					if (fromY > toY) {
						int y = fromY - 1;
						while (toY < y) {
							if (isChessmen(aPlayer, toX, y)) {
								throw new CommandException(aPlayer, "ړrɋ݂܂B");
							}
							y--;
						}
					} else if (fromY < toY) {
						int y = fromY + 1;
						while (toY > y) {
							if (isChessmen(aPlayer, toX, y)) {
								throw new CommandException(aPlayer, "ړrɋ݂܂B");
							}
							y++;
						}
					} else if (fromX < toX) {
						int x = fromX + 1;
						while (toX > x) {
							if (isChessmen(aPlayer, x, toY)) {
								throw new CommandException(aPlayer, "ړrɋ݂܂B");
							}
							x++;
						}
					} else if (fromX > toX) {
						int x = fromX - 1;
						while (toX < x) {
							if (isChessmen(aPlayer, x, toY)) {
								throw new CommandException(aPlayer, "ړrɋ݂܂B");
							}
							x--;
						}
					}
				} else if (Type.Bishop == target.getType()) {
					if (fromY > toY && fromX < toX) {
						int x = fromX + 1;
						int y = fromY - 1;
						while (toX > x && toY < y) {
							if (isChessmen(aPlayer, x, y)) {
								throw new CommandException(aPlayer, "ړrɋ݂܂B");
							}
							x++;
							y--;
						}
					} else if (fromY > toY && fromX > toX) {
						int x = fromX - 1;
						int y = fromY - 1;
						while (toX < x && toY < y) {
							if (isChessmen(aPlayer, y, y)) {
								throw new CommandException(aPlayer, "ړrɋ݂܂B");
							}
							x--;
							y--;
						}
					} else if (fromY < toY && fromX < toX) {
						int x = fromX + 1;
						int y = fromY + 1;
						while (toX > x && toY > y) {
							if (isChessmen(aPlayer, x, y)) {
								throw new CommandException(aPlayer, "ړrɋ݂܂B");
							}
							x++;
							y++;
						}
					} else if (fromY < toY && fromX > toX) {
						int x = fromX - 1;
						int y = fromY + 1;
						while (toX < x && toY > y) {
							if (isChessmen(aPlayer, x, y)) {
								throw new CommandException(aPlayer, "ړrɋ݂܂B");
							}
							x--;
							y++;
						}
					}
				}

				ChessmenData toComa = getChessmen(toFixX, toFixY);
				if (null != toComa) {
					if (toComa.getPlayer() == aPlayer) {
						throw new CommandException(aPlayer, "̈ʒuɂ͊Ɏ݂܂B");
					}
					// ɂ
					toComa.setPlayer(aPlayer);
					toComa.setBoard(false);
					toComa.setPromote(false);
					toComa.setFixX(-1);
					toComa.setFixY(-1);
				}

				// ړ
				target.setFixX(toFixX);
				target.setFixY(toFixY);
				if (aCommand.isPromote()) {
					if (2 < toY) {
						throw new CommandException(aPlayer, "̏ꏊł͐邱Ƃ͏o܂B");
					}
					target.setPromote(true);
				}

			} else {
				if (isChessmen(toFixX, toFixY)) {
					throw new CommandException(aPlayer, "ɋłĂ܂B");
				}

				// 2`FbN
				if (Type.Pawn == target.getType()) {
					for (int y = 0; y < MAX_Y; y++) {
						ChessmenData check = getChessmen(toFixX, y);
						if (null != check) {
							if (check.getPlayer() == aPlayer && Type.Pawn == check.getType() && !check.isPromote()) {
								throw new CommandException(aPlayer, "2ł܂B");
							}
						}
					}
				}

				// zu
				target.setBoard(true);
				target.setPromote(false);
				target.setFixX(toFixX);
				target.setFixY(toFixY);
			}
		} else {
			throw new CommandException(aPlayer, "̋𑀍삵悤Ƃ܂B");
		}

		// TODO history
	}