O Barqueiro
Publicado por Washington Luis de O Santos (última atualização em 16/01/2019)
[ Hits: 2.971 ]
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()
Jogo da Velha com IA (Inteligencia Artificial)
Compartilhe suas configurações gconf
Criador de instalador USB Linux bootável com Python
Nenhum comentário foi encontrado.
IA Turbina o Desktop Linux enquanto distros renovam forças
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Linux em 2025: Segurança prática para o usuário
Desktop Linux em alta: novos apps, distros e privacidade marcam o sábado
IA chega ao desktop e impulsiona produtividade no mundo Linux
Atualizando o Fedora 42 para 43
Como saber se o seu e-mail já teve a senha vazada?
Como descobrir se a sua senha já foi vazada na internet?
Warcraft II Remastered no Linux? (7)
O programa assinador digital (5)









