Как написать программу сапер

Как это сделано: пишем «Сапера» за 4 минуты

image

От переводчика: этот пост — перевод оригинальной статьи Маки Чиза, опытного кодера, который не только пишет классные программы, но и демонстрирует возможности различных языков своим коллегам, как новичкам, так и профессионалам.

«Сапер» — веселая игра, многие из нас в нее играют. Может быть, вы хотите сделать «Сапера» сами?

Напоминаем: для всех читателей «Хабра» — скидка 10 000 рублей при записи на любой курс Skillbox по промокоду «Хабр».

Уникальность игры в том, что она очень простая и при этом весьма увлекательная. В «Сапере» нет никакой хитрой геймплейной механики, вы просто нажимаете на квадратики, надеясь, что под ними нет мины.

Предлагаю попробовать написать «Сапера» на Processing. Это отличный инструмент, который позволяет создавать графические приложения на Java. Ссылка на него вот здесь.

Создание игры Сапер на С++. Часть 1.

Прежде чем начать, скажу, что этот туториал рассчитан на тех, кто уже знает Java. Опыт работы с Processing необязателен.

Итак, начинаем. Первый шаг — определение состояния игры. Я решил реализовать это вот так.

int gridW; // grid width int gridH; // grid height int numMines; // number of mines on the board int[][] mines; // entry is 1 for having a mine and 0 for not boolean[][] flags; // entry is true if you have flagged that spot boolean[][] revealed; // entry is true if that spot is revealed

Здесь, кажется, имеет смысл все, кроме вот этого участка: int[][] mines. Почему сетка мин является целым числом, а не булевым? Дело в том, что это позволяет легко подсчитать, сколько мин находится рядом с определенной позицией.

Читайте также:
Как закрыть программу автоматически

int calcNear(int x, int y) < int i=0; for (int offsetX=-1; offsetX> return i; >

Этот код определяет, сколько мин находится рядом с определенным участком. После того, как мы уберем исключения, мы получим что-то похожее на это:

boolean outBounds(int x,int y)< return x<0||y<0||x>=gridW||y>=gridH; > int calcNear(int x, int y) < if(outBounds(x,y))return 0; int i=0; for (int offsetX=-1; offsetX> return i; >

Главная задача самой игры — раскрывать квадраты, начиная с точки х, у.

void reveal(int x, int y)

В итоге мы имеем следующий алгоритм:

  • Если позиция за пределами поля, end;
  • Если позиция раскрыта, end;
  • Раскрываем текущую позицию;
  • Если у нас бомба рядом с текущей позицией, end;
  • Если мы дошли до этого пункта во время выполнения функции, текущая позиция в пределах игрового поля была обнаружена и рядом с ней нет бомб, открываем смежные квадраты.

Если вы хотите узнать о визуализации, читайте дальше.

Визуализация

Здесь все должно быть понятно, но я объясню сложные части.

Итак, у нас есть переменная cellSize, определяющая количество пикселей в каждом квадрате.

void settings()

Таким образом мы создаем поле со сторонами gridW x gridH, где размеры каждого квадрата будут равняться значению cellSize.

Игра «Сапер» на Python, создаем игровое поле. Minesweeper in Python Tkinter

Затем мы возвращаем переменные в изначальное состояние.

void setup() < //initialize and clear the arrays mines=new int[gridW][gridH]; flags=new boolean[gridW][gridH]; revealed=new boolean[gridW][gridH]; for(int x=0;x> >

Для инициализации поля:
//Place numMines mines on the grid void placeMines() < int i=0; while(ielse while (calcNear(x,y)!=0); > //Check for game loss if (mines[x][y]!=0) < println(«Dang!»); exit(); >else > >

И функция отображения, вызываем ее один раз для каждого кадра.

Читайте также:
Программа teamviewer для чего

void draw() < background(0); //For each cell for (int x=0; xelse if (revealed[x][y]) < col1=color(255/2); col2=color(255/2); >if (near==1)txtColor=color(255*1/4, 255*1/4, 255*3/4); if (near==2)txtColor=color(255*1/4, 255*3/4, 155*1/4); if (near==3)txtColor=color(255, 0, 0); if (near==4)txtColor=color(0, 0, 255); if (near==5)txtColor=color(255, 0, 0); boolean alternate=(x+y)%2==0; if (alternate) < fill(col2); stroke(col2); >else < fill(col1); stroke(col1); >//if(mines[x][y]>0) < //fill(0,255,0); //stroke(0,255,0); //>rect(x*cellSize, y*cellSize, cellSize, cellSize); //If there is a mine near this spot and it is revealed if (near>0revealed[x][y]) < fill(txtColor); noStroke(); textAlign(LEFT, TOP); textSize(cellSize); text(«»+near, x*cellSize, y*cellSize); >> > >

И все, вот и наш «Сапер».

Игра выглядит просто, но в целом она полностью функциональна. И помните: «Сапер» вызывает привыкание!

  • Онлайн-курс «Профессия frontend-разработчик».
  • Практический годовой курс PHP-разработчик.
  • Практический курс «Мобильный разработчик PRO».

Источник: habr.com

Создаем игру «Сапёр» на PyQt5

Сапёр – это такая одиночная игра, суть которой заключается в том, чтобы исследовать территорию вокруг вашей ракеты на луне и избегать контакта с пришельцами. В разных версиях игры разные сценарии.

Создаем игру «Сапёр» на PyQt5

Это простая альтернативная версия классического Сапёра, где вам приходилось переворачивать плитки для поиска спрятанных мин. Наша версия использует пользовательские объекты QWidget для плиток, которые индивидуально сохраняют свое состояние в качестве мин, статус и смежное количество мин. В данной версии мины заменены на инопланетян, но здесь вы уже можете придумывать что угодно.

Есть вопросы по Python?

На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!

Telegram Чат Easy» , 8 , 10 ) ,
( «Medium» , 16 , 40 ) ,
( «Hard» , 24 , 99 )

Игровая сетка может быть представлена несколькими способами, включая, например, двухмерный «список списков», который представляет различные состояния игровых позиций (мины, раскрытые мины, помеченные мины).

Читайте также:
Прекращена работа программы witcher 3 при запуске

Однако, этот вариант использует объектно-ориентированный подход. Отдельные квадраты на карте содержат релевантные данные о своем нынешнем состоянии и отвечают за прорисовку. В Qt мы можем сделать это просто, создав дочерний класс QWidget и использовав простую функцию рисования.

Поскольку наши объекты плиток являются дочерними классами QWidget, мы можем расположить их как любой другой виджет. Мы сделаем это, настроив QGridLayout.

self . grid = QGridLayout ( )
self . grid . setSpacing ( 5 )
self . grid . setSizeConstraint ( QLayout . SetFixedSize )

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru