Coder Social home page Coder Social logo

pythonbirds's Introduction

Gitpod ready-to-code

Python Birds

Essa versão é a mais simples. Ela não contém replay nem reset, de forma que o jogo não pode retroceder.

Para versão mais complexa, acesse a branch diversao

Projeto para Ensino de Programação Orientadas a Objetos em Python.

A versão utilizada para desenvolvimento foi Python 3.4

Um vídeo fala mais que 1000 palavras: Python Birds

Contribuidores

Abordagem

Instalar Python 3.

Baixar o zip do projeto (botão Download Zip)

Os testes se encontram dentro do pacote "testes" e servem para definir a dinâmica das classes. Para rodar todos testes, execute:

python executor_de_testes.py

Explicação detalhada sobre classes e métodos se encontram nos scripts atores.py e fase.py.

Ordem de desenvolvimento

A ordem preferida é começar pelos atores, seguindo a ordem dos testes presentes no script atores_testes.py. Depois passar para a fase_teste.py, onde é implementada uma fase.

É possível emular um jogo que termina em vitória rodando:

python fase_testes.py

É possível jogar a fase rodando:

python placa_grafica_tkinter.py

Para jogar, utilize as setas para cima e para baixo. Para lançar, utilize a tecla enter ou espaço. Demonstração nos vídeos:

Python Birds

script atores.py

Contém todos atores do projeto.

script fase.py

Contém classes respectivas a fase e ponto do plano cartesiano

script placa_grafica.py

Contém lógica para rodar jogo e exibir no console.

script placa_grafica_tkinter.py

Contém lógica para rodar jogo em uma janela.

Simplificação do Jogo

  1. Atores são pontos no plano cartesiano.
  2. A velocidade dos pontos é pequena, de tal forma que a cada passo os atores se movam apenas para pontos vizinhos.
  3. A colisão entre pontos ocorre quando eles estão em ponto vizinho, de acordo com valor de intervalo.

A seguir é apresentada a especificação detalhada do jogo.

Classe Ator

Classe base para todos atores do jogo.

Método calcular_posicao

Método que recebe o tempo (float) como parâmetro e retorna uma tupla com 2 elementos, posição horizontal (x) como primeiro elemento e posição vertical (y) como segundo.

Método colidir

O método colidir executa a lógica de colisão. A colisão só ocorre com atores ativos e que estejam em pontos vizinhos. Ao colidir, os atores envolvidos devem ter seus status alterado para DESTRUIDO

Classe Obstaculo

Classe que representa obstáculos na fase e que podem ser destruídos por pássaros. Herda de ator. Seu caracter de representação é a letra "O", quando ATIVO.

Status

Um obstáculo ao ter seu status alterado para DESTRUIDO deve ter seu caracter de apresentação alterado para " " (vazio). Assim ele vai "sumir" da tela.

Classe Porco

Classe que representa porcos na fase e que podem ser destruídos por pássaros. Herda de ator. Seu caracter de representação é a o caracter "@".

Status

Um obstáculo ao ter seu status alterado para DESTRUIDO deve ter seu caracter de apresentação alterado para "+" (sinal de mais). Assim sua imagem é alterada para a de porco morto.

Passaro

Classe base de todos os passáros. Cada tipo possui uma velocidade de lançamento (v). No lançamento o jogador escolhe o ângulo (teta), em graus, no qual o passáro deve ser lançado. O lançamento respeita as regras de lançamento oblíquo com gravidade (GRAVIDADE) constante e igual a 10 m/s^2.

Método lancar

O método lançar recebe o ângulo, em graus, que será feito o lançamento. Ele deve ser convertido para radianos. Cada pássaro deve armazenar esse valor e o tempo de lançamento para cálculo de sua posíção. Lembrar que o tempo das fórmulas é delta_t = T_final - T_inicial.

Método de colidir_com_chao

Todo pássaro que colidir com o chão (y<=0) deve ser destruído.

Método foi_lançado

Esse método deve retornar verdadadeiro se o pássaro foi lançado (tempo de lançamento é None). Caso contrário deve retornar falso.

Lançamento

Se o pássaro ainda não foi lançado, o pássaro deve permanecer na posição inicial.

Caso tenha sido lançado e seu status esteja ATIVO, sua posição deve ser calculada de acordo com o lançamento oblíquo. Nesse caso, delta_t vai ser igual ao tempo do jogo menos o tempo do lançamento.

Caso contrário, ele deve retornar a posição onde colidiu.

Método posicao_horizontal

Fórmula X=X0+v*cos(teta)*delta_t.

Método posicao_vertical

Fórmula Y=Y0+v*sen(teta)delta_t-(G*delta_t^2)/2.

Classe Passaro Vermelho

Tipo de Pássaro que representa o pássaro vermelho. Possui velocidade de lançamento igual a 20 m/s. Seu caracter quanto ATIVO é "V". Quando DESTRUIDO é "v".

Classe Passaro Amarelo

Tipo de Pássaro que representa o pássaro amarelo. Possui velocidade de lançamento igual a 30 m/s. Seu caracter quanto DESTRUIDO é "a".

Classe Fase

Classe responsável por organizar atores e transformar os dados em pontos a serem representados na tela.

Método adicionar_obstaculo

Método que adiciona um ou mais obstáculos na fase.

Método adicionar_porco

Método que adiciona um ou mais porcos na fase.

Método adicionar_passaro

Método que adiciona um ou mais pássaros na fase.

Método status

Recebe o tempo como parâmetro e retorna status do jogo.

  1. Se o jogo está em andamento, retorna status "EM_ANDAMENTO";
  2. Se o jogo acabou e não existem porcos ativos, retorna STATUS "VITORIA";
  3. Se o jogo acabou e existem porcos ativos, retorna status "DERROTA".

Método lancar

Recebe o ângulo e o tempo do lançamento. Deve delegar o lançamento ao primeiro pássaro ATIVO da lista de pássaros que ainda não foi lançado.

Método calcular_pontos

Método que executa a lógica do jogo a cada passo (tempo), retornando pontos a serem exibidos na tela.

Ele deve:

  1. Calcular a posição de cada pássaro, verificando se ele colidiu com algum obstáculo, porco ou chão.
  2. Retornar instâncias da classe Ponto, informando x, y e caracter respectivo a cada ator.

Divirta-se!!!!

Powered by Python Pro

Observação Importante

Esse projeto usa somente o interpretador padrão do Python. Para fazer jogos com mais interatividade, existe a biblioteca Pygame. Ela não foi utilizada por motivos de simplicidade, para evitar que o aluno iniciante tenha dificuldades na hora de instalar o projeto.

Contudo o Estevão Fonseca fez um versão com essa biblioteca, confira o projeto:

https://github.com/estevaofon/angry-birds-python

Ele também colocou esse vídeo no Youtube.

pythonbirds's People

Contributors

engnogueira avatar giovaneliberato avatar guidobr avatar jona04 avatar michelamaral avatar renzon avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

pythonbirds's Issues

Teste

pergunta = input("Qual é o seu nome? ")
print("Olá,", pergunta, "! Prazer em te conhecer.")
print("Bem vindo ao quiz do AugustoDelf. Você é bem legal!")

Inicializando a pontuação

pontuacao = 0

número1 = 2
número2 = 2
soma = número1 + número2
resposta_usuario = float(input("Qual é a soma de 2 + 2? "))
if resposta_usuario == soma:
print("Parabéns", pergunta, "sua resposta está correta!")
pontuacao += 2.5
else:
print("Ops", pergunta, "verifique se sua resposta está correta")

num1 = 167
num2 = 129
menos = num1 - num2
resposta_usuario = float(input("Quanto é 167 - 129? "))
if resposta_usuario == menos:
print("Caramba", pergunta, "você é bom demais, resposta correta!")
pontuacao += 2.5
else:
print("Foi quase", pergunta, "tente de novo, você é capaz, eu sei disso")

nUm1 = 6095
nUm2 = 745
soMa = nUm1 + nUm2
resposta_usuario = float(input("Quanto é 6095 + 745? "))
if resposta_usuario == soMa:
print("Caramba, você é bem inteligente!")
pontuacao += 2.5
else:
print("Precisa treinar mais")

Num1 = 516
Num2 = 290
sOmA = Num1 + Num2
resposta_usuario = float(input("Quanto é 516 + 290? "))
if resposta_usuario == sOmA:
print("Caramba, você é bem inteligente!")
pontuacao += 2.5
else:
print("Precisa treinar mais")

print("Sua nota final é:", pontuacao)

Augusto

pergunta = input("Qual é o seu nome? ")
print("Olá,", pergunta, "! Prazer em te conhecer.")
print("Bem vindo ao quiz do AugustoDelf. Você é bem legal!")

Inicializando a pontuação

pontuacao = 0

número1 = 2
número2 = 2
soma = número1 + número2
resposta_usuario = float(input("Qual é a soma de 2 + 2? "))
if resposta_usuario == soma:
print("Parabéns", pergunta, "sua resposta está correta!")
pontuacao += 2.5
else:
print("Ops", pergunta, "verifique se sua resposta está correta")

num1 = 167
num2 = 129
menos = num1 - num2
resposta_usuario = float(input("Quanto é 167 - 129? "))
if resposta_usuario == menos:
print("Caramba", pergunta, "você é bom demais, resposta correta!")
pontuacao += 2.5
else:
print("Foi quase", pergunta, "tente de novo, você é capaz, eu sei disso")

nUm1 = 6095
nUm2 = 745
soMa = nUm1 + nUm2
resposta_usuario = float(input("Quanto é 6095 + 745? "))
if resposta_usuario == soMa:
print("Caramba, você é bem inteligente!")
pontuacao += 2.5
else:
print("Precisa treinar mais")

Num1 = 516
Num2 = 290
sOmA = Num1 + Num2
resposta_usuario = float(input("Quanto é 516 + 290? "))
if resposta_usuario == sOmA:
print("Caramba, você é bem inteligente!")
pontuacao += 2.5
else:
print("Precisa treinar mais")

print("Sua nota final é:", pontuacao)

Rodando no Linux

Tentei rodar o arquivo no GNU/Linux Mint 16, mas não apareceu nada além de gráficos no terminal.
Era pra ser assim mesmo? ou era pra aparecer os gráficos normais?

Não executa

Ao tentar executar o app do branch master ou diversao ocorrem os seguintes error:

D:\git\pythonbirds [diversao]> C:\Python34\python.exe .\python_birds.py
Traceback (most recent call last):
  File ".\python_birds.py", line 2, in <module>
    from atores import PassaroVermelho, PassaroAmarelo, Porco, Obstaculo
ImportError: cannot import name 'PassaroVermelho'
D:\git\pythonbirds [diversao]> C:\Python34\python.exe .\executor_de_testes.py
EEEEEEE..
======================================================================
ERROR: fases.brasil (unittest.loader.ModuleImportFailure)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:\Python34\lib\unittest\case.py", line 58, in testPartExecutor
    yield
  File "C:\Python34\lib\unittest\case.py", line 577, in run
    testMethod()
  File "C:\Python34\lib\unittest\loader.py", line 32, in testFailure
    raise exception
ImportError: Failed to import test module: fases.brasil
Traceback (most recent call last):
  File "C:\Python34\lib\unittest\loader.py", line 312, in _find_tests
    module = self._get_module_from_name(name)
  File "C:\Python34\lib\unittest\loader.py", line 290, in _get_module_from_name
    __import__(name)
  File "D:\git\pythonbirds\fases\brasil.py", line 9, in <module>
    from atores import PassaroAmarelo, PassaroVermelho, Obstaculo, Porco
ImportError: cannot import name 'PassaroAmarelo'


======================================================================
ERROR: fases.escudo_espartano (unittest.loader.ModuleImportFailure)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:\Python34\lib\unittest\case.py", line 58, in testPartExecutor
    yield
  File "C:\Python34\lib\unittest\case.py", line 577, in run
    testMethod()
  File "C:\Python34\lib\unittest\loader.py", line 32, in testFailure
    raise exception
ImportError: Failed to import test module: fases.escudo_espartano
Traceback (most recent call last):
  File "C:\Python34\lib\unittest\loader.py", line 312, in _find_tests
    module = self._get_module_from_name(name)
  File "C:\Python34\lib\unittest\loader.py", line 290, in _get_module_from_name
    __import__(name)
  File "D:\git\pythonbirds\fases\escudo_espartano.py", line 10, in <module>
    from atores import PassaroAmarelo, PassaroVermelho, Obstaculo, Porco
ImportError: cannot import name 'PassaroAmarelo'


======================================================================
ERROR: fases.rodar_fase_exemplo (unittest.loader.ModuleImportFailure)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:\Python34\lib\unittest\case.py", line 58, in testPartExecutor
    yield
  File "C:\Python34\lib\unittest\case.py", line 577, in run
    testMethod()
  File "C:\Python34\lib\unittest\loader.py", line 32, in testFailure
    raise exception
ImportError: Failed to import test module: fases.rodar_fase_exemplo
Traceback (most recent call last):
  File "C:\Python34\lib\unittest\loader.py", line 312, in _find_tests
    module = self._get_module_from_name(name)
  File "C:\Python34\lib\unittest\loader.py", line 290, in _get_module_from_name
    __import__(name)
  File "D:\git\pythonbirds\fases\rodar_fase_exemplo.py", line 9, in <module>
    from atores import PassaroAmarelo, PassaroVermelho, Obstaculo, Porco
ImportError: cannot import name 'PassaroAmarelo'


======================================================================
ERROR: placa_grafica_tkinter (unittest.loader.ModuleImportFailure)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:\Python34\lib\unittest\case.py", line 58, in testPartExecutor
    yield
  File "C:\Python34\lib\unittest\case.py", line 577, in run
    testMethod()
  File "C:\Python34\lib\unittest\loader.py", line 32, in testFailure
    raise exception
ImportError: Failed to import test module: placa_grafica_tkinter
Traceback (most recent call last):
  File "C:\Python34\lib\unittest\loader.py", line 312, in _find_tests
    module = self._get_module_from_name(name)
  File "C:\Python34\lib\unittest\loader.py", line 290, in _get_module_from_name
    __import__(name)
  File "D:\git\pythonbirds\placa_grafica_tkinter.py", line 9, in <module>
    from fase import Fase
ImportError: cannot import name 'Fase'


======================================================================
ERROR: python_birds (unittest.loader.ModuleImportFailure)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:\Python34\lib\unittest\case.py", line 58, in testPartExecutor
    yield
  File "C:\Python34\lib\unittest\case.py", line 577, in run
    testMethod()
  File "C:\Python34\lib\unittest\loader.py", line 32, in testFailure
    raise exception
ImportError: Failed to import test module: python_birds
Traceback (most recent call last):
  File "C:\Python34\lib\unittest\loader.py", line 312, in _find_tests
    module = self._get_module_from_name(name)
  File "C:\Python34\lib\unittest\loader.py", line 290, in _get_module_from_name
    __import__(name)
  File "D:\git\pythonbirds\python_birds.py", line 2, in <module>
    from atores import PassaroVermelho, PassaroAmarelo, Porco, Obstaculo
ImportError: cannot import name 'PassaroVermelho'


======================================================================
ERROR: testes.atores_testes (unittest.loader.ModuleImportFailure)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:\Python34\lib\unittest\case.py", line 58, in testPartExecutor
    yield
  File "C:\Python34\lib\unittest\case.py", line 577, in run
    testMethod()
  File "C:\Python34\lib\unittest\loader.py", line 32, in testFailure
    raise exception
ImportError: Failed to import test module: testes.atores_testes
Traceback (most recent call last):
  File "C:\Python34\lib\unittest\loader.py", line 312, in _find_tests
    module = self._get_module_from_name(name)
  File "C:\Python34\lib\unittest\loader.py", line 290, in _get_module_from_name
    __import__(name)
  File "D:\git\pythonbirds\testes\atores_testes.py", line 5, in <module>
    from atores import Ator, DESTRUIDO, ATIVO, Obstaculo, Porco, PassaroAmarelo, PassaroVermelho
ImportError: cannot import name 'Ator'


======================================================================
ERROR: testes.fase_testes (unittest.loader.ModuleImportFailure)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:\Python34\lib\unittest\case.py", line 58, in testPartExecutor
    yield
  File "C:\Python34\lib\unittest\case.py", line 577, in run
    testMethod()
  File "C:\Python34\lib\unittest\loader.py", line 32, in testFailure
    raise exception
ImportError: Failed to import test module: testes.fase_testes
Traceback (most recent call last):
  File "C:\Python34\lib\unittest\loader.py", line 312, in _find_tests
    module = self._get_module_from_name(name)
  File "C:\Python34\lib\unittest\loader.py", line 290, in _get_module_from_name
    __import__(name)
  File "D:\git\pythonbirds\testes\fase_testes.py", line 13, in <module>
    from atores import Obstaculo, Porco, PassaroVermelho, PassaroAmarelo, DESTRUIDO, ATIVO
ImportError: cannot import name 'Obstaculo'


----------------------------------------------------------------------
Ran 9 tests in 0.016s

FAILED (errors=7)
D:\git\pythonbirds [diversao]>

Animação lenta no Mac

Código deve ser refatorado para considerar o tempo de processamento do pássaros na hora de calcular o loop de animação

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.