O Barqueiro

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

[ Hits: 2.674 ]

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

Random Google Images - v1.0b

Geometria Analítica

Diferença de dias entre datas

Veja a versão das principais distrubuições.

Sudoku


  

Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts