음 0.2 버젼 때 이후로 다른 것을 간간히 하면서 약간씩 수정을 해봤습니다. 굳이 이 것을 100% 잘돌아가게 하여 승률이 100%에 달하게 만든다는 것에 흥미가 없다보니 정체가 될 수 밖에 없는 군요. 그리하여 0.6 버젼에서 업그레이드는 무기한 연기를 예정해보려 합니다. 사실 스피드 15레벨 까지 도달하는 것을 나름대로 달성했기 때문이랄까요.
위 동영상은 0.6 버젼의 프로그램을 가지고 테스트한 동영상 입니다. 0.2 버젼의 동영상과 비교하면 확실히 엄청난 차이가 있음을 알 수 있습니다. 하지만 거의 95% 정상적으로 작동하는 프로그램인데 동영상을 찍다 보니 한게임 테트리스 프로세스의 처리가 늦어서 인지 키가 몇개 먹는 동영상이 보입니다. 사실 키를 먹는 것은 거의 다 수정을 했거든요^^; 그런데 동영상을 찍을 때만 저렇게 잘못 놓는 다는 것이 꽤 많다는 것은 원인을 그 쪽으로 돌릴 수 밖에 없을 것 같네요.
위 0.3 버젼과 비교를 해보시기 바랍니다.^^. 그럼 이 것을 마지막으로 자동테트리스에 대한 포스팅을 할 일은 없을 것 같습니다. 게임 트리적인 부분이 A.I 쪽을 간단하게 구현을 하면 그다지 복잡하지도 않고 대 부분 같기 때문이죠^^. 그럼 다들 즐거운 한게임 테트리스 하시길 바래요^^. 마지막으로 댓글로 공개를 요청하셔도 공개할 일은 없습니다.
일단 저는 게임가드가 없을 때 했다는 것을 알려드립니다. 지금은 모르겠네요.. 게임가드 같은 것에 대해서 일반적으로 어느정도 잘 알려진 Win32 API 들은 실행이 됨과 동시에 막히게 됩니다. 물론 Native API도 일정 어느 부분은 막히는 것으로 알 고 있구요.
저도 정확히 관계를 추론할 수는 없지만 잉카인터넷이 MS에서 제공하는 모든 부분을 알고 있다면 모든 부분에서 막을 수도 있겠지만, 경우에 따라서 막지 못하는 부분과 다 알지 못하기에 막을 수 없는 부분, 그리고 어디서나 100% 안전이란 없기에 존재하는 취약점이라는 것을 이용하면 뚫을 수야 있겠죠.
그래서 굳이 막지 못한것이라고 해서 실망할 필요는 없습니다. 왜냐면 창과 방패가 있다고 한다면 창이 우세할 수 밖에 없으니까요. 굳이 예를 든다면 집에 보안이 철저한 문을 세워놓는다고나 할까요. 그게 없다면 그냥 도둑이 드나들겠지만 있다면 시간도 지체 되고 이런 저런 방법을 사용하게 되겠죠^^.
최근 집으로 돌아오는 길마다 무엇을 만들어야 할까? 이렇게 시간을 보내지 말고 무엇이라도 하나 만들어야 할텐데 라는 생각이 머릿속을 지배하더군요. 그런 와중에 저번주 수요일 집으로 돌아와서 한게임 테트리스 소식을 듣고 실행한 순간 갑자기 생각나는게 있었습니다.
그 것은 바로 "한게임 테트리스 오토" 였죠. 물론 게임 시장에 있어서 일반적으로 퍼져있는 오토에 대한 인식만을 생각한다면 제작을 고심하여 생각해보아야 했지만, 타 프로그램같이 일반인에 공개를 하지 않고, 개인용 연습목적으로 제작해본다면 어떨까 하는 생각이 들었습니다. 연습하고싶은 부분은 이미지 처리와 테트리스 AI 부분이었죠. 다른 부분이야 일반적으로 사용되는 C++ 언어를 사용하기 떄문에 별 다른 부분이 없었습니다. 그래서 수요일부터 일요일까지 바짝 달린결과 어느정도 썩 괜찮은 결과물이 나오더군요. 하지만 아직 에러가 많습니다ㅜㅜ
결과는 위 동영상과 동일합니다. 썩 그렇게 좋은 AI가 아님에도 불구하고 50여초 동안은 생존하더군요. 그래도 갓 키보드 입력을 받아들였을때인 0.1 버젼에 비하면 엄청 오래 살고 있는거랍니다. 그 때는 한 5초면 죽었으니까요. 동영상을 자세히 보시면 간간히 부분부분 마다 놓지 말아야할 곳을 실수로 컴퓨터가 놓고 있습니다. 아마 이것은 프로그램 내부의 입력키 생성 부분에서의 버그이거나 키보드 입력이 먹어버리는 경우가 아닐까 라고 생각하고 있습니다. Log를 남기면서 확인 중이니 곧 잡히리라 생각합니다.^^.
약간 개량해보니 더 오래 사는군요^^;;
개인적으로 이 프로그램을 만들면서 비록 한게임 테트리스에 붙어서 동작하는 거라지만 나름대로 테트리스 AI에 대해서 어느정도 공부를 해본것 같네요. 아직 계산하는 요소가 2가지 밖에 되질 않아 8가지 정도 더 추가하면 90% 정도의 AI가 나오지 않을까 기대해봅니다.
추가로 40줄 빨리 없애기 모드 도전해보니 어느정도 잘 나오는군요;; 저도 깜짝 놀랬습니다.
음 일단 진행 됬던건.. BIOS가 처음 POST 과정을 끝내고 BIOS에서 지정된 순서로 부팅 디스크를 검색하여 Magic Sign에 해당하는 첫 번째 디스크의 첫 번째 섹터를 7C00h 번지로 올려준다는 것을 전제로 간단한 Hellow World 출력까지 진행했었기에, 어제 자기전까지 섹터 읽는 것을 구현을 해봤죠. 뭐 그다지 복잡한 것은 아니지만 괜히 삽질하고 있었더군요.
일단 예전과는 다르게 PrintPoint로 EntryPoint를 변경한 뒤, 512바이트 뒤로 명령어 데이터를 옮겼습니다. 왜 이렇게 했냐하면 플로피디스크에서야 잘 모르겠지만 나중에 하드디스크 MBR에 이미지를 Write하여 부팅을 하려고 할 때, 파티션 데이터에 대한 처리를 쉽게 허용하기 위해서 였죠. 기본적으로 한 섹터는 512바이트이기 때문에, 첫 번째 512바이트는 7C00h번지로 올라가게 되고, 512 바이트 뒤의 데이터는 플로피 같은 디스크 매체에 그대로 남아있게 됩니다. 별도의 로딩과정이 존재하지 않게 되죠. 하지만 512바이트로는 뭐 콩을 구워먹을래도 할 수 있는 일이 없기 때문에 디스크 매체에서 데이터를 읽어들여야 합니다. 그래서 INT13H의 02H인터럽트를 통하여 2번째 섹터를 읽어 7C00h + 512바이트 주소인 7E00h번지로 로딩을 하게 설정합니다. 기본적인 인자값은 위키피디아에 존재하므로 그 부분을 감안하여 본 뒤 작성하시면 됩니다. 맨 처음 [ORG 7C00h]라는 Directive로 해당 명령어의 시작 지점이 7C00h라는 것을 알려주었기 때문에 생성되는 Label 및 변수에 대해서 주소값은 7C00h를 상대값으로 가지게 됩니다. 결국 컨트롤이 쉽게 된달까요. 뭐 어찌되었던 512바이트 이후에 예전에 작성했던 코드를 밀어넣고 INT13H를 호출한 후 해당 메모리 주소로 점프를 합니다. 그럼 섹터가 로딩되기 전엔 쓰레기 값이 들어있었을 메모리에 제대로 된 명령어들이 들어있게 되고, 출력 명령어를 잘 수행하게 되죠. 다만 여기서 중요한 것은 02H에 해당하는 Sector Address는 1이 MBR이고 2가 두 번째 섹터더군요. 너무나 인덱스에서 0에 익숙해져 있는 관계로 1을 적었다가 왜 안되지 했었습니다.
별개로 이 것은 위키피디아를 읽다가 42H에 해당하는 기능이 읽어보니 훨씬 좋은 기능을 지원하길래 혹시나 하고 작성해봤던 코드입니다. 액세스할 수 있는 주소가 엄청 크기 때문에 원하는 곳을 모두 액세스 할 수 있었는데, 어제 테스트해본 결과론 죽어라 해도 안되더군요. 결국 오늘 까마구 횽님과 대화하다가 다른 문서에서도 플로피에 대한 언급이 없었다고, 이 것은 아무래도 하드디스크에서만 지원하는 것 같다는 결론을 얻게 되었습니다. 그럼 오늘은 시간이 될 지는 모르겠습니다만 GDT, IDT, LDT에 대해서 자료를 보고 한 번 설정을 해봐야 겠군요^^. 뭐 어떻게 될지는 잘 모르겠지만 잘 되리라 믿습니다.
그냥 무턱대고 삽질을 감수한 뒤에 맹글어본 간단한 부트로더 입니다. 친구이름을 찍어서 스샷을 보내주느라 문자열이 DongWoo Kerenl이 되어버렸군요. OS제작을 위해서 예전에 잡다하게 모아두었던 자료에서 필요한 자료를 빼내 썼습니다. 처음에 MASM으로 만들려고 했는데, link가 없어서 그런건지 약간 이상하여 그냥 맘편하게 nasm으로 만들었습니다.
그렇게 복잡한 것은 아니라는 사실을 알 수 있습니다. 다만 그냥 문자열 출력만 되게 만들어 놔서 Loading 라벨에서 계속 Hang up상태의 무한 루프를 돌고 있다는 것을 알 수 있지요. 여기서 문자열 혹은 .문자를 출력하며 하드디스크 인터럽트로 읽어가며 메인 커널 데이터를 읽어오면 될 것 같습니다. 오늘 빨리 퇴근한 김에 해보려고 하는데 잘 될지 모르겠군요^^. 다 알고 시작하는 늦은 것에 너무 지치기도 하여 그냥 무작정 달려들긴 했지만 앞이 조금 불투명 하긴 하군요. 그래도 나름 잘 되리라 생각합니다.
Com개체를 이용한 프로그래밍을 하다보면 Com Control을 이용하게 될 수도 있습니다. 바로 지금 보고 계시는 IE조차도 Com으로 이루어진 Browser Com 입니다. IE라는 것이 뭐 기능적으로 추가를 시켜 실제로 보는 익스플로어가 되는 것이죠. 그래서 웹마 같은 IE기반의 웹 브라우저가 나올 수 있는 까닭이 이 때문입니다. 그런데 Control을 보면 예를 들어서 어떠한 이벤트가 끝났을 때 해당 클라이언트에 링크된 함수를 호출시켜주는 경우가 있죠. 컨트롤이 다 그려졌을 때, 뭐 대충 이런것이라고 할까요? 이 부분을 정리해보기로 했습니다.
일단 ATL 프로젝트를 시작하여 프로젝트를 만든 다음 Control Class 를 추가할 때 Options에서 필수적으로 Connection Points를 체크해야 합니다. 이 것을 해야 이벤트를 구현할 수 있습니다.
Interface, Apperance, Stock Properties같은 부분에서 설정할 부분은 모두 다 설정한 뒤, "Finish" 혹은 "마침" 버튼을 눌러 해당 컨트롤을 생성하는 과정을 마칩니다. 그럼 Class View에 해당 Control에 대한 클래스와 Event에 해당하는 클래스가 생성됩니다. 그럼 이 Event에 해당하는 Interface에 메소드를 추가해야 합니다.
겉으로는 드러나지 않고 TEventLib 안으로 한 레벨 들어가면 _ITestControlEvents 라고 있습니다. 여기서 마우스 오른쪽 버튼을 누른 뒤, Add Method를 선택하여 기존 Com Class에 Method를 추가하듯이 해당 메소를 추가합니다. 다만 여기서 하나 생각해줘야 할 점은 Event 라는 것이 해당 Com Control이 클라이언트에게 호출 하는 것이다보니 [in]파라메터로 넘기는게 좋다는 것이죠. 그럼 일단 파라메터가 없는 빈 AfterDraw이벤트를 추가해보도록 하겠습니다. 그런 다음 CTestControl 에서 마우스 오른쪽 버튼을 눌러 Add Connection Point를 선택합니다. 그 후엔 당연히 _ITestControlEvents를 선택하시면 됩니다. 혹시 CProxy_ITestControlEvents를 더블클릭하여 해당 소스를 봤는데 아무런 차이가 나지 않고 "Fire_메소드명" 이 보이지 않는다면 한 번 빌드를 하신 뒤 다시 해보시기 바랍니다. 만약 제대로 된다면 다음과 같은 소스가 추가됩니다.
이렇게 생성이 된 메소드를 어떻게 호출을 하냐면 일단 목표가 Control이 다 그려지고 난 후에 호출하자고 정했으니 CTestControl 부분의 소스로 건너갑니다. 그 다음 소스를 아래로 주욱 내리시면 OnDraw라는 함수가 보이실 겁니다. 빙고@0@. 드디어 찾았습니다. 그럼 삽입을 해야 겠죠?
단 한 줄 이지만 무지 중요합니다 ㅠㅠ. 이 것을 추가하지 않는다면 제대로 작동하지 않죠~. 추가도 되었으니 이제 소스를 빌드하고 regsvr32 로 등록을 합니다. 그런 다음 C#에서 이제 테스트를 해보는 겁니다. @0@ 컨트롤을 추가하니 AfterDraw 이벤트가 보이는군요!! 당장 추가하고 메시지 박스를 띄워봅니다.
실행을 하면 메시지 박스가 하나 띄워집니다. 그리고 컨트롤을 살짝 가렸다가 다시 보여주니 메시지 박스가 띄워지는 군요^^. 이벤트 방식으로 컨트롤이나 소스를 처리하는 방식도 있는데, 이를 이용하면 아주 유용하게 사용할 수 있을듯 합니다. 한 번 시도해보시는건 어떨까요??
댓글을 달아 주세요
키 먹는다는 거는 동영상 탓?!
그럼 컴터 성능이 안좋다는거네 ㄲㄲ
헐.. 나의 초 특급 고 사양이라고 하기엔 쿼드가 아닌 내 컴으로 안되는건 어쩔 수 없어!!
사실 뭐 그래픽 처리 한다고 어쩔 수 없겠찌 ㅋㅋ
ai좀 주실수없나요 ?
아.. 코드를 바로 드리는것은 좀 그렇구요..
AI의 기본적인 구조는 알려드릴 수 있습니다. 기본 구조는 블럭이 하단 부터 쌓이니 현재 쌓을 블럭의 Y위치를 맨 밑에서 부터 쌓을 수 있는 블럭 위치를 X 위치 하나마다 판별합니다.
그럼 결국 하나의 블럭에 대한 경우의 수는 (가로칸 - 블럭의 가로길이) * 블럭 회전가능수 가 되겠죠. 그렇게 각각의 경우의 수에 대해서 블럭의 높이, 모양에 대해서 점수를 판별합니다.
그 점수의 계산이 끝나면 해당 점수가 가장 높은쪽의 상태를 택하면 블럭이 쌓여야 될 곳의 위치가 결정될겁니다. 그 후의 처리는 ^^; 아시는대로 ..
언뜻 봤더니 게임가드가 붙어있는것 같던데
키입력 메시지는 별다른 우회 없이 작동하던가요?
음.. 엔플텍이 붙어있는것 같지는 않네요^^;
제가 마지막으로 플레이한 것이 2~3주 전인지라 지금은 바뀌었을지도 모르겠습니다. 답은 예전엔 가능했습니다.
저기요 엔프로텍트 뚫는방법아시나요 그리구
이런프로그램 어케만드는지 자세히 설명좀 해주세요
이메일로 보내주세요 ssg1423@naver.com
부탁합니다 엔진 사용 같은 거 등등 버그들
C언어로 만든 프로그램이 게임가드에걸리면 프로그래머는 게임을 접어야하는 상황인겅미?
프로그램을 만드는 것은 어떠한 방법으로 처리를 하던간에 조건에 의한 자료를 제작하고 자료를 바탕으로 처리로직을 만드는 것입니다. 프로그래밍에 대해서 알고 계시면 단순히 Hello world 가 아닌 여러가지 기술이 섞여 있다고 생각하시면 됩니다.
그럼 없는건가요?
엔프좀뚫어보시징
안녕하세요 ^^
웹서칭을 하다가 우연히 검색결과에서 보고 찾아왔는데
오토 테트리스라니 신기하네요
화면의 이미지를 얻어온다거나 명백히 키보드로 부터 들어온 입력이 아닌것에 대해서 게임에 붙어있는 핵쉴드나 게임가드 같은것에 진단이 되지 안나요?
막지못한 것에 대한 실망이랄까? 그리고 호기심에 질문드려봅니다
일단 저는 게임가드가 없을 때 했다는 것을 알려드립니다. 지금은 모르겠네요.. 게임가드 같은 것에 대해서 일반적으로 어느정도 잘 알려진 Win32 API 들은 실행이 됨과 동시에 막히게 됩니다. 물론 Native API도 일정 어느 부분은 막히는 것으로 알 고 있구요.
저도 정확히 관계를 추론할 수는 없지만 잉카인터넷이 MS에서 제공하는 모든 부분을 알고 있다면 모든 부분에서 막을 수도 있겠지만, 경우에 따라서 막지 못하는 부분과 다 알지 못하기에 막을 수 없는 부분, 그리고 어디서나 100% 안전이란 없기에 존재하는 취약점이라는 것을 이용하면 뚫을 수야 있겠죠.
그래서 굳이 막지 못한것이라고 해서 실망할 필요는 없습니다. 왜냐면 창과 방패가 있다고 한다면 창이 우세할 수 밖에 없으니까요. 굳이 예를 든다면 집에 보안이 철저한 문을 세워놓는다고나 할까요. 그게 없다면 그냥 도둑이 드나들겠지만 있다면 시간도 지체 되고 이런 저런 방법을 사용하게 되겠죠^^.
부탁인데요 얍카라는게임에 버그좀 만들어주세요
버그가 게임가드때문에 막혀버렷음
그리구 게임가드뚫는방법좀 알려주시구요
급해요
전 할줄아는게 만들어놓은 파일 받아서 설명서보고
따라하는것뿐임
엔진이나 버그좀 만들어주삼
음.. 게임에 대해서 따로 일부러 오토 같은것을 만드는 짓은 하지 않습니다. 그냥그저 좋아하는 게임을 하다보니 궁금한 것도 있고 프로그래밍 적으로 궁금한 게 있어서 한 것일 뿐이죠..
그리고 중요한 것은 그런 것을 만든다고 하여도 공개하지는 않습니다.
어떻게 그렇게 컴퓨터를 잘하죵?
제가 잘하는 편은 아닙니다..
잘하는 사람들은 세상에 많죠..
저기요 얍카라는게임에 게임가드가 설치됏는데 어떻게 복사버그가
가능한거죠~~ 여러 가지 고가 템들이 막늘어나는것같은데
그건 어떻게하는방법이죠?
글쎄요 그건 게임 만든 루틴을 조작하는 건데 그것은 게임을 뜯어본 사람만이 알겠죠.. 그리고 게임도 하나의 프로그램이고 프로그램마다, 경우에 따라 해석방법을 다 각기 달리해야 되니 정석적인 방법이 있는 것도 아니구요..
어쨋든 중요한 것은 얘기하시는 버그나 핵은 취약점을 이용하는 것 뿐이라는 겁니다. 취약점은 단순히 컴퓨터를 할 줄 안다가 아니라 구조적인 원리까지 알면서 해야 되는거니 단순 설명으로는 끝나지 않겠죠.
오토프로그램으로 40라인 39등.....
난 손으로 150등 겨우찍었는데... 난감 - _ -
하하^^;;
사실 특정목적만을 위해서 만들어진 것에는 범용적인 것이 당해낼 재간이 없듯이 프로그램은 빠르긴 하지만 사람이 할 수 있는 것은 못합니다^^;
그래도 한게임 테트리스를 플레이 하지 않은지 꽤 오래고, 일단 프로그램 자체의 배포는 하지 않았으니 제 프로그램에 의한 게임 랭킹 문제는 생각하지 않으셔도 될거 같네요.. 다만 타 프로그램이 있다면 모르겠지만요..
귀차니스트님 =_=
작대기 의 고유 코드를 알수있을까요 ?
파란색 긴막대기의 그 막대기 1개만의 코드요 .
고유코드라고 하시면 어떤 것을 말씀하시는건지..
게임 자체 메모리에서 빼내온것이 아니라 영상처리를 한 것이기 때문에 블럭 하나에 대한 코드는 제가 붙이기 나름이었습니다. 물론 원하는 것에 따라 또 다른 코드를 설정할 수도 있었구요.
그래서 고유라는것은 있을 리가^^;
관리자만 볼 수 있는 댓글입니다.
^^; 그러셨군요.. 사실 동영상을 찍지 않았다면 3배 정도는 더 빠른데 동영상 때문에 적절히 맞춰봤습니다. 그런데 그렇게 해도 힘들것 같더군요..