Программирование аркадных игр и обучение информатике

Программирование аркадных игр
и обучение информатике

Chapter 16: Реализация поля с помощью массива

Эта глава описывает как создать двухмерное поле с помощью массива. Это полезно при создании игр вроде сапёра, крестиков-ноликов, четыре в ряд. Например, ниже приведено поле для крестиков-ноликов:
 OO
 X 
X  

Двухмерный массив используется для создания матрицы, сетки, чисел. Значения чисел в массиве представляют из себя то, что должно быть отображено в каждой ячейке поля. Массив чисел может выглядеть подобно числам снизу. 0 представляет пустое поле, 1 - крестик, 2 - нолик.
022
010
100

Перейдите на страницу с примерами кода и скачайте файл pygame_base_template.py. Затем, следуйте нижеприведённым инструкциям.

    16.1 Рисование поля

  1. Поставьте размер окна 255x255 пикселей.
  2. Создайте переменные width, height и margin. Установите width(ширину) и height(высоту) равными 20. Это будет представлять, насколько большой будет каждая клетка нашего поля. Поставьте margin (рамка) = 5. Эта переменная обозначает рамку между каждой клеткой и границами экрана. Создайте эти переменные перед главным циклом программы.
  3. Нарисуйте белый квадрат в верхнем левом угло. Нарисуйте квадрат используя переменные height и width, заданные ранее. (Можете свободно настраивать цвета.)
    step_03
    Figure 16.1: Шаг 3
  4. Используйте цикл for для рисования 10 квадратов подряд. Используйте переменную под названием column в цикле for.
    step_04
    Figure 16.2: Шаг 4
  5. Учитывайте переменную margin в процессе рисования квадратов.
    step_05
    Figure 16.3: Шаг 5
  6. Добавьте рамку между окном и прямоугольниками при их рисовании.
    step_06
    Figure 16.4: Шаг 6
  7. Добавьте другой цикл for, который также будет проходить через каждый ряд. Названием используемой переменной в этом цикле for должно быть row.
    step_07
    Figure 16.5: Шаг 7

    16.2 Заполнение поля

  8. Создайте двухмерный массив. Создание двухмерного массива в Python, к сожалению, не будет таким простым, как в других языках. Есть библиотеки, которые могут быть скачаны для Python, делающие процесс создания такого массива простым, но в этом примере они использованы не будут. Для создания двухмерного массива используйте следующий код:
    # --- Создать сетку чисел
    # Создать пустой список
    grid = []
    # Пройти через каждый ряд
    for row in range(10):
        # Для каждого ряда, создайте список, который будет
        # представлять каждый ряд
        grid.append([])
        # Пройти через каждую столбец
        for column in range(10):
            # Добавить 0 в текущий ряд
            grid[row].append(0)
    

    Разместите код где-то перед главным циклом программы.

  9. Установите одну из ячеек массива равной единице.

    Двухмерные массивы обычно представляют адрес, вначале указывается ряд, затем колонна. Это называется строчным хранением. Большинство языков используют строчное хранение, за исключением Fortran и MATLAB. Fortran and MATLAB используют столбцовое хранение.

    # Записать единицу в первый ряд, пятый столбец
    grid[1][5] = 1
    

    Поставьте этот код перед главным циклом программы.

  10. Выберите цвет прямоугольника, основываясь на значении переменной color. Сделайте это, сначала найдя строку кода, где рисуется прямоугольник. После этого, создайте переменную color и поставьте цвет, равным белому. Затем замените белый цвет в декларации прямоугольника на переменную color.
    step_11
    Figure 16.6: Шаг 11
  11. Выберите цвет, основываясь на значениях в массиве. После задания color белым, поместите выражение if, проверяющее значение в grid[row][column] и меняющее цвет(color) на зелёный, если значение внутри grid равно 1.
  12. Выведите на экран “click” если пользователь щёлкает кнопкой мыши. Ознакомьтесь с bitmapped_graphics.py для примера кода обнаружения нажатия мыши.
  13. Выводите координаты мыши, когда пользователь делает щелчёк.
    Ознакомьтесь с move_mouse.py для примера нахождения позиции мыши.
    step_13
    Figure 16.7: Шаг 13
  14. Конвертируйте координаты мыши в координаты поля. Вместо координат мыши, теперь выводите эти координаты. Используйте width и height каждой клетки, комбинируя их с margin для вычисления правильных координат. Также, потребуется конвертация финальных значений в целочисленный формат. Этого можно достигнуть, используя функцию int или используя оператор целочисленного деления //, вместо стандартного оператора деления /.
    step_14
    Figure 16.8: Шаг 14
  15. Затем, устанавливайте значения нажатых клеток на 1.
    step_15
    Figure 16.9: Шаг 15

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.