• 8921
  • 4
  • 1
Нравится блог?
Подписывайтесь!

«Крестики-нолики» своими руками

Всем привет! Свой блог я хочу посвятить теме разработки видеоигр.  Немного погуглив и полазив в сообществе Game dev на юви, я нашел блог @Nuligine, который уже больше года неактивен, и сайты gamedev.kz и gamez.kz, которые тоже уже давно находятся в инактиве. На этих сайтах конечно есть интересные статьи и уроки, но они, как правило, по UNITY3D. Я считаю, что изучение этой темы (да и не только этой) нужно начинать, грубо говоря, со дна (или как можно ближе к нему).

Как известно из истории индустрии видеоигр, первые примитивные компьютерные игры были разработаны в 1950-x и 1960-x годах и работали на таких платформах, как университетские мейнфреймы и компьютеры EDSAC. Мы же сегодня попробуем реализовать одну из тех первых программ, имитирующую игру «крестики-нолики». В качестве среды программирования выбрана старая добрая Borland C++, которую на современных компьютерах можно запустить с помощью эмулятора DosBox. Его дистрибутив можно скачать с официального сайта разработчиков. Для запуска приложений необходимо в командной строке эмулятора прописать следующие команды по очереди: mount d d:\ и d: (где d - имя диска). Для вызова исполняемого файла прописываем его полный путь (например, folder\game.exe).

Теперь перейдем непосредственно к реализации программы. В первую очередь подключим необходимые библиотеки и объявим глобальные переменные:

  1. #include <stdlib.h>
  2. #include <iostream.h>
  3. #include <conio.h>
  4. #include <math.h> //библиотека для выполнения некоторых математических действий
  5. #include <graphics.h>
  6. char a[3][3];//матрица, равная игровому полю 3x3 и принимающая значения X, O и -, если ячейка свободна
  7. char strike[1];// периодически меняет свое значение с X на O и наоборот
  8. int hit=0;//счетчик ходов
  9. int style,midx,midy,i,x,y,j;
  10. void*ptr;//резервируем пустой указатель - стартовая ячейка памяти, начиная в которой мы будем хранить наш так называемый прицел (пригодится для его перемещения по игровому полю)
  11. unsigned int size;//в этой переменной будем хранить данные о том, сколько наш прицел будет занимать в памяти

Графический интерфейс фирмы Borland International (BGI - Borland Graphics Interface) состоит из двух компонент: постоянного ядра графической системы и набора графических драйверов. Ядро графической системы воспринимает все запросы прикладной программы на выполнение графических функций. Оно не зависит от типа подключенного дисплейного адаптера. Аппаратно-зависимой частью являются графические драйверы, осуществляющие интерфейс между ядром системы и конкретным дисплейным адаптером.

Графические драйверы содержаться в отдельных файлах с расширением .bgi. Каждый файл содержит бинарный образ (binary image) драйвера для одного или нескольких близких по типу адаптеров.

После объявления глобальных переменых опишем функции, которые будут выводить на экран игровое поле и прицел:

  1. void draw(int x, int y)
  2. {
  3. setlinestyle(SOLID_LINE,1,3); //устанавливаем стиль линии (сплошная и толстая)
  4. line(x+70,y-70,x+70,y+70);
  5. line(x-70,y-70,x-70,y+70);  //рисуем 4 линии
  6. line(x+200,y-25,x-200,y-25); //4 цифры в скобках - это координаты линии
  7. line(x+200,y+25,x-200,y+25);
  8. }
  9. void check(int x, int y)
  10. {
  11. rectangle(x,y,x+15,y+10); //рисуем прямоугольник, который и будет нашим прицелом
  12. }

Отмечу, что перемещение прицела по игровому полю будет ограничено координатами (это будет описано в функции int main(void), которую найдете ниже). Затем описываем функции рисования «крестика» и «нолика»:

  1. void stroke(int x, int y)
  2. {if(hit %2==0)//если ход четный, то ставим «крестик» (ходы считаются с нуля, поэтому всегда начинаем с «крестика»). %2==0 - проверка, делиться  ли число пополам без остатка. Для этого была подключега библиотека <math.h>
  3. { strike[0]='x';
  4. line(x+35,y-10,x-40,y+15);
  5. line(x+40,y+15,x-35,y-10);}
  6. else{ circle(x,y,40); strike[0]='o';} //если нечетный, то ставим "нолик"
  7. hit++;}

  8. void step(int x, int y){
  9. if((x+y==218)&&(a[0][0]=='-')){//проверяем, соответствует ли положение прицела позиции левой верхней ячейки и свободна ли она
  10. putimage(x-30, y-20, ptr, XOR_PUT);
  11. stroke(x,y);a[0][0]=strike[0];       //если свободна, то рисуем
  12. putimage(x-30, y-20, ptr, XOR_PUT);}
  13. if((x+y==368)&&(a[0][1]=='-')){      //здесь тоже самое для верхней центральной позиции и т.д.
  14. putimage(x-30, y-20, ptr, XOR_PUT);  //повторно выводим прицел, чтобы не сливался с "крестиком"
  15. stroke(x,y);a[0][1]=strike[0];
  16. putimage(x-30, y-20, ptr, XOR_PUT);}
  17. if((x+y==518)&&(a[0][2]=='-')){
  18. putimage(x-30, y-20, ptr, XOR_PUT);
  19. stroke(x,y);a[0][2]=strike[0];
  20. putimage(x-30, y-20, ptr, XOR_PUT);}
  21. if((x+y==268)&&(a[1][0]=='-')){
  22. putimage(x-30, y-20, ptr, XOR_PUT);
  23. stroke(x,y);a[1][0]=strike[0];
  24. putimage(x-30, y-20, ptr, XOR_PUT);}
  25. if((x+y==418)&&(a[1][1]=='-')){
  26. putimage(x-30, y-20, ptr, XOR_PUT);
  27. stroke(x,y);a[1][1]=strike[0];
  28. putimage(x-30, y-20, ptr, XOR_PUT);}
  29. if((x+y==568)&&(a[1][2]=='-')){
  30. putimage(x-30, y-20, ptr, XOR_PUT);
  31. stroke(x,y);a[1][2]=strike[0];
  32. putimage(x-30, y-20, ptr, XOR_PUT);}
  33. if((x+y==318)&&(a[2][0]=='-')){
  34. putimage(x-30, y-20, ptr, XOR_PUT);
  35. stroke(x,y);a[2][0]=strike[0];
  36. putimage(x-30, y-20, ptr, XOR_PUT);}
  37. if((x+y==468)&&(a[2][1]=='-')){
  38. putimage(x-30, y-20, ptr, XOR_PUT);
  39. stroke(x,y);a[2][1]=strike[0];
  40. putimage(x-30, y-20, ptr, XOR_PUT);}
  41. if((x+y==618)&&(a[2][2]=='-')){
  42. putimage(x-30, y-20, ptr, XOR_PUT);
  43. stroke(x,y);a[2][2]=strike[0];
  44. putimage(x-30, y-20, ptr, XOR_PUT);}}

Далее нам нужна функция определения победы или ничьи, а также очистка игрового поля, если это определено. Но юви дальше отказывается сохранять код, поэтому вы можете скачать весь исходник и сам exe-шник здесь (если планируете запускать через DosBox, то папку bgi и exe-шник нужно закидывать в корень диска).

29 апреля 2013, 22:21
1333

Загрузка...
Loading...

Комментарии

слишком олдскульно, не вижу в этом полезности, нарисовать на чистом ogl или d3d было бы информативно полезней.
но с удовольствием почитаю новые записи.

Оставьте свой комментарий

Спасибо за открытие блога в Yvision.kz! Чтобы убедиться в отсутствии спама, все комментарии новых пользователей проходят премодерацию. Соблюдение правил нашей блог-платформы ускорит ваш переход в категорию надежных пользователей, не нуждающихся в премодерации. Обязательно прочтите наши правила по указанной ссылке: Правила

Также можно нажать Ctrl+Enter

Популярные посты

Узаконенное варварство в стране, принимающей «EPXO». Еще далеко нам до «топ-30 развитых стран»

Узаконенное варварство в стране, принимающей «EPXO». Еще далеко нам до «топ-30 развитых стран»

В продвинутых государствах едва ли поймут, почему в столь развитом, успешном и преуспевающем Казахстане от имени и по заданию властей творятся такие зверства над животными.
openqazaqstan
24 мая 2017 / 12:12
  • 10136
  • 100
Поддержим пенсией жиреющие банки! На что казахстанцам разрешат досрочно тратить свои накопления в ЕНПФ

Поддержим пенсией жиреющие банки! На что казахстанцам разрешат досрочно тратить свои накопления в ЕНПФ

Со стороны ЕНПФ в очередной раз прозвучало крайне неоднозначное заявление, от которого, на наш взгляд, лучше было бы воздержаться.
openqazaqstan
23 мая 2017 / 11:08
  • 9389
  • 32
Казком берет комиссии за оплаты по карте. Почему на это закрывают глаза Visa и MasterCard?!

Казком берет комиссии за оплаты по карте. Почему на это закрывают глаза Visa и MasterCard?!

Покупаешь в супермаркете продукты на 5000 тенге и банк забирает себе еще 30-50 тенге. То есть, продукты обошлись уже не в 5000, а в 5050 тенге.
ValentinaVladimirska
25 мая 2017 / 22:56
  • 7803
  • 22
Вырубка деревьев в Алматы под БРТ. Проект уже нанес городу экологический ущерб

Вырубка деревьев в Алматы под БРТ. Проект уже нанес городу экологический ущерб

Как ранее уже сообщалось из-за строительства БРТ в Алматы пострадают значительное количество деревьев. На прошлой неделе вырублены первые вязы и клён, - под расширение проезжей части на улице...
SKYFALL
24 мая 2017 / 17:20
  • 6722
  • 12
Системная коррупция стала главной угрозой для Казахстана. У нас воруют миллиардами

Системная коррупция стала главной угрозой для Казахстана. У нас воруют миллиардами

Коррупционные отношения вышли на такой уровень, что они уже начинают дискредитировать всю систему управления.
openqazaqstan
вчера / 13:45
  • 5432
  • 32
Что бы ни сделал пешеход – все равно водитель сядет

Что бы ни сделал пешеход – все равно водитель сядет

Вопрос о равной ответственности водителя и пешехода при наезде на последних, только-только начинают обдумывать в высоких кабинетах. Но, пока государственные головы думают, водители продолжают...
Mirogloff
22 мая 2017 / 23:29
  • 4903
  • 32
Пока полицейские будут прощать, им будут бить и по чести, и по лицу

Пока полицейские будут прощать, им будут бить и по чести, и по лицу

Судья Алмалинского районного суда Куаныш Арипов ломает стереотипы отношения граждан к представителям Фемиды. Напавшему на полицейского экс-сотруднику алматинского акимата он назначил наказание выше...
Mirogloff
24 мая 2017 / 16:41
  • 3484
  • 9
Да-да, я знаю, пора выходить замуж. Есть ли у меня еще время и, пожалуйста, уточните сколько?

Да-да, я знаю, пора выходить замуж. Есть ли у меня еще время и, пожалуйста, уточните сколько?

Итак давайте сразу начистоту. Мне 29. Не замужем, никогда не была, детей нет. В душе я совсем не чувствую этот возраст. Каждый раз когда задумываюсь об этом больше чем на 3 минуты, меня накрывает...
user2017
23 мая 2017 / 10:57
Аблязов загробным голосом декларирует «ДВК-2». Монолог обиженного человека

Аблязов загробным голосом декларирует «ДВК-2». Монолог обиженного человека

Последний монолог Аблязова о «продолжении борьбы с режимом» и «ДВК-2», при всём желании, не выглядел как какой-то политический манифест.
openqazaqstan
25 мая 2017 / 13:53
  • 2830
  • 60