⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gameplace.cs

📁 C#纸牌游戏,做的还是比较精致的.值得学习.
💻 CS
📖 第 1 页 / 共 2 页
字号:
using System;
using System.Windows.Forms;
using System.Drawing;
using System.Collections;
using System.Threading;
namespace CardGame
{
	public class GamePlace:GamePanel
	{
		private NormalCard[] cards;
		private static BackSenderCollections backSenderItems;
		private static FaceSenderCollections faceSenderItems;
		private DealtCollections[] dealtItemsArr;
		private UnDealtCollections[] undealtItemsArr;
		public static int NormalCardBackImageIndex=62;
		private int Score=0;
		public bool IsRecord=true;
		public bool IsScore=true;
		private System.Threading.Timer timer;

		private static OnceShowCount showCount=OnceShowCount.Three;
		private bool IsCardMouseDown=false;
		private Point CardMouseDownLocation=Point.Empty;
		private Point FaceCardMouseDownLocation=Point.Empty;

		public delegate void StateTriggerDelegate(string timeStr,int score);
		public event StateTriggerDelegate StateTrigger;
		private int delScoreCount=0;

		private Card magCard=null;
		private PassPlayer player=null;

		private enum ScoreEnum:int
		{
			Null=0,
			TimeScore=-2,
			BackSender=-5,
			TurnCard=5,
			DealtCard=10,
			UnDealtCard=-10
		}

		public enum OnceShowCount:int
		{
			One=1,
			Three=3
		}

		public static OnceShowCount ShowCount
		{
			get
			{
				return showCount;
			}
			set
			{
				showCount=value;
				if(faceSenderItems!=null)
				{
					if(showCount==OnceShowCount.One)
					{
						faceSenderItems.AcceptOffsetPoint=new Point(0,0);
					}
					else if(showCount==OnceShowCount.Three)
					{
						faceSenderItems.AcceptOffsetPoint=new Point(12,1);
					}
				}
			}
		}

		public bool CanLoop
		{
			get
			{
				if(backSenderItems.BaseCard==null)return false;
				return ((BackSenderAreaCard)backSenderItems.BaseCard).CanLoopSend;
			}
			set
			{
				if(backSenderItems.BaseCard!=null)
				{
					((BackSenderAreaCard)backSenderItems.BaseCard).CanLoopSend=value;
				}
			}
		}

		public void InitPlace()
		{
			CardCollections.gamePanel=this;
			this.MouseDown+=new MouseEventHandler(gamePanel_MouseDown);
			this.Visible=false;
			DealtCollections.AllDealt+=new EventHandler(DealtCollections_AllDealt);

			backSenderItems=new BackSenderCollections(new BackSenderAreaCard());
			backSenderItems.BaseCard.MouseDown+=new MouseEventHandler(BaseCard_MouseDown);

			faceSenderItems=new FaceSenderCollections(new FackSenderAreaCard());
			if(showCount==OnceShowCount.Three)
			{
				faceSenderItems.AcceptOffsetPoint=new Point(12,1);
			}
			faceSenderItems.CardAdd+=new CardGame.CardCollections.CardAddDelegate(GamePlace_CardAdd);

			dealtItemsArr=new DealtCollections[4];
			undealtItemsArr=new UnDealtCollections[7];

			for(int i=0;i<dealtItemsArr.Length;i++)
			{
				dealtItemsArr[i]=new DealtCollections(new DealtAreaCard(),CardCollections.HSpace+(i+3)*(CardCollections.HSpace+Cards.CardImageSize.Width));
				dealtItemsArr[i].BaseCard.MouseDown+=new MouseEventHandler(BaseCard_MouseDown);
				dealtItemsArr[i].CardAdd+=new CardGame.CardCollections.CardAddDelegate(GamePlace_CardAdd);
				dealtItemsArr[i].CardRemove+=new CardGame.CardCollections.CardRemoveDelegate(GamePlace_CardRemove);
			}

			for(int i=0;i<undealtItemsArr.Length;i++)
			{
				undealtItemsArr[i]=new UnDealtCollections(new UnDealtAreaCard(),CardCollections.HSpace+i*(CardCollections.HSpace+Cards.CardImageSize.Width));
				undealtItemsArr[i].BaseCard.MouseDown+=new MouseEventHandler(BaseCard_MouseDown);
				undealtItemsArr[i].CardAdd+=new CardGame.CardCollections.CardAddDelegate(GamePlace_CardAdd);
			}

			cards=new NormalCard[52];
			for(int i=0;i<52;i++)
			{
				cards[i]=new NormalCard(i,NormalCardBackImageIndex);
				CreateEvents(cards[i]);
			}
			player=new PassPlayer(this);
			player.PlayComplete+=new EventHandler(player_PlayComplete);
		}
		public GamePlace():base()
		{
			
		}
		public void RefreshCardBack()
		{
			if(cards==null)return;
			foreach(NormalCard card in cards)
			{
				card.CardBackImageIndex=NormalCardBackImageIndex;
				if(!card.IsFace)
				{
					card.ShowBack();
				}
			}
		}

		private NormalCard[] GetRadomOrderCards()
		{
			int MaxCount=cards.Length;
			ArrayList list=new ArrayList();
			for(int i=0;i<MaxCount;i++)
			{
				list.Add(i);
			}
			NormalCard[] cardlist=new NormalCard[MaxCount];
			Random r=new Random();
			int m=0;
			while(list.Count>0)
			{
				int n=r.Next(0,list.Count-1);
				cardlist[m]=cards[(int)list[n]];
				list.Remove(list[n]);
				m++;
			}
			return cardlist;
		}
		public void Shuffle()
		{
			GameEnd();
			
			NormalCard[] RadomCards=GetRadomOrderCards();

			for(int i=0;i<24;i++)
			{
				RadomCards[i].ShowBack();
				backSenderItems.Add(RadomCards[i]);
			}

			int n=24;
			for(int i=0;i<7;i++)
			{
				for(int j=0;j<=i;j++)
				{
					RadomCards[n].ShowBack();
					undealtItemsArr[i].Add(RadomCards[n]);
					n++;
				}
				((NormalCard)undealtItemsArr[i][undealtItemsArr[i].Count-1]).ShowFace();
			}
			CardCollections.StartUndo=true;
			Score=(int)ScoreEnum.Null;
			delScoreCount=0;
			if(StateTrigger!=null)
			{
				if(IsRecord)
				{
					StateTrigger("00:00:00",Score);
				}
				else
				{
					StateTrigger(null,Score);
				}
			}
			SizeChanged+=new EventHandler(gamePanel_SizeChanged);
			if(!Visible)Visible=true;
		}

		private void CreateEvents(Card card)
		{
			card.MouseDown+=new MouseEventHandler(OnCardMouseDown);
			card.MouseMove+=new MouseEventHandler(OnCardMouseMove);
			card.MouseUp+=new MouseEventHandler(OnCardMouseUp);
			card.Move+=new EventHandler(OnCardMove);
		}

		public void TurnSenderCard()
		{
			MouseEventArgs e=new MouseEventArgs(MouseButtons.Left,1,0,0,0);
			if(backSenderItems.Peek()!=null)
			{
				OnCardMouseDown(backSenderItems.Peek(),e);
			}
			else
			{
				BaseCard_MouseDown(backSenderItems.BaseCard,e);
			}
		}

		private void OnCardMouseDown(object sender, MouseEventArgs e)
		{
			if(e.Button==MouseButtons.Right&&e.Clicks==1)
			{
				AutoDeal();
				return;
			}
			NormalCard card=(NormalCard)sender;
			if(e.Button==MouseButtons.Left&&e.Clicks==2&&card.IsFace&&!(card.CardsGroup is DealtCollections))
			{
				foreach(DealtCollections dealts in dealtItemsArr)
				{
					if(dealts.CanAcceptCard(card))
					{
						dealts.Add(card);
						return;
					}
				}
			}
			else if(e.Button==MouseButtons.Left&&e.Clicks==1)
			{
				if(card.CardsGroup is BackSenderCollections)
				{
					if(card==card.CardsGroup.Peek())
					{
						if(showCount==OnceShowCount.One)
						{
							faceSenderItems.Add(card);
						}
						else if(showCount==OnceShowCount.Three)
						{
							int remain=(backSenderItems.Count>=3)?3:backSenderItems.Count;
							faceSenderItems.AddRange(backSenderItems,backSenderItems.Count-remain,remain);
						}
						InitTimer();
					}
				}
				else if(card.CardsGroup is UnDealtCollections)
				{
					if(card.IsFace)
					{
						StartMag(card,e);
					}
					else
					{
						if(card==card.CardsGroup.Peek())
						{
							card.ShowFace();
							if(IsScore)
							{
								Score+=(int)ScoreEnum.TurnCard;
								if(StateTrigger!=null)StateTrigger(null,Score);
							}
							CardCollections.CanUndo=false;
							InitTimer();
						}
					}
				}
				else
				{
					if(card==card.CardsGroup.Peek()&&card.IsFace)
					{
						StartMag(card,e);
						if(card.CardsGroup is FaceSenderCollections)
						{
							FaceCardMouseDownLocation=card.Location;
						}
						else
						{
							FaceCardMouseDownLocation=Point.Empty;
						}
					}
				}
			}
		}
		
		private void AddCard(Control control,NormalCard objCard,ArrayList cardList)
		{
			if((control!=null)&&(control is Card)&&control.Visible&&control!=objCard&&!cardList.Contains(control))
			{
				Card card=(Card)control;
				if((card.CardsGroup is UnDealtCollections)||(card.CardsGroup is DealtCollections))
				{
					if((card==card.CardsGroup.Peek()&&card.IsFace)||card.CardsGroup.Peek()==null)
					{
						cardList.Add(card);
					}
				}
			}
		}

		private ArrayList GetCardsByRec(NormalCard objCard)
		{
			Rectangle rec=new Rectangle(objCard.Location,objCard.Size);
			ArrayList cardList=new ArrayList();

			Point point=new Point(rec.X-1,rec.Y-1);
			Size size=new Size(rec.Width+1,rec.Height+1);

			Control control=GetChildAtPoint(point);
			AddCard(control,objCard,cardList);

			control=GetChildAtPoint(new Point(point.X,point.Y+size.Height));
			AddCard(control,objCard,cardList);

			control=GetChildAtPoint(new Point(point.X+size.Width,point.Y+size.Height));
			AddCard(control,objCard,cardList);

			control=GetChildAtPoint(new Point(point.X+size.Width,point.Y));
			AddCard(control,objCard,cardList);

			if(cardList.Count==0)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -