斗地主的制作與實(shí)現(xiàn)報(bào)告 完整源代碼畢業(yè)設(shè)計(jì)論文_第1頁
斗地主的制作與實(shí)現(xiàn)報(bào)告 完整源代碼畢業(yè)設(shè)計(jì)論文_第2頁
斗地主的制作與實(shí)現(xiàn)報(bào)告 完整源代碼畢業(yè)設(shè)計(jì)論文_第3頁
斗地主的制作與實(shí)現(xiàn)報(bào)告 完整源代碼畢業(yè)設(shè)計(jì)論文_第4頁
斗地主的制作與實(shí)現(xiàn)報(bào)告 完整源代碼畢業(yè)設(shè)計(jì)論文_第5頁
已閱讀5頁,還剩53頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

《游戲設(shè)計(jì)概論》課程設(shè)計(jì)報(bào)告題目斗地主的制作與實(shí)現(xiàn)專業(yè)班級學(xué)號姓名同組人員一、課程設(shè)計(jì)的內(nèi)容、要求完成一個(gè)網(wǎng)絡(luò)版的斗地主。對于聯(lián)網(wǎng)斗地主,要實(shí)現(xiàn)以下功能:能夠聯(lián)網(wǎng)對戰(zhàn),能及時(shí)出牌并能與主機(jī)一起更新游戲狀態(tài)。能正確判斷勝負(fù)和游戲的開始與結(jié)束。能認(rèn)清地主和農(nóng)民,能正確記分。整個(gè)游戲界面如下圖所示。上面中間是游戲地主最后拿的三張牌,左右分別是玩家的牌,下面中間是自己的牌。在游戲的右下方有2個(gè)按鈕,分別是出牌和過牌。5,這個(gè)游戲是用鼠標(biāo)進(jìn)行操作的,單擊自己的牌可以把它們選中,當(dāng)輪到自己出牌時(shí),就可以單擊出牌按鈕,出自己已經(jīng)選中的牌,或者單擊過牌按鈕,放棄出牌機(jī)會(huì)。游戲開始時(shí)會(huì)有選地主的過程,可以單擊出牌選擇自己是地主,也可以單擊過牌選擇放棄,如果所有的玩家都選擇放棄,則重新發(fā)牌。二、所采用的數(shù)據(jù)結(jié)構(gòu)沒有.三、主要模塊(或函數(shù))及其功能本游戲的所有模塊如下圖所示:其中主要模塊功能:Managers模塊:這是本游戲的核心模塊之一。函數(shù):voidGameStart();//游戲初始化,發(fā)牌。voidSendCard(); //發(fā)牌voidCardsInfo(Cardca[],int&num,int&min,int&type);//用來得到牌的信息。到底是炸彈,連牌,還是什么的。voidPlayS(intmin2,inttype2,intnum2);//設(shè)置與發(fā)出聲音,用來通知玩家所打的牌的大小與種類。voidUpdata();//根據(jù)游戲狀態(tài)的改變,從而設(shè)置游戲界面的狀態(tài)。Card模塊:記錄了一張牌的所有信息,包括大小、類型、是否被玩家選中。CProgramView模塊:編輯游戲界面函數(shù):voidDrawCardOut(intk); voidDrawLeft();//繪出剩下的地主的牌,當(dāng)?shù)刂鬟€沒決定的時(shí)候畫的是牌的背面,決定地主 //后畫出地主的牌 voidDrawPlayername();//根據(jù)傳入的字符串,繪出玩家的名稱 voidOnPass();//點(diǎn)擊過牌按鈕后的響應(yīng)函數(shù) voidOnSendCard();//畫出當(dāng)前玩家所出的牌 intSelectNum(intnum,intmx,intmy);//判斷玩家點(diǎn)牌后具體點(diǎn)的是哪一張 voidDrawOtherCard();//畫出另外兩個(gè)玩家還剩下的牌,以及 //他們剛剛出牌 voidDrawMyCard();//畫出當(dāng)前玩家手中牌 voidOnCancel();//點(diǎn)擊退出按鈕后的響應(yīng)函數(shù) voidOnOK();//點(diǎn)擊確定按鈕后的響應(yīng)函數(shù) virtual~CProgramView(); CStringPlayerName[3];//用來存放三個(gè)玩家姓名的字符串 voidPrintAll();//整體重畫CChat模塊:基本對話框的聊天模塊.CNet模塊:網(wǎng)絡(luò)控制CServer模塊:網(wǎng)絡(luò)主機(jī)配置NetControl模塊:用于設(shè)置網(wǎng)絡(luò)各方面的問題。函數(shù): voidStartCards(); voidSendGetReady(); voidSendCards(Card*c,intaction); NetControl(CProgramView*p); voidBroadcast(char*pMsg);voidSendMsg(CNet*pSend,charconst*pMsg);//發(fā)送消息 voidOnSorc();//網(wǎng)絡(luò)配置 voidOnSet();//設(shè)置問題 voidOnOpen();//已經(jīng)打開網(wǎng)絡(luò)配置 voidFetchMsg(CNet*pRequest);//網(wǎng)絡(luò)信息處理CNet*ConnectServer();//網(wǎng)絡(luò)連接四、主要模塊(或函數(shù))的算法思想和程序框圖流程圖如下圖所示:走牌走牌用戶操作退出游戲過牌\出牌單擊牌放棄接受地主準(zhǔn)備退出游戲DoMsg(intnum,intaction)PlayerCards[x][y].Click改變誰是地主PlayerMain過牌出牌CheckCard()什么都不做改變OutCards與OutPlayerCardsInfo(Cardca[],int&num,int&min,int&type)OutPlayerOutCards不能走牌能走牌判斷是否能走牌這個(gè)函數(shù)是用來得到牌的信息,到底是炸彈,連牌,還是什么。Managers模塊:#include"Card.h"#include"NetControl.h" //AddedbyClassView//#include"ProgramView.h"classManagers{public: boolm_CardSound; voidClearCard(); CProgramView*m_pView; intt;//重新計(jì)時(shí) NetControl*pControl; voidPlayS(intmin2,inttype2,intnum2); boolDoMsg(intnum,intaction); voidGameStart();//游戲初始化,發(fā)牌。 boolMainComputer;//主機(jī),是主機(jī)則是true不是則為false; Managers(); virtual~Managers(); CardPlayCards[3][20];//最多20張牌 intPlayerAc;//這臺(tái)機(jī)器上的玩家 intPlayerMain;//地主 CardOutCards[20];//走的牌,一次也最多出20張牌 intOutPlayer;//走牌的玩家 CardSendleft[4];//記錄剩下的3張牌 intGame_State; voidUpdata(); //-2游戲沒開始 //-1游戲準(zhǔn)備中,選地主 //0-2游戲玩家出牌 //3-5對應(yīng)0-2玩家勝利 intPower;//計(jì)算當(dāng)前游戲如果農(nóng)民勝利則每人得的分 intPlayerMaininfo;//記錄有幾個(gè)玩家選擇放棄地主如果都放棄則游戲結(jié)束 voidSendCard(); //發(fā)牌 voidSortCard(Cardca[]); intp[3]; voidCardsInfo(Cardca[],int&num,int&min,int&type);private:// voidSortCard(Cardca[]);// voidSendCard(); //發(fā)牌 boolCheckCard(intpl); CardPreOut[20];};//////////////////////////////////////////////////////////////////////#include"stdafx.h"#include"program.h"#include"Managers.h"#include"mmsystem.h"#include"ProgramView.h"#ifdef_DEBUG#undefTHIS_FILEstaticcharTHIS_FILE[]=__FILE__;#definenewDEBUG_NEW#endif////////////////////////////////////////////////////////////////////////Construction/Destruction//////////////////////////////////////////////////////////////////////Managers::Managers(){ Game_State=-2; PlayerAc=-1; t=30; p[0]=p[1]=p[2]=0; Power=10; m_CardSound=true; }Managers::~Managers(){}voidManagers::GameStart(){ intk; for(k=0;k<20;k++) PlayCards[1][k].Click=false; for(k=0;k<3;k++) Sendleft[k].Click=true; if(MainComputer) { //Power=10; OutCards[0].Num=16; PlayerMaininfo=0; SendCard(); PlayerMain=rand()%3; Game_State=-1; } else { // GetCard(); }}boolManagers::CheckCard(intpl){ Card*Ca=PlayCards[pl];//用Ca指針來代替Player[pl],使程序簡單容易理解 inti,j; intnum1,min1,type1; intnum2,min2,type2; j=0; for(i=0;i<20&&Ca[i].Num<=15;i++) if(Ca[i].Click) { PreOut[j]=Ca[i]; j++; } if(j==0) returnfalse; elseif(j!=20) { PreOut[j].Num=16;//表示此后的都沒有牌了 } Ca=PreOut;//現(xiàn)在把CA指到這里 CardsInfo(Ca,num2,min2,type2); if(OutCards[0].Num==16)//上次沒有人走牌 { if((type2==4&&num2==4)||type2==5) { PlaySound("res\\炸彈.wav",NULL,SND_ASYNC|SND_NODEFAULT); if(type2!=5)PlaySound("res\\zhadan.wav",NULL,SND_ASYNC|SND_NODEFAULT); elsePlaySound("res\\wangzha.wav",NULL,SND_ASYNC|SND_NODEFAULT); } PlayS(min2,type2,num2); if(type2!=0) returntrue; } if(OutPlayer==PlayerAc)//上次走牌的人OutPlayer就是自己,那么自己可以隨便走什么 {//改變 if((type2==4&&num2==4)||type2==5) { PlaySound("res\\炸彈.wav",NULL,SND_ASYNC|SND_NODEFAULT); if(type2!=5)PlaySound("res\\zhadan.wav",NULL,SND_ASYNC|SND_NODEFAULT); elsePlaySound("res\\wangzha.wav",NULL,SND_ASYNC|SND_NODEFAULT); } PlayS(min2,type2,num2); if(type2!=0) returntrue; } if(type2==0) returnfalse; CardsInfo(OutCards,num1,min1,type1); if(type1==5)//雙鬼 { returnfalse; } if(type2==5) { PlaySound("res\\炸彈.wav",NULL,SND_ASYNC|SND_NODEFAULT); PlaySound("res\\wangzha.wav",NULL,SND_ASYNC|SND_NODEFAULT); returntrue; } if(type1==4&&type2==4) { if(num2==num1) { if(min1<min2) { if(num1==4) { PlaySound("res\\炸彈.wav",NULL,SND_ASYNC|SND_NODEFAULT); PlaySound("res\\zhadan.wav",NULL,SND_ASYNC|SND_NODEFAULT); } PlayS(min2,type2,num2); returntrue; } else returnfalse; } } if(num2==4&&type2==4) { PlaySound("res\\炸彈.wav",NULL,SND_ASYNC|SND_NODEFAULT); PlaySound("res\\zhadan.wav",NULL,SND_ASYNC|SND_NODEFAULT); returntrue; } if(type2==type1) { if(num1==num2) { if(min1<min2) { PlayS(min2,type2,num2); returntrue; } else returnfalse; } else returnfalse; } returnfalse;}voidManagers::SendCard(){ inti,j,k; boolCards[55]={false}; //對應(yīng)54張撲克,其中Cards[54]做初始化用必須為true; //其中0-51為4個(gè)1-1352是小王53是大王 Cards[54]=true; for(j=0;j<17;j++) for(i=0;i<3;i++) { Card&Ca=PlayCards[i][j]; k=54;//保證必進(jìn)入While循環(huán)進(jìn)行隨機(jī) while(Cards[k]) k=rand()%54; Cards[k]=true; Ca.Click=false; if(k==53||k==52) { Ca.Num=k-38; Ca.Pow=k-38; Ca.Type=4; Ca.Click=false; } else { Ca.Click=false; Ca.Num=k%13+1; Ca.Type=k/13; if(Ca.Num==1||Ca.Num==2) Ca.Pow=Ca.Num+11; else Ca.Pow=Ca.Num-2; } } i=0; for(k=0;k<54;k++) if(!Cards[k]) { Card&Ca=Sendleft[i]; i++; if(k==53||k==52) { Ca.Num=k-38; Ca.Pow=k-38; Ca.Type=4; Ca.Click=true; } else { Ca.Num=k%13+1; Ca.Type=k/13; Ca.Click=true; if(Ca.Num==1||Ca.Num==2) Ca.Pow=Ca.Num+11; else Ca.Pow=Ca.Num-2; } } Sendleft[i].Num=16; PlayCards[0][17].Num=16; PlayCards[1][17].Num=16; PlayCards[2][17].Num=16; }/////////////////////////////////////////////////////////////////////////**函數(shù)名稱:DoMSG( intnum //第幾的一張牌 intaction) //行為*函數(shù)介紹:消息響應(yīng)*輸入?yún)?shù):action含義 1點(diǎn)牌3放棄出牌4出牌(或接受當(dāng)?shù)刂鳎?輸出參數(shù):bool*返回值:true表示響應(yīng)成功false為失敗*/boolManagers::DoMsg(intnum,intaction){ if(action==1)//唯一用得到前面1個(gè)參數(shù)的地方 { Card&Ca=PlayCards[PlayerAc][num]; if(Ca.Click) Ca.Click=false; else Ca.Click=true; PlaySound("res\\give.wav",NULL,SND_ASYNC|SND_NODEFAULT); returntrue; } if(Game_State==-1&&PlayerMain==PlayerAc) { if(action==4) { PlayCards[PlayerAc][17]=Sendleft[0]; PlayCards[PlayerAc][18]=Sendleft[1]; PlayCards[PlayerAc][19]=Sendleft[2]; SortCard(PlayCards[PlayerAc]); Game_State=PlayerAc; OutPlayer=PlayerAc;//改變 PlaySound("res\\叫地主.wav",NULL,SND_ASYNC|SND_NODEFAULT); t=30; returntrue; } if(action==3) { PlayerMain=(PlayerMain+1)%3; PlayerMaininfo++; if(PlayerMaininfo==3) { Game_State=-2; PlayerMaininfo=0; m_pView->m_ok.Invalidate(); m_pView->m_ok.ShowWindow(SW_SHOW); m_pView->m_sendcard.ShowWindow(SW_HIDE); m_pView->m_pass.ShowWindow(SW_HIDE); m_pView->m_isReady=false; m_pView->isDrawed=false; } PlaySound("res\\不叫.wav",NULL,SND_ASYNC|SND_NODEFAULT); t=30; returntrue; } } if(Game_State!=PlayerAc) returnfalse; elseif(action==4) { if(CheckCard(Game_State)) { t=30; //能出牌當(dāng)然出牌咯 inti,j; for(i=0;i<20&&PreOut[i].Num<=15;i++) OutCards[i]=PreOut[i]; if(i!=20) OutCards[i].Num=16; j=0; Card*Ca=PlayCards[Game_State]; for(i=0;i<20&&Ca[i].Num<=15;i++) if(!Ca[i].Click) { Ca[j]=Ca[i]; j++; } OutPlayer=Game_State; Ca[j].Num=16; Updata(); returntrue; } else returnfalse; } elseif(action==3&&OutPlayer!=PlayerAc) { t=30; Game_State=(Game_State+1)%3;//直接更改游戲玩家 PlaySound("res\\不要.wav",NULL,SND_ASYNC|SND_NODEFAULT); returntrue; } returnfalse;}voidManagers::Updata(){ intj; Card*ca=PlayCards[Game_State]; for(j=0;j<20&&ca[j].Num<=15;j++); if(j!=0) Game_State=(Game_State+1)%3; else { //改變 if(Game_State==PlayerMain) { MessageBox(GetActiveWindow(),"地主勝利!","勝利",0); PlaySound("res\\win1.wav",NULL,SND_ASYNC|SND_NODEFAULT); p[PlayerAc]+=Power; } else { MessageBox(GetActiveWindow(),"農(nóng)民勝利!","勝利",0); PlaySound("res\\win.wav",NULL,SND_ASYNC|SND_NODEFAULT); for(inti=0;i<=2;i++) { if(i!=PlayerMain) { p[i]+=Power; } } } m_pView->m_ok.Invalidate(); m_pView->m_ok.ShowWindow(SW_SHOW); m_pView->m_sendcard.ShowWindow(SW_HIDE); m_pView->m_pass.ShowWindow(SW_HIDE); m_pView->m_isReady=false; m_pView->isDrawed=false; m_pView->GetParent()->GetMenu()->GetSubMenu(8) ->EnableMenuItem(IDM_READY,MF_ENABLED); Game_State+=3; Power=10; ClearCard(); //m_pView->Invalidate(); }}/////////////////////////////////////////////////////////////////////////**函數(shù)名稱:CardsInfo(Cardca[],int&num,int&min,int&type)*函數(shù)介紹:把ca中的牌信息反應(yīng)出來*輸入?yún)?shù):ca[]需要反應(yīng)的牌信息*輸出參數(shù):int&num,int&max,int&type*返回值:num表示有多少張牌,min表示起作用的牌中值最小的一個(gè)的大小例如3個(gè)5帶一個(gè)8,那么起作用的就是5min=5,num=3,type表示類型1:3帶1、22:4帶2(4帶2、兩對)3:連子4:全相同5:雙鬼炸彈6:飛機(jī)7:三順0:錯(cuò)牌!不能走出去的*/voidManagers::CardsInfo(Cardca[],int&num,int&min,int&type){ inti,k,n; intsame[10]={0}; intnsame[10]={0}; for(n=0;n<20&&ca[n].Num<=15;n++); type=0; num=n; if(n>=5) { for(k=0;k<n-1;k++)//連牌 if(ca[k].Pow!=ca[k+1].Pow-1) break; if(k==n-1&&ca[k].Pow<=12)//牌不能連到22的pow就是13 { min=ca[0].Pow; type=3; return; } i=-1; for(k=0;k<n;k++) { if(i<0||ca[k].Pow!=same[i]) i++; if(i>2) break; same[i]=ca[k].Pow; nsame[i]++; } if(i>=2) { inttem; for(tem=0;tem<i;tem++) if(nsame[tem]!=2||same[tem]!=same[tem+1]-1) break; if(nsame[tem]==2&&same[tem]<=12) tem++; if(tem>i)//三順 { type=7; min=same[0]; return; } intty1=0,ty2=0,num3=0; intkmin=0; for(tem=0;tem<=i;tem++)//飛機(jī) if(nsame[tem]==1) { ty1++; } elseif(nsame[tem]==2) { ty2++; } elseif(nsame[tem]==3&&kmin==0) { kmin=same[tem]; for(;tem<i;tem++) if(nsame[tem]==3&&same[tem]==same[tem+1]-1) num3++; else break; if(tem==i&&nsame[tem]==3) num3++; if(same[tem]>12) break; } else break; if((ty1==0||ty2==0)&&tem>i) { if((num3==ty1||num3==ty2||ty1==ty2)&&num3!=0) { type=6; min=kmin; return; } } } if(i<2)//3帶n或4帶n { intmaxnum=-1; for(k=0;k<=2;k++) if(nsame[k]>maxnum) { maxnum=nsame[k]; i=k; } if(maxnum==3&&n==5) { type=1; min=same[i]; return; } elseif(maxnum==4) { type=2; min=same[i]; return; } } } elseif(n>2) { i=-1; for(k=0;k<n;k++) { if(i<0||ca[k].Pow!=same[i]) i++; if(i>2) break; same[i]=ca[k].Pow; nsame[i]++; } if(i<=2) { intmaxnum=-1; for(k=0;k<=2;k++) if(nsame[k]>maxnum) { maxnum=nsame[k]; i=k; } if(maxnum==3&&n==4) { type=1; min=same[i]; return; } elseif(maxnum==3&&n==3) { type=4; min=same[i]; return; } elseif(maxnum==4&&n==4) { type=4; min=same[i]; return; } } } elseif(n==2) { if(ca[0].Pow==ca[1].Pow) { type=4; min=ca[0].Pow; } elseif(ca[0].Pow==14&&ca[1].Pow==15) { type=5; min=ca[1].Pow; } } elseif(n==1) { min=ca[0].Pow; type=4; }}voidManagers::SortCard(Cardca[]){ inti,j; Cardtemp; for(i=0;i<20&&ca[i].Num<=15;i++) for(j=i+1;j<20&&ca[j].Num<=15;j++) if(ca[i].Pow>ca[j].Pow) { temp=ca[i]; ca[i]=ca[j]; ca[j]=temp; }}voidManagers::PlayS(intmin2,inttype2,intnum2){if(m_CardSound){ if(1==type2) { if(4==num2) PlaySound("res\\sandaiyi.wav",NULL,SND_ASYNC|SND_NODEFAULT); else PlaySound("res\\sandaiyidui.wav",NULL,SND_ASYNC|SND_NODEFAULT); } elseif(2==type2) { if(6==num2) PlaySound("res\\sidaier.wav",NULL,SND_ASYNC|SND_NODEFAULT); else PlaySound("res\\sidailiangdui.wav",NULL,SND_ASYNC|SND_NODEFAULT); } elseif(3==type2) { PlaySound("res\\shunzi.wav",NULL,SND_ASYNC|SND_NODEFAULT); } elseif(4==type2) { if(1==num2) { switch(min2) { case1: PlaySound("res\\出牌\\3.wav",NULL,SND_ASYNC|SND_NODEFAULT); break; case2: PlaySound("res\\出牌\\4.wav",NULL,SND_ASYNC|SND_NODEFAULT); break; case3: PlaySound("res\\出牌\\5.wav",NULL,SND_ASYNC|SND_NODEFAULT); break; case4: PlaySound("res\\出牌\\6.wav",NULL,SND_ASYNC|SND_NODEFAULT); break; case5: PlaySound("res\\出牌\\7.wav",NULL,SND_ASYNC|SND_NODEFAULT); break; case6: PlaySound("res\\出牌\\8.wav",NULL,SND_ASYNC|SND_NODEFAULT); break; case7: PlaySound("res\\出牌\\9.wav",NULL,SND_ASYNC|SND_NODEFAULT); break; case8: PlaySound("res\\出牌\\10.wav",NULL,SND_ASYNC|SND_NODEFAULT); break; case9: PlaySound("res\\出牌\\11.wav",NULL,SND_ASYNC|SND_NODEFAULT); break; case10: PlaySound("res\\出牌\\12.wav",NULL,SND_ASYNC|SND_NODEFAULT); break; case11: PlaySound("res\\出牌\\13.wav",NULL,SND_ASYNC|SND_NODEFAULT); break; case12: PlaySound("res\\出牌\\1.wav",NULL,SND_ASYNC|SND_NODEFAULT); break; case13: PlaySound("res\\出牌\\2.wav",NULL,SND_ASYNC|SND_NODEFAULT); break; case14: PlaySound("res\\出牌\\14.wav",NULL,SND_ASYNC|SND_NODEFAULT); break; case15: PlaySound("res\\出牌\\15.wav",NULL,SND_ASYNC|SND_NODEFAULT); break; default:; } } elseif(2==num2) { switch(min2) { case1: PlaySound("res\\出牌\\dui3.wav",NULL,SND_ASYNC|SND_NODEFAULT); break; case2: PlaySound("res\\出牌\\dui4.wav",NULL,SND_ASYNC|SND_NODEFAULT); break; case3: PlaySound("res\\出牌\\dui5.wav",NULL,SND_ASYNC|SND_NODEFAULT); break; case4: PlaySound("res\\出牌\\dui6.wav",NULL,SND_ASYNC|SND_NODEFAULT); break; case5: PlaySound("res\\出牌\\dui7.wav",NULL,SND_ASYNC|SND_NODEFAULT); break; case6: PlaySound("res\\出牌\\dui8.wav",NULL,SND_ASYNC|SND_NODEFAULT); break; case7: PlaySound("res\\出牌\\dui9.wav",NULL,SND_ASYNC|SND_NODEFAULT); break; case8: PlaySound("res\\出牌\\dui10.wav",NULL,SND_ASYNC|SND_NODEFAULT); break; case9: PlaySound("res\\出牌\\dui11.wav",NULL,SND_ASYNC|SND_NODEFAULT); break; case10: PlaySound("res\\出牌\\dui12.wav",NULL,SND_ASYNC|SND_NODEFAULT); break; case11: PlaySound("res\\出牌\\dui13.wav",NULL,SND_ASYNC|SND_NODEFAULT); break; case12: PlaySound("res\\出牌\\dui1.wav",NULL,SND_ASYNC|SND_NODEFAULT); break; case13: PlaySound("res\\出牌\\dui2.wav",NULL,SND_ASYNC|SND_NODEFAULT); break; default:; } } elseif(3==num2) { PlaySound("res\\出牌\\sange.wav",NULL,SND_ASYNC|SND_NODEFAULT); } }elseif(6==type2) { PlaySound("res\\plane.wav",NULL,SND_ASYNC|SND_NODEFAULT); }elseif(7==type2) { PlaySound("res\\出牌\\liandui.wav",NULL,SND_ASYNC|SND_NODEFAULT); }} }voidManagers::ClearCard(){ //恢復(fù)到開始狀態(tài),所有數(shù)據(jù)清除 inti,j; i=j=0; for(i=0;i<20;i++) { PreOut[i].Click=false; PreOut[i].Num=0; PreOut[i].Pow=0; PreOut[i].Type=-1; OutCards[i].Click=false; OutCards[i].Num=0; OutCards[i].Pow=0; OutCards[i].Type=-1; } for(i=0;i<3;i++) for(j=0;j<20;j++) { PlayCards[i][j].Click=false; PlayCards[i][j].Num=0; PlayCards[i][j].Pow=0; PlayCards[i][j].Type=-1; } for(i=0;i<4;i++) { Sendleft[i].Click=false; Sendleft[i].Num=0; Sendleft[i].Pow=0; Sendleft[i].Type=-1; }}CProgramView模塊:#include"Card.h"#include"NetControl.h"#include"Name.h"#include"ProgramDoc.h"#include"Chat.h"http://定義按鈕的ID#defineID_OK100#defineID_CANCEL101#define ID_SENDCARD 102#define ID_PASS 103//#defineID_TEST104classCProgramView:publicCView{protected://createfromserializationonly CProgramView(); DECLARE_DYNCREATE(CProgramView)//Attributespublic: CProgramDoc*GetDocument(); NetControl*pControl;//Operationspublic://Overrides //ClassWizardgeneratedvirtualfunctionoverrides //{{AFX_VIRTUAL(CProgramView) public: virtualvoidOnDraw(CDC*pDC);//overriddentodrawthisview virtualBOOLPreCreateWindow(CREATESTRUCT&cs); protected: virtualBOOLOnPreparePrinting(CPrintInfo*pInfo); virtualvoidOnBeginPrinting(CDC*pDC,CPrintInfo*pInfo); virtualvoidOnEndPrinting(CDC*pDC,CPrintInfo*pInfo); //}}AFX_VIRTUALpublic: //定義畫圖用CDC CDC Background; CDC Mcard; //定義畫圖用CBitmap CBitmap m_background; CBitmap m_card; //定義BUTTON對象 CButtonm_ok; CButton m_cancel; CButton m_sendcard; CButton m_pass; //測試// CButtonm_test; //定義指針 Card *cardleft; Card *cardmiddle; Card *cardright; Card OutCards[3][20];//Implementationpublic: boolisDrawed; boolm_isReady; CChatdlg; boolisgoon; voidOnTimer(UINTnIDEvent); voidPrintAll(inttype); voidPlayerPos(); voidPrintState(); voidDrawCardOut(intk); voidDrawLeft();//繪出剩下的地主的牌,當(dāng)?shù)刂鬟€沒決定的時(shí)候畫的是牌的背面,決定地主 //后畫出地主的牌 voidDrawPlayername();//根據(jù)傳入的字符串,繪出玩家的名稱 voidOnPass();//點(diǎn)擊過牌按鈕后的響應(yīng)函數(shù) voidOnSendCard();//畫出當(dāng)前玩家所出的牌 intSelectNum(intnum,intmx,intmy);//判斷玩家點(diǎn)牌后具體點(diǎn)的是哪一張 voidDrawOtherCard();//畫出另外兩個(gè)玩家還剩下的牌,以及 //他們剛剛出牌 voidDrawMyCard();//畫出當(dāng)前玩家手中牌 voidOnCancel();//點(diǎn)擊退出按鈕后的響應(yīng)函數(shù) voidOnOK();//點(diǎn)擊確定按鈕后的響應(yīng)函數(shù) virtual~CProgramView(); CStringPlayerName[3];//用來存放三個(gè)玩家姓名的字符串 voidPrintAll();//整體重畫 friendclassNetControl;#ifdef_DEBUG virtualvoidAssertValid()const; virtualvoidDump(CDumpContext&dc)const;#endifprotected://Generatedmessagemapfunctionsprotected: //{{AFX_MSG(CProgramView) afx_msgintOnCreate(LPCREATESTRUCTlpCreateStruct); afx_msgvoidOnMouseMove(UINTnFlags,CPointpoint); afx_msgvoidOnLButtonDown(UINTnFlags,CPointpoint); afx_msgvoidOnKkndorc(); afx_msgvoidOnL1(); afx_msgvoidOnL2(); afx_msgvoidOnL3(); afx_msgvoidOnL4(); afx_msgvoidOnPoint(); afx_msgvoidOnChat(); afx_msgvoidOnL5(); afx_msgvoidOnMsopen(); afx_msgvoidOnMsclose(); afx_msgvoidOnSendc(); afx_msgvoidOnPassc(); afx_msgvoidOnReady(); afx_msgvoidOnExit(); afx_msgvoidOnCso(); afx_msgvoidOnCsc(); afx_msgvoidOnRButtonDown(UINTnFlags,CPointpoint); //}}AFX_MSG DECLARE_MESSAGE_MAP()private: boolisMsOpen; CBitmapm_callBitmap; inttimer; voidCardReady();//用來畫還沒發(fā)牌時(shí)牌的情況};//ProgramView.cpp:implementationoftheCProgramViewclass//#include"stdafx.h"#include"Program.h"#include"ProgramDoc.h"#include"ProgramView.h"#include"NetControl.h"#include"Managers.h"#include"mmsystem.h"#include"chat.h"#ifdef_DEBUG#definenewDEBUG_NEW#undefTHIS_FILEstaticcharTHIS_FILE[]=__FILE__;#endifexternManagersmanager;///////////////////////////////////////////////////////////////////////////////CProgramViewIMPLEMENT_DYNCREATE(CProgramView,CView)BEGIN_MESSAGE_MAP(CProgramView,CView) //{{AFX_MSG_MAP(CProgramView) ON_WM_CREATE() ON_WM_MOUSEMOVE() ON_WM_LBUTTONDOWN() ON_COMMAND(ID_KKNDORC,OnKkndorc) ON_COMMAND(IDM_L1,OnL1) ON_COMMAND(IDM_L2,OnL2) ON_COMMAND(IDM_L3,OnL3) ON_COMMAND(IDM_L4,OnL4) ON_COMMAND(IDM_POINT,OnPoint) ON_COMMAND(IDM_CHAT,OnChat) ON_COMMAND(IDM_L5,OnL5) ON_COMMAND(IDM_MSOPEN,OnMsopen) ON_COMMAND(IDM_MSCLOSE,OnMsclose) ON_COMMAND(IDM_SENDC,OnSendc) ON_COMMAND(IDM_PASSC,OnPassc) ON_COMMAND(IDM_READY,OnReady) ON_COMMAND(IDM_EXIT,OnExit) ON_COMMAND(IDM_CSO,OnCso) ON_COMMAND(IDM_CSC,OnCsc) ON_WM_TIMER() ON_WM_RBUTTONDOWN() //}}AFX_MSG_MAP // //將按鈕點(diǎn)擊事件同響應(yīng)函數(shù)聯(lián)系起來 ON_BN_CLICKED(ID_OK,OnOK)//讓ID_OK所指的對象響應(yīng)單擊(ON_BN_CLICKED)事件,事件 //的處理函數(shù)是OnOK ON_BN_CLICKED(ID_CANCEL,OnCancel) ON_BN_CLICKED(ID_SENDCARD,OnSendCard) ON_BN_CLICKED(ID_PASS,OnPass)END_MESSAGE_MAP()///////////////////////////////////////////////////////////////////////////////CProgramViewconstruction/destructionCProgramView::CProgramView(){ //TODO:addconstructioncodehere pControl=newNetControl(this);//創(chuàng)建一個(gè)指向NetControl的指針 manager.m_pView=this; isgoon=true; isMsOpen=true; manager.pControl=pControl; srand(time(NULL)); PlayerName[0]=""; PlayerName[1]=""; PlayerName[2]=""; cardleft=NULL; cardright=NULL; cardmiddle=NULL; m_isReady=false; isDrawed=false;//畫發(fā)牌了沒有,發(fā)牌完成了沒有}CProgramView::~CProgramView(){ if(!pControl->m_Isserver) pControl->SendMsg(pControl->m_pSocket,"退出游戲"); else pControl->Broadcast("退出游戲"); deletepControl;}BOOLCProgramView::PreCreateWindow(CREATESTRUCT&cs){ //TODO:ModifytheWindowclassorstylesherebymodifying //theCREATESTRUCTcs //加載位圖 m_background.LoadBitmap(IDB_BACKGROUND); m_card.LoadBitmap(IDB_CARD); returnCView::PreCreateWindow(cs);}///////////////////////////////////////////////////////////////////////////////CProgramViewdrawingvoidCProgramView::OnDraw(CDC*pDC){ CProgramDoc*pDoc=GetDocument(); ASSERT_VALID(pDoc); //TODO:adddrawcodefornativedatahere //初始化CDC static bool st=TRUE; if(st) { Background.CreateCompatibleDC(pDC); Background.SelectObject(m_background); Mcard.CreateCompatibleDC(pDC); Mcard.SelectObject(m_card); st=FALSE; } PrintAll();}///////////////////////////////////////////////////////////////////////////////CProgramViewprintingBOOLCProgramView::OnPreparePrinting(CPrintInfo*pInfo){ //defaultpreparation returnDoPreparePrinting(pInfo);}voidCProgramView::OnBeginPrinting(CDC*/*pDC*/,CPrintInfo*/*pInfo*/){ //TODO:addextrainitializationbeforeprinting}voidCProgramView::OnEndPrinting(CDC*/*pDC*/,CPrintInfo*/*pInfo*/){ //TODO:addcleanupafterprinting}///////////////////////////////////////////////////////////////////////////////CProgramViewdiagnostics#ifdef_DEBUGvoidCProgramView::AssertValid()const{ CView::AssertValid();}voidCProgramView::Dump(CDumpContext&dc)const{ CView::Dump(dc);}CProgramDoc*CProgramView::GetDocument()//non-debugversionisinline{ ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CProgramDoc))); return(CProgramDoc*)m_pDocument;}#endif//_DEBUG///////////////////////////////////////////////////////////////////////////////CProgramViewmessagehandlersintCProgramView::OnCreate(LPCREATESTRUCTlpCreateStruct){ if(CView::OnCreate(lpCreateStruct)==-1) return-1; //TODO:Addyourspecializedcreationcodehere ////////////////////////////////////////////////////////////////////////**函數(shù)名稱:CBUTTON.Creat(_T("確定"),//按鈕的caption屬性,按鈕的顯示 WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,//按鈕也是一種窗體,同樣有不同 //風(fēng)格,通過對常量或運(yùn)算進(jìn)行組合,達(dá)到一定的效果,這些常量的含義可以參考MSDN CRect(660,410,765,450),//這個(gè)參數(shù)指出按鈕在視圖中左上角和右下角坐標(biāo),在 //確定了按鈕位置的同時(shí)也確定了其大小 this,//這個(gè)指針指向按鈕這個(gè)窗體的父窗體 ID_OK);//這是剛才為按鈕定義的常量,按鈕的控制ID*函數(shù)介紹:創(chuàng)建按鈕*輸入?yún)?shù):見上*輸出參數(shù):無*返回值 :無*/ //創(chuàng)建按鈕OK /*m_ok.Create(_T("準(zhǔn)備"),WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, CRect(660,420,765,460),this,ID_OK);*/ m_ok.Create(_T("準(zhǔn)備"),WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, CRect(420,500,490,525),this,ID_OK); //創(chuàng)建按鈕CANCEL /*m_cancel.Create(_T("退出"),WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, CRect(660,502,765,542),this,ID_CANCEL); */ //出牌 /*m_sendcard.Create(_T("出牌"),WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, CRect(533,387,637,427),this,ID_SENDCARD);*/ m_sendcard.Create(_T("出牌"),WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, CRect(506,500,576,525),this,ID_SENDCARD); //過牌 /* m_pass.Create(_T("過牌"),WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, CRect(533,460,638,500),this,ID_PASS); */ m_pass.Create(_T("過牌"),WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, CRect(592,500,662,525),this,ID_PASS); // m_callBitmap.LoadBitmap(IDB_BITMAP1);// m_call.SetBitmap(m_callBitmap);/////////////////////////////////////////////////////////////////////////////*dow(SW_SHOW)*函數(shù)介紹:按鈕的顯示控制*輸入?yún)?shù):當(dāng)輸入?yún)?shù)為SW_SHOW表示顯示按鈕,當(dāng)為SW_HIDE表示隱藏按鈕*輸出參數(shù):無*返回值 :無*/ //顯示按鈕 m_ok.ShowWindow(SW_HIDE);// m_cancel.ShowWindow(SW_HIDE); m_sendcard.ShowWindow(SW_HIDE); m_pass.ShowWindow(SW_HIDE); //mciSendString("res\\ms1.wav",NULL,NULL,NULL); CStringstr="playres\\ms1.wav";mciSendString(str,0,0,0); //PlaySound("res\\ms1.wav",NULL,SND_ASYNC|SND_NODEFAULT); SetTimer(3,35000,NULL); return0;}voidCProgramView::OnMouseMove(UINTnFlags,CPointpoint){ //TODO:Addyourmessagehandlercodehereand/orcalldefault //跟蹤光標(biāo)坐標(biāo) int mx=point.x; int my=point.y; CString st; CDC *pdc=GetDC(); st.Format("%d,%d",point.x,point.y);// pdc->SetBkMode(TRANSPARENT);// pDC->SetTextColor(RGB(255,255,255)); pdc->TextOut(400,5,st); ReleaseDC(pdc); CView::OnMouseMove(nFlags,point);}///////////////////////////////////////////////////////////////////*函數(shù)名稱:OnOk()函數(shù)介紹:響應(yīng)確定按鈕的點(diǎn)擊輸入?yún)?shù):無輸出參數(shù):無返回值 :無*/voidCProgramView::OnOK(){// MessageBox("你點(diǎn)擊了確定按鈕");//改變 m_isReady=true; if(!pControl->m_Isserver)pControl->m_ready[1]=true; if(!pControl->m_Isserver&&pControl->m_ready[0]&&pControl->m_ready[1]&&pControl->m_ready[2]) { pControl->m_ready[0]=false; pControl->m_ready[1]=false; pControl->m_ready[2]=false; } if(manager.Game_State>=0&&manager.Game_State<3) return; if(manager.Game_State>=3) { manager.Game_State=-2; isgoon=true; } if(isgoon) { OutCards[0][0].Num=16; OutCards[1][0].Num=16; OutCards[2][0].Num=16; PrintAll(); if(!pControl->m_Isserver) { pControl->SendGetReady(); } else { pControl->m_ready[1]=true; if(pControl->m_ready[0]&&pControl->m_ready[1]&&pControl->m_ready[2]) { pControl->m_ready[0]=false; pControl->m_ready[1]=false; pControl->m_ready[2]=false; manager.GameStart(); pControl->StartCards(); PlayerPos(); PrintAll(1); // CStringstr; str.Format("%d",manager.Power);MessageBox(str); } } CDC *pdc=GetDC(); pdc->SetBkMode(TRANSPARENT); pdc->TextOut(350,394,"準(zhǔn)備"); m_ok.ShowWindow(SW_HIDE); ReleaseDC(pdc); GetParent()->GetMenu()->GetSubMenu(8)->EnableMenuItem(IDM_READY,MF_DISABLED|MF_GRAYED); if(manager.PlayerAc==0)pControl->Broadcast("ready0"); elseif(manager.PlayerAc==1)pControl->SendMsg(pControl->m_pSocket,"ready1"); elseif(manager.PlayerAc==2)pControl->SendMsg(pControl->m_pSocket,"ready2"); else; PrintAll(); }}/////////////////////////////////////////////////////////////////////*函數(shù)名稱:OnCancel()函數(shù)介紹:響應(yīng)取消按鈕的點(diǎn)擊輸入?yún)?shù):無輸出參數(shù):無返回值 :無*/voidCProgramView::OnCancel(){// MessageBox("你點(diǎn)擊了取消按鈕"); if(!pControl->m_Isserver) pControl->SendMsg(pControl->m_pSocket,"退出游戲"); else pControl->Broadcast("退出游戲"); exit(0);}////////////////////////////////////////////////////////////////////////*函數(shù)名稱:PrintAll(CDC*pdc)函數(shù)介紹:用來整體重畫輸入?yún)?shù):繪圖用CDC輸出參數(shù):無返回值 :無*/voidCProgramView::PrintAll(){ CDC *pdc=GetDC(); pdc->BitBlt(0,0,800,600,&Background,0,0,SRCCOPY); if(ma

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論