O Barqueiro
Publicado por Washington Luis de O Santos (última atualização em 16/01/2019)
[ Hits: 2.524 ]
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()
Just Do It - XML Generic Editor
Versão das principais distribuições.
Fazendo processos rodarem em background
Nenhum comentário foi encontrado.
Melhorando o tempo de boot do Fedora e outras distribuições
Como instalar as extensões Dash To Dock e Hide Top Bar no Gnome 45/46
E a guerra contra bots continua
Tradução do artigo do filósofo Gottfried Wilhelm Leibniz sobre o sistema binário
Conheça o firewall OpenGFW, uma implementação do (Great Firewall of China).
Instalando o FreeOffice no LMDE 6
Anki: Remover Tags de Estilo HTML de Todas as Cartas
Colocando uma opção de redimensionamento de imagem no menu de contexto do KDE
Não consigo acessar os modos de desempenho (2)
Ubuntu — tentando iniciar o windows? (0)
[Shell Script] Script para desinstalar pacotes desnecessários no OpenSuse
[Shell Script] Script para criar certificados de forma automatizada no OpenVpn
[Shell Script] Conversor de vídeo com opção de legenda
[C/C++] BRT - Bulk Renaming Tool
[Shell Script] Criação de Usuarios , Grupo e instalação do servidor de arquivos samba