[나눔] Ver.4 - 당첨자발표
페이지 정보
작성자 Nalo (218.♡.13.82) 작성일 조회22회 댓글0건관련링크
본문
안녕하세요. 랜덤 이름 추첨기 #코드_개발 의 깊이보다는 재밌어 보이면 두서없이 이것저것 만들어보고 있는 코딩계의 팔랑귀(?) 코딩 읽어주는 아재 깡입니다. ^^;(사용자 유용성이 높아서 더더 기능좋게 만들어 보고 싶은 것이 나올때까지 계속 여러가지 코드들을 만들어 보게 될 것 같습니다. 파이썬 코딩 초심자 분들이 코딩을 시작해보기에는 더 좋은 기본예제들이 될 것 도 같숩니다만... -.-;그래도 너무 시작만 하기보단 계속 유용해질 수 있도록 코드들 업그레이드도 해보겠습니다. ^^)오늘은 그간 만들어온 추첨 숫자의 #당첨확률 을 높인(?) Al로또명당 코드와는 다르게 더 직관적이고 단순한 #기계식_로또_추첨기 #파이썬 코드를 만들어 보려 합니다. 기본 파이썬 코딩을 활용하고 #그래픽 을 위해 #pygame 파이썬 #그래픽_게임_모듈 을 활용할 예정입니다. 차차 기능을 업그레이드 하겠습니다만 오늘은 아주 간단하게 화면에 로또공 45개를 그리고 랜덤하게 움직이는 것을 구현해 봅니다. 코딩 배우시는 분들 중에 #그래픽_게임 만들기 해보고 싶어하시는 분들도 많을 것으로 생각합니다. 오늘 코드가 웹에 올라와있는 가장 기본적인 게임 그래픽 기초 예제라고 생각하시고 자알~ 학습해 두시면 좋을 듯 랜덤 이름 추첨기 합니다. 컴퓨터 화면에 내가 원하는 그래픽 객체 하나를 그리고 그 객체를 움직일 수 있으면 단계단계 여러가지 객체들을 추가하여 재미난 게임을 구현해 보실 수 있습니다. 본 예제도 1차적으로는 로또볼 추첨기로 개발하지만 pygame 그래픽 모듈도 잘 다루게 되면 최근 출시된 #닌텐도 ( #Nintendo) #스위치 의 #51_Worldwide_Games 에 들어있는 간단한 룰의 게임들도 직접 코딩해 볼 수 있을 꺼라 생각합니다. (물론 닌텐도 게임만큼 화려한 그래픽, 네트웍 대전 등등의 기능은 또 더 많은 코딩공부가 필요하겠습니다만... ^^)오늘 코드의 최종 결과는 아래와 같습니다. 검은 화면에 #로또공 과 색깔을 맞춘 45개의 공이 랜덤하게 윈도박스 안에서 움직이게 됩니다. 벽면에 충돌하면 거울반사하듯 반사되는 정도만 구현되어 있습니다. 잘 보시면 공에 번호도 써있지 않고, 공들간 #물리적_충돌, 추첨을 위한 탈출구(?) 등등도 전혀 설계되어 있지 않습니다. 말그대로 화면에 여러개 공이 움직인다 끄읏~ 인 단순한 코드입니다. 그러나 말씀드렸듯이 그래픽 게임 구현에 가장 기본이되는 중요한 코드이기도 합니다. 구글링 해보시면 위 랜덤 이름 추첨기 multi-ball moving, bouncing 관련 여러 언어 버전의 코드들이 공유되고 있는 것을 알 수 있습니다. 더 복잡하고 재밌는 룰을 넣은 코드들은 차차 개발하면 되며 그 전에 아래 기능 코드를 완전히 내 것으로 소화하고 있어야 합니다. (그만큼 본 코드가 게임 그래픽 구현에 기초가 되는 코드라고 다시 한번 강조드립니다. ^^)0. 화면에 원을 그리고 움직이는 간단한 기능이지만 보다 코드를 효율적으로 짜기 위해 구글링을 통해 최대한 이해하기 쉽고 간결하게 짠 코드들을 찾아봅니다. 코딩아재는 아래싸이트에서 코드를 보고 코드 수정을 해보았습니다. 코딩 세계에서는 실력이 좋아도 혼자서 모든 것을 다 짜려고 하시는 것보다 잘 짜놓은 고수분들의 기본 코드를 활용하여 보다 의미있게 만드시는 것을 추천드립니다. 그러는 과정에서 고수분들의 기술 (know-how)도 습득되어 학습이 많이 되는 것 같습니다. ^^ (아래 예제의 경우 길이도 짧고 주석이 잘 달려있어 학습하시기 좋습니다.)1. 코드 개발에 필요한 random과 pygame 모듈을 import 해줍니다. 임의 위치에서 공을 생성시키는 것과 공의 이동 변위를 랜덤 이름 추첨기 만들때 임의적으로 change_x, change_y 값을 주기 위해 #random 모듈을 활용합니다.2. 코드 전범위에서 사용할 전역변수 (global_variable)도 선언해 줍니다. 그냥 공이 아닌 로또공 이므로 색을 맞추기 위해 필요한 색 변수도 설정합니다. 로또공의 (R,G,B) 색을 #그림판 스포이드 툴로 직접 추출하셔도 좋고 비슷해 보이는 색으로 맞추어 사용하셔도 됩니다. 화면용 스크린 싸이즈, 실제 사용할 로또공 크기, 공 개수도 전역변수로 선언해 줍니다. 3. 이제 Ball class를 선언해 줍니다. 동일한 성격의 #객체 (코드에서는 45개의 로또공)들을 만들어 사용할 때 #클래스 ( #class) 를 정의하여 사용하면 매우 편리합니다. 보통 코딩시 class를 만드는 것을 잘 안쓰시는데, 코드 개발의 효율성을 생각하면 매우 적극적으로 사용하면 좋습니다. (코딩아재도 C언어부터 배워 class, #구조체 ( #struct) 쓰는 것이 체득화되어 있진 못합니다. 그러나 코드 설계할때 정말 꼭 필요하다는 것을 매번 느낍니다. -.-;;) 오늘 코드 에서도 로또공을 1개가 아니라 여러개 만들 것이고 이 로또공 class는 자기의 (x, y) 좌표 변수와 번호에 랜덤 이름 추첨기 따라 색 (color) 변수를 갖고 또 자신의 움직임 (delta_x, delta_y, 극좌표에서 속도와 각으로도 표시 가능)의 변위값 변수를 모두 가지고 있게 만들고, 사용자는 이 Ball class의 구현예인 #실체 ( #instance) ball1, ball2 를 ball1 㶺ll() 하는 식으로 만들어서 사용하면 됩니다. 개념적으로 로또공 클래스의 객체가 가지고 있어야 할 변수 데이터들과 이 클래스의 동작들 ( #method, #메쏘드_함수)을 모두 class 안에 정의해 놓으면 ball1 객체가 매우 똑똑해져서 코딩이 매우 쉬워지는 원리입니다. (후반부에 어떻게 Ball class가 똑똑한지 느껴보기로 하시죠. ^^) 원본 소스에는 없는 하이라이트 한 color 변수값도 로또공에서는 꼭 필요한 값이라 추가해 보았습니다. 그 외에도 공의 번호를 self.no 변수에 저장할 수 도 있습니다.4. Ball class를 이용하여 번호별로 공을 만들어 줍니다. Ball class의 객체를 만드는 방법은 ball 㶺ll() 로 쓰면 됩니다. 마치 정수형 변수를 만들기 위해 no_lotto 㵅 라고 쓸 때 사실 no_lotto =int(45) 를 더 간단히 써준 것처럼, 리스트 랜덤 이름 추첨기 변수를 만들 때 lotto6 =list() 라고 쓰는 것과 유사한 원리입니다. int class의 이름을 int() 함수처럼 써주면 int 변수를 만들 수 있습니다. 아래 코드의 나머지들은 만들어진 ball 객체의 특성값 (attributes)들을 설정하는 것이 전부 입니다. 실제 중요한 부분은 Ball class의 실체 (instance)를 객체로 만들어 주는 부분이 훨씬 더 중요합니다. 이런 식으로 사용자 객체를 정의할 수 있게되면 게임 캐릭터를 만들거나, 보다 복잡한 툴 개발도 가능합니다. 파이썬 #외부모듈 들도 개념적으로는 이런 클래스로 선언되어 사용자가 그 아래 구현된 메쏘드들을 쓰게 되는 형태라고 볼 수 있습니다. 5. 메인 함수에서는 pygame 초기화, pygame용 화면을 정의하고, 에니메이션용 속도 조절을 위한 clock을 설정합니다. (빠른 컴퓨터나 느린 컴퓨터나 화면 갱신 속도를 유사하게 맞추기 위해 화면 refresh를 위한 clock 설정이 필요합니다.) 6. 이제 45개의 Ball class의 ball 객체를 만들어 ball_list 리스트에 담아줍니다. 사용자는 이 리스트에 담긴 45개 공에 대해 움직임을 위해 (change_x, change_y) 값을 임의로 랜덤 이름 추첨기 발생시키고 이 값을 (x, y) 값에 더해주는 작업을 for-in 루프에서 해주면 됩니다. 실제 화면에 그려지게 하기 위해 pygame.draw.circle() 함수를 사용하면 됩니다. 아래 1~45번까지 no의 공을 만들고 리스트에 담기 충분히 하실 수 있으실 껍니다. ^^7. 이제 ball_list의 모든 로또공들에 대해 (x, y) 좌표를 바꾸어 주고 이 공이 벽에 충돌할 경우 변위 (change_x, change_y)의 값의 부호를 바꾸어 반대 방향의 움직임이 되게 만들어 줍니다.8. 바뀐 좌표를 반영하여 로또공들을 새로 그려줍니다. 간단한 동영상 화면을 위해서는 매번 모든 화면을 깨끗하게 흑색, (or 백색)으로 칠해주고 다시 모든 공들을 바뀐 위치를 고려하여 그려준 뒤 화면을 update (or flip) 시키면 됩니다. 아래 코드에서 화면 갱신 속도를 위해 clock.tick() 함수로 화면 #frame_rate 도 바꾸는 것을 알 수 있습니다. 조금 느린 움직임을 원하시면 #tick() 함수내 값을 낮추면 됩니다. 9. 마지막은 pygame 모듈 종료 부 입니다. 실행해 보시면 좀 휭하지만 45개 로또공 색깔의 구들이 화면에서 랜덤 이름 추첨기 임의적인 위치로 움직이면서 벽에 닿으면 반대 방향으로 튕기는 것을 알 수 있습니다. 향후 공들의 움직임을 더 실제와 같게 만들어 주면 꽤나 그럴싸한 기계식 로또 추첨기가 될 듯 합니다. 로또 추첨기도 궁금하여 로또 홈피에서 찾아보니 국산이 아닌 프랑스산 #비너스_추첨기 (VENUS_DRAWING_SYSTEM)를 쓴다고 하네요. 가로, 세로 80x80cm 치수에 공 치수가 4.5cm 정도로 얼추 1/20 크기의 4g 짜리 작은 폴리우레탄 공을 사용하고 있습니다. 국산 기계들도 잘 개발되어 있을 것으로 생각됩니다만 공신력있게 임의 번호 추첨기를 만드는 것도 나름 높은 수준의 기술을 요하다 보니 해외 우수 업체의 추첨기를 쓰는 것이 아닐까 하는 생각을 해봅니다. 진짜 기계는 아니지만 우리가 만들 파이썬 로또 추첨기도 실제와 가깝게 잘 만들어 여러 사람들이 쓸 수 있도록 해보면 좋을 것 같습니다. (뽑을 때마다 그 주 로또 번호 6개를 떡허니 예측해준다면 그야 말로 금.상.첨.화!! ^^ㅋ 파이썬 그래픽 기초 학습에 도움되셨길 바라며 다음회차 코드 수정도 기대해 주세요. 그럼 랜덤 이름 추첨기 이만~ ^,^
댓글목록
등록된 댓글이 없습니다.