본문 바로가기
개발 노트 꾸러미/스파르타 코딩 교육 AI웹 개발노트

AI웹개발 TIL 2주차 화요일 [2021-12-21] Updated

by 괴짜코더 2021. 12. 21.

스파르타 코딩 클럽 AI웹개발 교육 프로그램< Daily Note 2 Weeks Day 2 >

< 2 주차 화요일 >

월요일 프로젝트가 사실 오늘보다 어려웠었다. 문제를 제출해주신 *준태 튜터님의 코드는 매우 직관적이고 알기 쉬웠다 놀라웠다. 코드가 짧으면 프로그램이 코드를 읽기는 빠르고 메모리도 절약하는 부분도 있다고 생각하지만 필자는 코드를 길게 쓰는걸 좋아한다. 나중에 새롭게 수정할수있고 비압축 버전 처럼 활용할수 있는 부분이라고 생각해서이다. 오늘은 우리 조원인 *혜원님이 발표를 한날이다. 교육 프로그램 시작때 부터 꽤나 남다르게 엄청 열심히하고 아는것도 많은 부분이 있었음으로 조원들의 부족한 부분도 채워주고 간단한 줄로 람다를 작성하는 법을 알려주셨다. 배스킨 라빈스 31 프로젝트를 만들면서 인간다운 AI일순 없을까란 생각을 하였다. 사람도 실수를 하는법 대학 시절 즐겼던 '드링크' 게임에선 항상 27다음 28숫자를 부를수있다면 28,29,30이 세 숫자를 쓸수있기 때문에 이겼다고 판단했다. 상대방을 배려해서 28,29 까지 말할순있겠지만 필자는 압도적인 힘으로 눌려지는게 아닌이상, 지는걸 싫어하기에 코드에서와 같이 28이상이면 이겼다고 판단하도록 코드를 작성했다 암묵적으로 상대방이 31이라 선언한것과 동일하기 때문이다. 다음 Baskin Rabins AI 31에서도 유저와 같이 1~3까지 숫자를 랜덤으로 적는데 게임의 마지막 끝나기전 숫자 24,25,26,27 부분에 조건문을 넣어 스스로 판단하는것처럼 보이게 하였다. 물론 랜덤수 출력과 고정값을 입력하여 승률은 거의 50대50으로 나올수있었다. 후에 AI관련 머신러닝을 더욱 습득하게 되면 알파고 처럼 인간이 이길수 없는 프로그램을 작성할수 있지 않을까란 기대감과 영화 터미네이터에 나오는 스카이넷같은 프로그램도 언젠가 한번 만들어 보고싶다 오늘의 핵심은 맨 마지막에 있다 스크롤을 끝까지 했다면 얻어가는부분도 있을것이다.

* 마지막 글은 될수도 있고 안될수도 있고한 부분이라 개발 실력 상승에 대한 염원일뿐이다. 

[ Bot이 1~3에서 랜덤수만 출력하는 Baskin Rabins 31 게임 ]

*  Trun_Swap으로 추가 조건을 추가했다 봇과 유저 사이 승리조건을 구별하기 위한것.

#region BR 31 게임 
import random

Advance = random.randint(0,1)
Turn_Swap = False
# 0이면 봇 선공
if Advance == 0:
    Strike_State = False

elif Advance == 1:
    Strike_State = True

BR_Numbers = []
for x in range(1,32):
    BR_Numbers.append(x)


if Advance == 0:
    Bot_Cal = random.randint(1,3)
    del BR_Numbers[:Bot_Cal]
    # print("나는 라인 20번 봇이 지우고 남은 List :", BR_Numbers)
while True:
    if BR_Numbers.__getitem__(0) >= 28 and Turn_Swap is False:
        print("유저가 승리하였습니다.")
        break
    elif BR_Numbers.__getitem__(0) >= 28 and Turn_Swap is True:
        print("봇이 승리하였습니다.")
        break
    try:
        if Turn_Swap == True:
            Bot_Cal = random.randint(1,3)
            del BR_Numbers[:Bot_Cal]
            #print("나는 라인 26번 봇이 지우고 남은 List :", BR_Numbers)
            Turn_Swap = False
        elif Turn_Swap == False:
            My_Input_Number = int(input(F"{BR_Numbers.__getitem__(0)}에서부터 {BR_Numbers.__getitem__(2)}사이 숫자를 부를수 있습니다. 1 ~ 3키중 하나를 누르세요 : "))
            if My_Input_Number >= 4:
                raise ValueError
            del BR_Numbers[:My_Input_Number]
            Turn_Swap = True
    except ValueError:
        print("4를 초과 하였거나 잘못된 명령입니다.")
        
#endregion

[ Baskin Rabins 약간 머리 굴리는 31 게임 ]

* 게임은 어딘가 항상 헛점이 있기 때문에 어떤 조건문을 내더라도 AI승률은 나중에 하락하기에 이 이상 손을 안댓다

아직 머신러닝을 배우진 않았지만 언젠간 딥마인드[1]의 알파고를 만든 데미스 허사비스같은 사람이 될것이다.

import random

#region BR31 똑똑하지만 인간적인 면모를 보이는 AI 게임

Advance = random.randint(0,1)
Turn_Swap = False
# 0이면 봇 선공
if Advance == 0:
    Strike_State = False

elif Advance == 1:
    Strike_State = True

BR_Numbers = []
for x in range(1,32):
    BR_Numbers.append(x)

if Advance == 0:
    Bot_Cal = random.randint(1,3)
    del BR_Numbers[:Bot_Cal]
    # print("나는 라인 20번 봇이 지우고 남은 List :", BR_Numbers)
while True:
    if BR_Numbers.__getitem__(0) >= 28 and Turn_Swap is False:
        print("유저가 승리하였습니다.")
        break
    elif BR_Numbers.__getitem__(0) >= 28 and Turn_Swap is True:
        print("봇이 승리하였습니다.")
        break
    try:
        if Turn_Swap == True:

            if BR_Numbers.__getitem__(0) >= 24:
                Bot_Cal = random.randint(1, 2)
                del BR_Numbers[:Bot_Cal]
            elif BR_Numbers.__getitem__(0) >= 25:
                Bot_Cal = 2
                del BR_Numbers[:Bot_Cal]
            elif BR_Numbers.__getitem__(0) >= 26:
                Bot_Cal = random.randint(1, 2)
                del BR_Numbers[:Bot_Cal]
            elif BR_Numbers.__getitem__(0) == 27:
                Bot_Cal = 3
                del BR_Numbers[:Bot_Cal]
            else:
                Bot_Cal = random.randint(1, 3)
                del BR_Numbers[:Bot_Cal]
            #print("나는 라인 26번 봇이 지우고 남은 List :", BR_Numbers)
            print(BR_Numbers.__getitem__(0))
            Turn_Swap = False
        elif Turn_Swap == False:
            My_Input_Number = int(input(F"{BR_Numbers.__getitem__(0)}에서부터 {BR_Numbers.__getitem__(2)}사이 숫자를 부를수 있습니다. 1 ~ 3키중 하나를 누르세요 : "))
            if My_Input_Number >= 4:
                raise ValueError
            del BR_Numbers[:My_Input_Number]
            Turn_Swap = True
    except ValueError:
        print("4를 초과 하였거나 잘못된 명령입니다.")

#endregion

 

[ 사실 오늘 핵심은 자바스크립트였다. ]

* 항상 $를 포함한 선언이나 특수기호값들이 같이 붙어있다보면 몇군데 백틱등 한곳이 비어있는 경우가 있었다.. 거기에 코드는 이상이 없지만 참조값또한 가려져 알아보기 힘드니 시간을 버린다 생각했다 그래서 javascript.js 안에 css.css 안에 static에 집어넣어 매크로화 시켜서 사용하니 에러가 날수없고 직관적이여서 재사용성에 좋았다. 

// 이 소스코드는 매번적어야하는 번거로움을 줄여..
// 매크로화 시켰다.javascript.js안에 코드값을 사용하면 문제없이 html안에서 잘돌아간다.
// 인치 폭이 좁은 노트북 유저들에게도 좌우 스크롤 압박을 줄여 좋게 사용될 것이다.

// 클래스 또는 ID 주소와 값을 가져온다.
    // ex) insert_Value('Address','insertvalue')
function insert_Value(Address, insertvalue)
{
    Show_Insert_Val = $(Address).val(insertvalue)
    return Show_Insert_Val
}
// 아직 이건 테스트 안해봤음.
function insert_Blank_Checker()
{
    insert_Value()
    if (insert_Value().value == '')
    {
        alert('빈칸입니다.')
    }
    else
    {
        alert(insert_Value().value)
    }
}
// 주소의 값을 보여준다.
    // ex) show_Value('Address')
function show_Value(Address)
{
    Show_Val = $(Address).show()
    return Show_Val
}
// 주소의 값을 숨긴다.
    // ex) hide_Value('Address')
function hide_Value(Address)
{
    Show_Val = $(Address).hide()
    return Show_Val
}
// 주소의 값을 다른 child로 추가시켜준다.
    // ex) Append_Value('Address')
function Append_Value(Value,add_child)
{
    Append_Val = $(Value).append(add_child)
    return Append_Val
}

 

댓글