# jQuery應用 - 德洲撲克牌 (牌型判斷) [toc] ## 賠率表 名稱 | 賠率 :---:|:---: 同花大順|250 同花順 |50 鐵支 |25 葫蘆 | 9 同花 | 6 順子 | 4 三條 | 3 兩對 | 2 一對 | 1 ## holdem.html ```htmlmixed= <!doctype html> <html lang="zh-TW"> <head> <!-- Required meta tags --> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <!-- Bootstrap CSS --> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" integrity="sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk" crossorigin="anonymous"> <!-- 引用自已定義的CSS --> <link rel="stylesheet" href="./css/template.css"> <link rel="stylesheet" href="./css/poker.css"> <link rel="stylesheet" href="./css/holdem.css"> <title>德洲撲克牌 (牌型判斷)</title> </head> <body> <div class="container"> <!-- 標題 --> <div class="row"> <div class="col"> <div class="jumbotron"> <h1 class="display-4">德洲撲克牌 (牌型判斷)</h1> </div> </div> </div> <!-- 表單 --> <div class="row"> <div class="col"> <form> <div class="form-group row"> <label for="total" class="col-sm-2 col-form-label">總資金</label> <div class="col-sm-10"> <input type="number" class="form-control" id="total" value="100000" disabled> </div> </div> <div class="form-group row"> <label for="anteMoney" class="col-sm-2 col-form-label">押注</label> <div class="col-sm-8"> <input type="number" class="form-control" id="anteMoney" value="500"> </div> <div class="col-sm-2"> <button id="ante" type="button" class="btn btn-primary">確定</button> </div> </div> <div class="form-group row"> <div class="col-sm-10"> <button id="main" type="button" class="btn btn-primary" disabled>發牌</button> </div> </div> <!-- 產生 撲克牌 的區塊--> <div class="row" id="data"> </div> <div class="form-group row"> <div class="col-sm-10"> <button id="check" type="button" class="btn btn-primary" disabled>判斷牌型</button> </div> </div> <div class="form-group row"> <label for="output" class="col-sm-2 col-form-label">牌型</label> <div class="col-sm-10"> <input type="text" class="form-control" id="output" disabled> </div> </div> </form> </div> </div> <div class="row"> <div class="col"> <footer> copyright &copy; 2020 前端程式設計 by kChen </footer> </div> </div> </div> <!-- Optional JavaScript --> <!-- jQuery first, then Popper.js, then Bootstrap JS --> <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"> </script> <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"> </script> <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.min.js" integrity="sha384-OgVRvuATP1z7JjHLkuOU7Xw704+h835Lr+6QL9UvYjZE3Ipu6Tp75j7Bh/kR0JKI" crossorigin="anonymous"> </script> <!-- 引用自己寫的 js --> <script src="./js/math.js"></script> <script src="./js/holdem.js"></script> </body> </html> ``` ## holdem.css ```css= img.poker:hover { box-shadow: 2px 2px 12px #606060; cursor: pointer; transform: translate(-10px, -10px); transition-duration: 0.5s; } ``` ## holdem.js ```javascript= // 記錄撲克牌 var poker = [] // 產生撲克牌在網頁上 var newPoker = (r) => { // 計算撲克牌目前的點數及花色 let point = Math.floor(r / 4) let color = r % 4 // 產生 img 的 jQuery 物件在變數 $img var $img = $('<img>').attr('src', './poker/pic' + (r + 1) + '.png') $img.addClass('poker') $img.attr('data-poker', r) $img.attr('data-point', point) $img.attr('data-color', color) $img.attr('data-back', false) // 當img被按到的時候 $img.on('click', (event) => { let $obj = $(event.target) // 判斷目前牌是蓋著還是翻開 if ($obj.attr('data-back') == 'true') { // 目前牌是蓋著,要執行翻牌動作 let r = $obj.attr('data-poker') r = Number(r) $obj.attr('src', './poker/pic' + (r + 1) + '.png') $obj.attr('data-back', false) } else { // 目前牌是打開的,要執行蓋牌的動作 $obj.attr('src', './poker/back.png') $obj.attr('data-back', true) } }) // 產生 div 的 jQuery 物件在變數 $div $div = $('<div>').addClass('col').addClass('poker') // 將 $img 插入到 $div 內 $div.append($img) // 將 $div 插入到網頁 id=data 的html element 裡面 $('#data').append($div) } // 發五張撲克牌 var dealFive = () => { // 產生新撲克牌 for (let i = 0; i < 52; i++) { poker.push(i) } // 洗牌 for (let i = 0; i < 100; i++) { // 隨機抽第 r 張,和第一張交換 let r = RandomInt(0, 51) let temp = poker[r] poker[r] = poker[0] poker[0] = temp } // 同花大順 poker[0] = 51 poker[1] = 39 poker[2] = 43 poker[3] = 3 poker[4] = 47 // 同花 // poker[0] = 22 // poker[1] = 38 // poker[2] = 34 // poker[3] = 18 // poker[4] = 50 // 鐵支 // poker[0] = 38 // poker[1] = 36 // poker[2] = 37 // poker[3] = 48 // poker[4] = 39 // 發牌 for (let i = 0; i < 5; i++) { newPoker(poker[i]) } } // 判斷是否是順子 var checkStraight = (card) => { let point = [...card] // 大到小的排序 point.sort((a, b) => { return a - b }); var isStraght = true for (i = 0; i < card.length - 1; i++) { if (point[i] - point[i + 1] != 1) { isStraght = false break } } return isStraght } $(() => { // 當確定按鈕按到時 $('#ante').on('click', () => { // 將押金扣除 let total = +$('#total').val() let anteMoney = +$('#anteMoney').val() total -= anteMoney $('#total').val(total) // 將發牌按鈕起動 $('#main').removeAttr('disabled') // 將押金和確定鎖住 $('#anteMoney').attr('disabled', '') $('#ante').attr('disabled', '') }) // 當發牌按鈕按到時 $('#main').on('click', () => { // 洗空桌面 $('#data').empty(); // 發五張牌 dealFive() $('#main').attr('disabled', '') $('#check').removeAttr('disabled') $('#output').removeAttr('disabled') }) // 當判斷牌型按鈕按到時 $('#check').on('click', () => { var color = ['梅花', '方塊', '愛心', '黑桃'] var point = ['A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K'] var poker_color = [] var poker_point = [] var $poker_list = $('img.poker') for (let i = 0; i < $poker_list.length; i++) { let $img = $($poker_list[i]); poker_color.push(+$img.attr('data-color')) poker_point.push(+$img.attr('data-point')) } // 統計花色出現的次數 var count_color = [0, 0, 0, 0] for (let i = 0; i < poker_color.length; i++) { count_color[poker_color[i]]++; } // 統計點數出現的次數 var count_point = [] for (let i = 0; i < 13; i++) { count_point.push(0); } for (let i = 0; i < poker_point.length; i++) { count_point[poker_point[i]]++; } // 將 count_point 複製一份到 count_point_sort var count_point_sort = [...count_point] count_point_sort.sort() // 排序,結果會是小到大 count_point_sort.reverse() // 反轉,結果就會是大到小 // 判斷是否同花 var isFlush = false var flush_color = 0 // 用來紀錄同花的顏色 for (let i = 0; i < count_color.length; i++) { if (count_color[i] == 5) { isFlush = true flush_color = i break } } // 開始判斷牌型 var strOutput = '' if (isFlush) { strOutput = color[flush_color] + '同花' } else if (count_point_sort[0] == 4) { strOutput = '鐵支' } else if (count_point_sort[0] == 3 && count_point_sort[0] == 2) { strOutput = '葫蘆' } else if (count_point_sort[0] == 3 && count_point_sort[0] == 1) { strOutput = '三條' } else if (count_point_sort[0] == 2 && count_point_sort[0] == 2) { strOutput = '兩對' } else if (count_point_sort[0] == 2 && count_point_sort[0] == 1) { strOutput = '一對' } else if (count_point_sort[0] == 1 && count_point_sort[1] == 1 && count_point_sort[2] == 1 && count_point_sort[3] == 1 && count_point_sort[4] == 1) { var isStraght = false var isBigStraght = false // 先檢查目前的牌是否有順子 isStraght = checkStraight(poker_point); // 若不是順子但牌中有A,那就要再檢查是否是大順 if (!isStraght && count_point[0] != 0) { let card = [...poker_point] // 找 A 是在那張牌 for (let i = 0; i < card.length; i++) { if (card[i] == 0) { // 第i張牌就是 A card[i] = 13 break } } isBigStraght = checkStraight(card); console.log(isBigStraght) } // 判斷剩下來的牌型 if (isFlush && isBigStraght) { strOutput = '同花大順' } else if (isFlush && isStraght) { strOutput = '同花順' } else if (isStraght) { strOutput = '順子' } else { strOutput = '散牌' } } // 將判斷的結果顯示到畫面 $('#output').val(strOutput) }) }) ``` ## poker.css ```css= #data { margin-bottom: 50px; margin-top: 20px; } div.poker { text-align: center; } ``` ###### tags: `前端程式設計` `108-1`