Главная » 2015 » Июнь » 7 » Познаём питон с самого начала
12:07
Познаём питон с самого начала

УРОК 4

Познаём питон с самого начала. Для этого нужно пройти небольшие уроки по написанию программы при помощи следующих авторов:

sentdex, и следующий автор Евгений Колтырин, пройдя уроки по написанию игр вы с лёгкостью сможете написать свою простую игру. Пример первой игры - Маша + Миша, картинки и музыкальные файлы поместить в ту же папку куда перенесете код программы.

m2.gif            mash2.gif                  banca.gif

fon1.gif

Музыкальные и звуковые файлы:

music1.mp3s2.oggs11.wav

 

 

 

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


# использoвание шрифтов игра с полным меню
# выход в меню при шестом попадании поворот картинки по направлению движения

import sys
import os
import pygame
pygame.init()
# окно
window = pygame.display.set_mode((600,630))# создаём окно
pygame.display.set_caption('Masha and Misha') # титул строка

# поле игры-холст
info_string = pygame.Surface((600,30)) # информационная строка
screen = pygame.Surface((600,600)) # создаем игровое поле(экран)


# загрузка музыки

pygame.mixer.music.load('music1.mp3')

def men(a,b):     # отображение клавиш упрвления из пункта OPTION меню
    done = True   # условие существования цикла меню

    pygame.key.set_repeat(0,0) # отключение залипания кнопок
    pygame.mouse.set_visible(True) # курсор мышки видим
    
    
        
    while done:
        screen.fill((100,0,200)) # закраска игрового поля(экрана меню)
        for e in pygame.event.get():
            if e.type == pygame.QUIT:
                sys.exit()
            if e.type == pygame.KEYDOWN:
                
                if e.key == pygame.K_ESCAPE:
                    done = False   
        

                    
                              
        im2 = pygame.transform.flip(im1,True,False)# переворот изображения im1 - горизонтально
        screen.blit(im1,(40,140)) # отображаем картинку
        screen.blit(im2,(420,140)) # отображаем картинку
         # отображаем информационную строку
        screen.blit(b,(180,100))
        screen.blit(inf_font.render(u'движение вниз - курсор DOWN',1,(0,250,250)),(130,260))   
        screen.blit(inf_font.render(u'движение вверх - курсор UP',1,(0,250,250)),(130,300))
        screen.blit(inf_font.render(u'движение влево - курсор LEFT',1,(0,250,250)),(130,340))
        screen.blit(inf_font.render(u'движение вправо - курсор RIGHT',1,(0,250,250)),(130,380))
        screen.blit(inf_font.render(u'огонь - ПРОБЕЛ',1,(0,250,250)),(180,200))
        screen.blit(inf_font.render(u'выход в меню - ESC',1,(0,250,250)),(180,500))
        window.blit(screen,(0,30)) # прорисовка на окне экрана для меню
            
                       
        pygame.display.flip()   # всё отобразить           
           
class Sprite:
    def __init__(self,xpos,ypos,filename):
        self.x = xpos
        self.y = ypos
        self.bitmap=pygame.image.load(filename) # создаем рисунок-загрузка из файла
        
    def obgrey (self):# отображение обьекта на игровом поле(экране)
        screen.blit(pygame.transform.flip(self.bitmap,True,False),(self.x,self.y))    
         
         
    
    def render (self):# отображение обьекта на игровом поле(экране)
        screen.blit(self.bitmap,(self.x,self.y))


def Intersect(x1,x2,y1,y2,dl1,dl2):# dl1,dl2-параметры цели----функция столкновения
    if (x1>x2-dl1) and (x1<x2+dl1) and (y1>y2-dl2) and (y1<y2+dl2):
        return 1
    else:
        return 0            

class Menu:
    def __init__(self,punkt=[120,140,u'Punkt',(250,25,250),(250,250,25),0]):
        self.punkts=punkts
        self.ppunkts=ppunkts
    def render(self,poverhnost,font,num_punkt):# подсветка активного пункта
        for i in self.punkts:
            if num_punkt == i[5]:
                poverhnost.blit(font.render(i[2],1,i[4]),(i[0],i[1]))
            else:
                poverhnost.blit(font.render(i[2],1,i[3]),(i[0],i[1]))
    
    
    
    def menu(self):
        done = True
        font_menu = pygame.font.Font(None,50) # определяем шрифт
        pygame.key.set_repeat(0,0) # отключение залипания кнопок
        pygame.mouse.set_visible(True) # курсор мышки видим
        #pygame.mixer.music.load('music0.mp3')
  # Проигрывание музыки.
        pygame.mixer.music.play(loops=-1)
        punkt = 0
       
        while done:
            
            screen.fill((0,100,200)) # закраска игрового поля(экрана меню)
    #    наведение курсора на пункт меню    
    #    проверка событий мышь   
            mp = pygame.mouse.get_pos() # получаем координаты курсора [0]-x, [1]-y
            for i in self.punkts:
                if mp[0]>i[0] and mp[0]<i[0]+150 and mp[1]>i[1] and mp[1]<i[1]+50:
                    punkt = i[5]
            self.render(screen,font_menu,punkt)        
            
            # проверка перемещения курсора кнопками
            for e in pygame.event.get():
                if e.type == pygame.QUIT:
                    sys.exit()
                if e.type == pygame.KEYDOWN:
                    if e.key == pygame.K_ESCAPE:
                        sys.exit()                
        # проверка перемещения курсора кнопками
                    if e.key == pygame.K_UP:
                        if punkt>0:
                            punkt-=1
                    if e.key == pygame.K_DOWN:
                        if punkt< len(self.punkts)-1:
                            punkt +=1
                    if e.key == pygame.K_SPACE:# активация пункта меню клавишей пробел
                        if punkt == 0:
                            done = False
                        if punkt == 1:
                            sys.exit()
                        if punkt == 2:
                            men(im1,b)
                if e.type == pygame.MOUSEBUTTONDOWN and e.button ==1:
                    if punkt == 0:
                        done = False
                    if punkt == 1:
                        sys.exit()
                    if punkt == 2:
                        men(im1,b)
            screen.blit(im1,(240,140))
            window.blit(screen,(0,30)) # прорисовка на окне экрана для меню
           
            pygame.display.flip()   # всё отобразить           

 
           
        
#  ШРИФТЫ        
pygame.font.init() # иницифлизация модуля шрифтов       
speed_font =pygame.font.SysFont('Comic Sans MS',24)        
inf_font = pygame.font.SysFont('Comic Sans MS',24)
label_font = pygame.font.Font(None,32)# создаем рабочий шрифт(None-стандарт,32-размер)        

im1 =pygame.image.load(u'm2.gif')
hero = Sprite(200,350,'mash2.gif')# создаём героя маша
fon = Sprite(0,0,'fon1.gif')

zet = Sprite(10,100,'m2.gif')# создаём цель миша

zet.right = False

strela=Sprite(-60,350,'banca.gif')# создание стрелы      
strela.push = False

# Создаём меню для каждого пункта
punkts = [(120,140,u'GAME',(250,25,250),(250,250,25),0),(120,210,u'QUIT',(250,25,250),(250,250,25),1),(120,280,u'OPTION',(250,25,250),(250,250,25),2)]

# создаем подпункт меню OPTION

ppunkts = [(120,140,u'UP',(250,25,250),(250,250,25),0),(120,210,u'DOWN',(250,25,250),(250,250,25),1),(120,280,u'LEFT',(250,25,250),(250,250,25),2)]
b = inf_font.render(u'клавиши управления',1,(0,250,250)) # строка в подпункте
game = Menu() # создание oбьекта класса меню
game.menu() # применение метода меню к обьекту класса

# загрузка звуков
sound1 = pygame.mixer.Sound('s11.wav')
sound2 = pygame.mixer.Sound('s2.ogg')

# подготовка к игре
arrow_color = 250
zet.step = 0.6 # начальная скорость движения-миша
enumerator = 0 # количество попаданий(счёт)
dd = 0 #количество патронов
pygame.key.set_repeat(1,1)# повтор нажатия
done = True# некая переменная

 

while done:# условие существования игрового цикла
    
    #pygame.mixer.music.stop()
    

    for e in pygame.event.get():# для любого события
        
        if e.type == pygame.QUIT:# если было закрытие окна
            sys.exit()
        if done == False:
            game.menu()      
        
   
        if e.type == pygame.KEYDOWN: # если была нажата клавиша
            if e.key == pygame.K_LEFT:
                if hero.x >10:
                    hero.x -= 1
            if e.key == pygame.K_RIGHT:
                if hero.x <550:
                    hero.x += 1                
            if e.key == pygame.K_UP:
                if hero.y >270:
                    hero.y -= 1
            if e.key == pygame.K_DOWN:
                if hero.y <580:
                    hero.y += 1        
            if e.key == pygame.K_SPACE:
                if strela.push == False:
                    strela.x = hero.x        
                    strela.y = hero.y
                    strela.push = True   # для ограничения запуска следующей стрелы
            if e.key == pygame.K_ESCAPE:  # выход в меню по нажатию ESC
                game.menu()
                pygame.key.set_repeat(1,1)  # включение залипания
                pygame.mouse.set_visible(False) # курсор не видим
                
        if e.type == pygame.MOUSEBUTTONDOWN:
            if pygame.mouse.get_pressed()[2]:
                           
                m = pygame.mouse.get_pos()
                hero.x = m[0]-25
                hero.y= m[1]-50
        
        if e.type == pygame.MOUSEBUTTONDOWN:
            if pygame.mouse.get_pressed()[0]:
                if strela.push == False:
                    strela.x = hero.x
                    strela.y = hero.y
                    strela.push = True
        
        if e.type == pygame.MOUSEMOTION:# перемещение героя мышкой  
            pygame.mouse.set_visible(False) # скрытие курсора       
            m = pygame.mouse.get_pos()    # получение координат мыши
            if m[0]>10 and m[0]<550:    # ограничение выхода героя за мышкой
                hero.x = m[0]# передача координат герою
            if m[1]>300 and m[1]<550:
                hero.y= m[1]
# закраска           
    screen.fill((25,250,70))# зарисовка игрового поля(экрана)    
    info_string.fill((45,90,45))
 # изменение цвета названия- плавно   
    arrow_color +=0.1
    if arrow_color >250:
        arrow_color = 100
# движение до границы поля и переключения движения-миша
   
    if zet.right == True:
        zet.x += zet.step       # можем менять скорость
        
   
        if zet.x >510:
            zet.right = False
    else:
        zet.x -= zet.step  
        
        if zet.x <0:
            zet.right = True
    
    
   
    if strela.push == True:# движение стрелы
        if strela.y>0:
            strela.y -=1
        else:
            strela.x = -60
            strela.push = False
            dd +=1
            # звук промаха
            sound_channel = sound2.play()
    if Intersect(strela.x,zet.x,strela.y,zet.y,48,48) == True:# условие столкновения
        strela.x = -60
        strela.push = False
        zet.step -=0.1
        enumerator +=1
        dd +=1
        # звук попадания
        sound_channel = sound1.play()
 # отображаем информационную строку
    info_string.blit(inf_font.render(u'сьел: '+str(enumerator),1,(0,250,250)),(5,0))
    info_string.blit(speed_font.render(u'баночки-'+str(dd),1,(250,250,0)),(450,0))    
    info_string.blit(label_font.render(u'маша+миша',1,(0,arrow_color,10)),(200,5))
 
 # отображаем элементы#
    fon.render()
    
    if zet.right == False:
        zet.render()
    else:
        zet.obgrey()
    
    
    strela.render()
    hero.render()
    window.blit(info_string,(0,0))# на окне прорисовываем информационную строку
    
    window.blit(screen,(0,30))# на окне прорисовываем поле игры
   
    pygame.display.flip()# отображаем полностью дисплей(окно)
    if enumerator == 6:
        zet.step = 0.6
        enumerator = 0
        dd = 0
            
        game.menu()
        pygame.key.set_repeat(1,1)# повтор нажатия
        pygame.mouse.set_visible(False) # курсор не видим

Просмотров: 425 | Добавил: kuzma | Рейтинг: 0.0/0
Всего комментариев: 1
avatar
1 nirhasia • 00:29, 02.07.2015
Ошибка в функции столкновения объектов. Правильно функция будет выглядеть так:
def Intersect(x1,x2,y1,y2,w1,w2,h1,h2):# функция столкновения 
        if (x2<x1+w1) and (x2>x1-w2) and (y2<y1+h1) and (y2>y1-h2):
            return 1
        else:
            return 0                   
и соответственно  вызов функции -

 if Intersect(strela.x,zet.x,strela.y,zet.y,30,142,36,142) == True:# условие столкновения
        strela.x = -60
        strela.push = False
        zet.step -=0.1
        enumerator +=1
        dd +=1
        # звук попадания
        sound_channel = sound1.play()
avatar

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

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

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

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

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

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