Разчитане на клавиатурата

Придобиването на информация за натискане на клавиши на клавиатура е много подобно на четене на бутоните на мишката. Функция pg.key.get_press() връща комплект, чиито елементи се използват като логически стойности, показвайки за всеки клавиш на клавиатурата дали в момента е натиснат или не.

Тъй като клавиатурата има много повече клавиши от мишката, използването на индекси 0, 1, 2 и т.н. за определени клавиши би било непрактично. За да не се налага да помним кой индекс в комплекта на кой клавиш съответства, библиотеката на PyGame съдържа наименувани константи, които използваме като индекси. Например, константи pg.K_LEFT, pg.K_RIGHT, pg.K_UP, pg.K_DOWN съответстват на често използваните клавиши със стрелки. За клавиша за интервал съответната константа е pg.K_SPACE, докато за буквите за букви, например a, b, c, съответните константи ще бъдат pg.K_a, pg.K_b, pg .K_c и пр. Пълният списък на тези константи можете да видите тук <https://www.pygame.org/docs/ref/key.html> __.

Примери и задачи

Пример - Космически кораб: В този пример имаме изображение на космически кораб, който преместваме наляво и надясно в съответствие с натиснатите клавиши със стрелки. Освен това можем да стреляме от кораба, като натискаме клавиша за интервал.

Първо обърнете внимание на подчертаната част от кода с по-светъл фон (линии 23-37). Тази част е нова тук и се коментира по-подробно в самия код.

Останалата част от програмата е просто анимиране на множество обекти, техника, известна от преди.

../_images/spaceship.png

Така че, след като прочетем състоянието на всички клавиши и го поставим в комплекта натиснат, можем просто да проверим състоянието на ключовете, които се интересуваме от използването на оператора if.

Задача - навигация:

Изпълнете следната програма, така че 4-те клавиши със стрелки да контролират жълтия кръг, както в примера. Кръгът не трябва да се движи, ако не са натиснати стрелки и да се движи един пиксел в посока на стрелките, които са натиснати (противоположните стрелки се отменят една друга навън).

Задача - змия:

Попълнете следната програма, така че стрелките да могат да контролират „змия“, състояща се от няколко квадрата, както в примера.

Променливите d_row и d_col указват посоката на движение на змията. Въпреки че не се натискат стрелки, стойността на тези променливи не се променя и змията продължава да се движи в същата посока. Вашата задача е да добавите команди за четене на състоянието на клавиатурата и изчисляване на нови стойности за (d_row, d_col) въз основа на натиснатите стрелки, така че движението да продължи в избраната посока.

Съвет: ако главата на змията беше в квадрата (ред, колона), в новата рамка тя ще бъде в квадрата (row + d_row, col + d_col). Проверете дали сте разбрали как трябва да присвоите стойности на променливите d_red, d_kol за всяка посока:

    Q-75: Ако на променливи (d_row, d_col) са присвоени стойности (0, -1), в коя посока движението продължава?

  • Нагоре
  • Не, стойностите за нагоре са (d_row, d_col) = (-1, 0)
  • Надолу
  • Не, стойностите за надолу са (d_row, d_col) = (1, 0)
  • Наляво
  • Правилно
  • Надясно
  • Не, стойностите за дясно са (d_row, d_col) = (0, 1)

Въпроси

Докато отговаряте на въпросите, върнете се към програмата „змия“, ако е необходимо, и потърсете частите, на които трябва да отговорите.

Колко реда има дъската?

    Q-76: Какви са координатите на крайния ляв ъгъл на площта (row, col)?

  • x = row*a + a, y = col*a + a
  • Опитай пак
  • x = col*a + a, y = row*a + a
  • Опитай пак
  • x = row*a, y = col*a
  • Опитай пак
  • x = col*a, y = row*a
  • Правилно

    Q-77: Избери вярното.

  • Във всеки списък 'змия' се разширява от нов елемент, представляващ новата позиция на главата на змията.
  • Няма такава команда в програмата
  • Списък „змия“ има еднакъв брой елементи в цялата програма.
  • Правилно
  • Един елемент, който представлява края на змийската опашка, се премахва от списъка „змия“ във всеки кадър.
  • Няма такава команда в програмата