O Barqueiro

Publicado por Washington Luis de O Santos (última atualização em 16/01/2019)

[ Hits: 999 ]

Download o_barqueiro-1.0.py




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...

  



Esconder código-fonte

#!/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 ) &#9484; &#9472; &#9488;
# Chr( 179 ) + Chr(  32 ) + Chr( 179 ) &#9474;   &#9474;
# Chr( 192 ) + Chr( 196 ) + Chr( 217 ) &#9492; &#9472; &#9496;

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()


Scripts recomendados

Tabela Price

Visualizar a data e hora de um servidor SNTP e atualizar na BIOS do sistema

Torres de Hanoi 1.0

Unescape de caracteres especiais ISO-8859-1

Desquebra-Cabeça dos Palitos


  

Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts