简单21点纸牌小游戏纸牌显示的修改

上次写的随笔,简单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控件,来定时刷新窗体重新绘制的方法,使用这种方法要定义一个开关项,不然定时刷新重绘,窗体会不断闪烁,开关项的定义也比较繁琐,不过也是一种解决办法,如果还有更好的方法,也请大家指教。


 



原文地址:https://www.cnblogs.com/chonglang/p/9750012.html

时间: 2024-11-07 10:53:14

简单21点纸牌小游戏纸牌显示的修改的相关文章

简单的猜数字小游戏

/** 简单的猜数字小游戏 要求如下: 用户输入想猜测数字的范围,输入1000则是0~1000之内的数字,程序就会内置一个 1 到 1000 之间的数字作为猜测的结果,由用户猜测此数字,用户每猜测一次,由系统提示猜测结果:大了.小了或者猜对了:直到用户猜对结果,则提示游戏结束.用户可以提前退出游戏,即,游戏过程中,如果用户录入数字0则游戏终止.加入新功能: 记次猜测次数功能,提示游戏开始时间,计猜测总用时功能,提示游戏结束时间 思路:1.用户输入电脑生成的数值取值范围,接收并判断是否是合理数值?

一个简单的“贪吃蛇”小游戏

一个简单的“贪吃蛇”小游戏 页面结构 简单的21x21的方块,页面结构 id为container的div包含所21个class名为row的div,每个row代表贪吃蛇的一整行,每个row中又包含21个div,代表这一行的每一个div方格,如果这个方格是空的话,div的类名为blank,如果这一个方格表示“贪吃蛇”的“食物”,div的类名为food,如果这一个方格表示“蛇”,div的类名为snake. CSS JS 然后我们思考下一个贪吃蛇游戏需要那些参数, 首先,界面中可见的元素无非就是空方格,

使用Python开发一个超级简单的接水果小游戏,零基础也可以学会

Pylash项目地址 创建项目 这样的话我们的项目就创建好了,然后只用往Main.py里填写代码运行即可. 编写Hello World小程序 编写游戏 有以上对pylash的小小了解,我们接下来可以开始编写游戏了.首先我们把第四行以后所有代码删除. 引入所需 全局变量 游戏里面要用到一些全局变量,大家先浏览一遍,不同知道它们是干什么的,之后会用到: 加载资源 创建开始界面 在main函数中我们调用了gameInit函数,所以添加这个函数: 开始游戏 舞台层鼠标点击事件的监听器是startGame

UIDynamicBehavior的简单使用:接球小游戏

一.概念扩充: 1.在开发中,我们可以使用UIKit中提供的仿真行为,实现与现实生活中类似的物理仿真动画,UIKit动力学最大的特点是将现实世界动力驱动的动画引入了UIKit,比如重力,铰链连接,碰撞,悬挂等效果.我们使用仿真引擎(UIDynamicAnimator)或者叫仿真者来管理和控制各种仿真行为,同时各种仿真行为可以叠加使用,可以实现力的合成. 2.只有遵守了UIDynamicItem协议的对象才可以参与到UI动力学仿真中,从iOS 7开始,UIView和UICollectionView

c语言简单的猜数字小游戏

//系统随机生成0--100的数,你猜是多少,大了或小了提示,猜对为止. #include<stdio.h> #include<stdlib.h> #include<time.h> int main() { int a=0,b=-1; int num = 1; while (num == 1) { printf("是否进行游戏(1:是 0:否)");     f: scanf("%d", &num); if ((num!=

C语言编程 如何构建一个简单的猜数字小游戏

源代码如下: #include<stdio.h> #include<stdlib.h> #include<time.h>//生成随机函数起点时用到time.h int main() { int number1 = 0, choice = 0, number2 = 0; printf("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n");//界面设置 printf(&qu

简单的canvas祖玛小游戏

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Typ

js简单的贪吃蛇小游戏

<!doctype html> <html lang="en">  <head>   <meta charset="UTF-8">   <meta name="Generator" content="EditPlus">   <meta name="Author" content="">   <meta nam

C/C++,彩色图像小游戏。

这里声明,这个游戏是由本人,在大一暑假自作的第二个小游戏,转载请注明原帖地址,谢谢! 所有图片都是我一个人用ps搞出来的,比较简单.........毕竟不是学图像制作的,请体谅!另外,图片 不放出来了要运行此程序一定要去下载ege库,因为要用到里面的一个函数库graphics,下载好了, 在项目->属性->配置属性->C/C++处添加库目录即可. 玩法是:主角做自由落体运动,不能让它掉到底线,要按左右按键使它站在上升的云条上面,这样 就能跟着上升,但是不能超过顶线,也不能越过左右边界,否