C#制作无边框纸牌游戏

以前打算做一个俄罗斯方块,做了一半不到,遇到了瓶颈,可能是没有什么压力,放弃了。

这次做纸牌,是因为老师布置的大作业其中有一个可选题目就是“纸牌”,挑战一下自己,就选择了这个对我来说有难度的题目,毕竟,这也是一次强迫自己学习的机会。

首先说一下我的思路。

52张牌,本来打算用52个PictureBox,但是代码写了大概一百多行的时候,发现遇到了难以继续的问题。由于以前的代码已经删除,现在也不知道是什么问题了。

后来经过老师的指导,决定采用直接画图的形式表现牌。由于之前也做过一个连连看的游戏,也是采用直接画图的形式,所以感觉这对我来说会容易一些。

程序采用无边框设计。现将Form1的FormBorderStyle属性设为None,然后用两个Panel将Form1完全覆盖。这两个Panel分别命名为panel_title和panel_operate。panel_title用于代替原来的上边框,可以用来拖动程序界面,而panel_operate用于游戏操作。

程序开始时先检查当前目录是否存在资源文件,检测全部存在后将这些资源文件(53张扑克牌图片)用一个ImageList存储(现在回想起来,是不应该用ImageList的,因为ImageList存储图片时有大小限制。)这些图片。有一个card类,用于表示每一张牌,每张牌有index,pile,index_of_pile,showface,left_up_point属性,index表示牌的值,比如方片A的index是0,而黑桃A的inedx是39,这样可以确定牌的唯一性,pile表示所属摞,桌面上共有14摞牌,index_of_pile表示牌在所属摞里的顺序,showface表示是否显示正面。整副牌用一个数组card_pack表示。

然后是洗牌,card_pack的每一个成员表示一张牌,洗牌则随机安排每个成员的index值。

洗牌后发牌,发牌就是按顺序把洗好的牌发到每一摞。鼠标那一摞不发牌。

然后还要统计每一摞的牌,为后面的绘制做准备。

这些准备工作做好了,就要把牌画到panel_operate上了。这里用了两个Bitmap(现在回想起来,其实不需要两张),一张用于将所有的扑克牌绘制到上面,另一个则在前一个绘制完成后复制其画面,再绘制到panel_operate上。

游戏操作只有鼠标的mousedown,mousemove,mouseup,mousedoubleclick几种操作。通过检测鼠标的操作以及坐标来确定牌的变化,然后统计、绘制。就是这个循环,直到游戏完成目标。

下面上代码(因为我的确是新手,代码经验严重不足,还希望大家多提意见,不胜感激)

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.Collections;

namespace 纸牌
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        class card
        {
            public int index;
            public bool show_face;
            public int pile;
            public int index_of_pile;
            public Point left_up_point;
        }
        static int H = 30;
        static int W = 30;
        Point point_mousedown_on_panel_title;
        Point point_mousedown_on_panel_operate;
        Point[] point_14_pile_initial_pozition = new Point[14];//第14个点是鼠标那一摞的坐标
        ImageList imagelist;//最好不用Imagelist来存储图像,因为Imagelist有大小限制
        Bitmap bmp_draw;
        Bitmap bmp_show;
        card[] card_pack = new card[52];
        Timer timer_draw;
        Timer timer_time;
        bool is_ready_draw;
        int selected_index;
        int old_pile;
        ArrayList[] arylist_14_pile = new ArrayList[14];
        void xipai()
        {
            ArrayList arraylist = new ArrayList();
            for (int i = 0; i < 52; i++)
            {
                arraylist.Add(i);
            }
            Random rd = new Random();
            int n;
            for (int i = 0; i < 52; i++)
            {
                card_pack[i] = new card();
                n = rd.Next(0, arraylist.Count);
                card_pack[i].index = (int)arraylist[n];
                arraylist.RemoveAt(n);
            }
        }
        void fapai()
        {
            for (int i = 0; i < 52; i++)
            {
                card_pack[i].show_face = false;
            }
            for (int i = 0; i < 7; i++)
            {
                card_pack[51 - i].pile = 12;
                card_pack[51 - i].index_of_pile = i;
            }
            card_pack[45].show_face = true;
            for (int i = 0; i < 6; i++)
            {
                card_pack[44 - i].pile = 11;
                card_pack[44 - i].index_of_pile = i;
            }
            card_pack[39].show_face = true;
            for (int i = 0; i < 5; i++)
            {
                card_pack[38 - i].pile = 10;
                card_pack[38 - i].index_of_pile = i;
            }
            card_pack[34].show_face = true;
            for (int i = 0; i < 4; i++)
            {
                card_pack[33 - i].pile = 9;
                card_pack[33 - i].index_of_pile = i;
            }
            card_pack[30].show_face = true;
            for (int i = 0; i < 3; i++)
            {
                card_pack[29 - i].pile = 8;
                card_pack[29 - i].index_of_pile = i;
            }
            card_pack[27].show_face = true;
            for (int i = 0; i < 2; i++)
            {
                card_pack[26 - i].pile = 7;
                card_pack[26 - i].index_of_pile = i;
            }
            card_pack[25].show_face = true;
            card_pack[24].pile = 6;
            card_pack[24].index_of_pile = 0;
            card_pack[24].show_face = true;
            for (int i = 0; i < 24; i++)
            {
                card_pack[i].pile = 0;
                card_pack[i].index_of_pile = i;
            }
        }
        void sort_arylist_14_pile()
        {
            for (int i = 0; i < 14; i++)
            {
                int index_temp = 0;
                arylist_14_pile[i] = new ArrayList();
                ArrayList arylist_temp = new ArrayList();
                for (int j = 0; j < 52; j++)//收集
                {
                    if (card_pack[j].pile == i)
                    {
                        arylist_14_pile[i].Add(card_pack[j]);
                    }
                }
                while (arylist_temp.Count < arylist_14_pile[i].Count)//排序
                {
                    for (int j = 0; j < arylist_14_pile[i].Count; j++)
                    {
                        card card_temp = (card)arylist_14_pile[i][j];
                        if (card_temp.index_of_pile == index_temp)
                        {
                            arylist_temp.Add(card_temp);
                            index_temp++;
                            break;
                        }
                    }
                }
                arylist_14_pile[i] = arylist_temp;
            }
            for (int i = 0; i < 14; i++)
            {
                if (i == 0)
                {
                    for (int j = 0; j < arylist_14_pile[i].Count; j++)
                    {
                        card card_temp = (card)arylist_14_pile[i][j];
                        for (int k = 0; k < 52; k++)
                        {
                            if (card_pack[k].index == card_temp.index)
                            {
                                card_pack[k].left_up_point = point_14_pile_initial_pozition[i];
                                break;
                            }
                        }
                    }
                }
                else if (i == 1)
                {
                    if (arylist_14_pile[i].Count > 0)
                    {
                        int flag = 0;
                        for (int j = 0; j < arylist_14_pile[i].Count; j++)
                        {
                            card card_temp = (card)arylist_14_pile[i][j];
                            for (int k = 0; k < 52; k++)
                            {
                                if (card_pack[k].index == card_temp.index)
                                {
                                    if (card_temp.show_face == false)
                                    {
                                        card_pack[k].left_up_point = point_14_pile_initial_pozition[i];
                                    }
                                    else if (card_temp.show_face == true)
                                    {
                                        card_pack[k].left_up_point = new Point(point_14_pile_initial_pozition[i].X + flag * W, point_14_pile_initial_pozition[i].Y);
                                        flag++;
                                    }
                                    break;
                                }
                            }
                        }
                    }
                }
                else if (i >= 2 && i <= 5)
                {
                    for (int j = 0; j < arylist_14_pile[i].Count; j++)
                    {
                        card card_temp = (card)arylist_14_pile[i][j];
                        for (int k = 0; k < 52; k++)
                        {
                            if (card_pack[k].index == card_temp.index)
                            {
                                card_pack[k].left_up_point = point_14_pile_initial_pozition[i];
                                break;
                            }
                        }
                    }
                }
                else if (i >= 6 && i <= 12)
                {
                    for (int j = 0; j < arylist_14_pile[i].Count; j++)
                    {
                        card card_temp = (card)arylist_14_pile[i][j];
                        for (int k = 0; k < 52; k++)
                        {
                            if (card_pack[k].index == card_temp.index)
                            {
                                card_pack[k].left_up_point = new Point(point_14_pile_initial_pozition[i].X, point_14_pile_initial_pozition[i].Y + j * H);
                                break;
                            }
                        }
                    }
                }
                else if (i == 13)
                {
                    for (int j = 0; j < arylist_14_pile[i].Count; j++)
                    {
                        card card_temp = (card)arylist_14_pile[i][j];
                        for (int k = 0; k < 52; k++)
                        {
                            if (card_pack[k].index == card_temp.index)
                            {
                                card_pack[k].left_up_point = new Point(point_14_pile_initial_pozition[i].X, point_14_pile_initial_pozition[i].Y + j * H);
                                break;
                            }
                        }
                    }
                }
            }
        }
        void draw()
        {
            if (is_ready_draw == false)
            {
                return;
            }
            bmp_draw = new Bitmap(panel_operate.Width, panel_operate.Height);
            Graphics g = Graphics.FromImage(bmp_draw);
            Brush brush = new SolidBrush(Color.Gray);
            g.FillRectangle(brush, new Rectangle(0, 0, panel_operate.Width, panel_operate.Height));
            if (arylist_14_pile[0].Count != 0)
            {
                g.DrawImage(imagelist.Images[52], point_14_pile_initial_pozition[0]);
            }
            if (arylist_14_pile[1].Count != 0)
            {
                ArrayList ary_temp_back = new ArrayList();
                ArrayList ary_temp_face = new ArrayList();
                for (int i = 0; i < arylist_14_pile[1].Count; i++)
                {
                    card card_temp = (card)arylist_14_pile[1][i];
                    if (card_temp.show_face == true)
                    {
                        ary_temp_face.Add(card_temp);
                    }
                    else
                    {
                        ary_temp_back.Add(card_temp);
                    }
                }
                if (ary_temp_back.Count > 0)
                {
                    g.DrawImage(imagelist.Images[52], point_14_pile_initial_pozition[1]);
                }
                for (int i = 0; i < ary_temp_face.Count; i++)
                {
                    card card_temp = (card)ary_temp_face[i];
                    g.DrawImage(imagelist.Images[card_temp.index], new Point(point_14_pile_initial_pozition[1].X + i * W, point_14_pile_initial_pozition[1].Y));
                }
            }
            for (int i = 2; i <= 5; i++)
            {
                if (arylist_14_pile[i].Count != 0)
                {
                    card card_temp = (card)arylist_14_pile[i][arylist_14_pile[i].Count - 1];
                    g.DrawImage(imagelist.Images[card_temp.index], point_14_pile_initial_pozition[i]);
                }
            }
            for (int i = 6; i <= 13; i++)
            {
                if (arylist_14_pile[i].Count != 0)
                {
                    for (int j = 0; j < arylist_14_pile[i].Count; j++)
                    {
                        card card_temp = (card)arylist_14_pile[i][j];
                        if (card_temp.show_face == true)
                        {
                            g.DrawImage(imagelist.Images[card_temp.index], new Point(point_14_pile_initial_pozition[i].X, point_14_pile_initial_pozition[i].Y + H * j));
                        }
                        else if (card_temp.show_face == false)
                        {
                            g.DrawImage(imagelist.Images[52], new Point(point_14_pile_initial_pozition[i].X, point_14_pile_initial_pozition[i].Y + H * j));
                        }
                    }
                }
            }
            bmp_show = bmp_draw;
            Graphics g_panel_operate = panel_operate.CreateGraphics();
            g_panel_operate.DrawImage(bmp_show, 0, 0);
            bmp_draw.Dispose();
            brush.Dispose();
            g.Dispose();
            g_panel_operate.Dispose();
            GC.Collect();//强制立即回收垃圾
        }
        #region//检查并创建图片序列
        bool add_poker_in_huase(string s1, string s2)//按照花色添加
        {
            bool bl = true;
            if (!File.Exists(@"poker\\" + s2 + "\\" + s1 + "A.png"))
            {
                imagelist.Images.Clear();
                return false;
            }
            imagelist.Images.Add(Image.FromFile(@"poker\\" + s2 + "\\" + s1 + "A.png"));
            for (int i = 2; i < 11; i++)
            {
                if (!File.Exists(@"poker\\" + s2 + "\\" + s1 + i.ToString() + ".png"))
                {
                    imagelist.Images.Clear();
                    return false;
                }
                imagelist.Images.Add(Image.FromFile(@"poker\\" + s2 + "\\" + s1 + i.ToString() + ".png"));
            }
            if (!File.Exists(@"poker\\" + s2 + "\\" + s1 + "J.png"))
            {
                imagelist.Images.Clear();
                return false;
            }
            imagelist.Images.Add(Image.FromFile(@"poker\\" + s2 + "\\" + s1 + "J.png"));
            if (!File.Exists(@"poker\\" + s2 + "\\" + s1 + "Q.png"))
            {
                imagelist.Images.Clear();
                return false;
            }
            imagelist.Images.Add(Image.FromFile(@"poker\\" + s2 + "\\" + s1 + "Q.png"));
            if (!File.Exists(@"poker\\" + s2 + "\\" + s1 + "K.png"))
            {
                imagelist.Images.Clear();
                return false;
            }
            imagelist.Images.Add(Image.FromFile(@"poker\\" + s2 + "\\" + s1 + "K.png"));
            return bl;
        }
        bool ini_imagelist()
        {
            bool bl = true;
            imagelist = new ImageList();
            imagelist.ImageSize = new Size(120, 160);
            imagelist.Images.Clear();
            if (!add_poker_in_huase("fp", "方片"))
            { return false; }
            if (!add_poker_in_huase("ch", "草花"))
            { return false; }
            if (!add_poker_in_huase("hx", "红心"))
            { return false; }
            if (!add_poker_in_huase("ht", "黑桃"))
            { return false; }
            if (!File.Exists(@"poker\\back.png"))
            { return false; }
            imagelist.Images.Add(Image.FromFile(@"poker\\back.png"));
            return bl;
        }
        #endregion
        void ini_point_14_pile_initial_pozition()
        {
            for (int i = 0; i < 7; i++)
            {
                point_14_pile_initial_pozition[i + 6] = new Point(130 * i, 170);
            }
            for (int i = 0; i < 2; i++)
            {
                point_14_pile_initial_pozition[i] = new Point(point_14_pile_initial_pozition[i + 6].X, 0);
            }
            for (int i = 0; i < 4; i++)
            {
                point_14_pile_initial_pozition[2 + i] = new Point(point_14_pile_initial_pozition[9 + i].X, 0);
            }
            point_14_pile_initial_pozition[13] = point_14_pile_initial_pozition[0];
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            panel_title.MouseDown += panel_title_MouseDown;
            panel_title.MouseMove += panel_title_MouseMove;
            button_min.Click += button_min_Click;
            button_close.Click += button_close_Click;
            button_newgame.Click += button_newgame_Click;
            button_undo.Click += button_undo_Click;
            panel_operate.MouseDown += panel_operate_MouseDown;
            panel_operate.MouseMove += panel_operate_MouseMove;
            panel_operate.MouseUp += panel_operate_MouseUp;
            panel_operate.MouseDoubleClick += panel_operate_MouseDoubleClick;
            is_ready_draw = false;
            timer_draw = new Timer();
            timer_draw.Interval = 10;
            timer_draw.Tick += timer_draw_Tick;
            timer_time = new Timer();
            timer_time.Interval = 1000;
            timer_time.Tick += timer_time_Tick;
            ini_point_14_pile_initial_pozition();
            if (ini_imagelist())
            {
                selected_index = -1;
                xipai();
                fapai();
                sort_arylist_14_pile();
                draw();
            }
            else
            {
                MessageBox.Show("程序目录下缺少资源文件,请检查。");
                this.Close();
            }
            is_ready_draw = true;
            timer_draw.Enabled = true;
        }

        void timer_time_Tick(object sender, EventArgs e)
        {

        }

        void timer_draw_Tick(object sender, EventArgs e)
        {
            draw();
        }

        bool is_completed()
        {
            bool bl = true;
            for (int i = 0; i < 52; i++)
            {
                if (card_pack[i].show_face == false != arylist_14_pile[1].Count > 0)
                {
                    bl = false;
                    break;
                }
            }
            return bl;
        }

        void panel_operate_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            if (arylist_14_pile[13].Count == 0)
            {
                return;
            }
            is_ready_draw = false;
            bool is_add = false;
            card card_temp = (card)arylist_14_pile[13][0];
            for (int i = 0; i < 52; i++)
            {
                if (card_pack[i].index == card_temp.index)
                {
                    for (int j = 0; j <= 12; j++)
                    {
                        if (j >= 2 && j <= 5 && j != old_pile && arylist_14_pile[13].Count == 1)
                        {
                            if (arylist_14_pile[j].Count == 0)
                            {
                                if (card_pack[i].index % 13 == 0)
                                {
                                    is_add = true;
                                    card_pack[i].pile = j;
                                    card_pack[i].index_of_pile = 0;
                                    break;
                                }
                            }
                            else if (arylist_14_pile[j].Count > 0)
                            {
                                card card_temp_temp = (card)arylist_14_pile[j][arylist_14_pile[j].Count - 1];
                                if (card_pack[i].index % 13 - card_temp_temp.index % 13 == 1 && card_pack[i].index / 13 == card_temp_temp.index / 13)
                                {
                                    is_add = true;
                                    card_pack[i].pile = j;
                                    card_pack[i].index_of_pile = arylist_14_pile[j].Count;
                                    break;
                                }
                            }
                        }
                        if (j >= 6 && j <= 12 && j != old_pile)
                        {
                            if (arylist_14_pile[j].Count == 0)
                            {
                                if (card_pack[i].index % 13 == 12)
                                {
                                    is_add = true;
                                    for (int k = 0; k < arylist_14_pile[13].Count; k++)
                                    {
                                        card card_temp_temp = (card)arylist_14_pile[13][k];
                                        for (int l = 0; l < 52; l++)
                                        {
                                            if (card_pack[l].index == card_temp_temp.index)
                                            {
                                                card_pack[l].pile = j;
                                                card_pack[l].index_of_pile = k;
                                                break;
                                            }
                                        }
                                    }
                                    break;
                                }
                            }
                            if (arylist_14_pile[j].Count > 0)
                            {
                                card card_temp_temp = (card)arylist_14_pile[j][arylist_14_pile[j].Count - 1];
                                if (card_temp_temp.index % 13 - card_pack[i].index % 13 == 1 && Math.Abs(card_pack[i].index / 13 - card_temp_temp.index / 13) % 2 == 1)
                                {
                                    is_add = true;
                                    for (int k = 0; k < arylist_14_pile[13].Count; k++)
                                    {
                                        card card_temp_temp_temp = (card)arylist_14_pile[13][k];
                                        for (int l = 0; l < 52; l++)
                                        {
                                            if (card_pack[l].index == card_temp_temp_temp.index)
                                            {
                                                card_pack[l].pile = j;
                                                card_pack[l].index_of_pile = arylist_14_pile[j].Count + k;
                                                break;
                                            }
                                        }
                                    }
                                    break;
                                }
                            }
                        }
                    }
                    break;
                }
            }
            if (is_add)
            {
                sort_arylist_14_pile();
                if (arylist_14_pile[old_pile].Count > 0 && old_pile != 1)
                {
                    card card_temp_temp_temp = (card)arylist_14_pile[old_pile][arylist_14_pile[old_pile].Count - 1];
                    for (int i__ = 0; i__ < 52; i__++)
                    {
                        if (card_pack[i__].index == card_temp_temp_temp.index)
                        {
                            card_pack[i__].show_face = true;
                        }
                    }
                    sort_arylist_14_pile();
                }
                is_ready_draw = true;
                if (is_completed())
                {
                    MessageBox.Show("恭喜,你完成了!");
                    panel_operate.Refresh();
                    timer_draw.Enabled = false;
                }
            }
            is_ready_draw = true;
        }

        void panel_operate_MouseUp(object sender, MouseEventArgs e)
        {
            if (arylist_14_pile[13].Count == 0)
            {
                return;
            }
            is_ready_draw = false;
            int mouse_up_index = detect_selected_index(e.X, e.Y);
            bool is_add = false;
            if (mouse_up_index == -1)
            {
                card card_temp_temp = (card)arylist_14_pile[13][0];
                for (int _i = 2; _i <= 12; _i++)
                {
                    if (_i >= 2 && _i <= 5)
                    {
                        if (card_temp_temp.index % 13 == 0 && arylist_14_pile[_i].Count == 0 && e.X - point_14_pile_initial_pozition[_i].X > 0 && e.X - point_14_pile_initial_pozition[_i].X < 120 && e.Y - point_14_pile_initial_pozition[_i].Y > 0 && e.Y - point_14_pile_initial_pozition[_i].Y < 160)
                        {
                            is_add = true;
                            for (int i = 0; i < arylist_14_pile[13].Count; i++)
                            {
                                card card_temp = (card)arylist_14_pile[13][i];
                                for (int j = 0; j < 52; j++)
                                {
                                    if (card_pack[j].index == card_temp.index)
                                    {
                                        card_pack[j].pile = _i;
                                        card_pack[j].index_of_pile = arylist_14_pile[_i].Count + i;
                                        break;
                                    }
                                }
                            }
                            break;
                        }
                    }
                    if (_i >= 6 && _i <= 12)
                    {
                        if (card_temp_temp.index % 13 == 12 && arylist_14_pile[_i].Count == 0 && e.X - point_14_pile_initial_pozition[_i].X > 0 && e.X - point_14_pile_initial_pozition[_i].X < 120 && e.Y - point_14_pile_initial_pozition[_i].Y > 0 && e.Y - point_14_pile_initial_pozition[_i].Y < 160)
                        {
                            is_add = true;
                            for (int i = 0; i < arylist_14_pile[13].Count; i++)
                            {
                                card card_temp = (card)arylist_14_pile[13][i];
                                for (int j = 0; j < 52; j++)
                                {
                                    if (card_pack[j].index == card_temp.index)
                                    {
                                        card_pack[j].pile = _i;
                                        card_pack[j].index_of_pile = arylist_14_pile[_i].Count + i;
                                        break;
                                    }
                                }
                            }
                            break;
                        }
                    }
                }
            }
            else if (mouse_up_index != -1)
            {
                for (int i = 0; i < 52; i++)
                {
                    if (card_pack[i].index == mouse_up_index)
                    {
                        if (card_pack[i].index_of_pile == arylist_14_pile[card_pack[i].pile].Count - 1)
                        {
                            if (card_pack[i].pile != 1)
                            {
                                card card_temp = (card)arylist_14_pile[13][0];
                                for (int j = 2; j <= 12; j++)
                                {
                                    if (j >= 2 && j <= 5 && arylist_14_pile[13].Count == 1)
                                    {
                                        if (card_temp.index - card_pack[i].index == 1 && card_temp.index / 13 == card_pack[i].index / 13)
                                        {
                                            is_add = true;
                                            for (int k = 0; k < 52; k++)
                                            {
                                                if (card_pack[k].index == card_temp.index)
                                                {
                                                    card_pack[k].pile = card_pack[i].pile;
                                                    card_pack[k].index_of_pile = arylist_14_pile[card_pack[i].pile].Count;
                                                    break;
                                                }
                                            }
                                            break;
                                        }
                                    }
                                    else if (j >= 6 && j <= 12)
                                    {
                                        if (card_pack[i].index % 13 - card_temp.index % 13 == 1 && Math.Abs(card_pack[i].index / 13 - card_temp.index / 13) % 2 == 1)
                                        {
                                            is_add = true;
                                            for (int k = 0; k < arylist_14_pile[13].Count; k++)
                                            {
                                                card card_temp_temp = (card)arylist_14_pile[13][k];
                                                for (int l = 0; l < 52; l++)
                                                {
                                                    if (card_pack[l].index == card_temp_temp.index)
                                                    {
                                                        card_pack[l].pile = card_pack[i].pile;
                                                        card_pack[l].index_of_pile = arylist_14_pile[card_pack[i].pile].Count + k;
                                                        break;
                                                    }
                                                }
                                            }
                                            break;
                                        }
                                    }
                                }
                            }
                        }
                        break;
                    }
                }
            }
            if (!is_add)
            {
                for (int i = 0; i < arylist_14_pile[13].Count; i++)
                {
                    card card_temp = (card)arylist_14_pile[13][i];
                    for (int j = 0; j < 52; j++)
                    {
                        if (card_pack[j].index == card_temp.index)
                        {
                            card_pack[j].pile = old_pile;
                            card_pack[j].index_of_pile = arylist_14_pile[old_pile].Count + i;
                            break;
                        }
                    }
                }
            }
            sort_arylist_14_pile();
            if (arylist_14_pile[old_pile].Count > 0 && old_pile != 1)
            {
                card card_temp_temp_temp = (card)arylist_14_pile[old_pile][arylist_14_pile[old_pile].Count - 1];
                for (int i__ = 0; i__ < 52; i__++)
                {
                    if (card_pack[i__].index == card_temp_temp_temp.index)
                    {
                        card_pack[i__].show_face = true;
                    }
                }
                sort_arylist_14_pile();
            }
            is_ready_draw = true;
            if (is_completed())
            {
                MessageBox.Show("恭喜,你完成了!");
                panel_operate.Refresh();
                timer_draw.Enabled = false;
            }
        }

        void panel_operate_MouseMove(object sender, MouseEventArgs e)
        {
            if (arylist_14_pile[13].Count == 0)
            {
                return;
            }
            is_ready_draw = false;
            if (e.Button == MouseButtons.Left)
            {
                for (int i = 0; i < 52; i++)
                {
                    if (card_pack[i].index == selected_index)
                    {
                        point_14_pile_initial_pozition[13] = new Point(card_pack[i].left_up_point.X + e.X - point_mousedown_on_panel_operate.X, card_pack[i].left_up_point.Y + e.Y - point_mousedown_on_panel_operate.Y);
                    }
                }
            }
            is_ready_draw = true;
        }

        int detect_selected_index(int e_x, int e_y)//检测被选中的牌的值
        {

            int selected_index_temp = -1;
            ArrayList arylist_temp = new ArrayList();
            for (int i = 0; i < 52; i++)//收集
            {
                if (card_pack[i].show_face == true && card_pack[i].pile != 0 && card_pack[i].pile != 13)
                {
                    arylist_temp.Add(card_pack[i]);
                }
            }
            ArrayList arylist_temp_temp = new ArrayList();
            for (int i = 0; i < arylist_temp.Count; i++)//再收集
            {
                card card_temp = (card)arylist_temp[i];
                if (e_x - card_temp.left_up_point.X > 0 && e_x - card_temp.left_up_point.X < 120 && e_y - card_temp.left_up_point.Y > 0 && e_y - card_temp.left_up_point.Y < 160)
                {
                    arylist_temp_temp.Add(card_temp);
                }
            }
            int flag = 0;
            for (int i = 0; i < arylist_temp_temp.Count; i++)//确定
            {
                card card_temp = (card)arylist_temp_temp[i];
                if (card_temp.index_of_pile >= flag)
                {
                    flag = card_temp.index_of_pile;
                    selected_index_temp = card_temp.index;
                }
                for (int i_ = 0; i_ < 52; i_++)
                {
                    if (card_pack[i_].index == selected_index_temp)
                    {
                        if (card_pack[i_].pile == 1 && card_pack[i_].index_of_pile != arylist_14_pile[card_pack[i_].pile].Count - 1)
                        {
                            selected_index_temp = -1;
                        }
                    }
                }
            }
            return selected_index_temp;
        }

        void panel_operate_MouseDown(object sender, MouseEventArgs e)
        {
            is_ready_draw = false;
            point_mousedown_on_panel_operate = new Point(e.X, e.Y);
            if (e.X - point_14_pile_initial_pozition[0].X > 0 && e.X - point_14_pile_initial_pozition[0].X < 120 && e.Y - point_14_pile_initial_pozition[0].Y > 0 && e.Y - point_14_pile_initial_pozition[0].Y < 160 && arylist_14_pile[0].Count > 0)
            {
                for (int _i = 0; _i < arylist_14_pile[1].Count; _i++)
                {
                    card card_temp = (card)arylist_14_pile[1][_i];
                    for (int j = 0; j < 52; j++)
                    {
                        if (card_pack[j].index == card_temp.index)
                        {
                            card_pack[j].show_face = false;
                        }
                    }
                }
                if (arylist_14_pile[0].Count < 3)
                {
                    for (int i = 0; i < arylist_14_pile[0].Count; i++)
                    {
                        card card_temp = (card)arylist_14_pile[0][arylist_14_pile[0].Count - 1 - i];
                        for (int j = 0; j < 52; j++)
                        {
                            if (card_pack[j].index == card_temp.index)
                            {
                                card_pack[j].pile = 1;
                                card_pack[j].index_of_pile = arylist_14_pile[1].Count + i;
                                card_pack[j].show_face = true;
                            }
                        }
                    }
                }
                else if (arylist_14_pile[0].Count > 2)
                {
                    for (int i = 0; i < 3; i++)
                    {
                        card card_temp = (card)arylist_14_pile[0][arylist_14_pile[0].Count - 1 - i];
                        for (int j = 0; j < 52; j++)
                        {
                            if (card_pack[j].index == card_temp.index)
                            {
                                card_pack[j].pile = 1;
                                card_pack[j].index_of_pile = arylist_14_pile[1].Count + i;
                                card_pack[j].show_face = true;
                            }
                        }
                    }
                }
            }
            else if (e.X - point_14_pile_initial_pozition[0].X > 0 && e.X - point_14_pile_initial_pozition[0].X < 120 && e.Y - point_14_pile_initial_pozition[0].Y > 0 && e.Y - point_14_pile_initial_pozition[0].Y < 160 && arylist_14_pile[0].Count == 0 && arylist_14_pile[1].Count > 0)
            {
                for (int i = 0; i < arylist_14_pile[1].Count; i++)
                {
                    card card_temp = (card)arylist_14_pile[1][arylist_14_pile[1].Count - 1 - i];
                    for (int j = 0; j < 52; j++)
                    {
                        if (card_pack[j].index == card_temp.index)
                        {
                            card_pack[j].pile = 0;
                            card_pack[j].index_of_pile = arylist_14_pile[0].Count + i;
                            card_pack[j].show_face = false;
                        }
                    }
                }
            }
            else
            {
                selected_index = detect_selected_index(e.X, e.Y);
                if (selected_index != -1)
                {
                    for (int i = 0; i < 52; i++)
                    {
                        if (card_pack[i].index == selected_index)
                        {
                            old_pile = card_pack[i].pile;
                            point_14_pile_initial_pozition[13] = card_pack[i].left_up_point;
                            int flag = 0;
                            for (int j = 0; j < arylist_14_pile[old_pile].Count; j++)
                            {
                                card card_temp = (card)arylist_14_pile[old_pile][j];
                                if (card_temp.index_of_pile >= card_pack[i].index_of_pile)
                                {
                                    for (int k = 0; k < 52; k++)
                                    {
                                        if (card_pack[k].index == card_temp.index)
                                        {
                                            card_pack[k].pile = 13;
                                            card_pack[k].index_of_pile = arylist_14_pile[13].Count + flag;
                                            flag++;
                                            break;
                                        }
                                    }
                                }
                            }
                            break;
                        }
                    }
                }
            }
            sort_arylist_14_pile();
            is_ready_draw = true;
        }

        void button_undo_Click(object sender, EventArgs e)
        {
            GC.Collect();
            timer_draw.Enabled = true;
            if (ini_imagelist())
            {
                selected_index = -1;
                fapai();
                sort_arylist_14_pile();
                draw();
            }
            else
            {
                MessageBox.Show("程序目录下缺少资源文件,请检查。");
                this.Close();
            }
        }

        void button_newgame_Click(object sender, EventArgs e)
        {
            GC.Collect();
            timer_draw.Enabled = true;
            if (ini_imagelist())
            {
                selected_index = -1;
                xipai();
                fapai();
                sort_arylist_14_pile();
                draw();
            }
            else
            {
                MessageBox.Show("程序目录下缺少资源文件,请检查。");
                this.Close();
            }
        }

        void button_close_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        void button_min_Click(object sender, EventArgs e)
        {
            this.WindowState = FormWindowState.Minimized;
        }

        void panel_title_MouseMove(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                this.Location = this.PointToScreen(new Point(e.X - point_mousedown_on_panel_title.X, e.Y - point_mousedown_on_panel_title.Y));
            }
        }

        void panel_title_MouseDown(object sender, MouseEventArgs e)
        {
            point_mousedown_on_panel_title = new Point(e.X, e.Y);
        }

    }
}


附上源码地址http://download.csdn.net/detail/u010655942/6740447

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值