< 시스템 SW 실습 3 > Project #1 Poker Seven Poker 게임을진행하고최종적으로가장많은돆을가진사람이승리합니다. # 공통 rule - Main 함수의순서대로진행 - AI 의 class condition User 가 AI 를참조하는경우 AI 의 table 상태를확인핛때 (AI 조합정보가이미 table 에정리되어있음 ) 최종결과를출력핛때 AI 의 condition table 변수정보 Name : 조합번호 Num : 조합에서가장큰숫자 Full house 의경우에는 3 장인카드의번호 Straight 는가장작은숫자 Shape : 조합에따라모양결정 Flush 의경우해당 shape 이외에경우, 위의 num 에해당하는카드의 shape Pair : Two pair 의경우, 작은숫자 pair 에해당하는숫자 Two pair 의경우에만사용핛필요존재 이외의변수는참조필요없음 (user 가필요핚경우에사용하는변수 )
조합에따라 num 혹은 shape 이필요하지않은경우, AI 도 user 의정보를일 부만참조 Four card 의경우, shape 이무의미 Royal straight flush 의경우, num 이무의미 AI 도 user table 의 name, num, shape, pair 만을참조합니다. - 조합 같은조합일경우, 숫자혹은모양을비교 높은숫자일수록상위 / Spade, Diamond, Heart, Clover 순으로상위 같은조합일경우, 가지고있는최대숫자를비교하고최대숫자가같을경 우최대숫자의모양을비교 두 player 가동일하게 9, 3pair 인경우 9 pair 중에서 spade 를가진사람 이승리 Flush 를비교하는경우, 최대숫자를비교하고최대숫자가같을경우에 는모양을비교 Straight 를비교하는경우, 최대숫자를비교하고최대숫자가같을경 우에는모양을비교 Straight 중, (A 2 3 4 5) 의조합은배제하고 (10 J Q K A) 의조합은사용 - Straight 의경우, condition 의 num 에는가장작은숫자를대입 - 처음 3 장을받은후, 1 장을반드시받고 100 원을적립 (1 set 필참 ) 2 set 부터 die 가능 - 죽는순서는 user 가가장먼저 Player 모두가죽는경우는배제 - 중갂에게임이끝난경우, 현재까지의카드와조합을출력 # 유의사항
- 구현방법 Poker.cpp 만을작성하고필요에따라서 poker.h 의주석부분에변수추가가능 - 판돆 Set 1, 2, 3, 4 에서진행핛때마다 100 원, 200 원, 400 원, 800 원씩 bank 에적립 Go 로결정핚경우바로적립 결과확인후에누적된금액을승자가획득 Player 의돆이 여도계속참여, 진행가능 - User 와 AI 공통으로, player 의죽음은 name 변수를 -1 로표시 AI vector 에는항상 3 명의 AI 가들어있으며, AI 의 name 변수가 -1 일경우, 현재 게임에서죽은상태로인식 # poker.h - 모듞조합은 poker.h 의숫자대로관리 - 각문양을 define 으로정리 SPADE = 4 / DIAMOND = 3 / HEART = 2 / CLOVER = 1 - Class Card 번호는 2~14 (2~A), 모양은위의 define 을사용 - Class Condition 조합의상태를표시 Name = 조합번호 정의되어있는변수들외에필요에따라추가선언및사용가능 - Class Player User 의정보 Name 은 0 으로고정, money 는시작핛때 10000 원지급
Mine, my_cards 는본인시점 / table, my_table_cards 는타인시점으로사용 String table_cards 는출력을위핚용도로자유롭게사용 정의되어있는변수들외에필요에따라추가선언및사용가능 - Class Player_AI AI 의정보 기본정보는 user 와마찬가지 User 는의사결정을위해 AI.table 에접근가능 Class 내의 get_mine() 을통해서 AI 의젂체카드열람가능 반드시 show_result() 내에서만사용 - Class Poker Card deck 제공 판돆을저장해놓을변수 bank 제공 핚게임이끝날때까지의누적판돆이며, 매게임마다 0 으로 reset 게임을위핚함수제공 # main.cpp - Player( 자싞 ) 와 AI 3 명을초기화 - 정상적으로출력되었을시, 게임과정과결과가도출 ( 최종카드, 돆 ) - 젂체진행상황 초기화 -> 카드섞기 -> 3 장씩분배 -> Table 카드상태확인 -> 1 장씩분배 -> Table 카드상태확인 -> 게임진행의사결정 -> 게임완료확인 -> 반복 게임완료확인은 player 가혺자남은경우를확인 # main_iter.cpp - 게임을여러번실행
각 player 의돆은초기화하지않으니누적되도록구현 - 결과를갂략하게출력 # poker.cpp Shuffle_deck - 0 ~ 51 까지의숫자를 random 으로획득 ( 순서 ) Rand() 에서 0 을받은경우, Ace 로인식 Rand() 에서 20 을받은경우, 8 로인식 AI 는 Ace 를 14 번으로인식 (2 ~ K : 2 ~ 13) - 받는순서대로 push_back() 함수로 deck 에넣고, back() 함수로차례대로사용 First_draw - 3 장씩받고, 뒤집어놓을 top card 를결정 - 나눠주는순서는 player 0 부터 3 장, player 1 에게 3 장 순서 - First_draw_AI() 에서는각 AI 가알아서 3 장씩획득 Show_table - Table 상태를출력 ( 자싞의카드만출력 ) - Show_table_AI() 에서는 AI 의 table card 출력 Verify_cards - 자싞의카드상태확인 Table 에있는자싞의카드상태 update 필요 (Player.table) 이후 AI 가 Player.table 을참조하여의사결정 실제자싞의카드상태 update 시점은자유 - Verify_cards_AI() 에서는각 AI 가자싞의 table card 상태를 update
Draw - 카드를 1 장씩분배 Table 에서가장높은조합을가진사람부터반시계방향으로분배 0->1->2->3, 2->3->0->1 과같은순서 AI 의조합을확인하기위해 AI.table 참조가능 - Draw_AI() 에서는 AI 가핚장의 card 를획득 Ex) AI 2 번이 top player 인경우, draw_ai(ai2) / draw_ai(ai3) / user 알고리즘 / draw_ai(ai1) 순서로함수호출 Draw_AI() 함수가남은 AI 수만큼호출필요 Go_or_die - User 의알고리즘에따라게임을진행핛지말지결정 - Go_or_die_AI() 에서는 AI 가자싞의카드상태와 table 상태를비교하여의사결정 Show_result - 최종 table 상태를출력함과동시에결과도출 죽은 player 는출력하지않음 승자와승자가가지고있던조합을출력 승자를판별하고돆을지급 승자를판별하기위해 AI 의젂체카드열람가능 Get_mine() 함수 최종출력은모듞카드가보이도록출력 - Show_result_AI() 에서는남은 AI 들의카드를젂부오픈
# 출력결과 - Main.cpp
- Main_iter.cpp (3 번실행핚경우 )
# 제출 - 작성핚코드에주석작성 가독성, 모듞경우가포함되었는지판단 - Poker.cpp / poker.h 파일만을압축 - 학번.tar.gz 형식으로조교에게제출 2016710580.tar.gz 을조교메일로젂송 ( 두명모두에게보내주시길바랍니다.) # g++-4.8 downgrade g++ --version 으로현재 g++ version 확인가능 sudo apt-get install g++-4.8 sudo apt-get install aptitude sudo aptitude install g++-4.8
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 800 sudo update-alternatives --config g++