O Barqueiro
Publicado por Washington Luis de O Santos (última atualização em 16/01/2019)
[ Hits: 2.663 ]
Não deixe seu barco afundar, você só pode levar um passageiro de cada vez, mas tem um porém, você não pode deixar o Lobo sozinho com a Cabra porque ele ira comer ela e nem pode deixar a Cabra sozinha com o Pasto porque é ele que será comido. Resumindo, deem seus pulos e aproveitem para aprender mais um pouquinho sobre o módulo 'ncurses' e o python.
E se gostarem deem um like...
#!/usr/bin/env python3 # -*- coding:UTF-8 -*- #coding: cp1252 #coding: latin1 u''' O B A R Q U E I R O version 1.0 - Program Copyright (c) 2002-2004 Washington Luis de O. Santos < owashington@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. POR: Washington Luis de Oliveira Santos Taubaté - SP, 10 de janeiro de 2019 ''' import sys import time import curses from random import randrange from threading import Timer # janela principal screen = curses.initscr() # tamanho da janela principal screen_x, screen_y = screen.getmaxyx() if screen_x < 24 or screen_y < 80: screen.clear() curses.endwin() print('\nO seu terminal tem que ter no minimo 24 linhas por 80 colunas.\n') print('Reajuste o tamanho do seu terminal para poder jogar... \n') sys.exit(0) screen.keypad(True) #screen.notimeout(False) curses.cbreak() # Não retorna caracteres na tela curses.noecho() # esconde o cursor do mouse e do terminal curses.curs_set(0) # limpa a tela 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) # iniciando cores curses.start_color() curses.init_pair( 1, curses.COLOR_RED, curses.COLOR_WHITE) curses.init_pair( 2, curses.COLOR_GREEN, curses.COLOR_BLACK) curses.init_pair( 3, curses.COLOR_RED, curses.COLOR_BLACK) curses.init_pair( 4, curses.COLOR_WHITE, curses.COLOR_BLUE) curses.init_pair( 5, curses.COLOR_WHITE, curses.COLOR_BLUE) curses.init_pair( 6, curses.COLOR_RED, curses.COLOR_BLUE) curses.init_pair(11, curses.COLOR_BLUE, curses.COLOR_WHITE) curses.init_pair(13, curses.COLOR_GREEN, curses.COLOR_WHITE) curses.init_pair(18, curses.COLOR_BLACK, curses.COLOR_WHITE) # 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 = 32 c_168 = 9608 c_177 = 9617 c_178 = 9618 c_179 = 9474 c_191 = 9488 c_192 = 9492 c_196 = 9472 c_217 = 9496 c_218 = 9484 c_219 = 9604 c_223 = 9600 # Executando Funções em Intervalos de Tempo # Tirado do link: # https://wiki.python.org.br/ExecutandoEmIntervalos def setInterval(function, interval, *params, **kwparams): def setTimer(wrapper): wrapper.timer = Timer(interval, wrapper) wrapper.timer.start() def wrapper(): function(*params, **kwparams) setTimer(wrapper) setTimer(wrapper) return wrapper def clearInterval(wrapper): wrapper.timer.cancel() # Esta é uma tentativa de manter o prg compativel com o python 2.7 # para isto comente as duas linhas abaixo def unichr(ch): return chr(ch) def pause(tempo): # Atualiza a tela #screen.refresh() # Pausa por um tempo time.sleep(tempo) # Funcao para imprimir a tela de abertura def autor(): DispBox_Shadow(2,10,21,67, 11) screen.addstr( 5, 12, ' ___ ____ _ ', curses.color_pair(13) | curses.A_BOLD) screen.addstr( 6, 12, ' / _ \ | __ ) __ _ _ __ __ _ _ _ ___(_)_ __ ___ ', curses.color_pair(13) | curses.A_BOLD) screen.addstr( 7, 12, '| | | | | _ \ / _` | \'__/ _` | | | |/ _ \ | \'__/ _ \ ', curses.color_pair(13) | curses.A_BOLD) screen.addstr( 8, 12, '| |_| | | |_) | (_| | | | (_| | |_| | __/ | | | (_) |', curses.color_pair(13) | curses.A_BOLD) screen.addstr( 9, 12, ' \___/ |____/ \__,_|_| \__, |\__,_|\___|_|_| \___/ ', curses.color_pair(13) | curses.A_BOLD) screen.addstr(10, 12, ' |_| ', curses.color_pair(13) | curses.A_BOLD) screen.addstr(14, 52, 'Versão 1.0', curses.color_pair(18)) screen.addstr(18, 15, 'Autor: Washington Luis de Oliveira Santos', curses.color_pair(11)) screen.addstr(19, 15, 'End. : Av. Campinas, 749 - Chácara do Visconde', curses.color_pair(11)) screen.addstr(20, 28, 'Taubaté - São Paulo', curses.color_pair(11)) def Box(lt,ce,lb,cd, cor): for x in range(lt,lb): screen.addstr(x, ce, ' ' * (cd-ce+1), curses.color_pair(cor)) def DispBox(lt,ce,lb,cd, cor): Box(lt,ce,lb,cd, cor) screen.addstr(lt, ce, unichr(c_196) * (cd-ce), curses.color_pair(cor)) screen.addstr(lt, ce, unichr(c_218), curses.color_pair(cor)) screen.addstr(lt, cd, unichr(c_191), curses.color_pair(cor)) screen.addstr(lb, ce, unichr(c_196) * (cd-ce), curses.color_pair(cor)) screen.addstr(lb, ce, unichr(c_192), curses.color_pair(cor)) screen.addstr(lb, cd, unichr(c_217), curses.color_pair(cor)) for x in range(lt+1,lb): screen.addstr(x, ce, unichr(c_179), curses.color_pair(cor)) screen.addstr(x, cd, unichr(c_179), curses.color_pair(cor)) def DispBox_Shadow(lt,ce,lb,cd, cor): DispBox(lt,ce,lb,cd, cor) #Desenha a Sombra da Caixa for x in range(lt+1,lb+1): screen.addstr(x, cd+1, unichr(c_168), curses.color_pair(18)) screen.addstr(lb+1, ce+1, unichr(c_168) * (cd-ce+1), curses.color_pair(18)) def ENCERRA(): #Restaura a cor do terminal screen.refresh() screen.clear() screen.keypad(True) curses.nocbreak() curses.echo() curses.endwin() sys.exit(0) def water_display(l_ini=13, l_end=19): for line in range(l_ini, l_end): water_line = '' while len(water_line) <= 80: water_line += ('^' * randrange(0,6)) + (' ' * randrange(1,6)) screen.addstr(line, 0, water_line[:80], curses.color_pair(4)) def chk_cais(cais): cais = ''.join(cais) quem = 'O Lobo' if cais == 'LC ' else 'A Cabra' if cais == ' CP' else '' #'ninguem' vitima = 'a Cabra' if cais == 'LC ' else 'o Pasto' if cais == ' CP' else '' #'nada ' if quem+vitima: screen.addstr(21, 1, 'Sinto muito...', curses.color_pair(1)) screen.addstr(22, 1, quem + ' comeu ' + vitima, curses.color_pair(1)) pause(1) return True def chk_lotacao(carga): if carga.count(' ') == 1: screen.addstr(21, 1, 'Sinto muito... Lotado', curses.color_pair(1)) screen.addstr(22, 1, 'O Barco afundou...', curses.color_pair(1)) pause(1) screen.addstr(10,38, ' ', curses.color_pair(2)) # f preto screen.addstr(11,38, ' ', curses.color_pair(1)) # f branco for line in range(13,18): water_display() screen.addstr(line+0,37, ' M ', curses.color_pair(6)) screen.addstr(line+1,37, '\~~~/', curses.color_pair(6)) # | curses.A_UNDERLINE) pause(.2) return True def chk_fim(cais_2): if ''.join(cais_2) == 'LCP': screen.addstr(21, 1, ' Muito Bem !!!', curses.color_pair(1)) return True def embarque(cais, carga): if ''.join(cais) != ' ': screen.addstr(21, 1, 'Por no Barco? ', curses.color_pair(3) | curses.A_BOLD | curses.A_BLINK) key = chr(screen.getch()).upper() screen.addstr(21, 1, ' '*15, curses.color_pair(3)) if key == chr(27): return True elif key != chr(32): try: i = cais.index(key) cais [i] = ' ' carga [i] = key except: pass def desembarque(cais, carga): if ''.join(carga) != ' ': screen.addstr(21, 1, 'Tirar do Barco?', curses.color_pair(3) | curses.A_BOLD | curses.A_BLINK) key = chr(screen.getch()).upper() screen.addstr(21, 1, ' '*15, curses.color_pair(3)) if key == chr(27): return True elif key != chr(32): try: i = carga.index(key) cais [i] = key carga [i] = ' ' except: pass def gameloop(): # Define Variaveis usadas no jogo cais_1 = ['L','C','P'] cais_2 = [' ',' ',' '] carga = [' ',' ',' '] barco = ' \___/ ' nv = 0 # numero de viagens screen.addstr(21,62, ' Nº de Viagens: {:2}'.format(nv), curses.color_pair(4)) while True: if desembarque(cais_1, carga): return screen.addstr(10, 2, ''.join(cais_1), curses.color_pair(2)) screen.addstr(10, 9, ''.join(carga), curses.color_pair(2)) if embarque(cais_1, carga): return screen.addstr(10, 2, ''.join(cais_1), curses.color_pair(2)) screen.addstr(10, 9, ''.join(carga), curses.color_pair(2)) # Movimenta o barco de C1 para C2 (atravessa) aux = ' '+''.join(carga)+' ' for col in range(7,67): #water_display() screen.addstr(10, col, aux, curses.color_pair(2)) screen.addstr(11, col, barco, curses.color_pair(1)) pause(.1) if col == 37 and chk_lotacao(carga): return nv += 1 screen.addstr(21,62, ' Nº de Viagens: {:2}'.format(nv), curses.color_pair(4)) if chk_cais(cais_1): return if desembarque(cais_2, carga): return screen.addstr(10,75, ''.join(cais_2), curses.color_pair(2)) screen.addstr(10,68, ''.join(carga), curses.color_pair(2)) if chk_fim(cais_2): return if embarque(cais_2, carga): return screen.addstr(10,75, ''.join(cais_2), curses.color_pair(2)) screen.addstr(10,68, ''.join(carga), curses.color_pair(2)) # Movimenta o barco de C2 para C1 (volta) aux = ' '+''.join(carga)+' ' for col in range(66,6,-1): #water_display() screen.addstr(10, col, aux, curses.color_pair(2)) screen.addstr(11, col, barco, curses.color_pair(1)) pause(.1) if col == 37 and chk_lotacao(carga): return nv += 1 screen.addstr(21,62, ' Nº de Viagens: {:2}'.format(nv), curses.color_pair(4)) if chk_cais(cais_2): return def main(): while True: screen.clear() #Imprimi a tela de abertura water_display(1,24) autor() pause(4) screen.clear() screen.addstr( 2,30, ' O B A R Q U E I R O ', curses.color_pair(4) | curses.A_BOLD) screen.addstr(10, 2, 'LCP', curses.color_pair(2)) screen.addstr(10, 9, ' ', curses.color_pair(2)) screen.addstr(11, 0, '|-----. \ /' + (' ' * 60)+'.-----|', curses.color_pair(1)) screen.addstr(12, 0, ('~' * 80), curses.color_pair(4)) screen.addstr(12, 0, '|', curses.color_pair(6) | curses.A_UNDERLINE) screen.addstr(12, 6, '|', curses.color_pair(6) | curses.A_UNDERLINE) screen.addstr(12,73, '|', curses.color_pair(6) | curses.A_UNDERLINE) screen.addstr(12,79, '|', curses.color_pair(6) | curses.A_UNDERLINE) screen.addstr(19, 0, ('~' * 80), curses.color_pair(4)) interval_monitor = setInterval(water_display, .5) gameloop() clearInterval(interval_monitor) # Verifica o que fazer ao final do jogo screen.addstr(23, 1, 'Quer tentar outra vez? (S/N)', curses.color_pair(1)) key = chr(screen.getch()).upper() if key != 'S': ENCERRA() if __name__ == '__main__': try: curses.wrapper(main()) except KeyboardInterrupt: curses.endwin()
Invariância Discreta de Escala
Probabilidade de Vencer - Poker Texas Hold
Nenhum comentário foi encontrado.
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
Efeito "livro" em arquivos PDF
Como resolver o erro no CUPS: Unable to get list of printer drivers
Flatpak: remover runtimes não usados e pacotes
Mudar o gerenciador de login (GDM para SDDM e vice-versa) - parte 2
Estou com sede em aprender sobre o nosso querido Linux. (1)
big linux sem audio como resolver (2)
Como faz para dar um update-grub por shell script [RESOLVIDO] (3)
[Python] Automação de scan de vulnerabilidades
[Python] Script para analise de superficie de ataque
[Shell Script] Novo script para redimensionar, rotacionar, converter e espelhar arquivos de imagem
[Shell Script] Iniciador de DOOM (DSDA-DOOM, Doom Retro ou Woof!)
[Shell Script] Script para adicionar bordas às imagens de uma pasta