SLC21 Week5 - Programming Games&Puzzles
Програмування ігор-головоломок.
Image sourse: designer.microsoft.com/image-creator & canva.com
В навчанні програмуванню має бути багато практики, як кажуть щоб навчитися програмувати - треба програмувати.
А краще коли в навчанні програмуванню буде ігрова складова, не у всіх же одразу розвинене абстрактне мислення, і їм до вподоби сортувати масиви)) А грають в ігри не лише діти, а й багато дорослих. В минулому сезоні ви вже писало одну гру, чим мене сильно здивували - так сильно прикрасили гру казковою магічною атмосферою. Сподіваюся тут буде так само))
То ж з ігровим циклом ви вже знайомі - а хто ні - то передивіться цей урок та домашні роботи під ним, тим більше що вам знадобляться кольори.
Отже,
в будь якій грі можна виділити декілька моментів:
Ініціалізація
Цикл
Вивід стану гри
Хід гравця
Оновлення даних
Доки не виграш/програш
Ініціалізація
Початкове налаштування гри, те що виконується один раз, до основного ігрового циклу: створення ігрового поля, встановлення початкових параметрів (наприклад, положення фігур, ініціалізація змінних для відстеження стану гри, визначення положення гравця).
Основний ігровий цикл
Цей цикл повторюється до завершення гри - виграшу, програшу чи нічиєї
Вивід стану гри - розташування ігрових фігур, гравця, відображення кількості ходів
Хід гравця- отримання дій від гравця чи комп'ютера якщо грає комп'ютер.
Оновлення даних - "реакція" гри на дії гравця, внесення відповідних змін в гру(ігрове поле)
Доки не виграш/програш
зазвичай тут робимо перевірку чи досягнуто умов виграшу, програшу або нічиєї. А частіше це потрібно робити після чергового виводу стану гри, перед ходом гравця.
Зробимо гру, правда це здебільшого заготовка гри для вас.
Є поле довжиною 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
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
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
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}
Домашнє завдання
Від завдання до завдання публікувати лише зміни внесені в код та свої пояснення, думки та аналіз.
- краї Зробити поле довшим, поставити (
в init()
)по краям наприклад стовби -#
на випадковій відстані 0-2 від країв карти(поля). Гравець має рухатися між цими стовбами. - калюжі Доповнити перше завдання, зробити поле ще довшим, випадково розставити на полі калюжі
_
. Гравець має без перешкод проходити через ці калюжі, лише міняти вид на%
- мокрий гравець. - стрибок Додати стрибок (пробілом) - гравець стрибає через одну клітинку в напрямку свого руху!!!
- зникає калюжа Якщо гравець стрибне(через пробіл) в поодиноку калюжу - вона висихає, коли гравець просто пробігає калюжу - вона не висихає.
- каміння Доповнити перше завдання, зробити поле ще довшим, випадково розставити на полі каміння
a
. Гравець не може перейти ці камені, а має їх переплигувати ці каміння.(зможе переплигувати лише один камінь, ініціалізації не допускати генерації двох каменів поруч) - статистика Додати статистику: - кількість ходів, стрибків, калюж, каменів.
- штовхати Гравець може штовхати один камінь, не більше.
Перше завдання один бал, решта 1.5. Не пишіть сухий короткий текст (на зразок код+gif+малий текст) - зробіть свою розповідь цікавою.
Правила проведення
Публікувати можна на будь-якій мові, в будь якій спільноті чи просто у власному блозі, посилання на вашу роботу додайте сюди коментарем
Щоб я швидко знайшов, перевірив та оцінив ваші роботи залиште посилання в коментарі під цим текстом а в роботі поставите тег #slc21w5sergeyk
До всіх завдань код наводити скріншотом, не текстом. Демонструвати теж скріншотом результат роботи програми.
Будьте обережні стосовно ідеальних та надефективних рішень, звичайній людині, початківцю їх не легко найти.
Не надавати рішення задач з допомогою матеріалів, які не вчили. Наприклад масивів, котрі ми ще не вчили. Це обмеження не стосується тих студентів які вже практично знайомі з програмуванням, та надають розширені відповіді на завдання, що більш схоже на лекцію.
Плагіат і використання ШІ заборонено.
Учасники мають бути перевіреними та активними користувачами платформи.
Використані зображення мають належати автору або бути вільними від авторських прав. (Не забудьте вказати джерело.)
Учасники не повинні використовувати будь-які сервіси ботів для голосування, не брати участь у купівлі голосів.
Порекомендуйте прийняти участь своїм друзям.
Роботи слід опублікувати з Monday 25 Nov 24 to Sunday 01 Dec 24
Ваші роботи будуть мною прокоментовані, оцінені та відібрані чотири кращі роботи.
Скільки ж часу та старань Ви вкладаєте в свої дописи!!!! Не можу не похвалити за таку величезну роботу…
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.
My link.
https://steemit.com/slc21w5sergeyk/@josepha/slc21-week5-programming-games-and-puzzles
https://steemit.com/slc21w5sergeyk/@simonnwigwe/slc21-week5-programming-games-and-puzzles