[Dernière histoire] Un débutant a essayé Numeron AI avec python

0e 1er 2ème 3e Histoire finale

À propos de cet article

Maintenant que nous avons défini les fonctions principales requises, nous allons les implémenter lentement!

Créer un environnement de combat

Pour le moment, voici un résumé des fonctions créées jusqu'à présent et de la détermination du nombre de joueurs.

import random

def NUMERON(CALL,ANS):
    EAT=0
    BITE=0
    for i in range(3):
        if CALL[i]==ANS[i]:
            EAT+=1
        elif CALL[i] in ANS and CALL[i]!=ANS[i]:
            BITE+=1
    return [EAT,BITE]

def change(a,b,c):
    return [[a,b,c],[a,c,b],[b,a,c],[b,c,a],[c,a,b],[c,b,a]]
ALL=[]
for i in range(0,10):
    for j in range(i+1,10):
        for k in range(j+1,10):
            ALL+=change(i,j,k)

EB=[[3,0],[2,1],[2,0],[1,2],[1,1],[1,0],[0,3],[0,2],[0,1],[0,0]]

def CHECK(CALL,EAT,BITE,KOUHO):
    X=len(KOUHO)
    group=[]
    for i in range(X):
        if NUMERON(CALL,KOUHO[i])==[EAT,BITE]:
            group.append(KOUHO[i])
    return group

def BAD(CALL,KOUHO):
    CHECK_LIST=[0]*10
    for i in range(10):
        EAT=EB[i][0]
        BITE=EB[i][1]
        CHECK_LIST[i]=len(CHECK(CALL,EAT,BITE,KOUHO))
    return max(CHECK_LIST)

def CALL_LIST(KOUHO):
    LIST=[]
    EATLIST=[]
    cnt=1000
    for i in range(720):
        if BAD(ALL[i],KOUHO)<cnt:
            cnt=BAD(ALL[i],KOUHO)
            LIST=[]
            EATLIST=[]
            if len(CHECK(ALL[i],3,0,KOUHO))>=1:
                EATLIST.append(ALL[i])
            else:
                LIST.append(ALL[i])
        elif BAD(ALL[i],KOUHO)==cnt:
            if len(CHECK(ALL[i],3,0,KOUHO))>=1:
                EATLIST.append(ALL[i])
            else:
                LIST.append(ALL[i])
    if len(EATLIST)==0:
        return LIST
    else:
        return EATLIST

NUMBERS=[0,1,2,3,4,5,6,7,8,9]
random.shuffle(NUMBERS)
com=NUMBERS[0:3]

for i in range(10**9):
    print("Entrez votre numéro à 3 chiffres préféré avec tous les numéros différents")
    X=input()
    if len(X) != 3:
        print("Veuillez utiliser 3 chiffres")
    else:
        if int(X[0]) in NUMBERS and int(X[1]) in NUMBERS and int(X[2]) in NUMBERS:
            if X[0] == X[1] or X[0] == X[2] or X[2] == X[3]:
                print("Veuillez saisir les trois chiffres différemment")
            else:
                player=[int(X[0]) , int(X[1]) , int(X[2])]
                break
        else:
            print("Veuillez utiliser un «numéro» à 3 chiffres")

Continuons à écrire le programme.

Gérez votre tour

Le tour est Je vais le gérer avec une variable appelée teban teban = 1: premier tour teban = -1: Ce sera le deuxième tour. Lorsque le tour de chaque tour est terminé, vous pouvez le gérer en le définissant comme turn * -1.

Donc, la suite du programme ci-dessus est la suivante

for i in range(10*9):
   if teban==1:
Traitement au premier tour

Une fois terminé, teban*-1
   else:
Traitement post-tour

Une fois terminé, teban*-1

Par conséquent, le reste est complété en créant le traitement du premier tour (joueur) et le traitement du deuxième tour (com).

Traitement au premier tour

Écrivons concrètement. Mais c'est facile "Entrez le numéro que vous souhaitez appeler ()" Et Afficher "EAT, BITE" C'est tout. Écrivons un peu

        print("C'est un appel de joueur")
        x=input()
        CALL=[int(x[0]),int(x[1]),int(x[2])]
        X=NUMERON(CALL,com)
        print(str(X[0])+"EAT//"+str(X[1])+"BITE")
        if X==[3,0]:
            print("joueur gagne")
            exit()
        teban*=(-1)

C'est bon. Allons après le problème

Traitement post-tour

La grande différence est que le numéro à appeler n'est pas input (). Cependant, comme j'ai défini une fonction qui répertorie les numéros à appeler la dernière fois, il est correct de choisir les numéros Mais comme vous le savez tous, python est lent. Si vous cochez 720 pièces, vous devrez attendre longtemps. Donc je vais juste dire les nombres au hasard pour le premier coup! (Parce que le premier mouvement ne change pas quoi que vous disiez)

Sur cette base, le traitement du deuxième tour est

        if count==0:
            random.shuffle(KOUHO)
            x=KOUHO[0]
            count+=1
        else:
            com_CALL=CALL_LIST(KOUHO)
            random.shuffle(com_CALL)
            x=com_CALL[0]
        print("C'est un appel de com")
        print(x)
        X=NUMERON(x,player)
        KOUHO=CHECK(x,X[0],X[1],KOUHO)
        print(str(X[0])+"EAT//"+str(X[1])+"BITE")
        if X==[3,0]:
            print("com gagner")
            exit()
        else:
            print("restant"+str(len(KOUHO))+"rue")

C'est tout ce qu'on peut en dire! !!

Programme d'achèvement

import random

def NUMERON(CALL,ANS):
    EAT=0
    BITE=0
    for i in range(3):
        if CALL[i]==ANS[i]:
            EAT+=1
        elif CALL[i] in ANS and CALL[i]!=ANS[i]:
            BITE+=1
    return [EAT,BITE]

def change(a,b,c):
    return [[a,b,c],[a,c,b],[b,a,c],[b,c,a],[c,a,b],[c,b,a]]
ALL=[]
for i in range(0,10):
    for j in range(i+1,10):
        for k in range(j+1,10):
            ALL+=change(i,j,k)

EB=[[3,0],[2,1],[2,0],[1,2],[1,1],[1,0],[0,3],[0,2],[0,1],[0,0]]

def CHECK(CALL,EAT,BITE,KOUHO):
    X=len(KOUHO)
    group=[]
    for i in range(X):
        if NUMERON(CALL,KOUHO[i])==[EAT,BITE]:
            group.append(KOUHO[i])
    return group

def BAD(CALL,KOUHO):
    CHECK_LIST=[0]*10
    for i in range(10):
        EAT=EB[i][0]
        BITE=EB[i][1]
        CHECK_LIST[i]=len(CHECK(CALL,EAT,BITE,KOUHO))
    return max(CHECK_LIST)

def CALL_LIST(KOUHO):
    LIST=[]
    EATLIST=[]
    cnt=1000
    for i in range(720):
        if BAD(ALL[i],KOUHO)<cnt:
            cnt=BAD(ALL[i],KOUHO)
            LIST=[]
            EATLIST=[]
            if len(CHECK(ALL[i],3,0,KOUHO))>=1:
                EATLIST.append(ALL[i])
            else:
                LIST.append(ALL[i])
        elif BAD(ALL[i],KOUHO)==cnt:
            if len(CHECK(ALL[i],3,0,KOUHO))>=1:
                EATLIST.append(ALL[i])
            else:
                LIST.append(ALL[i])
    if len(EATLIST)==0:
        return LIST
    else:
        return EATLIST

NUMBERS=[0,1,2,3,4,5,6,7,8,9]
random.shuffle(NUMBERS)
com=NUMBERS[0:3]

for i in range(10**9):
    print("Entrez votre numéro à 3 chiffres préféré avec tous les numéros différents")
    X=input()
    if len(X) != 3:
        print("Veuillez utiliser 3 chiffres")
    else:
        if int(X[0]) in NUMBERS and int(X[1]) in NUMBERS and int(X[2]) in NUMBERS:
            if X[0] == X[1] or X[0] == X[2] or X[1] == X[2]:
                print("Veuillez saisir les trois chiffres différemment")
            else:
                player=[int(X[0]) , int(X[1]) , int(X[2])]
                break
        else:
            print("Veuillez utiliser un «numéro» à 3 chiffres")
teban=1
KOUHO=ALL
count=0
for i in range(10**9):
    if teban==1:
        print("C'est un appel de joueur")
        x=input()
        CALL=[int(x[0]),int(x[1]),int(x[2])]
        X=NUMERON(CALL,com)
        print(str(X[0])+"EAT//"+str(X[1])+"BITE")
        if X==[3,0]:
            print("joueur gagne")
            exit()
        teban*=(-1)
    else:
        if count==0:
            random.shuffle(KOUHO)
            x=KOUHO[0]
            count+=1
        else:
            com_CALL=CALL_LIST(KOUHO)
            random.shuffle(com_CALL)
            x=com_CALL[0]
        print("C'est un appel de com")
        print(x)
        X=NUMERON(x,player)
        KOUHO=CHECK(x,X[0],X[1],KOUHO)
        print(str(X[0])+"EAT//"+str(X[1])+"BITE")
        if X==[3,0]:
            print("com gagner")
            exit()
        else:
            print("restant"+str(len(KOUHO))+"rue")
        teban*=(-1)

Jouons un peu!

Jouons un peu

#Entrez votre numéro à 3 chiffres préféré avec tous les numéros différents
017

Et c'est au tour de l'appel

#C'est un appel de joueur
012
#1EAT//0BITE
#C'est un appel de com
#[2, 7, 3]
#0EAT//1BITE
#252 rues restantes

Je suis 1-0, donc ça devrait être supérieur à com. Aller au 034

#C'est un appel de joueur
034
#0EAT//0BITE
#C'est un appel de com
#[5, 3, 7]
#1EAT//0BITE
#72 voies à gauche

034 est 0-0. En d'autres termes, c'est x1y ou xy2 et 0,3,4 n'est pas utilisé. L'autre partie se réduit à 72 façons, vous ne pouvez donc pas être alerte Aller au 567

#C'est un appel de joueur
567
#0EAT//1BITE
#C'est un appel de com
#[0, 6, 7]
#2EAT//0BITE
#8 voies à gauche

Ne jouez pas avec les 8 méthodes restantes () Pour résumer les informations 1,2 5,6,7 8,9 Un est utilisé de chaque ... Allez voir le chien au 618.

#C'est un appel de joueur
618
#2EAT//0BITE
#C'est un appel de com
#[0, 4, 1]
#1EAT//1BITE
#1 voie à gauche

Il semble que vous puissiez frapper l'adversaire au prochain tour () Cependant, je suis aussi dans les virages. Si 6 et 8 sont EAT, une contradiction se produira, donc EAT de 1 est confirmé. En d'autres termes, il y a deux choix, 619 ou 718 (probablement) Passer par 718

#C'est un appel de joueur
718
#3EAT//0BITE
#joueur gagne

Oh, j'ai gagné. (Je peux gagner)

Eh bien, je suis heureux que cela fonctionne tel quel> <

finalement

C'était la première fois que je créais de l'IA (est-ce correct de dire IA? Je ne comprends pas bien les termes techniques), mais c'était plutôt bien. J'en suis satisfait car je peux le deviner 6 fois. Je pensais que si je faisais de mon mieux, même pendant un mois d'histoire de programme, je serais capable de faire quelque chose à ce sujet.

Tâche

Cependant, le deuxième appel est de toute façon lent. Si le premier coup est 0-1, il y a 252 candidats, donc Lorsque vous pensez à votre prochain mouvement, vous effectuez 720 * 10 * 252 = 1814400 calculs en interne. Désormais, mon objectif est d'étudier de nombreux algorithmes et de réduire la quantité de calcul. À ce rythme, l'IA à 4 chiffres sera difficile ...

Résumé

Merci d'avoir parcouru jusqu'à présent. J'étais convaincu que je pouvais exécuter le programme jusqu'à la fin même s'il n'était pas connecté. Cependant, j'aimerais devenir plus fort dans le programme, alors j'apprécierais que vous me donniez un commentaire avec l'amour des conseils et des encouragements.

Merci pour votre relation! !!

Recommended Posts

[Dernière histoire] Un débutant a essayé Numeron AI avec python
[Épisode 2] Les débutants ont essayé Numeron AI avec python
[Épisode 0] Un débutant a essayé Numeron AI avec python
[Épisode 1] Un débutant a essayé Numeron AI avec python
3. 3. Programmation IA avec Python
J'ai essayé fp-growth avec python
J'ai essayé de gratter avec Python
Créez Puyopuyo AI avec Python
Histoire de trébucher avec le tableau Python
J'ai essayé gRPC avec Python
J'ai essayé de gratter avec du python
[IPdb] Les débutants en développement Web ont tenté de résumer le débogage avec Python
J'ai essayé webScraping avec python.
[Petite histoire] Obtenez l'horodatage avec Python
J'ai essayé d'exécuter prolog avec python 3.8.2.
les débutants en python ont essayé de le découvrir
J'ai essayé la communication SMTP avec Python
J'ai essayé de résoudre l'édition du débutant du livre des fourmis avec python
[Pandas] J'ai essayé d'analyser les données de ventes avec Python [Pour les débutants]
INSÉRER dans MySQL avec Python [Pour les débutants]
J'ai essayé le rendu non réaliste avec Python + opencv
J'ai essayé un langage fonctionnel avec Python
J'ai essayé la récurrence avec Python ② (séquence de nombres Fibonatch)
[Python] Lire des images avec OpenCV (pour les débutants)
Création WebApi avec Python (création CRUD) Pour les débutants
Comment les débutants en Python commencent avec Progete
Construction d'environnement AI / Machine Learning avec Python
J'ai refactoré "J'ai essayé de faire d'Othello AI lorsque les débutants en programmation ont étudié python"
[Pour les débutants] Essayez le web scraping avec Python
# J'ai essayé quelque chose comme Vlookup avec Python # 2
Un débutant en apprentissage automatique a essayé de créer un modèle de prédiction de courses de chevaux avec python
J'ai essayé de prédire l'année prochaine avec l'IA
J'ai essayé des centaines de millions de SQLite avec python
Raisonnement causal et recherche causale par Python (pour les débutants)
J'ai essayé de "différencier" l'image avec Python + OpenCV
[Python3] Une histoire bloquée avec la conversion du fuseau horaire
Un débutant en Python a essayé de coder une boisson énergisante
J'ai essayé L-Chika avec Razpai 4 (édition Python)
J'ai essayé la différenciation jacobienne et partielle avec python
J'ai essayé d'obtenir des données CloudWatch avec Python
J'ai essayé d'utiliser mecab avec python2.7, ruby2.3, php7
~ Conseils pour les débutants de Python donnés avec amour par Pythonista ① ~
J'ai essayé la synthèse de fonctions et le curry avec python
Une histoire sur la gestion des données binaires en Python
J'ai essayé de sortir LLVM IR avec Python
J'ai essayé de "binariser" l'image avec Python + OpenCV
J'ai essayé d'exécuter faiss avec python, Go, Rust
J'ai essayé d'automatiser la fabrication des sushis avec python
[Petite histoire] Tester la génération d'images avec Python / OpenCV
Débutants en Python accro à Django
J'ai essayé d'exécuter Deep Floor Plan avec Python 3.6.10.
J'ai essayé d'envoyer un email avec SendGrid + Python
~ Conseils pour les débutants de Python donnés avec amour par Pythonista ② ~
[Introduction pour les débutants] Manipuler MySQL avec Python
Histoire de base de l'héritage en Python (pour les débutants)
FizzBuzz en Python3
Grattage avec Python