Урок 7, По-сложни условия
Допълнителни линкове към този урок:
- Кода от този урок: игра с кръгче
- "Логически оператори", Khan Academy
- "Logical operators", javascript.info
Основни точки от този урок
Миналия път бяхме направили условие което проверява дали е натисната мишката. Беше нещо от този род:
function setup() {
createCanvas(400, 400);
}
function draw() {
background(220);
if (mouseIsPressed) {
rect(0, 0, 100, 100)
} }
Както може би си спомняте, този код показва един правоъгълник само докато задържаме мишката, тъй като mouseIsPressed
е true
/"истина" когато е задържан бутона на мишката и false
/"неистина" когато не е.
Превеждайки го на български, с този код казваме: "Ако е натисната мишката, нарисувай правоъгълник."
Обръщане на условия с !
Това е страхотно, но как бихме могли да показваме правоъгълника само когато не е натисната мишката?
Един начин би бил да използваме else
, без нищо в къдравите скоби на if
. Нещо като това:
if (mouseIsPressed) {
else {
} rect(0, 0, 100, 100)
}
С този код буквално казваме: "Ако е натисната мишката, не прави нищо, а иначе, нарисувай правоъгълник."
Това работи, но не е особено четливо. Този if (..) {} else { .. }
лесно предизвиква объркване.
Вместо това може да използваме знака за отрицание (negation, също познат и като логическо "не"), !
. Поставяйки този знак преди дадено условие, получаваме точно противоположното условие. Тоест, може да напишем горния код по-просто ето така:
if (!mouseIsPressed) {
rect(0, 0, 100, 100)
}
Това бихме прочели като: "Ако не е натисната мишката, нарисувай правоъгълник." – точно това което искаме.
(Този знак бихме могли да използваме и в конзолата, където ще видим че !true
(НЕ истина) произвежда false
(неистина) а !false
(НЕ неистина) е true
(истина).)
Може би си спомняте същата тази удивителна от знака за неравенство, !=
. И там, както и тук, удивителната означава "не".
Комбиниране на условия с &&
(и)
За друг пример, нека да си представим че имаме една анимация която движи правоъгълник през екрана. Нещо като това:
function setup() {
createCanvas(400, 400);
}
let x = 0 // (бележка: във видеото тук бях писал `var x = ..`, но `var` и `let` са почти еднакви. Препоръчва се let.)
function draw() {
background(220);
rect(x, 0, 10, 10) // Рисува малък правоъгълник
= x + 1 // Премества правоъгълника надясно
x
if (!mouseIsPressed) {
rect(0, 0, 100, 100) // Големият правоъгълник от преди малко
} }
Нека да си представим, че искам кода да показва големия правоъгълник само когато мишката е натисната и, едновременно с това, малкия правоъгълник е в дясната част от екрана. (Да речем, тъй като ако винаги показвам големия правоъгълник, то той би покрил малкия в лявата част от екрана)
Това можем да го направим използвайки два пъти if
, например така:
if (mouseIsPressed) { // Мишката е натисната
if (x > 200) { // Малкият правоъгълник е в десния край на екрана
rect(0, 0, 100, 100)
} }
Но, разбира се, има и по-лесен начин да опишем същото, а именно:
if (x > 200 && mouseIsPressed) { // Малкият правоъгълник е в десния край на екрана И мишката е натисната
rect(0, 0, 100, 100)
}
В този случай, знакът &&
(двоен амперсанд, изписва се с Shift+7 на повечето клавиатури) означава "логическо И" и се използва за да опише условие, което е вярно, само когато и двете под-условия са верни.
Например, този знак може да използваме за да опишем неща като "ако паролите съвпадат И не съществува потребител с това име" или пък "ако играчът е жив и няма останали монети за събиране".
Също, ако искаме да кажем условие подобно на "ако променливата z е между 5 и 10", то това отново бихме направили използвайки &&
, ето така: z > 5 && z < 10
.
Комбиниране на условия с ||
(или)
И последно, друг начин да правим по-сложни условия е да използваме знака ||
(права черта, изписва се с Shift+\ на повечето клавиатури), значещ "логическо ИЛИ". Него използваме за да опишем условия, които са верни, когато поне едно под-условие е вярно.
Така например, ако напишем:
if (x > 200 || mouseIsPressed) { // Малкият правоъгълник е в десния край на екрана ИЛИ мишката е натисната
rect(0, 0, 100, 100)
}
Тогава, големият правоъгълник от преди малко ще се показва винаги когато мишката е вдясно и, също така, и винаги когато малкия правоъгълник е вдясно.
Това може да е полезно за да опишем условия като, този знак може да използваме за да опишем неща като "ако потребителя е авторът на съобщението ИЛИ потребителя е администратор" или пък "ако играчът е извън екрана или играчът допира лава".
Таблица
Ето и отново списък от "логическите" оператори, които може да използваме за да правим по-сложни условия:
Знак (оператор) | Значение | Пример | Значение на примера |
---|---|---|---|
(без) | keyIsPressed |
Някой клавиш на клавиатурата е натиснат. | |
! |
не (отрицание) | !keyIsPressed |
Не е натиснат нито един клавиш на клавиатурата. |
&& |
и (""конюнкция"") | keyIsPressed && mouseIsPressed |
Едновременно е натиснат клавиш на клавиатурата и бутон на мишката. |
|| |
или (""дисюнкция"") | keyIsPressed || mouseIsPressed |
Натиснат е или клавиш на клавиатурата, или бутон на мишката (или и двете). |
Примерна игра с кръгче, което се движи
Останалата част от урока (от 3:49 нататък), показва примерна игра, в която играча трябва да натисне с мишката когато един движещ се кръг е в средата на екрана, и ако успее печели, а иначе губи.
Кода от тази игра може да разгледате тук:
function setup() {
createCanvas(400, 400);
}
let x = 0 // Променлива, в която записваме къде се намира кръгчето.
function draw() { // Всеки кадър:
background(220);
circle(x, 200, 50) // 1) Нарисувай кръгче
= x + 2 // 2) Премести го надясно
x if (x > 400) { // 3) Ако е след десния край,
= 0 // .. го върни в началото
x
}if (mouseIsPressed) { // 4) Когато се натисне мишката
if (x > 150 && x < 250) { // .1) Ако кръгчето е в средата (победа),
fill(0, 255, 0) // .. смени цвета на зелен
else { // .2) а иначе (загуба)
} fill(255, 0, 0) // .. го смени на червен
}
} }
Може да изпробвате крайния резултат тук: игра с кръгче.
Задачa
Направете един правоъгълник да изчезва (или, по желание, да сменя цвета си) когато застанете върху него с мишката.
За целта, може да използвате променливите mouseX
и mouseY
, които ни дават съответно отстоянието от левия и горния край на самата мишка.
За начало, може да пробвате със следния правоъгълник, който заема цялата дясна половина на екрана:
function setup() {
createCanvas(400, 400);
}
function draw() {
background(220);
rect(200, 0, 200, 400) // <--
}
След това, пробвайте да допълните условието, така че следния правоъгълник (заемащ долната дясна четвъртина) да изчезва:
rect(200, 200, 200, 200)
След това, пробвайте да допълните условието с още една част, така че следния правоъгълник да изчезва:
rect(200, 200, 100, 200)
И последно, направете условието да работи за финалния правоъгълник:
rect(200, 200, 100, 100)
В някой от следващите уроци ще говорим малко повече за това как може да използвате подобни техники за да направите някакъв вид бутон, но за сега, това е хубаво упражнение. Ако някоя стъпка ви се вижда сложна, пробвайте да направите само първите две.