简单21点纸牌小游戏纸牌显示的修改
程序员文章站
2022-05-25 14:29:44
上次写的随笔,简单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控件,来定时刷新窗体重新绘制的方法,使用这种方法要定义一个开关项,不然定时刷新重绘,窗体会不断闪烁,开关项的定义也比较繁琐,不过也是一种解决办法,如果还有更好的方法,也请大家指教。
上一篇: 对象创建,表结构就会自动生成