Главная » 2015 » Октябрь » 21 » Как создать игру - ПАЗЛЫ
21:32
Как создать игру - ПАЗЛЫ

Создание игры ПАЗЛ на Python + Pygame

Сегодня встретил приятеля, который устраивался на работу программистом. Ему задали пробное задание - создать программу "часы" или "Пазлы" . Программ по изображению часов на Python очень много, поэтому будем создавать игру - пазлы. Первоисточников и исходников на питоне не нашел , чему несказанно и обрадовался... Я думаю, что справлюсь без особых усилий. И так начнем с создания нужной картинки, а вернее способа разбития. Чтоб не нагружать программно наш комп картинку будем разбивать в фотошопе.Проделать эту операцию можно многими способами, я предпочитаю инструментом - раскройка.Подробное видео красивого разбития картинки https://www.youtube.com/watch?v=oLSl3u_wBfA В предыдущих уроках мы создавали квадратное клетчатое поле и устанавливали точно в клеточку пятнашку или цветную шашечку, аналогичное действие мы проделаем с кусочком рисунка, а клетки просто не отобразим( поле останется монотонно окрашенным).

Начнем с простого: рисунок разбиваем на четыре равных квадрата, экран разбиваем на 5х5, но не прорисовываем клетки как в пятнашках. Картинки двигаем мышкой при нажатии лкм. при отпускании картинка установиться в клетку где находиться курсор мышки.

Полный код программы пазлы:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
import os
import pygame
WHITE    = ( 255, 255, 255)
pygame.init()
n=8# количество клеток квадратного поля игры
width  = 80#ширина клетки( и объекта)
height = 80#высота клетки ( и объекта)

margin = 1# промежуток между клетками


window = pygame.display.set_mode(((width +margin)*n+margin,(height+margin)*n+margin))# создаём окно

screen = pygame.Surface(((width +margin)*n+margin,(height+margin)*n+margin)) # создаем игровое поле(экран)

 

koo = []# список нач. координат до перемещения
all_s = []# список всех объектов

koor = []# список координат разницы между обьуктом и мышкой
grid = []# список занятых и свободных клеток
for row in range(n):
    # заполняем пустую матрицу
    
    grid.append([])
    for column in range(n):
        grid[row].append(0)
class Sprite:
    # (нач.коорд-х,у,имя файла,нач.скорость-х,у)
    def __init__(self,xpos,ypos,filename):
        self.x = xpos
        self.y = ypos
        self.image=pygame.image.load(filename) # создаем рисунок-загрузка из файла
        self.rect = self.image.get_rect() # представляем его прямоугольником
        all_s.append(self)
        self.w = self.image.get_width()   #ширина
        self.h = self.image.get_height()  #высота
        #self.row = None
        #self.column = None
        self.action = False
        self.column = self.x // (width + margin)
        self.row = self.y // (height + margin)            
        grid[self.row][self.column] = 1
    def bum (self):# проверка попадания мышки на объект
        if self.x<mp[0]<self.x+self.w and self.y<mp[1]<self.y+self.h:
            a = mp[0]-self.x# разница кооздинаты мышки и объекта
            b = mp[1]-self.y  
            koor.append(a)# запись в список координат
            koor.append(b)
            self.action = True# разрешение на перемещение
            c = self.x# первоначальные кооздинаты объекта
            d = self.y
            koo.append(c)# запись первоначального положения выбранного объекта
            koo.append(d)
           
    def funtion (self):# функция движения точно в клетку
        mp = pygame.mouse.get_pos()# получ коорд мышки        
        self.x = (mp[0]// (width + margin))*(width + margin)+margin# коорд. клетки где находится мышь
        self.y = (mp[1] // (height + margin))*(height + margin)+margin
        self.column = self.x // (width + margin)# координ. в списке грид
        self.row = self.y // (height + margin)
        grid[ koo[1] // (height + margin)][ koo[0]// (width + margin)] =0# старой клетке = 0
        if  grid[self.row][self.column] ==1 : # если клетка куда переместили занята
            self.x = koo[0]# откат на обратные координаты
            self.y = koo[1]
        
        
    def render (self):# отображение обьекта на игровом поле(экране)
        screen.blit(self.image,(self.x,self.y))
       
    def mouv(self):# движение объекта с мышкой    
        
       
        #pygame.mouse.set_visible(False) # скрытие курсора   
        # Получить текущее положение мыши. Это возвращает позицию
        # в виде списка двух чисел.
        pos = pygame.mouse.get_pos()
        
        # Теперь  игрок имеет координаты мышки с учетом разницы координат           
        self.x = pos[0]-koor[0]
        self.y = pos[1]-koor[1]
        # условие границ поля
        
        if self.x<-10 :
            self.x = koo[0]
            self.y = koo[1]
            self.action = False
        if self.x+width>((margin+width)*n+10+margin):
            self.x = koo[0]
            self.y = koo[1]
            self.action = False
        if self.y<-10:
            self.x = koo[0]
            self.y = koo[1]
            self.action = False
        if self.y+height>((margin+height)*n+10+margin) :
            self.x = koo[0]
            self.y = koo[1]
            self.action = False
           
    def mesto(self):# запись положения объектов в список грид             
        self.column = self.x // (width + margin)
        self.row = self.y // (height + margin)            
        grid[self.row][self.column] = 1
    
        
hero1 = Sprite((width +margin)*(0)+margin,margin+(height +margin)*(0),('fores_01.gif'))
hero2 = Sprite(margin+(width +margin)*(n-8),margin+(height +margin)*(1),('fores_02.gif'))
hero3 = Sprite(margin+(width +margin)*(n-8),margin+(height +margin)*(2),('fores_05.gif'))
hero4 = Sprite(margin+(width +margin)*(n-8),margin+(height +margin)*(3),('fores_03.gif'))
hero5 = Sprite(margin+(width +margin)*(n-8),margin+(height +margin)*(4),('fores_04.gif'))
hero6 = Sprite(margin+(width +margin)*(n-8),margin+(height +margin)*(5),('fores_06.gif'))
hero17 = Sprite(margin+(width +margin)*(n-8),margin+(height +margin)*(6),('fores_17.gif'))
hero18 = Sprite(margin+(width +margin)*(n-8),margin+(height +margin)*(7),('fores_18.gif'))

hero7 = Sprite((width +margin)*(1)+margin,margin+(height +margin)*(0),('fores_07.gif'))
hero8 = Sprite((width +margin)*(2)+margin,margin+(height +margin)*(n-8),('fores_08.gif'))
hero9 = Sprite((width +margin)*(3)+margin,margin+(height +margin)*(n-8),('fores_09.gif'))                                
hero10 = Sprite((width +margin)*(4)+margin,margin+(height +margin)*(n-8),('fores_10.gif'))
hero11 = Sprite((width +margin)*(5)+margin,margin+(height +margin)*(n-8),('fores_11.gif'))
hero12 = Sprite((width +margin)*(6)+margin,margin+(height +margin)*(n-8),('fores_12.gif'))
hero13 = Sprite((width +margin)*(4)+margin,margin+(height +margin)*(4),('fores_13.gif'))

hero14 = Sprite((width +margin)*(7)+margin,margin+(height +margin)*(0),('fores_14.gif'))
hero15 = Sprite((width +margin)*(7)+margin,margin+(height +margin)*(1),('fores_15.gif'))
hero16 = Sprite((width +margin)*(7)+margin,margin+(height +margin)*(2),('fores_16.gif'))
hero19 = Sprite((width +margin)*(7)+margin,margin+(height +margin)*(3),('fores_19.gif'))
hero20 = Sprite((width +margin)*(7)+margin,margin+(height +margin)*(4),('fores_20.gif'))
hero21 = Sprite((width +margin)*(7)+margin,margin+(height +margin)*(5),('fores_21.gif'))
hero22 = Sprite((width +margin)*(7)+margin,margin+(height +margin)*(6),('fores_22.gif'))
hero23 = Sprite((width +margin)*(7)+margin,margin+(height +margin)*(7),('fores_23.gif'))

hero24 = Sprite((width +margin)*(1)+margin,margin+(height +margin)*(7),('fores_24.gif'))
hero25 = Sprite((width +margin)*(n-6)+margin,margin+(height +margin)*(7),('fores_25.gif'))
hero26 = Sprite((width +margin)*(n-5)+margin,margin+(height +margin)*(7),('fores_26.gif'))
hero27 = Sprite((width +margin)*(n-4)+margin,margin+(height +margin)*(7),('fores_27.gif'))
hero28 = Sprite((width +margin)*(n-3)+margin,margin+(height +margin)*(7),('fores_28.gif'))
hero29 = Sprite((width +margin)*(6)+margin,margin+(height +margin)*(7),('fores_29.gif'))

hero30 = Sprite((width +margin)*(3)+margin,margin+(height +margin)*(4),('fores_30.gif'))
hero31 = Sprite((width +margin)*(1)+margin,margin+(height +margin)*(1),('fores_31.gif'))
hero32 = Sprite((width +margin)*(1)+margin,margin+(height +margin)*(2),('fores_32.gif'))
hero33 = Sprite((width +margin)*(1)+margin,margin+(height +margin)*(3),('fores_33.gif'))
hero34 = Sprite((width +margin)*(1)+margin,margin+(height +margin)*(4),('fores_34.gif'))
hero35 = Sprite((width +margin)*(1)+margin,margin+(height +margin)*(5),('fores_35.gif'))
hero36 = Sprite((width +margin)*(1)+margin,margin+(height +margin)*(6),('fores_36.gif'))
dum = True
while dum:# условие существования игрового цикла      
    
    screen.fill((10,10,100))
    for e in pygame.event.get():# для любого события
        
        if e.type == pygame.QUIT:# если было закрытие окна
            sys.exit()
    
    # захват объекта лкм и перемещение при удержании кнопки    
    if e.type == pygame.MOUSEBUTTONDOWN and e.button ==1:                                        
        
            mp = pygame.mouse.get_pos()
            for i in all_s :# захват объекта
                i.bum()
    
    if e.type == pygame.MOUSEBUTTONUP and e.button ==1:# если отпущена лкм         
            
           
            for i in all_s:
                if i.action ==True:
                    i.funtion()# перемещение объекта точно в клетку
            for i in all_s :
                i.action = False# движение запрещено
            
            for i in all_s:# запись положения объекта в список grid
                i.mesto() # запись положения объектов в список грид
            koor = []# список координат разницы между обьуктом и мышкой
            koo = []# обнуление списка захвачен. объекта
    for i in all_s:
        if i.action == True:
            i.mouv()# перемещение объекта мышкой    
   
   
             
    
    for i in all_s:# отображаем все объекты
        i.render()        
         
    
    window.blit(screen,(0,0))# на окне прорисовываем поле игры
   
    pygame.display.flip()# отображаем полностью дисплей(окно)
   

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

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

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

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

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

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

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