📄 gameplace.cs
字号:
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 + -