Главная » 2015 » Июль » 22 » Победим универ или курсовые своим умом.
00:32
Победим универ или курсовые своим умом.

Новая серия уроков по нахождению решений задач курсовых работ по программированию 
Самые часто встречаемые задания на четвертых курсах универов - это программирование игры с появляющимися и исчезающими шариками по заданному алгоритму. Игры как таковые не представляют особого интереса у пользователей, но пользуются большой популярностью у преподавателей, так как их программирование позволяет охватить большой объём знаний языка программирования. Задания подобного рода достаточно сложны и их решения бесплатно в интернете практически не найти. Решением подобных задач никогда не занимался, поэтому приступаю к самой простой и надеюсь решить самые сложные.

УРОК 10  Перемещение объекта по клеточному полю.

Задача - нарисовать клеточное поле ( заданного масштаба) и перемещать по клеткам этого поля объект.

Моё решение было таково: 1) создаём объект и расчитываем под него клетку игрового поля. Я взял квадратный объект и по его размерам задал клетку игрового поля.

2)рисуем игровое поле при помощи двумерного списка с учетом промежутков между клетками.Как это сделать приведено ниже

где 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()# отображаем полностью дисплей(окно)

Просмотров: 336 | Добавил: kuzma | Рейтинг: 0.0/0
Всего комментариев: 0
avatar

Сайт создан для помощи тем, кто делает первые шаги в программировании.

- автор идеи Кузьма Кузин

Возможность бесплатного доступа ко всем материалам и скриптам.

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

Срипты для автоматического заработка на SEO сайтах.

- для всех пользователей всё по цене в 1 EUR