목차

 Black Jack.php 웹상에서 구동시켜보기

http://ldh1103.dothome.co.kr/blackjack.php

 

Black Jack

9♡, J♤ Player : 19 10◇, 3◇ Dealer : 13

ldh1103.dothome.co.kr

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Black Jack</title>
    <link rel=stylesheet href='blackjack2.css' type='text/css'>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-rbsA2VBKQhggwzxH7pPCaAqO46MgnOM80zW1RWuH61DGLwZJEdK2Kadq2F9CUG65" crossorigin="anonymous">
</head>
<body>
<?php
	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장씩 나눠주고 덱에서 빼기
            array_push( $this->player_card, array_shift( $this->deck ) );
            array_push( $this->player_card, array_shift( $this->deck ) );
            array_push( $this->dealer_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 "<span class='winner_msg'>Dealer 승리</span><br><br>";
			} else if( $this->fnc_calculate_score( $this->dealer_card ) > 21) {
				return "<span class='winner_msg'>Player 승리</span><br><br>";
			} else if( $this->fnc_calculate_score( $this->player_card ) > $this->fnc_calculate_score( $this->dealer_card ) ) { // 2입력시 점수 비교
				return "<span class='winner_msg'>Player 승리</span><br><br>";
			} else if( $this->fnc_calculate_score( $this->player_card ) < $this->fnc_calculate_score( $this->dealer_card ) ) {
				return "<span class='winner_msg'>Dealer 승리</span><br><br>";
			} else {
				if ( count( $this->player_card ) < count( $this->dealer_card ) ) { // 점수가 같을경우 카드갯수 비교
					return "<span class='winner_msg'>Player 승리</span><br><br>";
				} else if ( count( $this->player_card ) > count( $this->dealer_card ) ) {
					return "<span class='winner_msg'>Dealer 승리</span><br><br>";
				} else {
					return "<span class='winner_msg'>비겼습니다</span><br><br>";
				}
			}
		}
	}

    session_start();
    if ( !isset( $_SESSION['game'] ) || isset( $_POST["new_game"] ) ) {
        $_SESSION['game'] = new Blackjack();
    }
    
    $game = $_SESSION['game'];
    // pre_dump($game);

    echo "<div class='container'>";
    echo "<div class='top'>";
    if ( isset( $_POST["hit"] ) ) {
        if ( !$game->fnc_get_card() ) {
            echo $game->fnc_check_winner();
            session_unset();
            session_destroy();
        }
    } else if ( isset( $_POST["stand"] ) ) {
        $game->fnc_compare_card();
        echo $game->fnc_check_winner();
    }
    echo "</div>";

    echo "<div class='score'>";
    echo implode( ", ", $game->player_card )."<br>";
    echo "\nPlayer : ".$game->fnc_calculate_score( $game->player_card )."<br>";
    echo "<br>".implode( ", ", $game->dealer_card )."<br>";
    echo "Dealer : ".$game->fnc_calculate_score( $game->dealer_card )."<br>";
    echo "</div>";
    
    echo "<form method='POST' action='blackjack2.php'>";
    echo "<div class='btns'>";
    echo "<input type='submit' name='new_game' value='새 게임' class='btn btn-outline-dark'>";
    // 플레이어의 점수가 21점 이하고, 카드비교 버튼을 클릭하지 않았을때
    if ( $game->fnc_calculate_score( $game->player_card ) <= 21 && !isset( $_POST["stand"]) ) {
        echo "<input type='submit' name='hit' value='더 받기' class='btn btn-outline-dark btn_center'>";
        echo "<input type='submit' name='stand' value='비교' class='btn btn-outline-dark'>";
    } 
    // 카드비교 버튼을 클릭한뒤, 더받기 버튼이 반응하지않게
    else if ( $game->fnc_calculate_score( $game->player_card ) <= 21 && isset( $_POST["stand"]) ) {
        echo "<input type='button' value='더 받기' class='btn btn-outline-dark btn_center'>";
        echo "<input type='button' value='비교' class='btn btn-outline-dark'>";
    } 
    // 플레이어의 점수가 21점 이상일때, 버튼이 반응하지 않게
    else if ( $game->fnc_calculate_score( $game->player_card ) > 21 ) {
        echo "<input type='button' value='더 받기' class='btn btn-outline-dark btn_center'>";
        echo "<input type='button' value='비교' class='btn btn-outline-dark'>";
    } 
    // 카드비교 버튼을 클릭할경우 세션 종료
    else if ( isset( $_POST["stand"]) ) {
        echo "<input type='submit' name='hit' value='더 받기' class='btn btn-outline-dark btn_center'>";
        echo "<input type='submit' name='stand' value='비교' class='btn btn-outline-dark'>";
        session_unset();
        session_destroy();
    }
    echo "</div>";
    echo "</form>";
    echo "</div>";
?>
</body>
</html>

 

Github

Link

 

 

 

 

 

'PHP > PHP_TEST' 카테고리의 다른 글

Black Jack.php 게임 만들기  (0) 2023.04.23
try-catch_TEST  (0) 2023.04.04
DB connect_TEST  (0) 2023.04.01
file_TEST  (0) 2023.04.01
class_TEST  (0) 2023.03.30

+ Recent posts