上次寫的隨筆,簡單21點紙牌小游戲,當窗體大小改變時,紙牌畫面會出現不顯示的問題,因為每一張牌都是用GDI+的方法,從圖片中剪裁下來的,沒有用到vs提供的控制項,如PictureBox控制項,這就需要自己在窗體的Paint事件中來重新繪製圖片,這樣在窗體大小改變時,就能夠正常顯示紙牌圖片了,代碼中紙牌父 ...
上次寫的隨筆,簡單21點紙牌小游戲,當窗體大小改變時,紙牌畫面會出現不顯示的問題,因為每一張牌都是用GDI+的方法,從圖片中剪裁下來的,沒有用到vs提供的控制項,如PictureBox控制項,這就需要自己在窗體的Paint事件中來重新繪製圖片,這樣在窗體大小改變時,就能夠正常顯示紙牌圖片了,代碼中紙牌父類PKFather中的x,y參數,提供的就是紙牌在窗體中的實際坐標,也就是每張紙牌類要在窗體中顯示時,都已經提供了在窗體上的坐標,那麼問題解決就簡單了,將需要在窗體上顯示的那幾張牌另外創建個集合,這個集合只要不為空,就在paint事件調用,這樣在窗體大小改變時就能重新繪製紙牌了。代碼如下
public partial class Form1 : Form //程式開始部分定義用來存儲需要顯示的牌 private List<RPoker> pCard = new List<RPoker>(); private void Form1_Paint(object sender, PaintEventArgs e) { if (pCard.Count > 0) { foreach (var item in pCard) { item.Draw(e.Graphics); } } } private void button1_Click(object sender, EventArgs e)//開始游戲 { pCard.Clear(); this.Refresh(); button1.Enabled = false; label1.Text = ""; label2.Text = ""; label1.Refresh(); label2.Refresh(); computerNumber = 0; playerNumber = 0; playerCount = 0; computerCount = 0; //畫玩家第一張牌 allCard[TopCard].X = 200; allCard[TopCard].Y = 200; allCard[TopCard].Draw(this.CreateGraphics()); pCard.Add(allCard[TopCard]);//要顯示牌加入集合 if (allCard[TopCard].Rank > Rank.Ten) { playerCount += 10; playerNumber += 1; } else { playerCount += (int)allCard[TopCard].Rank; playerNumber += 1; } TopCard++; if (TopCard >= 54) { Shuffle(); MessageBox.Show("新的一副牌!!"); } label2.Text = playerCount.ToString(); label2.Refresh(); label3.Text = playerNumber.ToString(); label3.Refresh(); //畫電腦第一張牌 allCard[TopCard].X = 200; allCard[TopCard].Y = 40; allCard[TopCard].Draw(this.CreateGraphics()); pCard.Add(allCard[TopCard]);//要顯示牌加入集合 if (allCard[TopCard].Rank > Rank.Ten) { computerCount += 10; computerNumber += 1; } else { computerCount += (int)allCard[TopCard].Rank; computerNumber += 1; } TopCard++; if (TopCard >= 54) { Shuffle(); // pCard.Clear(); MessageBox.Show("新的一副牌!!"); } label1.Text = computerCount.ToString(); label1.Refresh(); label4.Text = computerNumber.ToString(); label4.Refresh(); //畫玩家第二張牌 allCard[TopCard].X = 225; allCard[TopCard].Y = 200; allCard[TopCard].Draw(this.CreateGraphics()); pCard.Add(allCard[TopCard]);//要顯示牌加入集合 if (allCard[TopCard].Rank > Rank.Ten) { playerCount += 10; playerNumber += 1; } else { playerCount += (int)allCard[TopCard].Rank; playerNumber += 1; } TopCard++; if (TopCard >= 54) { Shuffle(); MessageBox.Show("新的一副牌!!"); } label2.Text = playerCount.ToString(); label2.Refresh(); label3.Text = playerNumber.ToString(); label3.Refresh(); //畫電腦第二張牌 allCard[TopCard].X = 225; allCard[TopCard].Y = 40; allCard[TopCard].Draw(this.CreateGraphics()); pCard.Add(allCard[TopCard]);//要顯示牌加入集合 if (allCard[TopCard].Rank > Rank.Ten) { computerCount += 10; computerNumber += 1; } else { computerCount += (int)allCard[TopCard].Rank; computerNumber += 1; } TopCard++; if (TopCard >= 54)// { Shuffle(); MessageBox.Show("新的一副牌!!"); } label1.Text = computerCount.ToString(); label1.Refresh(); label4.Text = computerNumber.ToString(); label4.Refresh(); button2.Enabled = true; button3.Enabled = true; }
其它地方的代碼,只要是需要顯示的牌,都加入到pCard集合中,當然還要在開始游戲的代碼開頭處加入pCard.Clear(),每次開始游戲前清空下集合,不然窗體顯示的就不一定是本輪的紙牌。
其實同一個問題,也可以有多種解法,在網上看到也有用Timer控制項,來定時刷新窗體重新繪製的方法,使用這種方法要定義一個開關項,不然定時刷新重繪,窗體會不斷閃爍,開關項的定義也比較繁瑣,不過也是一種解決辦法,如果還有更好的方法,也請大家指教。