Jogo da Velha com IA (Inteligencia Artificial)

Publicado por Washington Luis de O Santos (última atualização em 17/09/2020)

[ Hits: 9.843 ]

Download jogo_da_veIA-1.0.py




Este é mais um programinha do "Jogo da Velha" que também é conhecido como "Jogo do Galo" e "Tic-Tac Toe".

A diferença deste, com a maioria dos outros programas de jogo da velha que eu tenho visto por aí, é que este faz uso da IA  (Inteligencia Artificial) e por isso eu o batizei de "jogo_da_veIA-1.0.py".

Este programa foi baseado em um outro feito em Basic apresentado na:

   REVISTA GERAÇÃO PROLÓGICA Nº 3 - PG. 6
   publicada em jan/fev de 1984
   CP-200 COMPATÍVEL ZX81 - TK-85

Disponível em pdf no link abaixo:
https://datassette.org/revistas/geracao-prologica-informatica-revistas/geracao-prologica-no-3

No programa acrescentei cores e contadores para indicar o número de vitórias do usuário, do PC e os empates.

É lógico que o programa em Python, devido aos recursos da própria linguagem e depois de uma boa reestruturação, ficou muito mais simples/fácil de entender comparado com o original em Basic.

E é isso então... novamente se divirtam e deem um joinha se gostaram e vejam os outros programas no link: https://www.vivaolinux.com.br/~WashingtonLuis/scripts/

PS.: Quem entender o programa original em Basic ganha uma bala.

  



Esconder código-fonte

#!/usr/bin/env python3
# -*- encoding: utf-8 -*-

'''
   Jogo da Velha (IA - inteligencia artificial)              version 1.0 - Program

   Também conhecido como Jogo do Galo e Tic-Tac Toe

   Copyright (c) 2019-2020 Washington Luis de O. Santos
   
   < owashington[arroba]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.

   Taubaté - SP, 4 de julho de 2020

   Vejam as minhas outras colaborações no link:
   https://www.vivaolinux.com.br/~WashingtonLuis/scripts/

   Este programa foi baseado em um outro feito em basic apresentado na:

   REVISTA GERACAO PROLOGICA Nº 3 - PG. 6 
   publicada em jan/fev de 1984
   CP-200 COMPATIVEL ZX81 - TK-85

   Disponivel em pdf no link abaixo:
   https://datassette.org/revistas/geracao-prologica-informatica-revistas/geracao-prologica-no-3
'''

import random
import os
from time import sleep

def GetLine(posicao):
   global pa, pb, pc
   posicao *= 2

   # abaixo, temos uma sequencia de "nºs mágicos" que, na realidade, de um jeito meio obscuro,
   # formam as linhas verticais, horizontais e diagonais do tabuleiro. Como por exemplo:
   # 591, 132, 258, e assim por diante...
   # Eu poderia fazer de outra forma, mas o meu ojetivo com isto é homenagear 'O CARA' que criou
   # o programinha lá pro CP-200 / TK-85 e que infelizmente não tem o nome divulgado

   # OBSERVAÇÃO: os numeros foram subtraidos em 1 para coincidir com as posições da string que
   # no PYTHON começa em 0
   #z = '59132587963756471'
   z =  '48021476852645360' 

   pa = int(z[posicao + 0])
   pb = int(z[posicao + 1])
   pc = int(z[posicao + 2])
   return board[pa] + board[pb] + board[pc]


def pc_joga():

   for x in (2, 18):
      for n in range(8):
         if GetLine(n) == x:
            if   board[pa] == vazio: pos = pa
            elif board[pb] == vazio: pos = pb
            else:                    pos = pc
            
            board[pos] = 1
            print('%s%s%i%s' % (BLUE, 'Posição Pc: ', (pos+1), RST))
            sleep(2)
            return

   while True:
      pos = random.randint(0, 8)
      if board[pos] == vazio:
         board[pos] = 1
         break

   print('%s%s%i%s' % (BLUE, 'Posição Pc: ', (pos+1), RST))
   sleep(2)
   return


def user_joga():
   while True:
      x = input('%s%s%s' % (GREEN, 'Posição user: ', RST))

      if x in ('q', 'Q', '0'):
         print('Jogo abortado...')
         exit(0)

      try:
         pos = int(x) - 1
         
         if board[pos] != vazio:
            print('Posição já ocupada')

         else :
            board[pos] = 9
            break
      except:
         pass


def display():
   global empate, micro, user
   os.system('clear')
   mk = []
   for i, v in enumerate(board):
      if   v == 0: mk.append('%s%s%s' % (YELLOW, str(i+1), RST))
      elif v == 1: mk.append('%s%s%s' % (BLUE  , 'O'     , RST))
      else:        mk.append('%s%s%s' % (GREEN , 'X'     , RST))

   print('%s%s%i%s' % (WHITE, 'Empate  = ', empate, RST))
   print('%s%s%i%s' % (BLUE , 'Micro   = ', micro , RST))
   print('%s%s%i%s' % (GREEN, 'Usuário = ', user  , RST))
   print()
   print(' %s | %s | %s' % tuple(mk[0:3]))
   print('---+---+---')
   print(' %s | %s | %s' % tuple(mk[3:6]))
   print('---+---+---')
   print(' %s | %s | %s' % tuple(mk[6:9]))
   print()


def verif():
   global empate, micro, user

   for n in range(8):
      if   GetLine(n) == 3:
          print('%s%s%s' % (BLUE, 'O Computador Ganhou', RST))
          micro += 1
          sleep(2)
          return True

      elif GetLine(n) == 27:
          print('%s%s%s' % (GREEN, 'O Usuário Ganhou', RST))
          user += 1
          sleep(2)
          return True

   if not vazio in board:
      print('Empatou...')
      empate += 1
      sleep(2)
      return True

   return False


if __name__ == '__main__':

   # Define variáveis usadas para mostrar cores no terminal
   RST     = '\033[00m'
   GRAY    = '\033[30m'
   RED     = '\033[31m'
   GREEN   = '\033[32m'
   YELLOW  = '\033[33m'
   BLUE    = '\033[34m'
   VIOLET  = '\033[35m'
   VERDAO  = '\033[36m'
   WHITE   = '\033[37m'

   empate = 0
   micro  = 0
   user   = 0
   vazio  = 0

   while True:

      board = [vazio] * 9

      Flag = random.choice([True, False])

      display()

      while True:

         Flag = not Flag

         if Flag: pc_joga()

         else:    user_joga()

         display()

         if verif(): break

      display()
      key = input('Quer jogar de Novo? (S/N)')

      if key not in ('S', 's'):
         break

   print('\nFim de Jogo')


Scripts recomendados

Coquetel

Algoritmo de Dijkstra em Python com visualização em PyGraphviz

Gerador de páginas .html

Fazendo processos rodarem em background

Calcular aproximação de raiz quadrada


  

Comentários
[1] Comentário enviado por SamL em 17/09/2020 - 21:58h

Essa veIA não é caduca. Como assim prometendo dar um tiro em quem entender de basic? Digo, uma da uma bala?
hahah chega de tanto trocadilho ruim por hoje
Bom programa cara, achei interessante.

____________________________________________
https://nerdki.blogspot.com/ acessa aí vai lá, é grátis!
Acesse meu GitHub:
https://github.com/cpusam

[2] Comentário enviado por maurixnovatrento em 19/09/2020 - 11:58h


Gostei do código. Vou usá-lo como ferramenta de estudo.

___________________________________________________________
[code]Conhecimento não se Leva para o Túmulo.
https://github.com/MauricioFerrari-NovaTrento [/code]


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts