• 8550
  • 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
1301

Loading...

Комментарии

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

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

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

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

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

«Мурашки по коже». Выступление Димаша Кудайбергенова впечатлило иностранцев

«Мурашки по коже». Выступление Димаша Кудайбергенова впечатлило иностранцев

21-го января сообщество "Казахстан разместило на своей странице фейсбук видео с выступлением Димаша Кудайбергенова c песней "S.O.S" на китайском конкурсе Singer 2017.  Данное видео стало вирусным...
Levlion999
15 февр. 2017 / 15:06
  • 22682
  • 5
Известные казахи, женившиеся на русских женщинах

Известные казахи, женившиеся на русских женщинах

Говорят, что за каждым великим мужчиной стоит женщина. А еще говорят что, все великие люди меняют судьбу своего народа. Так давайте узнаем больше о русских женщинах, навсегда изменивших жизнь...
Shala-Kazakh
17 февр. 2017 / 23:21
  • 11597
  • 72
Правильный пиар или Как нас достали новости о Баян Есентаевой

Правильный пиар или Как нас достали новости о Баян Есентаевой

Побитое личико Баян светилось со всех экранов, неважно – телевизионных или компьютерных. Казахстанское интернет-сообщество, забыв про терроризм и земельную реформу, обсасывало личную жизнь Есентаевой.
Timur_Tregulov
13 февр. 2017 / 16:20
  • 9164
  • 11
У нас зарплаты в 3 раза ниже, чем в Болгарии. А мы говорим о самом дешевом бензине, хлебе и воде

У нас зарплаты в 3 раза ниже, чем в Болгарии. А мы говорим о самом дешевом бензине, хлебе и воде

Многие у нас любят сравнивать цены в Казахстане с ценами в Европе. Как мол у нас все дешево! При этом они забывают о том, что минимальный размер оплаты труда на Западе в разы выше, чем у нас.
AliyaSadyrbaeva
15 февр. 2017 / 0:43
  • 6273
  • 52
Келин XX века vs келин XXI века. Если сейчас легче жить, то почему разводов стало больше?

Келин XX века vs келин XXI века. Если сейчас легче жить, то почему разводов стало больше?

Часто слышу от пожилых «апашек» слова разочарования, когда они в очередной раз узнают новость про развод семьи. В основном рассуждения начинаются с фразы «біздің кезімізде»...
socium_kzo
15 февр. 2017 / 15:47
  • 6087
  • 76
«Мужчины, живущие с родителями после 25 лет». Опрос набирает популярность в сети

«Мужчины, живущие с родителями после 25 лет». Опрос набирает популярность в сети

"Как вы относитесь к мужчинам, которые в 25+ еще живут с родителями?". Опрос, который набирает популярность в соцсетях. Хотелось бы узнать, что же думаете вы по этому поводу?
Muchacho55
15 февр. 2017 / 18:51
Места для уличного секса в Алматы. Не будьте ханжами, уятменами и моралфагами!

Места для уличного секса в Алматы. Не будьте ханжами, уятменами и моралфагами!

Не будьте ханжами, уятменами и моралфагами, будьте доброжелательней и скиньте уже с себя цепи и оковы нравственности. Да здравствует любовь и свобода!
gelberdeuet
14 февр. 2017 / 11:00
«Казахстанцы больше не смогут приобрести недвижимость за рубежом»

«Казахстанцы больше не смогут приобрести недвижимость за рубежом»

Так мог бы звучать заголовок этой публикации, откажись Европа, Турция, ОАЭ, США и другие от фундаментального права человека на имущество. Пост про то, кто заработает на поправках в Конституцию РК...
lyalusha
16 февр. 2017 / 14:45
  • 3302
  • 23
Секреты женского оргазма или Почему вокруг так много фригидных женщин

Секреты женского оргазма или Почему вокруг так много фригидных женщин

Просьба отключить режим высокой морали и узколобия, а внять советам, дабы сделать немножко счастливей и свою жизнь, и жизнь партнера. Всем уят! :D
kami_princesska
16 февр. 2017 / 11:39