Причина проста: elif player != n1 or n2
не совпадает с elif player != n1 or player != n2
.
player != n1 or n2
совпадает с (player != n1) or (bool(n2))
. Другими словами, пока n2
является «правдивым» (то, что при преобразовании в логическое значение будет True
), player != n1 or n2
будет True
. Поскольку n2
всегда отлично от нуля int
, это всегда верно, и поэтому ваше условие if
всегда будет успешным.
Кроме того, вы изменяете значения player
, n1
и n2
только вне вашего цикла while
. Это означает, что ваш код внутри этого цикла всегда будет идти по одному и тому же пути! Судя по вашему коду, я думаю, вы хотите player = int(input("Select a room from 1 to 9: "))
внутри цикла.
В качестве отступления: если вы когда-либо находились в ситуации, когда вы хотели сравнить неравенство со многими переменными (что-то вроде player != n1 or player != n2 or player != n3...
), вы могли бы вместо этого использовать player in [n1, n2, n3...]
.
Вы не можете использовать ResponseWriter, как Вы хотите. Двумя путями я могу думать, как добавить, что дочерние элементы управления программно любой через обязательный атрибут (см. этот ответ), или в месте, где средства управления обычно создаются (в JSPs, который находится в классе тега).
Существует два пути к компонентам JSF для содержания других средств управления: как дети или как названный фасетами. Компоненты всегда управляют, как они представляют свои фасеты; если они должны представить своих детей, они должны возвратить true для getRendersChildren.
Это не тестируется код, но последовательность проходит примерно так:
@Override
public boolean getRendersChildren() {
return true;
}
@Override
public void encodeBegin(FacesContext context)
throws IOException {
// should really delegate to a renderer, but this is only demo code
ResponseWriter writer = context.getResponseWriter();
writer.startElement("span", this);
String styleClass = getStyleClass();
writer
.writeAttribute("class", styleClass, "styleClass");
UIComponent headerComponent = getFacet("header");
if (headerComponent != null) {
headerComponent.encodeAll(context);
}
writer.startElement("hr", null);
}
@Override
public void encodeChildren(FacesContext context)
throws IOException {
ResponseWriter writer = context.getResponseWriter();
for (UIComponent kid : getChildren()) {
kid.encodeAll(context);
writer.startElement("br", null);
}
}
@Override
public void encodeEnd(FacesContext context)
throws IOException {
ResponseWriter writer = context.getResponseWriter();
writer.endElement("span");
}
Едва ли ответ, больше предположения, но возможно Вы могли расширить одни из средств управления facelets?
С другой стороны, любое использование facelets непосредственно - который, кажется, точно, что Вы хотите действительно, хотя я не использовал его сам. Или Вы могли добавить средства управления UIOutput, где Вы хотите, чтобы HTML появился, и устанавливать значение каждого к HTML Вы хотите появиться - это точно, что f:verbatim делает под капотом, или таким образом, это кажется от рассмотрения исходного кода :-)