O Barqueiro
Publicado por Washington Luis de O Santos (última atualização em 16/01/2019)
[ Hits: 2.995 ]
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()
Sugestão aleatória de filmes e séries para assistir por streaming
Crivo de Eratóstenes Simples em Python
Criador de instalador USB Linux bootável com Python
Nenhum comentário foi encontrado.
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
IA Turbina o Desktop Linux enquanto distros renovam forças
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Ativando e usando "zoom" no ambiente Cinnamon
Vídeo Nostálgico de Instalação do Conectiva Linux 9
Como realizar um ataque de força bruta para desobrir senhas?
Estou tentando ser legalista, mas tá complicado! (8)
Thinkpads são bons mesmo ?! (0)
Queda no serviços da Cloudflare, alguns sites estão fora do ar. (1)









