亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? jldoc.cpp

?? 很經典的用C++編的空當接龍的程序
?? CPP
?? 第 1 頁 / 共 4 頁
字號:
// JLDoc.cpp : implementation of the CJLDoc class
//

#include "stdafx.h"
#include "JL.h"

#include "JLDoc.h"
#include "DlgSelGame.h"
#include "DlgSettings.h"
#include "JLView.h"
#include "MainFrm.h"
#include "DlgAIShow.h"
#include "MsgDlg.h"
#include "DlgAICal.h"
#include "PassedDlg.h"
#include "DlgDefGame.h"
#include "DlgScore.h"

//用于支持洗牌的函數
#include <algorithm>
#include <functional>

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CJLDoc

IMPLEMENT_DYNCREATE(CJLDoc, CDocument)
IMPLEMENT_SERIAL(COperation,CObject,3)
IMPLEMENT_SERIAL(COperations,CObject,3)

#define FitTrash(card,x) (TYPE(x)==TYPE(card)&&NUM(x)==NUM(card)-1)
 
//取得文檔指針
CJLDoc * AfxGetDocument() {
	POSITION tmplPos = AfxGetApp()->GetFirstDocTemplatePosition();
	CDocTemplate* pTmpl = AfxGetApp()->GetNextDocTemplate(tmplPos);
	POSITION docPos = pTmpl->GetFirstDocPosition();
 	CJLDoc* pDoc = (CJLDoc*)pTmpl->GetNextDoc(docPos);

 	ASSERT(pDoc);
 	return pDoc;
}

//取得視圖指針
CJLView * AfxGetView() 
{
	CJLView * pView = AfxGetDocument()->GetView();
	ASSERT(pView);
	return pView;
}


BEGIN_MESSAGE_MAP(CJLDoc, CDocument)
	//{{AFX_MSG_MAP(CJLDoc)
	ON_COMMAND(IDM_UNDO, OnUndo)
	ON_COMMAND(IDM_SETTING, OnSetting)
	ON_COMMAND(IDM_SELECTGAMENUMBER, OnSelectgamenumber)
	ON_COMMAND(IDM_SAVE, OnSave)
	ON_COMMAND(IDM_LOAD, OnLoad)
	ON_COMMAND(IDM_AI, OnAi)
	ON_COMMAND(IDM_HELP_NEXTSTEP, OnHelpNextstep)
	ON_COMMAND(IDM_RAND, OnRand)
	ON_COMMAND(IDM_PREV_GAME, OnPrevGame)
	ON_COMMAND(IDM_NEXT_GAME, OnNextGame)
	ON_COMMAND(IDM_AGAIN, OnAgain)
	ON_COMMAND(IDB_EDIT, OnEdit)
	ON_COMMAND(IDM_SCORE, OnScore)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CJLDoc construction/destruction
CJLDoc::CJLDoc() 
{
	// TODO: add one-time construction code here
	m_nSel = 0;
	m_pOps = new CObList;
	m_Hints.ClrHints();

	srand(UINT(time(NULL)));
	m_nCurGameNumber = Random();

	m_bEnableAlert    = false;
	m_bQuickMove      = false;
	m_bEnableDbClick  = true;
	m_bMaxMove        = true;
	m_bAICalRunning   = false;
	m_bRealTimeUpdate = false;
	m_nDDASpeed       = 75;
}

CJLDoc::~CJLDoc()
{
	ClrOpsRecords();
	delete m_pOps;
}
/////////////////////////////////////////////////////////////////////////////
// CJLDoc serialization

void CJLDoc::Serialize(CArchive& ar)
{
	struct SIZE_INF { UINT size, *pAddr; };
	const SIZE_INF cols[3] = {
		{ sizeof(m_iCards  ) / sizeof(UINT) , &m_iCards[0][0]   },
		{ sizeof(m_iBuffer ) / sizeof(UINT) , &m_iBuffer[0]     },
		{ sizeof(m_iRecycle) / sizeof(UINT) , &m_iRecycle[0][0] },
	};

	if (ar.IsStoring()) {
		ar<<m_nCurGameNumber;//保存本局代號
		m_pOps->Serialize(ar);//保存步驟記錄
		for(UINT k = 0; k < 3 ; ++k)//保存牌局
			for(UINT i = 0; i < cols[k].size; i++)
				ar<<cols[k].pAddr[i];
	}
	else {
		ar>>m_nCurGameNumber;//讀取本局代號
		ClrOpsRecords();//清除步驟記錄,準備讀檔 
		m_pOps->Serialize(ar);//讀取步驟記錄
		for(UINT k = 0; k < 3 ; ++k)//讀取牌局
			for(UINT i = 0; i < cols[k].size; i++)
				ar>>cols[k].pAddr[i];
	}
}

/////////////////////////////////////////////////////////////////////////////
// CJLDoc diagnostics

#ifdef _DEBUG
void CJLDoc::AssertValid() const
{
	CDocument::AssertValid();
}

void CJLDoc::Dump(CDumpContext& dc) const
{
	CDocument::Dump(dc);
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CJLDoc commands
bool CJLDoc::IsCol(UINT col)
{
	return (col<=16&&col>=1);
}


	// +-----Buf----+    +---Recycle---+
	// | 9 10 11 12 | JL | 13 14 15 16 |
	// +------------+    +-------------+
	// +------------Cards--------------+
	// | 1   2   3   4   5   6   7   8 |
	// +-------------------------------+
//核心的移牌程序:將src列的n張牌移動到des列
void CJLDoc::MoveCards(UINT des, UINT src, UINT n)
{
	ASSERT(IsCol(src) && !IsEmptyCol(src) //源列非空
		&& n <= CntSeriIn(src) //最多可移動全部序列牌
		&& IsCol(des));

	//取消當前選中
	if(!m_bAICalRunning) UnselectCardCol();

	CRect rSrc,rDes;
	UINT *pSrc,*pDes,*pTop;
	if(src <= 8) {
		pTop = &m_iCards[src-1][0];
		pSrc = &pTop[pTop[19]-1];//指向底牌
		//刷新移走的部分
		rSrc = RectOf(src,pTop[19]-n+1,n);
		//改變牌的計數
		pTop[19] -= n;
		//刷新整列
		if(pTop[19]+n > 13) {
			rSrc.UnionRect(rSrc,RectOf(src,1,pTop[19]));
		}
	} else if(src <= 12) {
		pSrc = &m_iBuffer[src-9];
		rSrc = RectOf(src,1,1);
	} else {
		pTop = &m_iRecycle[src-13][0];
		pSrc = &pTop[pTop[13]-1];//指向底牌
		pTop[13] -= n;//改變牌的計數
		ASSERT(n==1);
		rSrc = RectOf(src,1,1);
	}

	if(des <= 8) {
		pTop = &m_iCards[des-1][0];
		pDes = &pTop[pTop[19]];//指向底牌之下
		//刷新移來的部分
		rDes = RectOf(des,pTop[19]+1,n);
		//改變牌的計數
		pTop[19] += n;
		//刷新整列
		if(pTop[19] > 13) {
			rDes.UnionRect(rDes,RectOf(des,1,pTop[19]));
		}
	} else if(des <= 12) {
		pDes = &m_iBuffer[des-9];
		rDes = RectOf(des,1,1);
		ASSERT(!m_iBuffer[des-9] && n==1);
	} else {
		pTop = &m_iRecycle[des-13][0];
		pDes = &pTop[pTop[13]];//指向底牌之下
		pTop[13] += n;//改變牌的計數
		ASSERT(n==1);
		rDes = RectOf(des,1,1);
	}

	UINT *p = pSrc+1-n;//p指向最上面那張將要被移動的牌
	for(UINT i = 0; i < n; i++) {
		*pDes++ = *p;//移動到目標處
		*p++ = 0;//源牌清零
	}

	if(m_bAICalRunning && !m_bRealTimeUpdate) {
		return;
	}
	InvalidateRect(RectOfStep());//刷新步數信息
	InvalidateRect(rSrc);//刷新源列牌面
	InvalidateRect(rDes);//刷新目標列牌面
}

//按照規則f的條件判斷 a可放在b下 這一論斷對兩張牌a,b是否成立
//規則f如下:
//    紅牌可以放在黑牌下,黑牌可以放在紅牌下
//    但是必須保證大點數的牌在上,小點數的牌在下
//    且點數只能相差1點
//    例如:
//        照此規則,紅桃5下只可以放黑桃4或者梅花4
//    
bool CJLDoc::FitFormula(UINT b, UINT a)
{
	ASSERT(a<=52 && a>=1 && b<=52 && b>=1);
	//Type()   =  0 黑桃   1 紅桃   2 梅花   3 方塊
	//b,a不同花色且b的點數比a大一點
	return (TYPE(a)+TYPE(b))%2==1 && NUM(b)-NUM(a)==1;
}
//洗牌
void CJLDoc::Shuffle() 
{
/*	
	//準備一副新牌,并洗牌
	using namespace std;
	vector<int> cards(52);
	for(int i = 1, *it = cards.begin(); it != cards.end(); *it++ = i++) ;
	
	srand(m_nCurGameNumber >> 16);
	random_shuffle(cards.begin(),cards.end());
	srand(m_nCurGameNumber & 0xFFFF);
	random_shuffle(cards.begin(),cards.end());
*/
	//準備一副新牌,并洗牌
	int cards[52];
	for(int i = 1; i <= 52; ++i) cards[i-1] = i;

	using namespace std;

	srand(m_nCurGameNumber >> 16);
	random_shuffle(cards, cards + 52);
	srand(m_nCurGameNumber & 0xFFFF);
	random_shuffle(cards, cards + 52);

	//清空緩存列、回收列和牌列
	struct SIZE_INF { UINT size, *pAddr; };
	const SIZE_INF cols[3] = {
		{ sizeof(m_iCards  ) / sizeof(UINT) , &m_iCards[0][0]   },
		{ sizeof(m_iBuffer ) / sizeof(UINT) , &m_iBuffer[0]     },
		{ sizeof(m_iRecycle) / sizeof(UINT) , &m_iRecycle[0][0] },
	};
	for(UINT k = 0; k < 3 ; ++k)
		for(UINT i = 0; i < cols[k].size; i++)
			cols[k].pAddr[i] = 0;
	//發牌到牌列m_iCards
	for(int col = 0; col <= 3; col++) {
		UINT *pTop;

		pTop = &m_iCards[col][0];
		for(i=0;i<7;i++) {
			UINT *pDes = &pTop[pTop[19]];//指向底牌之下
			pDes[i] = cards[col*7 + i];
		}
		pTop[19] = 7;

		pTop = &m_iCards[col+4][0];
		for(i=0;i<6;i++) {
			UINT *pDes = &pTop[pTop[19]];//指向底牌之下
			pDes[i] = cards[28 + col*6 + i];
		}
		pTop[19] = 6;
	}
}

void CJLDoc::SelectCardCol(UINT col)
{
	ASSERT(IsCol(col) && !IsEmptyCol(col));

	//(如果有)取消當前選中
	UnselectCardCol();

	//選中另一列并刷新
	m_nSel = col;
	InvalidateRect(RectOf(col,CntCardsIn(col),1));
}
//不選中此列
void CJLDoc::UnselectCardCol()
{
	//游戲剛開始、玩家取消選中、有
	//牌移動等都會導致無任何列被選

	//如果沒有選中任何列就不管
	if(!m_nSel) return;

	CRect r = RectOf(m_nSel,CntCardsIn(m_nSel),1);
	//取消選中并刷新
	m_nSel = 0;
	InvalidateRect(r);
}
//看看此列是否為空
bool CJLDoc::IsEmptyCol(UINT col)
{
	ASSERT(IsCol(col));
	if(col <= 8) {
		return !m_iCards[col-1][19];
	} else if(col <= 12) {
		return !m_iBuffer[col-9];
	}else {
		return !m_iRecycle[col-13][13];
	}
}

// 計算實際允許從被選中列移動多少張紙牌到目標列
//(計算出來之后可以利用函數MoveCards來進行實際的移動)
UINT CJLDoc::CntMaxMv(UINT desCol, UINT srcCol)
{
	ASSERT(IsCol(srcCol) && !ColInRecycle(srcCol) && !IsEmptyCol(srcCol));
	ASSERT(IsCol(desCol));

	UINT n = 0;
	//目標列是牌列
	if(desCol <= 8) {
		if(COL_IN_BUFF(srcCol)) { //源列是緩存列
			if(IsEmptyCol(desCol) || 
				FitFormula( BottCard(desCol) , BottCard(srcCol) ))
				n = 1;
		} else {
			//源列是牌列
			UINT nSeri = CntSeriIn(srcCol);//計算連續多少張牌
			if(IsEmptyCol(desCol)) { //目標列是空牌列
				UINT maxSuppliment = CntMaxSuppliment(true);
				//肯定可以移動
				n = min(maxSuppliment,nSeri);
			} else {
				UINT bottSrc = BottCard(srcCol);//源列最下面的牌
				UINT bottDes = BottCard(desCol);//目標列最下面的牌
				UINT numSrc = NUM(bottSrc);//牌點數
				UINT numDes = NUM(bottDes);//牌點數
				n = numDes - numSrc;
				UINT maxSuppliment = CntMaxSuppliment(false);
				//必須嚴格滿足以下條件才可以移動:
				if( 	//目標牌點數介于源序列牌之上的指定區間內 且
					numDes >= numSrc + 1 && numDes <= numSrc + nSeri &&
					//它比源牌大奇數點且紅黑相異或大偶數點紅黑相同 且
					n%2 == (TYPE(bottSrc)+TYPE(bottDes))%2 && 
					//有足夠空間來移動
					n <= maxSuppliment) 
				{ 
					;
				} else {
					n = 0;
				}
			}
		}
	} else if(desCol <= 12) { //目標列是緩存列
		if(IsEmptyCol(desCol))
			n = 1;//緩存列無牌則可移動一張
	} else { //目標列是回收列
		int s = BottCard(srcCol);
		if(!IsEmptyCol(desCol)) {
			int d = BottCard(desCol);
			if(TYPE(s)==TYPE(d) && NUM(d) == NUM(s) - 1)
				n = 1;//花色相符,點數小一,則可以回收
		} else if(NUM(s) == 1 && TYPE(s)+13 == desCol)
			n = 1;//是A且花色相符(且相應回收列中無牌)
	}

	return n;
}

//遍歷各列并自動扔出1-12列中最小的牌直到無法扔出為止
void CJLDoc::AutoThrow()
{
	UINT colSrc, cardSrc, numSrc, colDes,sons[2];
	while(true) { //直到沒有牌可扔為止
		for(colSrc = 1; colSrc <= 12; colSrc++) { //尋找可扔的牌所在的列
			if(IsEmptyCol(colSrc)) continue;
			cardSrc=BottCard(colSrc);
			if(!Trashable(cardSrc)) continue;
			numSrc = NUM(cardSrc);
			colDes = TYPE(cardSrc) + 13;
			if(numSrc == 1 || numSrc == 2) break;
			if(m_bAICalRunning) break;//自動解答時廢牌能扔就扔

			//考慮子牌是否已經回收
			sons[0] = sons[1] = colDes;
			sons[0] -= colDes > 13 ? 1 : -3;
			sons[1] += colDes < 16 ? 1 : -3;
			if(
				m_iRecycle[sons[0]-13][13] && //子牌的回收列非空
				m_iRecycle[sons[1]-13][13] && //子牌的回收列非空
				NUM(BottCard(sons[0])) >= numSrc-1 &&
				NUM(BottCard(sons[1])) >= numSrc-1
			) break;
		}
		if(colSrc > 12) break;
		if(!m_bQuickMove && ColInCard(colSrc)) { //快速移動的時候沒有動畫
			CRect rs = RectOf(colSrc,CntCardsIn(colSrc),1);
			CRect rd = RectOf(colDes,1,1);
			::LineDDA(rs.left,rs.top,rd.left,rd.top,LineDDACallback,cardSrc);
		}
		MoveCards(colDes,colSrc,1);
		if(m_pOps->IsEmpty()) {
			Record(new COperations(colDes,colSrc,1));
		} else { //扔牌后的自動扔牌動作必須和扔牌動作放在一起
			((COperations*)m_pOps->GetTail())->AddOperation(colDes,colSrc,1);
		}
	}
}

//測試是否游戲結束

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
风间由美一区二区av101| 制服丝袜av成人在线看| 色88888久久久久久影院按摩| av亚洲精华国产精华精华| 在线免费观看视频一区| av电影在线观看一区| 色婷婷香蕉在线一区二区| 99麻豆久久久国产精品免费| 欧美日韩在线观看一区二区| 精品国产免费人成电影在线观看四季 | 夜夜揉揉日日人人青青一国产精品| 亚洲国产精品人人做人人爽| 极品少妇一区二区三区精品视频| 波多野结衣中文字幕一区| 91在线免费播放| 欧美精品v国产精品v日韩精品| 久久综合中文字幕| 国产精品久久久久久久午夜片| 亚洲狠狠爱一区二区三区| 国产资源在线一区| 欧美三区在线视频| 久久免费视频一区| 日韩精品免费专区| www.日韩大片| 国产调教视频一区| 精品在线你懂的| 在线观看亚洲一区| 亚洲一区二区三区四区不卡| 色综合久久久久综合体| 中文字幕人成不卡一区| 成人av在线网| 国产精品麻豆视频| 91色婷婷久久久久合中文| 国产精品三级av| av激情成人网| 亚洲欧美视频在线观看视频| 成人99免费视频| 日韩一区欧美一区| 欧美性大战xxxxx久久久| 午夜精品成人在线| 91精品国产免费| 久久99精品久久久久婷婷| 久久综合av免费| 成人国产一区二区三区精品| 亚洲欧洲三级电影| 欧美视频一二三区| 免费成人在线播放| 久久只精品国产| 91小视频免费观看| 日韩精品亚洲专区| 久久品道一品道久久精品| 成人国产免费视频| 亚洲福利一区二区三区| 日韩一卡二卡三卡四卡| 国产成人福利片| 亚洲欧美色图小说| 欧美一区二区在线免费播放| 国产一区二区看久久| 亚洲视频 欧洲视频| 欧美日韩精品一区视频| 免费精品99久久国产综合精品| 久久久天堂av| 91久久精品午夜一区二区| 美国十次综合导航| 国产精品成人一区二区艾草| 欧美日本韩国一区| 国产成人亚洲精品青草天美| 一区二区日韩电影| 26uuu久久天堂性欧美| 色欧美片视频在线观看| 麻豆高清免费国产一区| 亚洲摸摸操操av| 精品免费视频.| 在线看国产一区| 国产精品99久久久| 亚洲二区在线视频| 精品久久久久久久久久久久久久久久久 | 一区视频在线播放| 日韩亚洲欧美一区二区三区| gogogo免费视频观看亚洲一| 麻豆国产精品一区二区三区| 一区二区三区.www| 中文av一区二区| 欧美一区二区视频网站| 色婷婷综合激情| 国产精品中文字幕日韩精品 | 极品尤物av久久免费看| 亚洲电影你懂得| 国产精品麻豆欧美日韩ww| 欧美一级二级三级乱码| 欧美午夜精品一区二区三区| 成人午夜在线视频| 国产一区在线观看视频| 日韩av一级电影| 亚洲一二三级电影| 亚洲乱码国产乱码精品精可以看| 精品粉嫩超白一线天av| 日韩写真欧美这视频| 欧美日韩午夜精品| 91视频精品在这里| 成人av电影免费观看| 国产风韵犹存在线视精品| 黄页网站大全一区二区| 奇米色777欧美一区二区| 亚洲不卡在线观看| 亚洲成a人在线观看| 亚洲黄网站在线观看| 亚洲国产精品国自产拍av| 精品国产一区二区精华| 精品国产一二三| 精品国产乱码久久久久久老虎| 日韩午夜中文字幕| 日韩一卡二卡三卡四卡| 精品国产一区二区精华| 精品国产sm最大网站| wwwwxxxxx欧美| 国产午夜亚洲精品午夜鲁丝片| 精品国产sm最大网站| 久久综合成人精品亚洲另类欧美| 久久精品亚洲麻豆av一区二区| 久久在线观看免费| 中文字幕成人网| 亚洲欧美日韩一区二区 | 麻豆国产精品官网| 激情伊人五月天久久综合| 精品一区二区三区久久| 国产精品影视在线观看| 成人在线视频首页| 91黄色激情网站| 欧美精品免费视频| 精品国精品自拍自在线| 国产日韩精品一区二区三区在线| 久久精品视频一区| 亚洲男人天堂av网| 天天综合色天天| 久久99精品国产麻豆不卡| 国产久卡久卡久卡久卡视频精品| 国产91精品露脸国语对白| 91亚洲国产成人精品一区二三| 欧美三级日韩在线| 精品国产乱码久久久久久影片| 国产精品久久久久久亚洲毛片 | 久久99国内精品| 成人动漫中文字幕| 欧美日韩国产区一| 久久亚洲精品国产精品紫薇| 国产精品成人在线观看| 日韩精品一区第一页| 成人成人成人在线视频| 在线不卡的av| 亚洲国产精品国自产拍av| 偷偷要91色婷婷| 国产a区久久久| 欧美三级日本三级少妇99| 26uuu精品一区二区| 亚洲图片一区二区| 国产99一区视频免费| 欧美日韩国产不卡| 中文幕一区二区三区久久蜜桃| 亚洲韩国一区二区三区| 国产福利不卡视频| 欧美二区在线观看| 国产精品色呦呦| 久久精品国产免费看久久精品| 91麻豆国产在线观看| 欧美va亚洲va香蕉在线| 亚洲国产精品一区二区久久| 国产99久久久国产精品潘金| 欧美日韩国产高清一区二区三区 | 偷拍一区二区三区| 成人av网站在线| 日韩欧美高清在线| 亚洲精品国产无套在线观| 国产黑丝在线一区二区三区| 欧美三区免费完整视频在线观看| 亚洲国产精品传媒在线观看| 裸体健美xxxx欧美裸体表演| 91激情在线视频| 国产精品国产三级国产普通话99 | 麻豆91在线观看| 欧美三级电影网| 亚洲男人都懂的| 成人av集中营| 国产欧美日韩激情| 国产在线播放一区三区四| 91精品国产高清一区二区三区蜜臀 | 久久久99精品免费观看不卡| 亚洲成a人片在线不卡一二三区| 成人ar影院免费观看视频| 国产日韩欧美激情| 国产精品一区二区果冻传媒| 欧美一区二区女人| 日韩专区中文字幕一区二区| 欧美视频精品在线观看| 一区二区三区蜜桃| 91麻豆产精品久久久久久| 国产精品无圣光一区二区| 成人黄色在线看| 1024国产精品| 色哟哟国产精品免费观看|