허브와 스위치의 Broadcast / Collision Domain
- 허브는 collision domain이 하나라 이론상 500대, 실제로 200대정도밖에 연결하지 못함.
- 스위치는 port별로 collision domain이 나눠짐.
- 허브는 collision domain을 나누지 못함.
- 스위치와 스위치 사이에도 collision domain이 나눠짐.
- Broadcast domain 과 collision domain 개수세기
3. 브릿지(Bridge)
- 하나의 브로드캐스트 도메인을 둘 또는 셋의 컬리전 도메인으로 나눠주는 장치
- 현재는 스위치에 밀려 거의 사용되고 있지 않다.
4. 스위치 & 브릿지의 기능
1) Learning
- MAC 주소를 배움
- Source MAC 주소만 배움! (받는 쪽이 불분명할 수도 있다.)
- Destination MAC은 배우지 않음.
2) Flooding
- MAC주소를 모르면 브로드캐스트
3) Forwarding
- MAC 주소를 알면 유니캐스트(해당 호스트에게만 전달)
4) Filtering
- 3)의 포워딩이 일어나면 나머지 포트로 필터링
- 1)에서 수집한 MAC을 기준으로 통신을 차단할 수 있다.
5) Aging
- 1) 에서 배운 MAC주소에 대한 유효수명 부여
- 기본값은 300초
- 통신이 지속되면 300초로 갱신
5. 스위치와 브릿지의 차이점
1) 처리 방식
- 브릿지는 소프트웨어 방식으로 기능, 스위치는 하드웨어 방식으로 동작.
- 하드웨어 방식으로 동작하는 것을 ASIC(Application Specific Integrated Circuit)이라고 한다.
- 스위치는 하드웨어 방식이기 때문에 훨씬 빠르다.
2) 브릿지는 모든 포트의 속도가 같아야 하지만 스위치는 포트별로 속도가 달라도 동작한다.
3) 스위치는 브릿지에 비해 훨씬 많은 포트를 제공
4) 스위치는 Cut-through와 store and forward 방식으로 동작하지만 브릿지는 store and forward 방식으로만 동작.
일부 스위치는 추가로 fragment free 방식도 지원
- cut through : 실시간으로 들어오는 패킷의 주소를 확인 후 포워딩이나 플루딩으로 패킷을 처리하는 방법
- store and forward : 패킷을 일단 저장한 후 패킷의 주소를 확인 후 처리
- fragment free : 실시간으로 들어오는 패킷을 확인할 때 주소를 포함한 512비트를 확인하고 처리. 보안장비 등에서 사용. (96비트의 보내는 MAC, 받는 MAC 뿐만이 아니라 헤더를 검사)
6. 루핑(Looping)
- 패킷이 네트워크상에서 무한 반복되는 현상
- 루핑을 막기 위해 Spanning Tree Protocol에 의해서 스위치들은 단일 경로만을 구성한다.
.
2017년 1월 10일 화요일
2017년 1월 9일 월요일
CCNA 3일차
OSI 7 계층
LAN의 종류
1. Ethernet
- 제록스와 인텔이 개발
- CSMA/CD 방식
- Carrier Sense Multiple Access / Collision Detection
- 신호 검출 다중 접근 / 충돌 감지
- 일정 횟수만큼 ack가 올때까지 계속 재전송.(15회)
- 15회 실패할 경우 상위 계층에 알리고 종료.
- 많은 수가 연결되면 충돌확률이 늘어난다.
- 10Mbps
- Fast Ethernet(100Mbps), Gigabit Ethernet(1000Mbps - 1Gbps)
https://ko.wikipedia.org/wiki/%EC%9D%B4%EB%8D%94%EB%84%B7
2. 토큰 버스/링
- IBM이 개발
- 4Mbps, 16Mbps
- Backbone을 이용한 버스 방식
- 한번에 토큰을 가지고 있는 하나만 통신 가능.
- 문제를 파악하기가 쉽다.
- 버스가 가지고 있는 시간적 문제를 해결하기 위해 링 형태가 나옴.
- 규모가 커지면 속도가 느려지거나 응답시간이 길어짐.
3. 기타 등등
- Appletalk, FDDI 등등
TTL
- Time To Live
- TTL 안에 패킷이 목적지에 도달하지 못하면 패킷은 소멸된다.
왕복 시간은 100ms 이하.
손실률 2% 미만.
wireshark 이용해서 패킷 관찰
ethernet II
protocol
message
1. 허브(HUB)
- Ethernet 의 중심이 되는 장치
- Port : 데이터를 서로간에 교환할 수 있는 곳
- 여러개의 Port에 Host들을 연결하고 브로드캐스트 해주는 장치
- 단순히 신호 전달만을 하기 때문에 멀티포트 리피터(Multiport Repeater)라고도 한다.
- 단순히 신호전달만을 하기 때문에 OSI 7 Layer 중 L1에 해당
1)단점
- 호스트가 많아지면 충돌이 발생할 확률이 높아진다.
- 충돌이 발생하면 15회까지 재전송
2. 스위치(Switch)
- 허브의 역할을 한다고 해서 스위칭 허브라고도 표현
- 하나의 브로드캐스트 도메인을 여러개의 Collision 도메인으로 나눠주는 역할
- 브로드캐스트 도메인 : LAN(한번에 브로드캐스트 할 수 있는 영역)
- 포워딩
- MAC 주소를 기반으로 동작하기 때문에 L2 장비로 분류
- MAC 주소를 기반으로 하나의 브로드캐스트 도메인을 여러개의 컬리전 도메인으로 분류
- 유니캐스트 통신인 경우 허브와는 달리 하나의 회선에서 충돌이 발생해도
- 나머지 회선의 호스트들에게 영향을 미치지 않고 통신이 가능하다.
CCNA 2일차
네트워크에서 통신방식
- 노드(호스트)들을 구분하기 위한 식별자(Identifier)가 기본적으로 필요하다.
- 각각의 개체를 고유하게 식별할 수 있게 해주는 식별자를 MAC(Media Access Control) Address라고 한다.
- 같은 LAN 안에서의 통신은 MAC을 기반으로 이루어진다.
- 물리적 주소 앞 6자리(제조업체), 뒤 6자리(일련번호)
cmd - ipconfig /all 명령어를 통해 MAC주소를 확인할 수 있다.
1. 브로드캐스트
- Broad + Cast
- 수신 대상을 정하지 않고 모두에게 전달하는 통신방식
- 브로드캐스트가 전달되는 범위를 LAN 으로 정의한다.
- 방송과 같이 신호를 뿌리면 받는 사람이 송신한다.
- 듣는 대상이 고려되어 있지 않다.
- 한번에 신호를 보낼 수 있는 범위가 정해져 있으며
- 그 범위는 LAN 이다. (근거리)
- 반면 멀티캐스트나 유니캐스트는 LAN을 넘어서도 통신가능
2. 멀티캐스트
- Multi + Cast
- 하나의 그룹(다수의 수신자)에게 신호를 전달하는 통신 방식
- 멀티캐스트를 전체에게 전달하지 않는 것은 아니다.
- 신호를 받는 측에서 온 신호를 선별한다.
3. 유니캐스트
- Uni + Cast (단일)
- 하나의 대상에게만 신호를 전달하는 통신 방식
4. 애니캐스트
- Ani + Cast
MAC(Media Access Control) Address 을 알아보자
1. MAC Address란?
2진수 48비트로 이루어진 숫자체계
16진수 1자리는 4비트
16진수 12자리로 표시할 수 있다
D0-50-99-8B-4D-96
D0:50:99:8B:4D:96
D050.998B.4D96
앞의 24비트(3바이트, 16진수 6자리)는 제조사(벤더)를 의미하고
(OUI:Oraganizaion Unique Identifier)
뒤의 24비트는 제조사가 사용하는 일련번호를 의미
https://regauth.standards.ieee.org/standards-ra-web/pub/view.html#registries
위 사이트를 통해 제조사를 확인할 수 있다.
유니캐스트
보내는쪽
00-60-80-AA-BB-CC
받는쪽
00-60-80-DD-EE-FF
브로드캐스트
보내는쪽
00-60-80-AA-BB-CC
받는쪽
FF-FF-FF-FF-FF-FF
- ip에서도 동일
2. 그럼 MAC을 어떻게 알아내서 통신을 하는 것일까?
- ARP(Address Resolution Protocol) 와 RARP(Reverse ARP)
- PC1이 PC2와 통신을 하려고 할 때
- PC1은 자신의 MAC 주소는 알고 있으나, PC2의 MAC 주소를 알지 못한다.
- 그래서 PC1이 PC2의 MAC 주소를 알아내기 위해서 네트워크에 자신의 MAC주소를 적은 PC2를 찾는 메시지를 브로드캐스트하게 된다.
- PC2는 브로드캐스트를 듣고 PC1에게 응답하기 위해서 자신의 MAC주소를 적어서 브로드캐스트로 응답한다.
- PC1이 PC2의 주소가 적힌 브로드캐스트를 듣고 PC2의 MAC을 확인하고 난 뒤 자신의 MAC Address Table에 메모한다.
- 이후 PC1은 PC2에게 유니캐스트로 통신을 할 수 있다.
- 이렇게 MAC 주소를 알아내는 과정을 ARP라고 한다. (IP주소를 가지고 MAC주소를 알아내는 과정)
- 역으로 MAC 주소를 가지고 IP주소를 알아내는 과정을 RARP라고 한다.
- MAC 주소를 위변조 하는 네트워크 해킹 기법을 spoofing이라고 한다.
cmd > arp -a
PC에 저장된 MAC Address Table을 보여준다.
- 노드(호스트)들을 구분하기 위한 식별자(Identifier)가 기본적으로 필요하다.
- 각각의 개체를 고유하게 식별할 수 있게 해주는 식별자를 MAC(Media Access Control) Address라고 한다.
- 같은 LAN 안에서의 통신은 MAC을 기반으로 이루어진다.
- 물리적 주소 앞 6자리(제조업체), 뒤 6자리(일련번호)
cmd - ipconfig /all 명령어를 통해 MAC주소를 확인할 수 있다.
1. 브로드캐스트
- Broad + Cast
- 수신 대상을 정하지 않고 모두에게 전달하는 통신방식
- 브로드캐스트가 전달되는 범위를 LAN 으로 정의한다.
- 방송과 같이 신호를 뿌리면 받는 사람이 송신한다.
- 듣는 대상이 고려되어 있지 않다.
- 한번에 신호를 보낼 수 있는 범위가 정해져 있으며
- 그 범위는 LAN 이다. (근거리)
- 반면 멀티캐스트나 유니캐스트는 LAN을 넘어서도 통신가능
2. 멀티캐스트
- Multi + Cast
- 하나의 그룹(다수의 수신자)에게 신호를 전달하는 통신 방식
- 멀티캐스트를 전체에게 전달하지 않는 것은 아니다.
- 신호를 받는 측에서 온 신호를 선별한다.
3. 유니캐스트
- Uni + Cast (단일)
- 하나의 대상에게만 신호를 전달하는 통신 방식
4. 애니캐스트
- Ani + Cast
MAC(Media Access Control) Address 을 알아보자
1. MAC Address란?
2진수 48비트로 이루어진 숫자체계
16진수 1자리는 4비트
16진수 12자리로 표시할 수 있다
D0-50-99-8B-4D-96
D0:50:99:8B:4D:96
D050.998B.4D96
앞의 24비트(3바이트, 16진수 6자리)는 제조사(벤더)를 의미하고
(OUI:Oraganizaion Unique Identifier)
뒤의 24비트는 제조사가 사용하는 일련번호를 의미
https://regauth.standards.ieee.org/standards-ra-web/pub/view.html#registries
위 사이트를 통해 제조사를 확인할 수 있다.
유니캐스트
보내는쪽
00-60-80-AA-BB-CC
받는쪽
00-60-80-DD-EE-FF
브로드캐스트
보내는쪽
00-60-80-AA-BB-CC
받는쪽
FF-FF-FF-FF-FF-FF
- ip에서도 동일
2. 그럼 MAC을 어떻게 알아내서 통신을 하는 것일까?
- ARP(Address Resolution Protocol) 와 RARP(Reverse ARP)
- PC1이 PC2와 통신을 하려고 할 때
- PC1은 자신의 MAC 주소는 알고 있으나, PC2의 MAC 주소를 알지 못한다.
- 그래서 PC1이 PC2의 MAC 주소를 알아내기 위해서 네트워크에 자신의 MAC주소를 적은 PC2를 찾는 메시지를 브로드캐스트하게 된다.
- PC2는 브로드캐스트를 듣고 PC1에게 응답하기 위해서 자신의 MAC주소를 적어서 브로드캐스트로 응답한다.
- PC1이 PC2의 주소가 적힌 브로드캐스트를 듣고 PC2의 MAC을 확인하고 난 뒤 자신의 MAC Address Table에 메모한다.
- 이후 PC1은 PC2에게 유니캐스트로 통신을 할 수 있다.
- 이렇게 MAC 주소를 알아내는 과정을 ARP라고 한다. (IP주소를 가지고 MAC주소를 알아내는 과정)
- 역으로 MAC 주소를 가지고 IP주소를 알아내는 과정을 RARP라고 한다.
- MAC 주소를 위변조 하는 네트워크 해킹 기법을 spoofing이라고 한다.
cmd > arp -a
PC에 저장된 MAC Address Table을 보여준다.
CCNA 1일차
네트워크
- 일을 할 수 있는 망 또는 관계
네트워크를 사용하는 이유는?
- 공유(share)하기 위해서
무엇을 공유?
1. 자원(Resource)
2. 정보(Information)
네트워크의 종류
1. 인터넷
- Inter + Net (상호간의)
- 네트워크를 여러개 묶어 놓은 것
예> 인터넷, 인터폰, 인터폴, 인터 컨티넨털, 인터내셔널
2. 인트라넷
- Intra + Net (내부)
- 인터넷 기술을 사용해서 회사 내부에 내부직원만 이용하는 서비스를 구축한 것
3. 엑스트라넷
- Extra + Net (확장)
- 인트라넷을 인터넷을 사용해서 외부 직원이나 고객이 이용할 수 있도록 확장한 것
네트워크의 종류 - 범위에 따른 분류
1. LAN
- Local Area Network
- 근거리 통신망
- 라우터를 거치지 않고 직접 통신할 수 있는 네트워크
2. NAN
- Netropolitian Area Network
- 광역도시권 통신망
3. WAN
- Wide Area Network
- 원거리 통신망
- 라우터를 사용해서 연결된 네트워크 모음. 국가단위나 전세계적인 규모를 의미.
cf) 네트워크에서 말하는 거리는 물리적인 거리가 아니다.
네트워크에서의 거리는 홉카운트(Hop Count)를 의미한다.
cmd - tracert (url)
호스트로부터 적은 도메인까지의 홉카운트들의 ip를 보여준다.
보안상의 이유로 * 으로 표시되는 서버들도 있다.
- 일을 할 수 있는 망 또는 관계
네트워크를 사용하는 이유는?
- 공유(share)하기 위해서
무엇을 공유?
1. 자원(Resource)
2. 정보(Information)
네트워크의 종류
1. 인터넷
- Inter + Net (상호간의)
- 네트워크를 여러개 묶어 놓은 것
예> 인터넷, 인터폰, 인터폴, 인터 컨티넨털, 인터내셔널
2. 인트라넷
- Intra + Net (내부)
- 인터넷 기술을 사용해서 회사 내부에 내부직원만 이용하는 서비스를 구축한 것
3. 엑스트라넷
- Extra + Net (확장)
- 인트라넷을 인터넷을 사용해서 외부 직원이나 고객이 이용할 수 있도록 확장한 것
네트워크의 종류 - 범위에 따른 분류
1. LAN
- Local Area Network
- 근거리 통신망
- 라우터를 거치지 않고 직접 통신할 수 있는 네트워크
2. NAN
- Netropolitian Area Network
- 광역도시권 통신망
3. WAN
- Wide Area Network
- 원거리 통신망
- 라우터를 사용해서 연결된 네트워크 모음. 국가단위나 전세계적인 규모를 의미.
cf) 네트워크에서 말하는 거리는 물리적인 거리가 아니다.
네트워크에서의 거리는 홉카운트(Hop Count)를 의미한다.
cmd - tracert (url)
호스트로부터 적은 도메인까지의 홉카운트들의 ip를 보여준다.
보안상의 이유로 * 으로 표시되는 서버들도 있다.
2016년 5월 14일 토요일
Pygame 틱택토 게임 (Tic-Tac-Toe) (2)
import random, pygame, sysfrom pygame.locals import *FPS = 30 # frames per second, the general speed of the programWINDOWWIDTH = 340 # size of window's width in pixelsWINDOWHEIGHT = 340 # size of windows' height in pixelsBOXSIZE = 100 # size of box height & width in pixelsGAPSIZE = 10 # size of gap between boxes in pixelsBOARDWIDTH = 3 # number of columns of iconsBOARDHEIGHT = 3 # number of rows of icons# ColorsetBLACK = (0, 0, 0)WHITE = (255, 255, 255)GRAY = (100, 100, 100)LIGHTBLUE = (153, 204, 255)BGCOLOR = WHITEBOXCOLOR = BLACKHIGHLIGHTCOLOR = GRAYLINECOLOR = WHITEdef main():global FPSCLOCK, DISPLAYSURFpygame.init()FPSCLOCK = pygame.time.Clock()DISPLAYSURF = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT))mousex = 0 # used to store x coordinate of mouse eventmousey = 0 # used to store y coordinate of mouse eventpygame.display.set_caption('TicTacToe - harang97')mainBoard = [[None,None,None],[None,None,None],[None,None,None]]playerTurn = 'X'firstSelection = None # stores the (x, y) of the first box clicked.DISPLAYSURF.fill(BGCOLOR)drawBoard(mainBoard)Message = 'None'while True: # main game loopmouseClicked = FalseDISPLAYSURF.fill(BGCOLOR)drawBoard(mainBoard)for event in pygame.event.get():if event.type == QUIT or (event.type == KEYUP and event.key == K_ESCAPE):pygame.quit()sys.exit()elif event.type == MOUSEMOTION:mousex, mousey = event.poselif event.type == MOUSEBUTTONUP:mousex, mousey = event.posmouseClicked = Trueboxx, boxy = getBoxAtPixel(mousex, mousey)if boxx != None and boxy != None:# the mouse is currently over a box.if mainBoard[boxx][boxy] == None:drawHighlightBox(boxx, boxy)if mainBoard[boxx][boxy] == None and mouseClicked:mainBoard[boxx][boxy] = playerTurn # set the box as "filled"drawXO(playerTurn, boxx, boxy)if playerTurn == 'X':playerTurn = 'O'else: playerTurn = 'X'# Algorithm that check the game is overif hasWon(mainBoard):if playerTurn == 'X': Message = 'Player 1 Wins!'else: Message = 'Player 2 Wins!'popMessage(Message)mainBoard = [[None,None,None],[None,None,None],[None,None,None]]playerTurn = 'X'elif hasDraw(mainBoard):Message = ' Draw! 'popMessage(Message)mainBoard = [[None,None,None],[None,None,None],[None,None,None]]playerTurn = 'X'# Redraw the screen and wait a clock tick.pygame.display.update()FPSCLOCK.tick(FPS)def popMessage(Message):font = pygame.font.Font('font/nanum.ttf', 32)textSurface = font.render(Message, True, BLACK, LIGHTBLUE)textRect = textSurface.get_rect()textRect.center = (170, 85)DISPLAYSURF.blit(textSurface, textRect)pygame.display.update()pygame.time.wait(2000)def getBoxAtPixel(x, y):# Draw Box on display surfacefor boxx in range(BOARDWIDTH):for boxy in range(BOARDHEIGHT):left, top = leftTopCoordsOfBox(boxx, boxy)boxRect = pygame.Rect(left, top, BOXSIZE, BOXSIZE)if boxRect.collidepoint(x, y):return (boxx, boxy)return (None, None)def drawBoard(board):# Draws all of the boxes in their covered or revealed state.for boxx in range(BOARDWIDTH):for boxy in range(BOARDHEIGHT):left, top = leftTopCoordsOfBox(boxx, boxy)if board[boxx][boxy] == None:pygame.draw.rect(DISPLAYSURF, BOXCOLOR, (left, top, BOXSIZE, BOXSIZE))else:pygame.draw.rect(DISPLAYSURF, BOXCOLOR, (left, top, BOXSIZE, BOXSIZE))drawXO(board[boxx][boxy], boxx, boxy)def leftTopCoordsOfBox(boxx, boxy):# Convert board coordinates to pixel coordinatesleft = boxx* (BOXSIZE + GAPSIZE) + GAPSIZEtop = boxy * (BOXSIZE + GAPSIZE) + GAPSIZEreturn (left, top)def drawHighlightBox(boxx, boxy):left, top = leftTopCoordsOfBox(boxx, boxy)pygame.draw.rect(DISPLAYSURF, HIGHLIGHTCOLOR, (left , top , BOXSIZE , BOXSIZE))def drawXO(playerTurn, boxx, boxy):left, top = leftTopCoordsOfBox(boxx, boxy)if playerTurn == 'X':pygame.draw.line(DISPLAYSURF, LINECOLOR, (left + 3, top + 3), (left + BOXSIZE - 3, top + BOXSIZE - 3), 4)pygame.draw.line(DISPLAYSURF, LINECOLOR, (left + BOXSIZE - 3, top + 3), (left + 3, top + BOXSIZE - 3), 4)else:HALF = int(BOXSIZE / 2)pygame.draw.circle(DISPLAYSURF, LINECOLOR, (left + HALF, top + HALF), HALF - 3, 4)def hasWon(board):# Returns True if player 1 or 2 winsfor xrow in board: # horizontalif xrow[0] != None and xrow[0] == xrow[1] and xrow[1] == xrow[2]:return Truefor i in range(3): # verticalif board[0][i] != None and board[0][i] == board[1][i] and board[1][i] == board[2][i]:return Trueif board[0][0] != None and board[0][0] == board[1][1] and board[1][1] == board[2][2]: # diagnol 1return Trueif board[2][0] != None and board[2][0] == board[1][1] and board[1][1] == board[0][2]: # diagnol 2return Truereturn False # no winnerdef hasDraw(board):# Returns True if all the boxes have been filledfor i in board:if None in i:return Falsereturn Trueif __name__ == '__main__':main()
(1)에서 구현해야 할 점 구현 완료!
부족한 점
- 승리시 표시하는 배경 박스를 그린 후 배경색이 없는 텍스트를 그리려 했으나, 결국 텍스트 배경색 이용
- 승리&무승부시 텍스트가 떠 있는 상태에서 클릭을 할 경우 다음 판에 반영된다.
보완점
- 텍스트를 사용하는 것이 아니라 팝업 텍스트 자체를 png로 저장한 후 불러오는 방법 고려
알게된 점
- pygame.display.update() 함수를 사용하는 이유는 화면 상에서 그래픽 변경 사항을 저장한 후 실제로 우리가 볼 수 있도록 하기 위해서이다.
Pygame 틱택토 게임 (Tic Tac Toe) 만들기 (1)
import random, pygame, sys
from pygame.locals import *
FPS = 30 # frames per second, the general speed of the program
WINDOWWIDTH = 340 # size of window's width in pixels
WINDOWHEIGHT = 340 # size of windows' height in pixels
BOXSIZE = 100 # size of box height & width in pixels
GAPSIZE = 10 # size of gap between boxes in pixels
BOARDWIDTH = 3 # number of columns of icons
BOARDHEIGHT = 3 # number of rows of icons
# Colorset
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
GRAY = (100, 100, 100)
BGCOLOR = WHITE
BOXCOLOR = BLACK
HIGHLIGHTCOLOR = GRAY
LINECOLOR = WHITE
O = 'O'
X = 'X'
def main():
global FPSCLOCK, DISPLAYSURF
pygame.init()
FPSCLOCK = pygame.time.Clock()
DISPLAYSURF = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT))
mousex = 0 # used to store x coordinate of mouse event
mousey = 0 # used to store y coordinate of mouse event
pygame.display.set_caption('TicTacToe - harang97')
mainBoard = [[None,None,None],[None,None,None],[None,None,None]]
playerTurn = 'X'
firstSelection = None # stores the (x, y) of the first box clicked.
DISPLAYSURF.fill(BGCOLOR)
drawBoard(mainBoard)
while True: # main game loop
mouseClicked = False
DISPLAYSURF.fill(BGCOLOR)
drawBoard(mainBoard)
for event in pygame.event.get():
if event.type == QUIT or (event.type == KEYUP and event.key == K_ESCAPE):
pygame.quit()
sys.exit()
elif event.type == MOUSEMOTION:
mousex, mousey = event.pos
elif event.type == MOUSEBUTTONUP:
mousex, mousey = event.pos
mouseClicked = True
boxx, boxy = getBoxAtPixel(mousex, mousey)
if boxx != None and boxy != None:
# the mouse is currently over a box.
if mainBoard[boxx][boxy] == None:
drawHighlightBox(boxx, boxy)
if mainBoard[boxx][boxy] == None and mouseClicked:
mainBoard[boxx][boxy] = playerTurn # set the box as "filled"
drawXO(playerTurn, boxx, boxy)
if playerTurn == 'X':
playerTurn = 'O'
else: playerTurn = 'X'
# Algorithm that check the game is over
if hasWon(mainBoard):
pass
if hasDraw(mainBoard):
pass
# -----------------------------
# Redraw the screen and wait a clock tick.
pygame.display.update()
FPSCLOCK.tick(FPS)
def getBoxAtPixel(x, y):
# Draw Box on display surface
for boxx in range(BOARDWIDTH):
for boxy in range(BOARDHEIGHT):
left, top = leftTopCoordsOfBox(boxx, boxy)
boxRect = pygame.Rect(left, top, BOXSIZE, BOXSIZE)
if boxRect.collidepoint(x, y):
return (boxx, boxy)
return (None, None)
def drawBoard(board):
# Draws all of the boxes in their covered or revealed state.
for boxx in range(BOARDWIDTH):
for boxy in range(BOARDHEIGHT):
left, top = leftTopCoordsOfBox(boxx, boxy)
if board[boxx][boxy] == None:
pygame.draw.rect(DISPLAYSURF, BOXCOLOR, (left, top, BOXSIZE, BOXSIZE))
else:
pygame.draw.rect(DISPLAYSURF, BOXCOLOR, (left, top, BOXSIZE, BOXSIZE))
drawXO(board[boxx][boxy], boxx, boxy)
def leftTopCoordsOfBox(boxx, boxy):
# Convert board coordinates to pixel coordinates
left = boxx* (BOXSIZE + GAPSIZE) + GAPSIZE
top = boxy * (BOXSIZE + GAPSIZE) + GAPSIZE
return (left, top)
def drawHighlightBox(boxx, boxy):
left, top = leftTopCoordsOfBox(boxx, boxy)
pygame.draw.rect(DISPLAYSURF, HIGHLIGHTCOLOR, (left , top , BOXSIZE , BOXSIZE))
def drawXO(playerTurn, boxx, boxy):
left, top = leftTopCoordsOfBox(boxx, boxy)
if playerTurn == 'X':
pygame.draw.line(DISPLAYSURF, LINECOLOR, (left + 3, top + 3), (left + BOXSIZE - 3, top + BOXSIZE - 3), 4)
pygame.draw.line(DISPLAYSURF, LINECOLOR, (left + BOXSIZE - 3, top + 3), (left + 3, top + BOXSIZE - 3), 4)
else:
HALF = int(BOXSIZE / 2)
pygame.draw.circle(DISPLAYSURF, LINECOLOR, (left + HALF, top + HALF), HALF - 3, 4)
def hasWon(board):
# Returns True if player 1 or 2 wins
return True
def hasDraw(board):
# Returns True if all the boxes have been filled
for i in board:
if None in i:
return False
return True
if __name__ == '__main__':
main()
현재 완료
- 기본 그래픽 바탕
- 마우스 커서가 빈 공간에 올라올 경우 하이라이트
- 클릭시 차례에 따라 X 또는 O가 바탕에 남음
추가할 것
- 승리, 무승부 판별 함수 만들기
- 승리, 무승부시 누가 승리했는지 표시 후 초기화하기
2016년 5월 10일 화요일
Pygame (4) 폰트 불러오기, 화면에 글씨쓰기
import pygame, sys
from pygame.locals import *
pygame.init()
DISPLAYSURF = pygame.display.set_mode((400,300))
pygame.display.set_caption('Hello World!')
WHITE = (255, 255, 255)
GREEN = (0, 255, 0)
BLUE = (0, 0, 128)
BLACK = (0, 0, 0)
fontObj = pygame.font.Font('font/nanum.ttf', 32)
textSurfaceObj = fontObj.render('Hello world!', True, BLACK, WHITE)
textRectObj = textSurfaceObj.get_rect()
textRectObj.center = (100, 16)
while True: # main game loop
DISPLAYSURF.fill(WHITE)
DISPLAYSURF.blit(textSurfaceObj, textRectObj)
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
pygame.display.update()
from pygame.locals import *
pygame.init()
DISPLAYSURF = pygame.display.set_mode((400,300))
pygame.display.set_caption('Hello World!')
WHITE = (255, 255, 255)
GREEN = (0, 255, 0)
BLUE = (0, 0, 128)
BLACK = (0, 0, 0)
fontObj = pygame.font.Font('font/nanum.ttf', 32)
textSurfaceObj = fontObj.render('Hello world!', True, BLACK, WHITE)
textRectObj = textSurfaceObj.get_rect()
textRectObj.center = (100, 16)
while True: # main game loop
DISPLAYSURF.fill(WHITE)
DISPLAYSURF.blit(textSurfaceObj, textRectObj)
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
pygame.display.update()
---------
Anti-Aliasing == False
Anti-Aliasing == True
fontObj란 변수에 pygame.font.Font를 이용해 .ttf 형식 등의 폰트 파일을 불러와 저장합니다.
미리 폰트를 연결시킨 변수 fontObj를 이용해 render() 함수를 통해 글씨를 화면 상에 출력할 수 있습니다.
render(message, Anti-Aliasing, color, backgroundcolor)의 4개의 인자를 전달받으며,
Anti-Aliasing이 True일 경우 안티앨리어싱을 적용해 부드러운 글자를 출력하며, False를 전달할 경우 안티앨리어싱이 적용되지 않아 다소 딱딱한 글씨체를 화면 상에 출력합니다.
피드 구독하기:
글 (Atom)