Genius - jogo de memória
Publicado por Washington Luis de O Santos (última atualização em 14/02/2020)
[ Hits: 6.064 ]
Este programa simula um jogo de memória eletrônico, que nos Estados Unidos é chamado de Simon e aqui no Brasil foi batizado de Genius pela fabricante de brinquedos Estrela S/A.
O brinquedo buscava estimular a memorização de cores e sons. Com um formato semelhante a um OVNI, possuía botões coloridos que emitiam sons harmônicos e se iluminavam em sequência. Cabia aos jogadores repetir o processo sem errar.
O Genius original possuía três jogos diferentes e quatro níveis de dificuldade. Para mais detalhes veja o link: https://pt.wikipedia.org/wiki/Genius_(jogo)
Eu não quis complicar muito o programa. O importante é que já da para brincar e ir aprendendo um pouco mais sobre Python e ncurses e que vocês entenda a lógica.
Observações:
- Para rodar o programa use o Python3
- No Debian, instale o pacote " sox " através do apt-get para poder reproduzir os beeps através do " play "
- O play é um utilitário de linha de comando (shell), para testar o play direto no terminal copie e cole a linha abaixo:
play --no-show-progress --null -t alsa --channels 1 synth .5 sine 1000
Bom... é isso então. Novamente se divirtam e dêem um joinha se gostaram e vejam os outros programas no link: https://www.vivaolinux.com.br/~WashingtonLuis/scripts/
#!/usr/bin/env python3 # -*- coding:UTF-8 -*- ''' Genius version 1.0 - Program blinken - KDE version of the Simon electronic memory game Copyright (c) 2018-2019 Washington Luis de O. Santos < owashington[arroba]terra.com.br > This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Taubaté - SP, 14 de outubro de 2019 ''' import sys import time import curses import random import os # janela principal screen = curses.initscr() # tamanho da janela principal screen_x, screen_y = screen.getmaxyx() if screen_x < 24 or screen_y < 81: screen.clear() curses.endwin() print('Tamanho atual do terminal: {} x {}'.format(screen_x, screen_y)) print('\nO seu terminal tem que ter no minimo 24 linhas por 81 colunas.\n') print('Reajuste o tamanho do seu terminal para poder jogar... \n') sys.exit(0) screen.notimeout(False) screen.keypad(True) screen.clear() # atualiza a tela automaticamente mais causa perda de performance # pode ser usado no lugar das chamadas da funcao screen.refresh() #screen.immedok(True) #screen.set_title('G E N I U S') curses.mousemask(curses.ALL_MOUSE_EVENTS) # iniciando cores curses.start_color() curses.use_default_colors() # Define as cores dos 'botãozões' curses.init_pair(1, curses.COLOR_WHITE, curses.COLOR_GREEN) curses.init_pair(2, curses.COLOR_WHITE, curses.COLOR_YELLOW) curses.init_pair(3, curses.COLOR_WHITE, curses.COLOR_RED) curses.init_pair(4, curses.COLOR_WHITE, curses.COLOR_BLUE) # Define cor do box lateral curses.init_pair(10, curses.COLOR_YELLOW, curses.COLOR_BLACK) curses.init_pair(11, curses.COLOR_WHITE, curses.COLOR_BLACK) # Define cor dos textos curses.init_pair(12, curses.COLOR_BLUE, curses.COLOR_WHITE) # Define cor da Barra de Status curses.init_pair(13, curses.COLOR_WHITE, curses.COLOR_CYAN) # Define cor da tela de abertura curses.init_pair(14, curses.COLOR_GREEN, curses.COLOR_WHITE) # Define cor da mensagem de error curses.init_pair(15, curses.COLOR_RED, curses.COLOR_WHITE) curses.cbreak() # Não retorna caracteres na tela curses.noecho() # move o cursor para a posicao 0,0 #screen.move(0,0) # esconde o cursor do mouse e do terminal curses.curs_set(0) # Define Constantes K_CTRL_Q = 17 K_ESC = 27 K_1 = 49 K_2 = 50 K_3 = 51 K_4 = 52 # Define Constantes usadas como caracteres especiais # Single-line # Chr( 218 ) + Chr( 196 ) + Chr( 191 ) ┌ ─ ┐ # Chr( 179 ) + Chr( 32 ) + Chr( 179 ) │ │ # Chr( 192 ) + Chr( 196 ) + Chr( 217 ) └ ─ ┘ c_032 = chr( 32) # espaço c_177 = chr(9619) # bloco c_179 = chr(9474) c_191 = chr(9488) c_192 = chr(9492) c_196 = chr(9472) c_217 = chr(9496) c_218 = chr(9484) class Box: def Fill(lt,ce,lb,cd, cor): #Desenha uma caixa sem bordas e sem sombras for x in range(lt,lb+1): screen.addstr(x, ce, c_032 * (cd-ce+1), curses.color_pair(cor)) def Display(lt,ce,lb,cd,cor): #Desenha uma caixa com bordas e sem sombras __class__.Fill(lt,ce,lb,cd,cor) screen.addstr(lt, ce, c_196 * (cd-ce), curses.color_pair(cor)) screen.addstr(lt, ce, c_218, curses.color_pair(cor)) screen.addstr(lt, cd, c_191, curses.color_pair(cor)) screen.addstr(lb, ce, c_196 * (cd-ce), curses.color_pair(cor)) screen.addstr(lb, ce, c_192, curses.color_pair(cor)) screen.addstr(lb, cd, c_217, curses.color_pair(cor)) for x in range(lt+1,lb): screen.addstr(x, ce, c_179, curses.color_pair(cor)) screen.addstr(x, cd, c_179, curses.color_pair(cor)) def Shadow(lt,ce,lb,cd,cor): #Desenha uma caixa com bordas e com sombras __class__.Display(lt,ce,lb,cd,cor) #Desenha a Sombra da Caixa for x in range(lt+1,lb+1): screen.addstr(x, cd+1, c_032, curses.color_pair(0)) screen.addstr(lb+1, ce+1, c_032 * (cd-ce+1), curses.color_pair(0)) def Beep(duration = .1, frequency = 3000): #curses.beep() #os.system('beep -f %s -l %s' % (frequency,duration)) #os.system('beep -f 555 -l 460') # Observação: # O play é um utilitário de linha de comando (shell), para poder usa-lo # instale o Pacote sox atraves do apt-get no Debian # Para testar o play direto no bash copie e cole a linha abaixo: #play --no-show-progress --null -t alsa --channels 1 synth .5 sine 1000 try: os.system('play --no-show-progress --null -t alsa --channels 1 synth %s sine %f' % (duration, frequency)) except: pass def pause(tempo): # Atualiza a tela screen.refresh() # Pausa por um tempo time.sleep(tempo) # Limpa qualquer outra coisa que o usuário tenha digitado curses.flushinp() def autor(): # Mostra a tela de abertura # Obs: As 'fontes' usadas foram criadas através do programa # figlet - http://www.figlet.org/ # digite o cmd abaixo para ver as fontes disponiveis # showfigfonts # digite o cmd abaixo para criar o arquivo com o texto # figlet -f big "G e n i u s" >> genius.txt # figlet -f small "Versao 1.0" >> genius.txt Box.Shadow(1,10,20,68,12) screen.addstr( 4, 18, ' _____ _ ', curses.color_pair(14) | curses.A_BOLD) screen.addstr( 5, 18, ' / ____| (_) ', curses.color_pair(14) | curses.A_BOLD) screen.addstr( 6, 18, '| | __ ___ _ __ _ _ _ ___ ', curses.color_pair(14) | curses.A_BOLD) screen.addstr( 7, 18, '| | |_ | / _ \ | \'_ \ | | | | | | / __|', curses.color_pair(14) | curses.A_BOLD) screen.addstr( 8, 18, '| |__| | | __/ | | | | | | | |_| | \__ \\', curses.color_pair(14) | curses.A_BOLD) screen.addstr( 9, 18, ' \_____| \___| |_| |_| |_| \__,_| |___/ ', curses.color_pair(14) | curses.A_BOLD) screen.addstr(11, 20, '__ __ __ _ __ ', curses.color_pair(14) | curses.A_BOLD) screen.addstr(12, 20, '\ \ / /__ _ _ ___ __ _ ___ / | / \ ', curses.color_pair(14) | curses.A_BOLD) screen.addstr(13, 20, ' \ V / -_) \'_(_-</ _` / _ \ | || () |', curses.color_pair(14) | curses.A_BOLD) screen.addstr(14, 20, ' \_/\___|_| /__/\__,_\___/ |_(_)__/ ', curses.color_pair(14) | curses.A_BOLD) screen.addstr(17, 15, 'Autor: Washington Luis de Oliveira Santos', curses.color_pair(12)) screen.addstr(18, 15, 'End. : Av. Campinas, 749 - Chácara do Visconde', curses.color_pair(12)) screen.addstr(19, 28, 'Taubaté - São Paulo', curses.color_pair(12)) def inkey(): while True: try: key = screen.getch() if key == curses.KEY_MOUSE: # botao esquerdo do mouse foi pressionado _, mx, my, _, _ = curses.getmouse() #screen.addstr (22, 1,"my = %i | mx = %i" % (my, mx)) # Verifica em que posicao foi pressionado # linhas colunas if ( 4 <= my <= 10) and ( 4 <= mx <= 24): return 1 elif ( 4 <= my <= 10) and (26 <= mx <= 46): return 2 elif (12 <= my <= 18) and ( 4 <= mx <= 24): return 3 elif (12 <= my <= 18) and (26 <= mx <= 46): return 4 except curses.error: pass if key in (K_ESC, K_CTRL_Q, ord('q'), ord('Q')): # encerra o programa screen.addstr(23, 1, 'Jogo abortado... ', curses.color_pair(13) | curses.A_BOLD) pause(3) ENCERRA() elif key in (curses.KEY_F1, ord('h'), ord('H')): # help acionado return 0 elif key == K_1: return 1 elif key == K_2: return 2 elif key == K_3: return 3 elif key == K_4: return 4 def showBotao(n, cor=0): #Desenha o botãozão botao = {1:(4,4,10,24), 2:(4,26,10,46), 3:(12,4,18,24), 4:(12,26,18,46)} label = {1:(7,13), 2:(7,35), 3:(15,13), 4:(15,35)} beep = [500, 1100, 700, 900] Box.Display(*botao[n], cor=cor) screen.addstr(label[n][0], label[n][1], ' %s ' % n, curses.color_pair(12)) if cor: Beep(.12, beep[n-1]) def display_tela(): #Cria um quadro na tela com char azul e fundo branco Box.Display(0,0,23,79,12) Box.Display(1,50,22,77,11) screen.addstr( 3, 55, 'Genius version 1.0', curses.color_pair(10)) screen.addstr( 6, 54, 'by: Washington Luis', curses.color_pair(10)) screen.addstr( 9, 52, 'My version of the Simon', curses.color_pair(10)) screen.addstr(11, 53, 'electronic memory game', curses.color_pair(10)) screen.addstr(14, 56, 'This program is', curses.color_pair(10)) screen.addstr(16, 57, 'free software', curses.color_pair(10)) screen.addstr(19, 52, 'Copyright (c) 2018-2019', curses.color_pair(10)) #Escreve o titulo screen.addstr(2, 20, 'G E N I U S', curses.color_pair(12) | curses.A_BOLD) #Desenha os botões for n in (1,2,3,4): showBotao(n, n) #Limpa a Barra de Status screen.addstr(23, 0, c_032 * 80, curses.color_pair(13)) pause(.01) def ENCERRA(): #Restaura a cor do terminal screen.refresh() screen.clear() screen.keypad(False) curses.nocbreak() curses.echo() curses.endwin() sys.exit(0) def gerasequencia(size=10): return ''.join(random.choice('1234') for _ in range(size)) def main(): msg = {1:'Botão verde ', 2:'Botão amarelo ', 3:'Botão vermelho', 4:'Botão azul '} #Imprimi a tela de abertura display_tela() autor() for _ in range(5): # Fica piscando a tela (mudando de cor) curses.init_pair(14, random.randint(0, 7), curses.COLOR_WHITE) pause(.7) niveis = 32 seq_pc = gerasequencia(niveis) seq_user = '' dificuldade = 1 display_tela() while True: # mostra a sequencia gerada pelo computador (só pra depuração) #screen.addstr(21, 1, 'sequencia -> %s ' % seq_pc[:dificuldade], curses.color_pair(12)) #Limpa a Barra de Status screen.addstr(23, 0, c_032 * 80, curses.color_pair(13)) screen.addstr(23, 61, 'Dificuldade: %5i ' % dificuldade, curses.color_pair(13) | curses.A_BOLD) pause(1) for n in range(dificuldade): showBotao(int(seq_pc[n]), 0) pause(.2) showBotao(int(seq_pc[n]), int(seq_pc[n])) pause(.2) while True: botao = inkey() if botao == 0: # help acionado autor() screen.addstr(23, 1, 'Tecle algo para sair...', curses.color_pair(13) | curses.A_BOLD) # O comando abaixo faz com que a chamada a getch() retorne depois # de um tempo simulando a função inkey(<tempo>) do CLIPPER curses.halfdelay(7) while True: key = screen.getch() if key != -1:break # Fica piscando a tela (mudando de cor) curses.init_pair(14, random.randint(0, 7), curses.COLOR_WHITE) screen.refresh() display_tela() #continue break elif 1 <= botao <= 4: #Aciona o botãozão screen.addstr(23, 1, msg[botao], curses.color_pair(13) | curses.A_BOLD) showBotao(botao, 0) pause(.01) showBotao(botao, botao) pause(.01) seq_user += str(botao) if seq_user == seq_pc: Box.Shadow(9,23,15,55,12) screen.addstr(11, 25, 'Parabéns!!! Você conseguiu...', curses.color_pair(12)) screen.addstr(13, 25, 'Quer Jogar Novamente? (S/N) ', curses.color_pair(12)) pause(.01) key = screen.getch() if key in (ord('S'), ord('s')): seq_pc = gerasequencia(niveis) seq_user = '' dificuldade = 1 display_tela() break else: ENCERRA() elif seq_user == seq_pc[:len(seq_user)]: if len(seq_user) == dificuldade: screen.addstr(23, 16, 'OK Próximo nivel...', curses.color_pair(13) | curses.A_BOLD) pause(2) seq_user = '' dificuldade += 1 break else: screen.addstr(23, 16, 'OK', curses.color_pair(13) | curses.A_BOLD) pause(.05) else: Beep(.2, 2000) Beep(.2, 1600) Beep(.2, 2200) screen.addstr(23, 16, 'NOK', curses.color_pair(13) | curses.A_BOLD) Box.Shadow(9,23,15,55,15) screen.addstr(11, 26, 'Você E R R O U ...', curses.color_pair(15) | curses.A_BLINK) screen.addstr(13, 26, 'Quer Jogar Novamente? (S/N)', curses.color_pair(12)) pause(.01) key = screen.getch() if key in (ord('S'), ord('s')): seq_pc = gerasequencia(niveis) seq_user = '' dificuldade = 1 display_tela() break else: ENCERRA() if __name__ == '__main__': try: curses.wrapper(main()) except KeyboardInterrupt: ENCERRA()
Script para fazer o Scroll Lock funcionar no Linux
m2psp - conversor de vídeo para o formato de psp
Algoritmo de Dijkstra em Python com visualização em PyGraphviz
Calculadora para números complexos
Nenhum comentário foi encontrado.
Enviar mensagem ao usuário trabalhando com as opções do php.ini
Meu Fork do Plugin de Integração do CVS para o KDevelop
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Compartilhamento de Rede com samba em modo Público/Anônimo de forma simples, rápido e fácil
Cups: Mapear/listar todas as impressoras de outro Servidor CUPS de forma rápida e fácil
Criando uma VPC na AWS via CLI
Tem como instalar o gerenciador AMD Adrenalin no Ubuntu 24.04? (15)
Tenho dois Link's ( IP VÁLIDOS ), estou tentando fazer o failover... (0)
Pendrive não formata de jeito nenhum (4)