O Barqueiro
Publicado por Washington Luis de O Santos (última atualização em 16/01/2019)
[ Hits: 2.846 ]
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 de adivinhar o número aleatório
Compressão de série numérica em Python
Nenhum coment�rio foi encontrado.
Aprenda a Gerenciar Permissões de Arquivos no Linux
Como transformar um áudio em vídeo com efeito de forma de onda (wave form)
Como aprovar Pull Requests em seu repositório Github via linha de comando
Visualizar arquivos em formato markdown (ex.: README.md) pelo terminal
Dando - teoricamente - um gás no Gnome-Shell do Arch Linux
Como instalar o Google Cloud CLI no Ubuntu/Debian
Mantenha seu Sistema Leve e Rápido com a Limpeza do APT!
Procurando vídeos de YouTube pelo terminal e assistindo via mpv (2025)
Sinto uma leve lentidão ao arrastar, miniminizar e restauras as janela... (3)
Alguém já usou o framework Avalonia para desenvolver interfaces de usu... (4)
Ajuda Pra Melhoria do NFTABLES. (8)
Pastas da raiz foram para a área de trabalho [RESOLVIDO] (7)