Новая серия уроков по нахождению решений задач курсовых работ по программированию
Самые часто встречаемые задания на четвертых курсах универов - это программирование игры с появляющимися и исчезающими шариками по заданному алгоритму. Игры как таковые не представляют особого интереса у пользователей, но пользуются большой популярностью у преподавателей, так как их программирование позволяет охватить большой объём знаний языка программирования. Задания подобного рода достаточно сложны и их решения бесплатно в интернете практически не найти. Решением подобных задач никогда не занимался, поэтому приступаю к самой простой и надеюсь решить самые сложные.
УРОК 10 Перемещение объекта по клеточному полю.
где n - количество клеток, row & column - соответственно строки и столбцы, margin - разделяющий промежуток
Перемещение объекта осуществляется кнопками курсора. Полный код приведен ниже:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pygame
import random
# Define some colors лкм - рисуем кубик в клетку,
BLACK = ( 0, 0, 0)
WHITE = ( 255, 255, 255)
GREEN = ( 0, 255, 0)
RED = ( 255, 0, 0)
pygame.init()
n=8# количество клеток квадратного поля игры
width = 48#ширина клетки( и объекта)
height = 48#высота клетки ( и объекта)
margin = 5# промежуток между клетками
x=None
y=None
window = pygame.display.set_mode(((width +margin)*n+margin,(height+margin)*n+margin))# создаём окно
pygame.display.set_caption('Masha and Misha') # титул строка
screen = pygame.Surface(((width +margin)*n+margin,(height+margin)*n+margin)) # создаем игровое поле(экран)
class Sprite:
def __init__(self,xpos,ypos,filename):
self.x = xpos
self.y = ypos
self.bitmap=pygame.image.load(filename) # создаем рисунок-загрузка из файла
def render (self ):# отображение обьекта на игровом поле(экране)
screen.blit(self.bitmap,(self.x,self.y))
hero = Sprite(5,5,('abcd.png'))
done = True# некая переменная
grid = []
while done:# условие существования игрового цикла
screen.fill((0,0,90))
for e in pygame.event.get():# для любого события
if e.type == pygame.QUIT:# если было закрытие окна
sys.exit()
# Перемещение объекта с помощью курсора
if e.type == pygame.KEYDOWN: # если была нажата клавиша
if e.key == pygame.K_LEFT:
if hero.x >margin:
hero.x -= margin+width
if e.key == pygame.K_RIGHT:
if hero.x <(width +margin)*(n-1):
hero.x += margin+width
if e.key == pygame.K_UP:
if hero.y >margin:
hero.y -=height+margin
if e.key == pygame.K_DOWN:
if hero.y <(height+margin)*(n-1):
hero.y += height+margin
for row in range(n):# рисуем игровое поле
for column in range(n):
color = WHITE
pygame.draw.rect(screen,
color,
[(margin+width)*column+margin,
(margin+height)*row+margin,
width,
height])
hero.render()
window.blit(screen,(0,0))# на окне прорисовываем поле игры
pygame.display.flip()# отображаем полностью дисплей(окно)
Усложняем задачу - перемещение объекта разрешается только после его активации и только на одну клетку вниз, вверх, влево или вправо. Для следующего шага требуется повторная активация объекта. Под активацией объекта будем понимать выбор его, кликом на нем левой клавишей мышки.
в предыдущий код добавляется функция выбора объекта:
def bum (self):# проверка попадания мышки на объект
if self.x<mp[0]<self.x+self.w and self.y<mp[1]<self.y+self.h:
self.action = True
return self.action
а, в основном цикле добавляем проверку события нажатие кнопки мышки
if e.type == pygame.MOUSEBUTTONDOWN : # если событие мышь
if pygame.mouse.get_pressed()[0]:#если была нажата лкм
mp = pygame.mouse.get_pos()
hero.bum() # можно двигать объект
полный код выглядит так:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pygame,sys,os
import random
# лкм - рисуем кубик в клетку
BLACK = ( 0, 0, 0)
WHITE = ( 255, 255, 255)
GREEN = ( 0, 255, 0)
RED = ( 255, 0, 0)
pygame.init()
# окно
action = False
n=8# количество клеток квадратного поля игры
width = 48#ширина клетки( и объекта)
height = 48#высота клетки ( и объекта)
margin = 5# промежуток между клетками
x=None
y=None
window = pygame.display.set_mode(((width +margin)*n+margin,(height+margin)*n+margin))# создаём окно
pygame.display.set_caption('Masha and Misha') # титул строка
screen = pygame.Surface(((width +margin)*n+margin,(height+margin)*n+margin)) # создаем игровое поле(экран)
class Sprite:
def __init__(self,xpos,ypos,filename):
self.x = xpos
self.y = ypos
self.image=pygame.image.load(filename) # создаем рисунок-загрузка из файла
self.action = False
self.rect = self.image.get_rect() # представляем его прямоугольником
self.w = self.image.get_width() #ширина
self.h = self.image.get_height() #высота
self.right = True# начальное движ вправо
self.doun = True# разрешение движения вниз
def bum (self):# проверка попадания мышки на объект
if self.x<mp[0]<self.x+self.w and self.y<mp[1]<self.y+self.h:
self.action = True
return self.action
def render (self ):# отображение обьекта на игровом поле(экране)
screen.blit(self.image,(self.x,self.y))
hero = Sprite(5,5,('abcd.png'))
done = True# некая переменная
grid = []
while done:# условие существования игрового цикла
#pygame.mixer.music.stop()
screen.fill((0,0,90))
for e in pygame.event.get():# для любого события
if e.type == pygame.QUIT:# если было закрытие окна
sys.exit()
if e.type == pygame.MOUSEBUTTONDOWN : # если событие мышь
if pygame.mouse.get_pressed()[0]:#если была нажата лкм
mp = pygame.mouse.get_pos()
hero.bum() # можно двигать объект
# Перемещение объекта с помощью курсора
if e.type == pygame.KEYDOWN: # если была нажата клавиша
if e.key == pygame.K_LEFT:
if hero.x >margin and hero.action == True:
hero.x -= margin+width
hero.action = False# запрет на перемещение
if e.key == pygame.K_RIGHT:
if hero.x <(width +margin)*(n-1)and hero.action == True:
hero.x += margin+width
hero.action = False
if e.key == pygame.K_UP:
if hero.y >margin and hero.action == True:
hero.y -=height+margin
hero.action = False# запрет на перемещение
if e.key == pygame.K_DOWN:
if hero.y <(height+margin)*(n-1)and hero.action == True:
hero.y += height+margin
hero.action = False# запрет на перемещение
for row in range(n):# рисуем игровое поле
for column in range(n):
color = WHITE
pygame.draw.rect(screen,
color,
[(margin+width)*column+margin,
(margin+height)*row+margin,
width,
height])
hero.render()
window.blit(screen,(0,0))# на окне прорисовываем поле игры
pygame.display.flip()# отображаем полностью дисплей(окно)
|