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

📄 gameplace.cs

📁 C#纸牌游戏,做的还是比较精致的.值得学习.
💻 CS
📖 第 1 页 / 共 2 页
字号:
			{
				control=GetChildAtPoint(new Point(Convert.ToInt32((point.X+point.X+size.Width)/2),point.Y));
				AddCard(control,objCard,cardList);

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

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

				control=GetChildAtPoint(new Point(point.X,Convert.ToInt32((point.Y+point.Y+size.Height)/2)));
				AddCard(control,objCard,cardList);
			}
			
			return cardList;
		}
		private void BaseCard_MouseDown(object sender, MouseEventArgs e)
		{
			if(e.Button==MouseButtons.Right&&e.Clicks==1)
			{
				AutoDeal();
				return;
			}
			if(sender is BackSenderAreaCard)
			{
				BackSenderAreaCard card=(BackSenderAreaCard)sender;
				if(card.CanLoopSend)
				{
					if(e.Button==MouseButtons.Left&&e.Clicks==1)
					{
						backSenderItems.AddRange(faceSenderItems,0,faceSenderItems.Count,false);
					}
				}
			}
		}

		private void OnCardMouseMove(object sender, MouseEventArgs e)
		{
			NormalCard card=(NormalCard)sender;
			if(IsCardMouseDown)
			{
				card.Location=new Point(card.Left+e.X-CardMouseDownLocation.X,card.Top+e.Y-CardMouseDownLocation.Y);
			}
		}

		private void OnCardMouseUp(object sender, MouseEventArgs e)
		{
			NormalCard card=(NormalCard)sender;
			if(IsCardMouseDown)
			{
				IsCardMouseDown=false;
				ArrayList cardlist=GetCardsByRec(card);
				if(cardlist.Count>0)
				{
					foreach(Card c in cardlist)
					{
						if(c.CardsGroup.CanAcceptCard(card))
						{
							c.CardsGroup.AddRange(card.CardsGroup,card.Index,card.CardsGroup.Count-card.Index,true);
							EndMag();
							return;
						}
					}
				}
				NormalCard nc;
				if(card.Index>0)
				{
					nc=(NormalCard)card.CardsGroup[card.Index-1];
					if(nc.IsFace)
					{
						int n=Convert.ToInt32(card.Index/10)-Convert.ToInt32(nc.Index/10);
						if(nc.CardsGroup is FaceSenderCollections)
						{
							if(!FaceCardMouseDownLocation.Equals(Point.Empty))
							{
								Point historyPoint=new Point(nc.Left+n*card.CardsGroup.BackOffsetPoint.X,nc.Top+n*card.CardsGroup.BackOffsetPoint.Y);
								if(FaceCardMouseDownLocation.Equals(historyPoint))
								{
									card.Location=historyPoint;
								}
								else
								{
									card.Location=new Point(nc.Left+card.CardsGroup.AcceptOffsetPoint.X,nc.Top+card.CardsGroup.AcceptOffsetPoint.Y);
								}
							}
							
						}
						else
						{
							card.Location=new Point(nc.Left+card.CardsGroup.AcceptOffsetPoint.X,nc.Top+card.CardsGroup.AcceptOffsetPoint.Y);
						}
						FaceCardMouseDownLocation=Point.Empty;
					}
					else
					{
						card.Location=new Point(nc.Left+card.CardsGroup.BackOffsetPoint.X,nc.Top+card.CardsGroup.BackOffsetPoint.Y);
					}
				}
				else
				{
					card.Location=card.CardsGroup.Location;
				}
				EndMag();
			}
		}

		private void OnCardMove(object sender, EventArgs e)
		{
			if(sender is NormalCard)
			{
				NormalCard card=(NormalCard)sender;
				if(card.CardsGroup!=null&&magCard!=null)
				{
					InitTimer();
				}
			}
		}
		private void InitTimer()
		{
			if(timer==null&&IsRecord)
			{
				timer=new System.Threading.Timer(new TimerCallback(OnTimer),DateTime.Now.TimeOfDay,1000,1000);
			}
		}

		private void OnTimer(object obj)
		{
			delScoreCount++;
			TimeSpan time=(TimeSpan)obj;
			DateTime dtime=DateTime.Now.Subtract(time);
			if(StateTrigger!=null)
			{
				if(IsScore)
				{
					if(delScoreCount==10)
					{
						Score+=(int)ScoreEnum.TimeScore;
						if(Score<0)Score=(int)ScoreEnum.Null;
						delScoreCount=0;
					}
				}
				StateTrigger(dtime.ToString("HH:mm:ss"),Score);
			}
		}

		private void AutoDeal()
		{
			while(true)
			{
			FindStart:
				foreach(NormalCard card in cards)
				{
					if(!(card.CardsGroup is DealtCollections)&&card.IsFace&&card.Index==card.CardsGroup.Count-1)
					{
						foreach(DealtCollections dealts in dealtItemsArr)
						{
							if(dealts.CanAcceptCard(card))
							{
								dealts.Add(card);
								goto FindStart;
							}
						}
					}
				}
				return;
			}
		}

		private void gamePanel_MouseDown(object sender, MouseEventArgs e)
		{
			if(e.Button==MouseButtons.Right&&e.Clicks==1)
			{
				AutoDeal();
			}
		}

		private void GamePlace_CardAdd(Card card, CardCollections cardsGroup)
		{
			if(IsScore)
			{
				if(card.CardsGroup is UnDealtCollections&&cardsGroup is FaceSenderCollections)
				{
					Score+=(int)ScoreEnum.TurnCard;
				}
				else if(card.CardsGroup is DealtCollections&&(cardsGroup is UnDealtCollections||cardsGroup is FaceSenderCollections))
				{
					Score+=(int)ScoreEnum.DealtCard;
				}
				else if(card.CardsGroup is FaceSenderCollections&&cardsGroup is UnDealtCollections)
				{
					Score+=(int)ScoreEnum.BackSender;
				}
				else
				{
					return;
				}
				if(StateTrigger!=null)StateTrigger(null,Score);
			}
		}

		private void GamePlace_CardRemove(Card card)
		{
			if(IsScore)
			{
				if(card.CardsGroup is DealtCollections)
				{
					Score+=(int)ScoreEnum.UnDealtCard;
				}
				else
				{
					return;
				}
				if(StateTrigger!=null)StateTrigger(null,Score);
			}
		}

		private void LocationChange(int hspace)
		{
			CardCollections.HSpace=hspace;
			backSenderItems.Location=new Point(hspace,CardCollections.VSpace);
			faceSenderItems.Location=new Point(2*hspace+Cards.CardImageSize.Width,CardCollections.VSpace);
			for(int i=0;i<dealtItemsArr.Length;i++)
			{
				dealtItemsArr[i].Location=new Point(hspace+(i+3)*(hspace+Cards.CardImageSize.Width),CardCollections.VSpace);
			}

			for(int i=0;i<undealtItemsArr.Length;i++)
			{
				undealtItemsArr[i].Location=new Point(hspace+i*(hspace+Cards.CardImageSize.Width),2*CardCollections.VSpace+Cards.CardImageSize.Height);
			}
		}

		private void gamePanel_SizeChanged(object sender, EventArgs e)
		{
			Size size=this.Size;
			int minWidth=CardCollections.MinHSpace*8+Cards.CardImageSize.Width*7;
			if(size.Width>minWidth)
			{
				LocationChange((size.Width-Cards.CardImageSize.Width*7)/8);
			}
			else
			{
				LocationChange(CardCollections.MinHSpace);
			}
		}
		
		private void StartMag(Card card,MouseEventArgs e)
		{
			IsCardMouseDown=true;
			CardMouseDownLocation=new Point(e.X,e.Y);
			Controls.SetChildIndex(card,0);
			magCard=card;
			int aboveCount=card.CardsGroup.Count-1-card.Index;
			Size size=new Size(card.Width,aboveCount*card.CardsGroup.AcceptOffsetPoint.Y+card.Height);
			Bitmap img=new Bitmap(size.Width,size.Height);
			Graphics g=Graphics.FromImage(img);

			for(int i=0;i<=aboveCount;i++)
			{
				g.DrawImage(card.CardsGroup[i+card.Index].Image,new Rectangle(0,i*card.CardsGroup.AcceptOffsetPoint.Y,card.Width,card.Height),0,0,card.Width,card.Height,GraphicsUnit.Pixel);
				if(i>0)card.CardsGroup[i+card.Index].Visible=false;
			}
			card.Region=Cards.GetCardRegion(size);
			card.Image=img;
		}
		private void EndMag()
		{
			if(magCard!=null)
			{
				magCard.Region=Cards.GetCardRegion(Cards.CardImageSize);
				magCard.ShowFace();
				for(int i=magCard.Index+1;i<magCard.CardsGroup.Count;i++)
				{
					Controls.SetChildIndex(magCard.CardsGroup[i],0);
					magCard.CardsGroup[i].Visible=true;
				}
				magCard=null;
			}
		}
		private void DealtCollections_AllDealt(object sender, EventArgs e)
		{
			if(player!=null)player.Play();
		}
		
		#region IDisposable 成员


		public new void Dispose()
		{
			backSenderItems.Clear();
			faceSenderItems.Clear();
			foreach(DealtCollections items in dealtItemsArr)
			{
				items.Clear();
			}
			foreach(UnDealtCollections items in undealtItemsArr)
			{
				items.Clear();
			}
			dealtItemsArr=null;
			undealtItemsArr=null;
			base.Dispose ();
		}

		#endregion

		private void GameEnd()
		{
			Visible=false;
			if(timer!=null)
			{
				timer.Dispose();
				timer=null;
			}
			SizeChanged-=new EventHandler(gamePanel_SizeChanged);
			CardCollections.StartUndo=false;
			CardCollections.CanUndo=false;
			backSenderItems.Clear();
			faceSenderItems.Clear();
			
			foreach(DealtCollections items in dealtItemsArr)
			{
				items.Clear();
			}
			foreach(UnDealtCollections items in undealtItemsArr)
			{
				items.Clear();
			}
		}

		private void player_PlayComplete(object sender, EventArgs e)
		{
			GameEnd();
			if(MessageBox.Show(FindForm(),"恭喜你顺利通关!\r\n重新发牌吗?","提示",MessageBoxButtons.OKCancel,MessageBoxIcon.Question)==DialogResult.OK)
			{
				Shuffle();
			}
		}
	}
}

⌨️ 快捷键说明

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