SLC21 Week5 - Programming Games&Puzzles

in Ukraine on Steem28 days ago (edited)

Програмування ігор-головоломок.


image.png
Image sourse: designer.microsoft.com/image-creator & canva.com

В навчанні програмуванню має бути багато практики, як кажуть щоб навчитися програмувати - треба програмувати.
А краще коли в навчанні програмуванню буде ігрова складова, не у всіх же одразу розвинене абстрактне мислення, і їм до вподоби сортувати масиви)) А грають в ігри не лише діти, а й багато дорослих. В минулому сезоні ви вже писало одну гру, чим мене сильно здивували - так сильно прикрасили гру казковою магічною атмосферою. Сподіваюся тут буде так само))

То ж з ігровим циклом ви вже знайомі - а хто ні - то передивіться цей урок та домашні роботи під ним, тим більше що вам знадобляться кольори.
Отже,
в будь якій грі можна виділити декілька моментів:
Ініціалізація
Цикл
Вивід стану гри
Хід гравця
Оновлення даних
Доки не виграш/програш

image.png

Ініціалізація

Початкове налаштування гри, те що виконується один раз, до основного ігрового циклу: створення ігрового поля, встановлення початкових параметрів (наприклад, положення фігур, ініціалізація змінних для відстеження стану гри, визначення положення гравця).

Основний ігровий цикл

Цей цикл повторюється до завершення гри - виграшу, програшу чи нічиєї
Вивід стану гри - розташування ігрових фігур, гравця, відображення кількості ходів
Хід гравця- отримання дій від гравця чи комп'ютера якщо грає комп'ютер.
Оновлення даних - "реакція" гри на дії гравця, внесення відповідних змін в гру(ігрове поле)

Доки не виграш/програш

зазвичай тут робимо перевірку чи досягнуто умов виграшу, програшу або нічиєї. А частіше це потрібно робити після чергового виводу стану гри, перед ходом гравця.

image.png

Зробимо гру, правда це здебільшого заготовка гри для вас.
Є поле довжиною 20 клітинок, десь на полі стоїть гравець. Треба змусити його реагувати на рух вліво та рух вправо.
Опитування руху річ не проста - але ми зробимо це через банальні scanf()/cin Жаль доведеться кожен рух підтверджувати ENTER(((
Хто забажає, це не обов'язково - я все таки знайшов як в цих онлайн компіляторах робити ігри(головоломки) - щоб не підтверджувати за ENTER. (якщо хто знає інший шлях це зробити - буду вдячний за підказку.)

#include <unistd.h> 
#include <termios.h>
using namespace std;
char myget()
{
  struct termios oldt, newt;
  tcgetattr(STDIN_FILENO, &oldt);
  newt = oldt;
  // EN:Disable terminal buffering and wait for the Enter key.
  // UA:Вимкнути буферизацію терміналу та очікування клавіші Enter
  newt.c_lflag &= ~(ICANON | ECHO);
  // EN:Apply new terminal settings.
  // UA:Застосувати нові налаштування терміналу
  tcsetattr(STDIN_FILENO, TCSANOW, &newt);
  // EN:Get a character without waiting for Enter.
  // UA:Отримати символ без очікування Enter
  char ch = getchar();
  // EN:Restore previous terminal settings.
  // UA:Відновити попередні налаштування терміналу
  tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
  return ch;
}

main

В головній програмі слід зробити ігрове поле, задати його розмір, та координату гравця. Поле у нас одновимірне, тому лише один x. Організувати основний цикл. Бажано ще зробити глобальну константу для зображення гравця, `#define PLAYER '@'` або const `char PLAYER='@';` десь на початку коду програми
int main()
...
int size=20;
int plr_x;
char field[size+1], mv;
init(field, size, plr_x); // <= C++/C => init(field, &size, &plr_x);  
do
{
    dispaly(field, n, plr_x);
    cin>>mv;//  4 or 'a' <<<left   and 6 or 'd'>>>right
    move(field, n, plr_x, mv);
}while(!game_over(field, n, plr_x));

init

Функція init() згенерує поле - замість пробілів поки що видимі `.` та "поставить" на ньому гравця - `@`.
void init(char* field, int n, int& x)  // <= C++/C => init(cha* field, int n, int* x)  
{
    for(int i=0; i<n; i++) field[i]='.';
    field[n]='\0';
    x=n/2;
}

display

Тепер пишемо display, якби на поле не треба було накладати гравця - можна було б просто зробити `cout<<field;` адже ми термінували рядок нулем. Проте виведемо посимвольно, циклом.
void display(char* field, int n, int x)
{
    for(int i=0; i<n; i++) 
      if(i==x)
        cout<<PLAYER;
      else
        cout<<field[i];
}

Тут також можна аналізувати вміст масиву і виводити відповідні символи певним кольором. Як це робити можете згадати в цьому уроці та домашніх роботах під ним

move

Тепер напишемо move() - реакція на дії гравця
натиснена клавіша попадає в змінну mv - це виглядає ніби ви вводите буквений(або числовий) символ
Якщо натиснуто клавішу вліво - ми зменшуємо значення координати гравця, якщо він звісно не дійшов до краю.
В моєму випадку move не повертає ніякого значення, проте можна зробити що повертало - наприклад чи був хід результативним чи ні. І тоді можна буде підраховувати ходи.

void move(char *field, int n, int& x, char mv)
{
    if(mv=='4' || mv=='a') 
        if(x>0)
            x--;
    if(mv=='6' || mv=='d') 
        if(x<n-1)
            x++;
}|

GAME OVER

І нарешті дійшла черга до основного - умови продовження(завершення) гри.
Я напишу вічну "безпрограшну" гру)), ви ж будете писати ті чи інші умови аналізу для завершення гри.
Можна також передавати натиснену клавішу mv, як четвертий параметр щоб наприклад достроково завершити гру, через q наприклад.

bool game_over(char* field, int n, int plr_x)
{
    return false;
}

Також можна додати очищення екрану через ASCI коди
void clear_screen() { cout << "\033[2J\033[1;1H"; // ANSI escape code for clear screen}

Домашнє завдання

Демонстрацію кожного завдання записати в gif-картинку( наприклад через gif-cam) я писав про неї [тут](https://steemit.com/hive-145157/@sergeyk/gif-and-gifcam-yak-pokrashiti-svoyi-dopisi-na-steemit)

Від завдання до завдання публікувати лише зміни внесені в код та свої пояснення, думки та аналіз.

  1. краї Зробити поле довшим, поставити (в init())по краям наприклад стовби -# на випадковій відстані 0-2 від країв карти(поля). Гравець має рухатися між цими стовбами.
  2. калюжі Доповнити перше завдання, зробити поле ще довшим, випадково розставити на полі калюжі _. Гравець має без перешкод проходити через ці калюжі, лише міняти вид на % - мокрий гравець.
  3. стрибок Додати стрибок (пробілом) - гравець стрибає через одну клітинку в напрямку свого руху!!!
  4. зникає калюжа Якщо гравець стрибне(через пробіл) в поодиноку калюжу - вона висихає, коли гравець просто пробігає калюжу - вона не висихає.
  5. каміння Доповнити перше завдання, зробити поле ще довшим, випадково розставити на полі каміння a. Гравець не може перейти ці камені, а має їх переплигувати ці каміння.(зможе переплигувати лише один камінь, ініціалізації не допускати генерації двох каменів поруч)
  6. статистика Додати статистику: - кількість ходів, стрибків, калюж, каменів.
  7. штовхати Гравець може штовхати один камінь, не більше.

Перше завдання один бал, решта 1.5. Не пишіть сухий короткий текст (на зразок код+gif+малий текст) - зробіть свою розповідь цікавою.

Правила проведення

Публікувати можна на будь-якій мові, в будь якій спільноті чи просто у власному блозі, посилання на вашу роботу додайте сюди коментарем

Щоб я швидко знайшов, перевірив та оцінив ваші роботи залиште посилання в коментарі під цим текстом а в роботі поставите тег #slc21w5sergeyk

До всіх завдань код наводити скріншотом, не текстом. Демонструвати теж скріншотом результат роботи програми.

Будьте обережні стосовно ідеальних та надефективних рішень, звичайній людині, початківцю їх не легко найти.

Не надавати рішення задач з допомогою матеріалів, які не вчили. Наприклад масивів, котрі ми ще не вчили. Це обмеження не стосується тих студентів які вже практично знайомі з програмуванням, та надають розширені відповіді на завдання, що більш схоже на лекцію.

Плагіат і використання ШІ заборонено.

Учасники мають бути перевіреними та активними користувачами платформи.

Використані зображення мають належати автору або бути вільними від авторських прав. (Не забудьте вказати джерело.)

Учасники не повинні використовувати будь-які сервіси ботів для голосування, не брати участь у купівлі голосів.

Порекомендуйте прийняти участь своїм друзям.

Роботи слід опублікувати з Monday 25 Nov 24 to Sunday 01 Dec 24

Ваші роботи будуть мною прокоментовані, оцінені та відібрані чотири кращі роботи.

material for reviewㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ‎‎
image.png1. Who is a programmer? What should have been done earlier to become a programmer in the future?
image.png2. How to Prepare Yourself for Programming?
image.png3. Writing the first code
image.png4. Decision Making in Programming: If-Then-Else
image.png5. Iteration in Programming: For, While, and Do-While Loops
image.png6. Practice cycles and Guess the number game
image.png1. (7) Learn more about variable types. Subroutines. Practice problems.
image.png2. (8) Programming arrays
image3. (9) Strings in C. C-style strings
image.png4. (10) Recursia

Sort:  
Loading...
 27 days ago (edited)

Скільки ж часу та старань Ви вкладаєте в свої дописи!!!! Не можу не похвалити за таку величезну роботу…

A pesar de que esta no es mi especialidad, no pude dejar de ver todo el proceso que debe llevar a cabo para realizar un programa.
Lo felicito y espero que siga teniendo mucho éxito en todo lo que se proponga.

Un gran saludo desde Venezuela.

Banner Frank fjjrg (1).png

Coin Marketplace

STEEM 0.20
TRX 0.25
JST 0.038
BTC 96900.40
ETH 3351.13
USDT 1.00
SBD 3.19