Программирование аркадных игр
и обучение информатикеChapter 16: Реализация поля с помощью массива
Эта глава описывает как создать двухмерное поле с помощью массива. Это полезно при создании игр вроде сапёра, крестиков-ноликов, четыре в ряд. Например, ниже приведено поле для крестиков-ноликов:
O | O | |
X | ||
X |
Двухмерный массив используется для создания матрицы, сетки, чисел. Значения чисел в массиве представляют из себя то, что должно быть отображено в каждой ячейке поля. Массив чисел может выглядеть подобно числам снизу. 0 представляет пустое поле, 1 - крестик, 2 - нолик.
0 | 2 | 2 |
0 | 1 | 0 |
1 | 0 | 0 |
Перейдите на страницу с примерами кода и скачайте файл pygame_base_template.py. Затем, следуйте нижеприведённым инструкциям.
- Поставьте размер окна 255x255 пикселей.
- Создайте переменные width, height и margin. Установите width(ширину) и height(высоту) равными 20. Это будет представлять, насколько большой будет каждая клетка нашего поля. Поставьте margin (рамка) = 5. Эта переменная обозначает рамку между каждой клеткой и границами экрана. Создайте эти переменные перед главным циклом программы.
- Нарисуйте белый квадрат в верхнем левом угло. Нарисуйте квадрат используя переменные height и width, заданные ранее. (Можете свободно настраивать цвета.)
- Используйте цикл for для рисования 10 квадратов подряд. Используйте переменную под названием column в цикле for.
- Учитывайте переменную margin в процессе рисования квадратов.
- Добавьте рамку между окном и прямоугольниками при их рисовании.
- Добавьте другой цикл for, который также будет проходить через каждый ряд. Названием используемой переменной в этом цикле
for должно быть row.
16.2 Заполнение поля
- Создайте двухмерный массив. Создание двухмерного массива в Python, к сожалению,
не будет таким простым, как в других языках. Есть библиотеки, которые могут быть скачаны для Python,
делающие процесс создания такого массива простым, но в этом примере они использованы не будут. Для создания
двухмерного массива используйте следующий код:
# --- Создать сетку чисел # Создать пустой список grid = [] # Пройти через каждый ряд for row in range(10): # Для каждого ряда, создайте список, который будет # представлять каждый ряд grid.append([]) # Пройти через каждую столбец for column in range(10): # Добавить 0 в текущий ряд grid[row].append(0)
Разместите код где-то перед главным циклом программы.
- Установите одну из ячеек массива равной единице.
Двухмерные массивы обычно представляют адрес, вначале указывается ряд, затем колонна. Это называется строчным хранением. Большинство языков используют строчное хранение, за исключением Fortran и MATLAB. Fortran and MATLAB используют столбцовое хранение.
# Записать единицу в первый ряд, пятый столбец grid[1][5] = 1
Поставьте этот код перед главным циклом программы.
- Выберите цвет прямоугольника, основываясь на значении переменной color. Сделайте это, сначала найдя строку кода, где рисуется прямоугольник. После этого, создайте переменную color и поставьте цвет, равным белому. Затем замените белый цвет в декларации прямоугольника на переменную color.
- Выберите цвет, основываясь на значениях в массиве. После задания color белым, поместите выражение if, проверяющее значение в grid[row][column] и меняющее цвет(color) на зелёный, если значение внутри grid равно 1.
- Выведите на экран “click” если пользователь щёлкает кнопкой мыши. Ознакомьтесь с bitmapped_graphics.py для примера кода обнаружения нажатия мыши.
- Выводите координаты мыши, когда пользователь делает щелчёк.
Ознакомьтесь с move_mouse.py для примера нахождения позиции мыши. - Конвертируйте координаты мыши в координаты поля. Вместо координат мыши, теперь выводите эти координаты. Используйте width и height каждой клетки, комбинируя их с margin для вычисления правильных координат. Также, потребуется конвертация финальных значений в целочисленный формат. Этого можно достигнуть, используя функцию int или используя оператор целочисленного деления //, вместо стандартного оператора деления /.
- Затем, устанавливайте значения нажатых клеток на 1.
16.1 Рисование поля
16.3 Готовая программа
""" Example program to show using an array to back a grid on-screen. Sample Python/Pygame Programs Simpson College Computer Science http://programarcadegames.com/ http://simpson.edu/computer-science/ Explanation video: http://youtu.be/mdTeqiWyFnc """ import pygame # Define some colors BLACK = (0, 0, 0) WHITE = (255, 255, 255) GREEN = (0, 255, 0) RED = (255, 0, 0) # This sets the WIDTH and HEIGHT of each grid location WIDTH = 20 HEIGHT = 20 # This sets the margin between each cell MARGIN = 5 # Create a 2 dimensional array. A two dimensional # array is simply a list of lists. grid = [] for row in range(10): # Add an empty array that will hold each cell # in this row grid.append([]) for column in range(10): grid[row].append(0) # Append a cell # Set row 1, cell 5 to one. (Remember rows and # column numbers start at zero.) grid[1][5] = 1 # Initialize pygame pygame.init() # Set the HEIGHT and WIDTH of the screen WINDOW_SIZE = [255, 255] screen = pygame.display.set_mode(WINDOW_SIZE) # Set title of screen pygame.display.set_caption("Array Backed Grid") # Loop until the user clicks the close button. done = False # Used to manage how fast the screen updates clock = pygame.time.Clock() # -------- Main Program Loop ----------- while not done: for event in pygame.event.get(): # User did something if event.type == pygame.QUIT: # If user clicked close done = True # Flag that we are done so we exit this loop elif event.type == pygame.MOUSEBUTTONDOWN: # User clicks the mouse. Get the position pos = pygame.mouse.get_pos() # Change the x/y screen coordinates to grid coordinates column = pos[0] // (WIDTH + MARGIN) row = pos[1] // (HEIGHT + MARGIN) # Set that location to one grid[row][column] = 1 print("Click ", pos, "Grid coordinates: ", row, column) # Set the screen background screen.fill(BLACK) # Draw the grid for row in range(10): for column in range(10): color = WHITE if grid[row][column] == 1: color = GREEN pygame.draw.rect(screen, color, [(MARGIN + WIDTH) * column + MARGIN, (MARGIN + HEIGHT) * row + MARGIN, WIDTH, HEIGHT]) # Limit to 60 frames per second clock.tick(60) # Go ahead and update the screen with what we've drawn. pygame.display.flip() # Be IDLE friendly. If you forget this line, the program will 'hang' # on exit. pygame.quit()
You are not logged in. Log in here and track your progress.
English version by Paul Vincent Craven
Spanish version by Antonio Rodríguez Verdugo
Russian version by Vladimir Slav
Turkish version by Güray Yildirim
Portuguese version by Armando Marques Sobrinho and Tati Carvalho
Dutch version by Frank Waegeman
Hungarian version by Nagy Attila
Finnish version by Jouko Järvenpää
French version by Franco Rossi
Korean version by Kim Zeung-Il
Chinese version by Kai Lin