November 23, 2022

Создание игры на Python.

Урок 7

Итак сегодня мы будем писать код для игры на Python.

Начнём с подготовки к написанию кода.

Откроем VSC

VSC - Visual Studio Code

Создадим папку на рабочем столе чтобы сохранить туда файлы с расширением .py.

Назовём папку как нам нравится.

Далее переходим в VSC.

Найдем кнопку в левом верхнем углу в виде двух файлов с названием Explorer.

Там мы ищем кнопку в виде троеточия, там выбираем раздел folders, нажимаем правой кнопкой мыши и создаем файлы в расширении .py и называем их следующими именами:

Открываем файл с название map, здесь мы будем создавать игровое поле.

Итак приступим к созданию игрового поля.

Нам пригодятся смайлики для обозначения полей.

("🌲 🌊 🚁🟩 🔥 🏥 💛 💵 🧳 🏆 ⚡️⛅️🔲⬛️")

Вот так выглядят смайлики которые нам нужны.

Попробуем ввести такую строку:

print("🌲 🌊 🚁🟩 🔥 🏥 💛 💵 🧳  🏆 ⚡️⛅️🔲⬛️")

Если у вас смайлики выводятся не в таком же виде, а в каком-то непонятном то придется скачать другое приложение под названием: Pycharm

Устанавливаем и выполняем шаги которые были выше.

Код который находиться в файле map.py

 1 from utils import randbool, randcell
 2 from utils import randcell2
 3 # 🌲 🌊 🚁🟩 🔥 🏥 💛 💵 🧳  🏆 ⚡ ️⛅️ 🔲 ⬛️
 4 # 0 - поля
 5 # 1 - дерево
 6 # 2 - река
 7 # 3 - госпиталь
 8 # 4 - upgrade shop
 9 # 5 - огонь
10 CELL_TYPES = "🟩🎄🌊🏥💵🔥"
11 class Map:    
12   def print_map(self):
13       print("⬛" * (self.w + 2))        
14       for row in self.cells:            
15          print("⬛", end="")
16          for cell in row:                
17              if cell >= 0 and cell < len(CELL_TYPES):
18                  print(CELL_TYPES[cell], end="")
19          print("⬛")        
20       print("⬛" * (self.w + 2))
21       
22       def check_bounds(self, x, y):        
23            if x < 0 or y < 0 or x >= self.h or y >= self.w:
24                return False
25            return True    
26       def generate_river(self, l):  # генератор расположения рек l - длина реки        
27           rc = randcell(self.w, self.h)
28           rx, ry = rc[0], rc[1]        
29           self.cells[rx][ry] = 2       
30           while l > 0:            
31                rc2 = randcell2(rx, ry)
32                rx2, ry2 = rc2[0], rc2[1]           
33                if self.check_bounds(rx, ry) and self.check_bounds(rx2, ry2):
34                   self.cells[rx2][ry2] = 2
35                   rx, ry = rx2, ry2
36                   l -= 1    
37       def generate_forests(self, r, mxr):  # ставим деревья с долей вероятности
38           for ri in range(self.h):
39               for ci in range(self.w):
40                   if randbool(r, mxr):
41                       self.cells[ri][ci] = 1
42       def __init__(self, w, h):
43           self.w = w 
44           self.h = h       
45           self.cells = [[0 for i in range(w)] for j in range(h)]
46 tmp = Map(10, 10)
47 tmp.generate_river(5)
48 tmp.generate_river(10)
49 tmp.generate_river(20)
50 tmp.print_map()

Этот код должен быть в файле map.py. Давайте теперь разберемся что за что отвечает.

1 и 2 строки пока что пропустим вернемся к ним позже.

В 3 строке мы вставляем смайлы для удобного копирования их и вставления в сам код.

С 4 по 9 строку мы пишем обозначения смайлов по их индексам для упрощения определения индексов.

В 10 строке задаем переменную в которую включаем все смайлы где они идут по индексу, а так же в последующем это упростит а так же сделает более удобным для чтения наш код.

В 11 строке мы задаем класс Map. (в нём будут все параметры игрового поля)

C 12 по 20 строку мы задаем обводку полям.

С 22 по 25 строку мы то что координаты находятся внутри поля.

С 26 по 36 строку мы создаем реку в рандомном расположении на поле.

С 37 по 41 строку мы создаем деревья в рандомном порядке на поле.

В 46 строке мы обозначаем количество клеток из которого состоит поле.

С 47 по 49 строку мы создаем реки.

В 50 строке мы выводим само поле.

Код который находится в файле utils.py

 1 from random import randint as rand
 2 def randbool(r, mxr): #r - осечка, mxr - разграничитель
 3     t = rand(0, mxr)
 4     return t <= r 
 5 def randcell(w,h):    
 6     tw = rand(0,w-1)
 7     th = rand(0,h-1)
 8     return (tw,th)
 9 #0 - up, 1 - right, 2 - down, 3 - left
10 def randcell2(x,y):
11     moves = [[-1,0],[0,1],[1,0],[0,-1]] # up right down left Карта передвижений
12     t = rand(0,3)
13     dx, dy = moves[t][0], moves[t][1]
14     return (x + dx, y + dy)

Данный код мы пишем в файле utils.py

В 1 строке мы обращаемся к библиотеке.

С 2 по 4 строку создаем рандомайзер значений для выставления деревьев в рандомном порядке с ограничениями.

С 5 по 8 строку создаем генерацию рек на поле.

С 9 по 14 строку создается карта передвижения.

Итак вернемся к двум первым строкам кода в файле map.py

1 from utils import randbool, randcell
2 from utils import randcell2

Благодаря этим строкам мы обращаемся к файлу units.py чтобы сработал наш код в файле map.py

После всего выше написанного в питоне сделаем вывод. В нём мы увидим следующую картину:

Так будет выглядеть наше игровое поле.

Продолжим написание игры на Python на следующем вебинаре и всем удачи в создании кода, а так же главная ваша задача в том чтобы ваш код работал без ошибок и выводил поле.