PHP/PHP_TEST

Black Jack.php 게임 만들기

ldh1123 2023. 4. 23. 21:06

목차

 Black Jack 게임 만들기

 

<?php

	//블랙잭 게임
	//-카드 숫자를 합쳐 가능한 21에 가깝게 만들면 이기는 게임

	//1. 게임 시작시 유저와 딜러는 카드를 2개 받는다.
	// 1-1. 이때 유저 또는 딜러의 카드 합이 21이면 결과 출력
	//2. 카드 합이 21을 초과하면 패배
	// 2-1. 유저 또는 딜러의 카드의 합이 21이 넘으면 결과 바로 출력
	//4. 카드의 계산은 아래의 규칙을 따른다.
	// 4-1.카드 2~9는 그 숫자대로 점수
	// 4-2. K·Q·J,10은 10점
	// 4-3. A는 1점 또는 11점 둘 중의 하나로 계산
	//5. 카드의 합이 같으면 다음의 규칙에 따름
	// 5-1. 카드수가 적은 쪽이 승리
	// 5-2. 카드수가 같을경우 비긴다.
	//6. 유저가 카드를 받을 때 딜러는 아래의 규칙을 따른다.
	// 6-1. 딜러는 카드의 합이 17보다 낮을 경우 카드를 더 받음
	// 6-2. 17 이상일 경우는 받지 않는다.
	//7. 1입력 : 카드 더받기, 2입력 : 카드비교, 0입력 : 게임종료
	//8. 한번 사용한 카드는 다시 쓸 수 없다.

	class Blackjack {
		public $deck;
		public $player_card;
		public $dealer_card;
		public $player_score;
		public $dealer_score;

		// method명		: fnc_set_deck
		// parameter 	: 없음
		// 기능 		: 덱 세팅
		public function fnc_set_deck() {
			$pattern = array( "♡", "◇", "♧", "♤" );
			$nums = array( "A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K" );
			$deck = array();
			foreach( $pattern as $patt ) {
				foreach( $nums as $num ) {
					array_push( $deck, "$num$patt" );
				}
			}
			return $deck;
		}

		// 게임 시작
		public function __construct() {
			$this->deck = $this->fnc_set_deck();
			shuffle( $this->deck );
			$this->player_card = array();
			$this->dealer_card = array();
			// 2장씩 나눠주고 덱에서 빼기
			for($i = 0; $i < 2; $i++) { 
				array_push( $this->player_card, array_shift( $this->deck ) );
				array_push( $this->dealer_card, array_shift( $this->deck ) );
			}
			$this->player_score = $this->fnc_calculate_score( $this->player_card );
			$this->dealer_score = $this->fnc_calculate_score( $this->dealer_card );
		}

		// method명		: fnc_calculate_score
		// parameter 	: $havingcard
		// 기능 		: 합계 계산
		public function fnc_calculate_score( $havingcard ) {
			$sum = 0;
			foreach($havingcard as $card) {
				// A가 나왔을때 11점을 더하면 게임오버라면 1점만 더하고, 아니라면 11점을 더하기
				// strpos() : 문자열에서 특정 문자열의 첫 번째 발생 위치를 반환, 문자열이 없다면 false를 반환함
				if( strpos( $card, "A" ) !== false ) {
					if ($sum + 11 > 21) {
						$sum += 1;
					} else {
						$sum += 11;
					}
				} else if ( strpos( $card, "K" ) !== false || strpos( $card, "Q" ) !== false || strpos( $card, "J" ) !== false || strpos( $card, "10" ) !== false) {
					$sum += 10;
				} else {
					$sum += intval( substr( $card, 0, 1 ) ); // 특수기호 잘라서 int로 바꾸고 점수에 더하기
				}
			}
			return $sum;
		}

		// method명		: fnc_get_card
		// parameter 	: 없음
		// 기능 		: 1 입력시 카드 더받고 21초과인지 계산
		public function fnc_get_card() {
			array_push( $this->player_card, array_shift( $this->deck ) );
			if ( $this->fnc_calculate_score( $this->player_card ) > 21) {
				return false;
			} else {
				return true;
			}
		}

		// method명		: fnc_dealer_get_card
		// parameter 	: 없음
		// 기능 		: 딜러는 카드의 합이 17보다 낮을 경우 카드를 더 받음
		public function fnc_dealer_get_card() {
			while( $this->fnc_calculate_score( $this->dealer_card ) < 17 ) {
				array_push( $this->dealer_card, array_shift( $this->deck ) );
				if( $this->fnc_calculate_score( $this->dealer_card ) > 21 ) {
					return false;
				}
			}
			return true;
		}

		// method명		: fnc_compare_card
		// parameter 	: 없음
		// 기능 		: 2 입력시 카드 비교
		public function fnc_compare_card() {
			if( !$this->fnc_dealer_get_card() ) {
				return false;
			} else {
				return true;
			}
		}

		// method명		: fnc_check_winner
		// parameter 	: 없음
		// 기능 		: 승자 확인, 카드 갯수 카운팅
		public function fnc_check_winner() {
			if( $this->fnc_calculate_score( $this->player_card ) > 21 ) {
				return "Dealer 승리";
			} else if( $this->fnc_calculate_score( $this->dealer_card ) > 21) {
				return "Player 승리";
			} else if( $this->fnc_calculate_score( $this->player_card ) > $this->fnc_calculate_score( $this->dealer_card ) ) { // 2입력시 점수 비교
				return "Player 승리";
			} else if( $this->fnc_calculate_score( $this->player_card ) < $this->fnc_calculate_score( $this->dealer_card ) ) {
				return "Dealer 승리";
			} else {
				if ( count( $this->player_card ) < count( $this->dealer_card ) ) { // 점수가 같을경우 카드갯수 비교
					return "Player 승리";
				} else if ( count( $this->player_card ) > count( $this->dealer_card ) ) {
					return "Dealer 승리";
				} else {
					return "비겼습니다";
				}
			}
		}
	}

	$input = null; // input 초기화
	while( !( $input === 0 ) ) {
		sleep( 3 );
		$game = new Blackjack();

		echo "----------------------새 게임-----------------------";
		echo "\nPlayer 카드 : ".implode( ", ", $game->player_card )."\n";
		echo "Player 점수 : ".$game->fnc_calculate_score( $game->player_card )."\n";
		echo "\nDealer 카드 : ".implode( ", ", $game->dealer_card )."\n";
		echo "Dealer 점수 : ".$game->fnc_calculate_score( $game->dealer_card )."\n";

		while(true) {
			echo "\n1 : 카드 더받기\n2 : 카드 비교\nO : 게임 종료\n";
			echo "----------------------------------------------------\n";
			fscanf( STDIN, "%d\n", $input ); 
			if( $input === 1 ) {
				if( !$game->fnc_get_card() ) { // 1 입력시 21초과일경우 break
					echo "\nPlayer 카드 : ".implode( ", ", $game->player_card )."\n";
					echo "Player 점수 : ".$game->fnc_calculate_score( $game->player_card )."\n";
					echo "\nDealer 카드 : ".implode( ", ", $game->dealer_card )."\n";
					echo "Dealer 점수 : ".$game->fnc_calculate_score( $game->dealer_card )."\n";
					break;
				}
				echo "Player 카드 : ".implode( ", ", $game->player_card )."\n";
				echo "Player 점수 : ".$game->fnc_calculate_score( $game->player_card )."\n";
			} else if( $input === 2 ) { 
				if( !$game->fnc_compare_card() ) { // 2 입력시 점수비교
					echo "\nPlayer 카드 : ".implode( ", ", $game->player_card )."\n";
					echo "Player 점수 : ".$game->fnc_calculate_score( $game->player_card )."\n";
					echo "\nDealer 카드 : ".implode( ", ", $game->dealer_card )."\n";
					echo "Dealer 점수 : ".$game->fnc_calculate_score( $game->dealer_card )."\n";
					break;
				}
				echo "\nPlayer 카드 : ".implode( ", ", $game->player_card )."\n";
				echo "Player 점수 : ".$game->fnc_calculate_score( $game->player_card )."\n";
				echo "\nDealer 카드 : ".implode( ", ", $game->dealer_card )."\n";
				echo "Dealer 점수 : ".$game->fnc_calculate_score( $game->dealer_card )."\n";
				break;
			} else if( $input === 0 ) { // 0 입력시 break
				break;
			}
		}

		echo "\n".$game->fnc_check_winner()."\n\n";
		echo "----------------------------------------------------\n";
	}

?>

 

Github

Link