🤔 Para Refletir : "Saber a hora de parar é quase tão importante quanto saber a hora de começar" - Ricky O Bardo

ALGORITMO - ATRAVESSAR A MARGEM DO RIO

Membro Membro
A existência virtual é mais como um "JOGO" de azar que sempre dá prêmios. Ronaldo Bento
Postagens
1.694
Bravecoins
433
Olá Desenvolvedores! Minha paixão por jogos lógicos/ educativos/ puzzles etc... Não morreu, porém, infelizmente não possuo habilidades para traduzir esse simples algoritmo para um game. Portanto, será que alguém (equipe) poderia contribuir com esse singelo projeto. Desde já agradeço!

Observação: Não importa a Linguagem de Programação ou Engine...

PROJETO – RESOLUÇÃO DE PROBLEMAS ALGORITMO - ATRAVESSAR A MARGEM DO RIO
Existe um problema muito antigo que apareceu em livros antigos de Matemática Recreativa há mais de 1000 anos.
Fonte: Bigode, Antônio José Lopes. Matemática do Cotidiano. Pag. 29
Uma versão seria: Um senhor precisa levar um cachorro, uma galinha e um maço de couves de uma margem para outra de um rio. Ele tinha uma embarcação que comportava ele próprio e um dos seus pertences. O senhor logo percebeu que não podia deixar sozinhos, em uma das margens do rio, o cachorro e a galinha, nem a galinha e o maço de couves. Como poderia ele atravessar o rio com seus pertences em segurança?

A solução dessa situação pode ser explicada pela descrição do algoritmo em cada etapa. Acompanhe:

Código:
Inicio:
    1) O senhor cruza o rio com a galinha, deixando na margem o cachorro
    com o maço de couves;
    2) O senhor deixa a galinha na outra margem e regressa sozinho;
    3) O senhor cruza o rio com o cachorro;
    4) O senhor regressa com a galinha;
    5) O senhor cruza o rio só com o maço de couves;
    6) O senhor regressa só.
    7) O senhor cruza o rio com a galinha.
Fim.

No entanto, o senhor poderia colocar o maço de couves no colo, pois o mesmo não possui massa que impediria, por exemplo, o barco (EMBARCAÇÃO) de afundar. Sendo assim, adaptei e escrevi esse algoritmo com outro tipo de situação abrangendo a lógica do nosso cotidiano.

Título: Travessia da Família

Descrição do Algoritmo:
Enunciado: Para atravessar um rio, uma família com um menino (criança) de 30 kg, sua irmã adolescente de 40 kg, sua mãe de 60 kg e seu pai de 100 kg dispõe de um barco a remo maltratado pelo tempo que suporta apenas 100 kg, ou seja, como todos os integrantes da família poderia atravessar o rio com total segurança?
ATENÇÃO: A criança não pode atravessar e ficar sozinha.
Autor: Ronaldo Rodrigues Bento

Código:
Inicio
    1) A mãe (60 kg) cruza o rio com sua filha (40 kg), deixando na margem a
    filha;
    2) A mãe (60 kg) deixa a filha (40 kg) na outra margem e regressa sozinha;
    3) A mãe (60 kg) cruza o rio novamente com a criança (30 kg);
    4) A mãe (60 kg) regressa só;
    5) O pai (100 kg) cruza o rio sozinho;
    6) A filha (40 kg) regressa só;
    7) A mãe (60 kg) cruza o rio com sua filha (40 kg).
Fim.

Em Python:

Python:
# Enunciado: ALGORITMO - ATRAVESSAR A MARGEM DO RIO
# Programa Desenvolvido em Python 03
''' Para atravessar um rio, uma família com um menino (criança) de 30 kg,
    sua irmã adolescente de 40 kg, sua mãe de 60 kg e seu pai de 100 kg
    dispõe de um barco a remo maltratado pelo tempo que suporta apenas 100 kg,
    ou seja, como todos os integrantes da família poderia
    atravessar o rio com total segurança?
   
    ATENÇÃO: A criança não pode atravessar e ficar sozinha.
   
    Autor: Ronaldo Rodrigues Bento '''

print()
print('-='*40)
print(f'\033[1;31m{" ATRAVESSAR A MARGEM DO RIO":^80}\033[m')
print('-='*40)
print()  

print('\033[1;33m Suas Opções são: ')
print(' [1] Mãe cruza o rio com sua filha; ')
print(' [2] Pai cruza o rio sozinho; ')
print(' [3] Mãe cruza com seu filho; ')
print(' [4] Filha cruza com seu irmão; ')
print(' [5] Mãe cruza o rio sozinha.\033[m ')
 
print()
opcao = int(input('\033[1;32m Escolha uma opção do Menu:\033[m '))

print('-='*40)

if opcao == 1:
    print('\033[1;37m A mãe (60 kg) cruza o rio com sua filha (40 kg).')
    print(' Deixando na margem a filha e regressa sozinha;')
    print(' A mãe (60 kg) cruza o rio novamente com a criança (30 kg) e depois regressa só ')
    print(' O pai (100 kg) cruza o rio sozinho;')
    print(' A filha (40 kg) regressa só;')
    print(' A mãe (60 kg) cruza o rio com sua filha (40 kg). Parabéns! A Família está SEGURA!\033[m')
 
elif opcao == 2:
    print('\033[1;33m O pai (100 kg) cruza o rio sozinho. ERRO: O barco não volta sozinho. TENTE DE NOVO!\033[m')
 
elif opcao == 3:
    print('\033[1;34m A mãe (60 kg) cruza o rio com seu filho (30 kg). ERRO: A criança não pode atravessar e ficar sozinha. TENTE DE NOVO!\033[m')
 
elif opcao == 4:
    print('\033[1;35m A filha (40 kg) cruza o rio com seu irmão (30 kg). ERRO: A criança não pode atravessar e ficar sozinha. TENTE DE NOVO!\033[m')

elif opcao == 5:
    print('\033[1;36m A mãe (60 kg) cruza o rio sozinha. ERRO: O barco não volta sozinho. TENTE DE NOVO!\033[m')

else:
    print('\033[1;31m Opção Inválida! Tente Novamente!\033[m')    
 
print()
print('-='*40)
print(f'\033[1;32m{" Programa Finalizado com Sucesso":^80}\033[m')
print('-='*40)
print()
 
Última edição:
Depois que você descobre a lógica do problema fica simples de resolver algo parecido.

Mas colocar tudo em programação, aí o caboco tem que entender bem de código e programação... Algo que não faço a minima ideia... kkkkkk...

Valeu pelo post!
 
Depois que você descobre a lógica do problema fica simples de resolver algo parecido.

Mas colocar tudo em programação, aí o caboco tem que entender bem de código e programação... Algo que não faço a minima ideia... kkkkkk...

Valeu pelo post!
Muito obrigado pelo comentário @Rodolfo Vieira
Acho que para transformar esse algoritmo em um game é trabalho para o grande @Dr.XGB ou o para o programador @DanTheLion
Eu acredito que ambos fazem fácil em Java Script.
 
Demorou um pouquinho pra eu generalizar isso num script, mas acho que consegui. O bacana é que tu pode alterar nele os personagens e seus parâmetros pra criar outros jogos com a mesma mecânica, adicionando um gato, por exemplo.

O código não ficou uma lindeza, mas dá pro gasto kkkkkkkkk

Python:
PESO_MAXIMO_BARCO = 100

listaPersonagens = {
    0: {
        'nome': 'Menino',
        'peso': 30,
        'lado': 'esquerdo',
        'podeFicarSozinho': False,
    },
    1: {
        'nome': 'Menina',
        'peso': 40,
        'lado': 'esquerdo',
        'podeFicarSozinho': True,
    },
    2: {
        'nome': 'Mãe',
        'peso': 60,
        'lado': 'esquerdo',
        'podeFicarSozinho': True,
    },
    3: {
        'nome': 'Pai',
        'peso': 100,
        'lado': 'esquerdo',
        'podeFicarSozinho': True,
    },
}

ladoBarco = 'esquerdo'

# Popula a lista de opções disponíveis recursivamente
def popularOpcoesDisponiveis(opcoesDisponiveis, opcoesSelecionadas):
    for indexPersonagem in listaPersonagens:
        personagem = listaPersonagens[indexPersonagem]

        pesoAtual = getPesoPersonagens(opcoesSelecionadas)

        if personagem['lado'] == ladoBarco and pesoAtual + personagem['peso'] <= PESO_MAXIMO_BARCO and indexPersonagem not in opcoesSelecionadas:
            possivelOpcao = opcoesSelecionadas + [indexPersonagem]
            possivelOpcao.sort()

            if(possivelOpcao not in opcoesDisponiveis):
                if(len(opcoesSelecionadas) == 0 and not personagem['podeFicarSozinho']):
                    continue

                if(not ausenciaPersonagemFicaSozinho(possivelOpcao)):
                    opcoesDisponiveis.append(possivelOpcao)

                popularOpcoesDisponiveis(opcoesDisponiveis, opcoesSelecionadas + [indexPersonagem])

# Retorna o peso dos personagens passados por parâmetro
def getPesoPersonagens(personagens):
    return sum(map(lambda indexPersonagem: listaPersonagens[indexPersonagem]['peso'], personagens))

# Verifica se na ausência dos personagens saindo, algum personagem vai ficar sozinho
def ausenciaPersonagemFicaSozinho(personagensSaindo):
    personagensFicariamSozinhos = list(filter(lambda indexPersonagem: listaPersonagens[indexPersonagem]['lado'] == ladoBarco and indexPersonagem not in personagensSaindo, listaPersonagens))
    return len(personagensFicariamSozinhos) == 1 and not listaPersonagens[personagensFicariamSozinhos[0]]['podeFicarSozinho']

# Printa as opções possíveis que o jogador pode escolher
def printarOpcoesDisponiveis(opcoesDisponiveis):
    for index, opcao in enumerate(opcoesDisponiveis):
        nomes = map(lambda indexPersonagem: listaPersonagens[indexPersonagem]['nome'], opcao)
        print("{} - {}".format(index, ", ".join(nomes)))

# Retorna uma lista de personagens do lado passado por parâmetro
def getPersonagensDoLado(lado):
    return list(filter(lambda indexPersonagem: listaPersonagens[indexPersonagem]['lado'] == lado, listaPersonagens))

# Verifica se o jogo foi vencido
def jogoFinalizado():
    return len(getPersonagensDoLado('esquerdo')) == 0

if(__name__ == '__main__'):
   
    while True:
        opcoes = []
        popularOpcoesDisponiveis(opcoes, [])

        personagensLadoAtual = getPersonagensDoLado(ladoBarco)

        print("O barco está do lado {}. Os personagens desse lado são: {}".format(ladoBarco, ", ".join(map(lambda indexPersonagem: listaPersonagens[indexPersonagem]['nome'], personagensLadoAtual))))
       
        print("Quais personagens você deseja que remem para o outro lado?")
        printarOpcoesDisponiveis(opcoes)
        print()

        opcao = int(input("Escolha uma opção: "))
        print("=========================================")

        for indexPersonagem in opcoes[opcao]:
            listaPersonagens[indexPersonagem]['lado'] = 'direito' if ladoBarco == 'esquerdo' else 'esquerdo'

        ladoBarco = 'direito' if ladoBarco == 'esquerdo' else 'esquerdo'

        if(jogoFinalizado()):
            print("Parabéns, você conseguiu!")
            break
 
Ficou muito bom @Eranot
Vou estudá-lo bastante e futuramente... que sabe tento adicioná-lo com a biblioteca de jogos pygame. Muito Obrigado!
Valeu! De fato, eu acho que daria pra adaptar bem facilmente para uma interface em qualquer linguagem. Quem sabe seja bacana portar para JS pra fazer algo jogável no navegador mesmo =)
 
Voltar
Topo