系統開發-02發牌給玩家

更新於 2024/11/07閱讀時間約 8 分鐘
raw-image


這一篇來解決上一篇的問題,使用Session來存取資料。

以下修改一下程式碼,[**新增 **]是新增的程式碼,舊的且不需要的程式碼會被註解掉

public partial class _Default : System.Web.UI.Page
{
Deck deck; //排堆
Player dealer; //莊家
Player player; //玩家

protected void Page_Load(object sender, EventArgs e)
{
//**新增**
//避免網頁載入後,每按一次按鈕都會更新(POST)
//改為網頁載入更新就好
if (IsPostBack == false)
{
ResetGame();
}

//ResetGame();
UpdateUI();
}

protected void ResetGame() { //初始化遊戲參數與動作(初始發牌)
//deck = new Deck();
//dealer = new Player();
//player = new Player();

//**新增***
//將資料存到Session
Session["Deck"] = new Deck();
Session["Dealer"] = new Player();
Session["Player"] = new Player();

//初始發牌
DrawForPlayer();
DrawForDealer();
DrawForPlayer();
DrawForDealer();

//清空label內容
lab_deck.Text = "";
lab_dealer.Text = "";
lab_player.Text = "";
}

protected void UpdateUI()
{
deck = (Deck)Session["Deck"];
lab_deck.Text = deck.ShowCards();

//**新增***
//Label顯示前先清空內容
lab_player.Text = "";
lab_dealer.Text = "";

//**新增***
player = (Player)Session["Player"];

//顯示玩家手牌
for (int i = 0; i < player.cards.Count; i++)
{
lab_player.Text += $"<img src='./images/{player.cards[i].Rank}-{player.cards[i].Suit}.png'>";
}

//**新增***
dealer = (Player)Session["Dealer"];

//顯示莊家手牌
for (int i = 0; i < dealer.cards.Count; i++)
{
lab_dealer.Text += $"<img src='./images/{dealer.cards[i].Rank}-{dealer.cards[i].Suit}.png'>";
}
}

//發牌給莊家
protected void DrawForDealer() {
//**新增***
deck = (Deck)Session["Deck"];
dealer = (Player)Session["Dealer"];

Card c = deck.DrawCard();
dealer.AddCard(c); //加到手牌

//**新增***
Session["Dealer"] = dealer;
Session["Deck"] = deck;
}

//發牌給玩家
protected void DrawForPlayer() {
//**新增***
deck = (Deck)Session["Deck"];
player = (Player)Session["Player"];

Card c = deck.DrawCard();
player.AddCard(c); //加到手牌

//**新增***
Session["Player"] = player;
Session["Deck"] = deck;
}

//按鈕OnClick後觸發
//玩家要牌,呼叫DrawForPlayer()
protected void btn_hit_Click(object sender, EventArgs e)
{
DrawForPlayer();

//**新增***
UpdateUI();
}

//玩家停牌,換莊家要牌DrawForDealer(),直到計分比較輸贏
protected void btn_stand_Click(object sender, EventArgs e)
{
DrawForDealer();

//**新增***
UpdateUI();
}

//新牌局(下一回合),呼叫NextRound()
protected void btn_newgame_Click(object sender, EventArgs e)
{
ResetGame();
}

protected void NextRound() { } //下一回合,呼叫ResetGame()
}

程式執行結果:

raw-image

用Session存取資料後,排堆(Deck)裡面發出來的牌,會和按下發牌(Hit)後的牌相同,不會再因為網頁被更新而無法保留資料。

下一篇來加上玩家的分數計算與超過21點(爆牌)的判斷。


Ps.此程式沒有限制只能發52張牌,所以一直按下發牌(Hit)是會一直發牌的,但超過52張會發生錯誤;沒有限制的原因是21點遊戲只有兩個人玩不會發到52張,且後面會有計算點數的控制來結束牌局。


    avatar-img
    0會員
    19內容數
    FIRE
    留言0
    查看全部
    avatar-img
    發表第一個留言支持創作者!
    你可能也想看
    Google News 追蹤
    Thumbnail
    *合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
    Thumbnail
    徵的就是你 🫵 超ㄅㄧㄤˋ 獎品搭配超瞎趴的四大主題,等你踹共啦!還有機會獲得經典的「偉士牌樂高」喔!馬上來參加本次的活動吧!
    Thumbnail
    這篇文章介紹了網站的整體架構以及開發時所使用的工具和套件,包括 Next.js、Tailwind CSS 和 socket.io 等。文章回顧了程式碼的重構與優化,幫助開發者提高工作效率,適合希望深入瞭解前端開發和網站架構的讀者。
    Thumbnail
    這篇內容,將會講解什麼是函式,以及與函式相關的知識。包括函式的簡介、Runtime Function、自訂函式、Script Function 腳本函式、Method 方法。
    Thumbnail
    這篇內容,將簡單介紹Asset Browser、Workspace、Inspector、Code Browser,作為入門的介面導覽。
    Thumbnail
    這篇內容,將教你如何開啟新的GameMaker專案,並調整畫面佈局。也會講解,為何建議用英文語系,來進行遊戲開發。
    Thumbnail
    到存放虛擬機的磁碟處\點選想要註冊的機器\註冊機器(登錄虛擬機器)
    Thumbnail
    題目敘述 題目會給我們一組定義好的界面和需求,要求我們設計一個資料結構,可以滿足平均O(1)的插入元素、刪除元素、隨機取得元素的操作。 RandomizedSet() 類別建構子 bool insert(int val) 插入元素的function界面 bool remove(int val
    Thumbnail
    *合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
    Thumbnail
    徵的就是你 🫵 超ㄅㄧㄤˋ 獎品搭配超瞎趴的四大主題,等你踹共啦!還有機會獲得經典的「偉士牌樂高」喔!馬上來參加本次的活動吧!
    Thumbnail
    這篇文章介紹了網站的整體架構以及開發時所使用的工具和套件,包括 Next.js、Tailwind CSS 和 socket.io 等。文章回顧了程式碼的重構與優化,幫助開發者提高工作效率,適合希望深入瞭解前端開發和網站架構的讀者。
    Thumbnail
    這篇內容,將會講解什麼是函式,以及與函式相關的知識。包括函式的簡介、Runtime Function、自訂函式、Script Function 腳本函式、Method 方法。
    Thumbnail
    這篇內容,將簡單介紹Asset Browser、Workspace、Inspector、Code Browser,作為入門的介面導覽。
    Thumbnail
    這篇內容,將教你如何開啟新的GameMaker專案,並調整畫面佈局。也會講解,為何建議用英文語系,來進行遊戲開發。
    Thumbnail
    到存放虛擬機的磁碟處\點選想要註冊的機器\註冊機器(登錄虛擬機器)
    Thumbnail
    題目敘述 題目會給我們一組定義好的界面和需求,要求我們設計一個資料結構,可以滿足平均O(1)的插入元素、刪除元素、隨機取得元素的操作。 RandomizedSet() 類別建構子 bool insert(int val) 插入元素的function界面 bool remove(int val