版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p><b> 連連看</b></p><p><b> 問題描述</b></p><p> 連連看是一款簡單有趣的小游戲,曾經風靡一時,玩家要將相同的兩張牌用三根以內的直線連在一起就可以消除,規(guī)則簡單容易上手,游戲速度節(jié)奏快,畫面清晰可愛,適合細心的玩家。游戲勝利條件的判定:將棋盤上面的格子全部消除掉;失敗的判定:規(guī)定的時間內
2、格子沒有消除。</p><p><b> 問題分析</b></p><p> 連連看需要解決的問題包括:</p><p> (1)整個游戲界面和各種圖案的圖形顯示;</p><p> ?。?)如何判斷鼠標所點的兩個圖像能否相消;</p><p> ?。?)如何判斷是否消除完全;</p&
3、gt;<p> (4)如何判斷游戲的結束及如何終止游戲;</p><p> (5)游戲難度的設計和得分規(guī)則</p><p> 游戲總的流程可以描述如下:首先出現(xiàn)游戲界面,一幅由10*6的小圖片的構成的畫面,玩家需要點擊 2 個相同圖案的對子,其連接線不多于 3 根直線,也就是說連接相同圖案時,直線只能有兩個折點,就可以成功將對子消除。</p><p&
4、gt; 此外,需要重點考慮的是游戲面板和各種形狀的方塊的數據結構表示。格子面板可以用一個二維數組來表示。</p><p><b> 開發(fā)工具的介紹</b></p><p> 【 VS2008 】</p><p> VS2008引入了250多個新特性,整合了對象、關系型數據、XML的訪問方式,語言更加簡潔。使用Visual Studio
5、2008可以高效開發(fā)Windows應用程序。設計器中可以實時反映變更,XAML中智能感知功能可以提高開發(fā)效率。同時Visual Studio 2008支持項目模板、調試器和部署程序。Visual Studio 2008可以高效開發(fā)Web應用,集成了AJAX 1.0,包含AJAX項目模板,它還可以高效開發(fā)Office應用和Mobile應用。VS的開發(fā)界面分為兩個版本:整合模式和孤立模式,分別對基于語言的開發(fā)和基于特別工具的開發(fā)作了優(yōu)化。&
6、lt;/p><p><b> 【 EasyX 】</b></p><p> EasyX 是針對 C++ 的圖形庫,可以幫助 C 語言初學者快速上手圖形和游戲編程。</p><p> 許多學編程的都是從 C 語言開始入門的,而目前的現(xiàn)狀是:</p><p> 1. 有些學校以 Turbo C 為環(huán)境講 C 語言,只是
7、Turbo C 的環(huán)境實在太老了,復制粘貼都很不方便。</p><p> 2. 有些學校直接拿 VC 來講 C 語言,因為 VC 的編輯和調試環(huán)境都很優(yōu)秀,并且 VC 有適合教學的免費版本。可惜在 VC 下只能做一些文字性的練習題,想畫條直線畫個圓都很難,還要注冊窗口類、建消息循環(huán)等等,初學者會受嚴重打擊的。初學編程想要繪圖就得用 TC,很是無奈。</p><p> 3. 還有計算機圖
8、形學,這門課程的重點是繪圖算法,而不是 Windows 編程。所以,許多老師不得不用 TC 教學,因為 Windows 繪圖太復雜了,會偏離教學的重點。新的圖形學的書有不少是用的 OpenGL,可是門檻依然很高。</p><p> 所以,于是就有了EasyX 庫方便的開發(fā)平臺和 TC 簡單的繪圖功能。</p><p><b> 設計</b></p>
9、<p><b> 【程序總體結構】:</b></p><p><b> 【界面設計】:</b></p><p> 界面的設計通過插入背景圖片 beijing.bmp , 在對每一個格子的賦圖片,通過getimage( )從board.bmp中截下所需要的圖,再利用putimage( )放置每一個小圖。</p><
10、;p><b> 具體算法:</b></p><p> loadimage(&beijing,"D:\\llk\\beijing.bmp");//載入背景圖</p><p> putimage(0,0,&beijing);//放置背景圖</p><p> for(int i = 0 ;i <
11、 ROW; i ++)</p><p> for(int j = 0 ;j < COL ; j++)</p><p><b> {</b></p><p> idy = i * 54 + board_Y ,idx = j * 48+ board_X;</p><p> putimage(idx,idy,&a
12、mp;image[board[i + 1][j + 1]]);//根據賦的值放置每一個格子圖</p><p><b> }</b></p><p> beijing.bmp</p><p><b> board.bmp</b></p><p> 【重要數據的數據結構設計】:</p
13、><p> struct BOARD //點擊的格子信息</p><p><b> {</b></p><p> int tx,ty; //格子坐標</p><p> int xx,yy; //屏幕坐標</p><p> int data;
14、 //圖片類型</p><p><b> };</b></p><p> 定義BOARD型的結構體,里面包含的是鼠標點擊以后,所讀取的點擊點在屏幕里的坐標(xx,yy)</p><p> 在二維數組里的坐標board[tx][ty],以及在給每一個二維數組元素賦的值data(用來判斷兩個格子是否相等,相等以后賦值為0,以便判斷是否存在格子
15、,為之后的尋找路徑鋪墊)</p><p> int board[ROW + 2][COL + 2];</p><p> 二維數組,用來記錄格子的信息,其值是判定是否有方塊的標志。</p><p> MOUSEMSG mouse;</p><p> 鼠標的記錄類型struct MOUSEMSG</p><p>
16、;<b> {</b></p><p> UINT uMsg; // 當前鼠標消息</p><p> bool mkCtrl; // Ctrl 鍵是否按下</p><p> bool mkShift; // Shift 鍵是否按下</p><p> bool mkLButton; // 鼠標
17、左鍵是否按下</p><p> bool mkMButton; // 鼠標中鍵是否按下</p><p> bool mkRButton; // 鼠標右鍵是否按下</p><p> int x; // 當前鼠標 x 坐標(物理坐標)</p><p> int y; // 當前鼠標 y 坐標(物理坐標)
18、</p><p> int wheel; // 鼠標滾輪滾動值</p><p><b> };</b></p><p> #define board_X 140 //格子區(qū)距左邊框距離</p><p> #define board_Y 140 //格子呢區(qū)距上邊框距離
19、</p><p> #define COL 10 //格子區(qū)列數</p><p> #define ROW 6 //格子區(qū)行數</p><p> #define board_number 15 //游戲圖片數目</p><p><b> 【函數
20、設計】:</b></p><p><b> 函數的功能列表:</b></p><p> void Init();//初始化界面</p><p> void load_picture (); //加載圖片</p><p> void del(BOARD &rec);//每個格子賦值為&l
21、t;/p><p> void leftbottondown (MOUSEMSG mouse);//實現(xiàn)鼠標左擊效果</p><p> void frame (int leftx,int lefty);//畫邊框</p><p> bool judge_mouse(int leftx,int lefty);//判斷鼠標是否在游戲區(qū)</p>&
22、lt;p> void select(int leftx,int lefty);//顯示選中效果</p><p> void accurate(int& leftx,int& lefty);//使格子的坐標都在邊緣</p><p> void cover(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int
23、 y4); //覆蓋直線</p><p> void line(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4) ; //用直線連接</p><p> void exchange(BOARD& pre,BOARD& cur);//交換格子信息</p><p> b
24、ool click(int mousex,int mousey); //判斷單擊是否有效</p><p> void record(int leftx,int lefty,BOARD &rec);//記錄選中的格子</p><p> void mouse_to_board(int mousex,int mousey,int *idx,int *idy
25、);//鼠標的坐標轉為格子的數組下標</p><p> int findpath(BOARD &pre,BOARD &cur);//尋找路徑,判斷是否相等</p><p> void progressbar();//畫進度條</p><p> void updateprogressbar(long t);//更新進度條</p>
26、<p> 因為有許多的函數是執(zhí)行圖像處理以及坐標轉化的簡單操作,這里畫出包含關鍵算法的主要函數的流程圖,其他的函數只做文字的描述介紹。</p><p> findpath(BOARD &pre,BOARD &cur)函數</p><p> cover(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y
27、4)函數</p><p><b> Init()函數</b></p><p> load_picture ()函數:</p><p> 這是一個類似于初始圖片的函數,利用 loadimage ,SetWorkingImage,對含有格子圖片信息的圖進行分割讀取,并存入image[]的IMAGE類型的數組里,同時還讀入了填充背景的圖(填充線
28、條)。</p><p> del(BOARD &rec)函數:</p><p> 刪除函數,將之前記錄的鼠標信息全部賦值為0;</p><p> leftbottondown (MOUSEMSG mouse)函數:</p><p> 記錄鼠標的信息,如果鼠標是第一次點擊的話,將其信息存入pre里,如果鼠標是第二次點擊的話,將其
29、存入cur里,通過findpath()函數來相消與否,如果能相消,則將鼠標點的兩塊區(qū)域覆蓋,同時調用del函數,來清除信息,在此過程中,根據統(tǒng)計剩余格子對數的變量counter,來給出分數(用s[]數組來存儲分數信息,并在相應位置輸出)。</p><p> frame (int leftx,int lefty)函數:</p><p> 根據導入的參數畫一個格子邊框。</p>
30、<p> judge_mouse(int leftx,int lefty)函數:</p><p> 判斷鼠標的點擊區(qū)域是否在規(guī)定的范圍里。</p><p> select(int leftx,int lefty)函數:</p><p> 在鼠標點擊選擇以后,顯示frame的效果,并記錄數據。</p><p> accu
31、rate(int& leftx,int& lefty)函數:</p><p> 規(guī)范坐標的函數,鼠標點擊的區(qū)域是在一個范圍內的,此函數能把屬于一個區(qū)域的坐標歸整為統(tǒng)一的坐標。</p><p> line(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4) 函數:</p><p> 連
32、線函數,通過導入的點的坐標來調用moveto,lineto函數畫線。</p><p> exchange(BOARD& pre,BOARD& cur)函數:</p><p> 交換格子信息的函數,在點擊2次后,發(fā)現(xiàn)兩個格子并不能相消后,將pre取第二次點擊的格子信息。</p><p> click(int mousex,int mousey)函
33、數:</p><p> 判斷點擊的地方是不是有效,即已經被消去的格子,點擊時,沒有像有格子的地方一樣會出現(xiàn)線框的情況。</p><p> record(int leftx,int lefty,BOARD &rec)函數:</p><p> 將鼠標的屏幕坐標轉化并記錄在BOARD類型的變量里。</p><p> mouse_to
34、_board(int mousex,int mousey,int *idx,int *idy)函數:</p><p> 將鼠標的坐標轉化為格子信息。</p><p> progressbar( )函數:</p><p> 畫進度條,作矩形,并填充相應顏色。</p><p> updateprogressbar(long t)函數:&l
35、t;/p><p> 進度條的更新函數,讀取當前系統(tǒng)時間與游戲開始時系統(tǒng)時間的差,來畫圖覆蓋進度條,從而達到進度條運動的效果。</p><p> 【程序運行整體視圖】</p><p><b> 源程序</b></p><p> #include <stdio.h></p><p>
36、 #include <graphics.h></p><p> #include <conio.h></p><p> #include <time.h></p><p> #include <windows.h></p><p> #include <mmsystem.h>
37、//播放音樂用的庫</p><p> #pragma comment(lib, "WINMM.LIB")//播放音樂用的庫</p><p> #define ture 1</p><p> #define flase 0</p><p> #define board_X 140 //格子區(qū)距左邊框距
38、離</p><p> #define board_Y 140 //格子呢區(qū)距上邊框距離</p><p> #define COL 10 //格子區(qū)列數</p><p> #define ROW 6 //格子區(qū)行數</p><p> #define boa
39、rd_number 15 //游戲圖片數目</p><p> #define W 48 //格子的長</p><p> #define H 54 //格子的寬</p><p> #define N 555 //背景的寬</p><p> #define
40、M 797 //背景的長</p><p> #define max(a,b) a>b?a:b</p><p> #define min(a,b) a<b?a:b</p><p> #define DGREE 2 //時間條的運動速度</p><p> struct BOARD
41、 //點擊的格子信息</p><p><b> {</b></p><p> int tx,ty; //格子坐標</p><p> int xx,yy; //屏幕坐標</p><p> int data; //圖片類型</p><p> }pr
42、e,cur,dur;</p><p> IMAGE image[board_number+ 1]; //圖片庫</p><p> IMAGE tianchong; //填充圖片</p><p> IMAGE tianchong1; //覆蓋分數的圖片</p><p> IMAGE tianchong2; //覆蓋分數的圖
43、片</p><p> int board[ROW + 2][COL + 2]; //游戲圖紙</p><p> MOUSEMSG mouse;</p><p> int counter=board_number*2;</p><p> void Init();//初始化界面
44、 </p><p> void load_picture ();//加載圖片</p><p> void del(BOARD &rec);//每個格子賦值為</p><p> void leftbottondown (MOUSEMSG
45、 mouse);//實現(xiàn)鼠標左擊效果</p><p> void frame (int leftx,int lefty);//畫邊框</p><p> bool judge_mouse(int leftx,int lefty);//判斷鼠標是否在游戲區(qū)</p><p> void select(int leftx
46、,int lefty);//顯示選中效果</p><p> void accurate(int& leftx,int& lefty);//使格子的坐標都在邊緣</p><p> void cover(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4);
47、 //覆蓋直線</p><p> void line(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4) ; //用直線連接</p><p> void exchange(BOARD& pre,BOARD& cur);//交換格子信息</p&g
48、t;<p> bool click(int mousex,int mousey); //判斷單擊是否有效</p><p> void record(int leftx,int lefty,BOARD &rec);//記錄選中的格子</p><p> void mouse_to_board(int mousex,in
49、t mousey,int *idx,int *idy);//鼠標的坐標轉為格子的數組下標</p><p> int findpath(BOARD &pre,BOARD &cur);//尋找路徑,判斷是否相等</p><p> void progressbar();//畫進度條</p><p> void updateprogressbar
50、(long t);//更新進度條</p><p> int findpath(BOARD &pre,BOARD &cur)</p><p><b> {</b></p><p> int i,j,path,min1,max1,min2,max2,left,right,top,bottom;</p><
51、p><b> int m,n;</b></p><p> if (board[pre.ty][pre.tx]!= board[cur.ty][cur.tx]) //判斷是否點中相同</p><p> return false;</p><p> min1=max1=pre.tx;</p><p> min
52、2=max2=cur.tx;</p><p> while (min1-1>=0 && board[pre.ty][min1-1]==0) min1--;//查找水平方向公共區(qū)域</p><p> while (min2-1>=0 && board[cur.ty][min2-1]==0) min2--;</p><p>
53、; left=max(min1,min2); // 左邊界</p><p> while (max1+1<=11 && board[pre.ty][max1+1]==0) max1++;</p><p> while (max2+1<=11 && board[cur.ty][max2+1]==0) max2++;</p>&
54、lt;p> right=min(max1,max2); // 右邊界</p><p> if (left==0)</p><p><b> { </b></p><p> line(pre.tx,pre.ty,0,pre.ty,0,cur.ty,cur.tx,cur.ty);//左邊緣連通</p><p>
55、 Sleep(300);</p><p> cover(pre.xx,pre.yy,board_X-48,pre.yy,board_X-48,cur.yy,cur.xx,cur.yy);//覆蓋線條</p><p> return true;</p><p><b> }</b></p><p> if (ri
56、ght==11)</p><p><b> {</b></p><p> line(pre.tx,pre.ty,11,pre.ty,11,cur.ty,cur.tx,cur.ty);</p><p> Sleep(300);</p><p> cover(pre.xx,pre.yy,board_X+480,pre
57、.yy,board_X+480,cur.yy,cur.xx,cur.yy);//覆蓋線條</p><p> return true;</p><p><b> }</b></p><p> for (i=left;i<=right;i++)</p><p><b> {</b><
58、/p><p> path=0;//記錄豎直方向上的長度</p><p> m=min(pre.ty,cur.ty);</p><p> n=max(pre.ty,cur.ty);</p><p> for (j=m+1;j<n;j++)</p><p><b> {</b></p
59、><p> path=path+board[j][i];</p><p> if (path>0) break;</p><p><b> }</b></p><p> if (path==0)</p><p><b> {</b></p><
60、p> line(pre.tx,pre.ty,i,pre.ty,i,cur.ty,cur.tx,cur.ty);</p><p> Sleep(300);</p><p> cover(pre.xx,pre.yy,board_X+(i-1)*48,pre.yy,board_X+(i-1)*48,cur.yy,cur.xx,cur.yy);//覆蓋線條</p><
61、;p> return true;</p><p><b> }</b></p><p><b> }</b></p><p> min1=max1=pre.ty;//查找垂直方向公共區(qū)域</p><p> min2=max2=cur.ty;</p><p>
62、 while (min1-1>=0 && board[min1-1][pre.tx]==0) min1--;</p><p> while (min2-1>=0 && board[min2-1][cur.tx]==0) min2--;</p><p> top=max(min1,min2);</p><p> whi
63、le (max1+1<=7 && board[max1+1][pre.tx]==0) max1++;</p><p> while (max2+1<=7 && board[max2+1][cur.tx]==0) max2++;</p><p> bottom=min(max1,max2);</p><p> if (
64、top==0)</p><p><b> {</b></p><p> line(pre.tx,pre.ty,pre.tx,0,cur.tx,0,cur.tx,cur.ty);//同在頂端消除</p><p> Sleep(300);</p><p> cover(pre.xx,pre.yy,pre.xx,boa
65、rd_Y-54,cur.xx,board_Y-54,cur.xx,cur.yy);//覆蓋線條</p><p> return true;</p><p><b> }</b></p><p> if (bottom==7)</p><p><b> {</b></p><
66、;p> line(pre.tx,pre.ty,pre.tx,7,cur.tx,7,cur.tx,cur.ty);</p><p> Sleep(300);</p><p> cover(pre.xx,pre.yy,pre.xx,board_Y+324,cur.xx,board_Y+324,cur.xx,cur.yy);//覆蓋線條</p><p> r
67、eturn true;</p><p><b> }</b></p><p> for (j=top;j<=bottom;j++)</p><p><b> {</b></p><p> path=0;//記錄水平方向的長度</p><p> m=min(pr
68、e.tx,cur.tx);</p><p> n=max(pre.tx,cur.tx);</p><p> for (i=m+1; i<n; i++)</p><p><b> {</b></p><p> path+=board[j][i];</p><p> if (path&
69、gt;0) break;</p><p><b> }</b></p><p> if (path==0)</p><p><b> {</b></p><p> line(pre.tx,pre.ty,pre.tx,j,cur.tx,j,cur.tx,cur.ty);</p>
70、<p> Sleep(300);</p><p> cover(pre.xx,pre.yy,pre.xx,board_Y+(j-1)*54,cur.xx,board_Y+(j-1)*54,cur.xx,cur.yy);//覆蓋線條</p><p> return true;</p><p><b> }</b></p&g
71、t;<p><b> }</b></p><p> return false;</p><p><b> }</b></p><p> void Init() //初始化</p><p><b> {</b></p><p>
72、 int ix,iy,jx,jy,idx,idy,temp;</p><p> srand((unsigned)time(NULL));</p><p> load_picture();</p><p> IMAGE beijing;</p><p> for(int i= 0, x = 1; x <= ROW; ++x )&l
73、t;/p><p><b> {</b></p><p> for( int y = 1; y <= COL; ++y )</p><p><b> {</b></p><p> board[x][y] = i++ % board_number + 1;</p><p&
74、gt;<b> }</b></p><p><b> }</b></p><p> loadimage(&beijing,"D:\\llk\\beijing.bmp");//載入背景圖</p><p> putimage(0,0,&beijing);//放置背景圖</p&g
75、t;<p> getimage(&tianchong,3 * 48,2 * 54,49,55);</p><p> getimage(&tianchong1,3 * 48,2 * 54,70,55);</p><p> getimage(&tianchong2,758,150,50,55);</p><p> for(
76、int k = 0; k <60; ++k )</p><p><b> {</b></p><p> ix = rand() % ROW + 1;</p><p> iy = rand() % COL + 1;</p><p> jx = rand() % ROW + 1; </p>
77、<p> jy = rand() % COL + 1;</p><p> if( board[ix][iy] != board[jx][jy]) //使數據打亂</p><p><b> {</b></p><p> temp= board[ix][iy];</p><p> board[ix][
78、iy] = board[jx][jy];</p><p> board[jx][jy] =temp;</p><p><b> }</b></p><p><b> }</b></p><p> for(int i = 0 ;i < ROW; i ++)</p><
79、p> for(int j = 0 ;j < COL ; j++)</p><p><b> {</b></p><p> idy = i * 54 + board_Y ,idx = j * 48+ board_X;</p><p> putimage(idx,idy,&image[board[i + 1][j + 1
80、]]);//根據賦的值放置每一個格子圖</p><p><b> }</b></p><p> setbkmode(TRANSPARENT);</p><p> setfont(35, 0,"華文琥珀");</p><p> setcolor(YELLOW);</p>&l
81、t;p> outtextxy(700, 100,"分數");</p><p> outtextxy(700, 150,"000");</p><p><b> }</b></p><p> void load_picture()</p><p><
82、;b> {</b></p><p> IMAGE image1,background;</p><p> loadimage(&image1,"D:\\llk\\board.bmp");</p><p> SetWorkingImage(&image1);</p><p> f
83、or(int i = 1 ;i <=board_number;i ++)</p><p> getimage(&image[i],0,i * 54,48, 54);</p><p> loadimage(&background,"IMAGE","bg");</p><p> SetWorkingI
84、mage(&background);</p><p> getimage(&tianchong,3 * 56,2 * 60,56,60);</p><p> SetWorkingImage();</p><p> putimage(0,0,&background);</p><p><b> }<
85、;/b></p><p> void leftbottondown (MOUSEMSG mouse) //單擊左鍵</p><p><b> {</b></p><p> static int click1 = 0,x,y;</p><p> char s[3];</p><p>
86、 int number,i;</p><p><b> click1++;</b></p><p> select(mouse.x,mouse.y);//顯示選中效果</p><p> if(click1 == 1)</p><p><b> {</b></p>
87、<p> record(mouse.x,mouse.y,pre);</p><p><b> }</b></p><p> if(click1 == 2) </p><p><b> {</b></p><p> mouse_to_board(mouse.x,mouse.y,&
88、amp;x,&y);</p><p> if(x != pre.tx||y != pre.ty)</p><p><b> {</b></p><p> record(mouse.x,mouse.y,cur);</p><p> if(findpath(pre,cur))</p><p
89、><b> {</b></p><p> board[pre.ty][pre.tx] = board[cur.ty][cur.tx] =0;</p><p> putimage(pre.xx,pre.yy,&tianchong);</p><p> putimage(cur.xx,cur.yy,&tianchong
90、);</p><p> del(pre); </p><p> del(cur); </p><p> click1 = 0;</p><p> counter--;</p><p> putimage(700,150,&tianchong1);</p><p> num
91、ber=20*(board_number*2-counter);</p><p> for(i=2;i>=0;i--)</p><p><b> {</b></p><p> s[i] = number % 10 + '0';</p><p> number/= 10;</p>
92、<p><b> }</b></p><p> setbkmode(TRANSPARENT);</p><p> setfont(35, 0,"華文琥珀");</p><p> setcolor(YELLOW);</p><p> outtextxy(700, 150,s);&l
93、t;/p><p> putimage(758,150,&tianchong2);</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> exchange(d
94、ur,pre); </p><p> exchange(pre,cur); </p><p> del(cur);</p><p> click1 = 1;</p><p> putimage(dur.xx,dur.yy,&image[board[dur.ty][dur.tx]]);</p><p
95、><b> }</b></p><p><b> }</b></p><p> else click1= 1;</p><p><b> }</b></p><p><b> }</b></p><p>
96、void select (int leftx,int lefty)//選中時效果</p><p><b> {</b></p><p> if(judge_mouse(leftx,lefty))</p><p><b> {</b></p><p><b> int
97、 x,y;</b></p><p> mouse_to_board(leftx,lefty,&x,&y);</p><p> accurate(leftx,lefty);</p><p> frame(leftx,lefty);</p><p><b> }</b></p>
98、<p><b> }</b></p><p> bool judge_mouse(int leftx,int lefty) //判斷鼠標是否在游戲區(qū)</p><p><b> {</b></p><p> return leftx >board_X &&a
99、mp; leftx < board_X + W * COL && </p><p> lefty >board_Y && lefty < board_Y+ H * ROW;</p><p><b> }</b></p><p> void mouse_to_board(int mouse
100、x,int mousey ,int *x,int *y) //鼠標坐標轉化為圖紙坐標</p><p><b> {</b></p><p> if(judge_mouse(mousex,mousey))</p><p><b> {</b></p><p> *x = (mousex -b
101、oard_X) / 48 + 1;</p><p> *y = (mousey -board_Y) / 54 + 1 ;</p><p><b> }}</b></p><p> void record(int leftx,int lefty,BOARD &rec)//記錄選中的信息</p><p>
102、;<b> {</b></p><p> mouse_to_board(leftx,lefty,&rec.tx,&rec.ty);</p><p> rec.xx = (rec.tx - 1) * 48 +board_X;</p><p> rec.yy = (rec.ty - 1) * 54 +board_Y;<
103、/p><p> rec.data = board[rec.ty][rec.tx];</p><p><b> }</b></p><p> bool click(int mousex,int mousey)//判斷單擊是否有效</p><p><b> {</b></p>&
104、lt;p><b> int x,y;</b></p><p> mouse_to_board(mousex,mousey,&x,&y);//轉化為格子坐標</p><p> if(judge_mouse(mouse.x,mouse.y) && board[y][x] != 0)</p><p>
105、 return true;</p><p> return false;</p><p><b> }</b></p><p> void frame(int leftx,int lefty)//畫方框</p><p><b> {</b></p><p>
106、 setcolor(RGB(126,91,68));</p><p> setlinestyle(PS_SOLID,3);</p><p> rectangle(leftx,lefty,leftx+47,lefty+53);</p><p> rectangle(leftx + 2,lefty + 2,leftx+47,lefty+53);</p>
107、;<p> setcolor(RGB(250,230,169));</p><p> rectangle(leftx + 1,lefty + 1,leftx+48,lefty+54);</p><p><b> }</b></p><p> void accurate(int& leftx,int& le
108、fty)</p><p><b> {</b></p><p> leftx = ((leftx -board_X) / 48) *48 +board_X;</p><p> lefty = ((lefty -board_Y) / 54) *54 +board_Y;</p><p><b> }&
109、lt;/b></p><p> void exchange(BOARD &pre,BOARD &cur)//交換格子信息</p><p><b> {</b></p><p> pre.data = cur.data;</p><p> pre.tx = cur.tx;pre.ty =
110、cur.ty;</p><p> pre.xx= cur.xx;pre.yy = cur.yy;</p><p><b> }</b></p><p> void del(BOARD &rec) //每個格子賦值為</p><p><b> {</b
111、></p><p> rec.data = 0;</p><p> rec.tx= 0; </p><p> rec.ty = 0;</p><p> rec.xx = 0;</p><p> rec.yy = 0;</p><p><b> }<
112、/b></p><p> void line(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4)</p><p><b> {</b></p><p> setlinestyle(PS_SOLID,NULL,3);</p><p> setcol
113、or(RGB(252,228,20));</p><p> moveto(board_X+24+48*(x1-1),board_Y+27+54*(y1-1));</p><p> lineto(board_X+24+48*(x2-1),board_Y+27+54*(y2-1));</p><p> lineto(board_X+24+48*(x3-1),boa
114、rd_Y+27+54*(y3-1));</p><p> lineto(board_X+24+48*(x4-1),board_Y+27+54*(y4-1));</p><p><b> }</b></p><p> void cover(int x1,int y1,int x2,int y2,int x3,int y3,int x4,in
115、t y4) </p><p><b> { </b></p><p> int minx,miny,maxx,maxy;</p><p> if(x1 == x2)</p><p><b> {</b></p><p> maxy = y1 >
116、y2? y1:y2;</p><p> miny = y1 < y2? y1:y2;</p><p> for(int i = miny; i <= maxy;i += 54)</p><p> putimage(x1,i,&tianchong);</p><p><b> }</b>&l
117、t;/p><p> else if(y1 == y2)</p><p><b> {</b></p><p> maxx = x1 > x2? x1:x2;</p><p> minx = x1 < x2? x1:x2;</p><p> for(int j = minx; j
118、<= maxx;j += 48)</p><p> putimage(j,y1,&tianchong);</p><p><b> }</b></p><p> if(x2 == x3)</p><p><b> {</b></p><p> max
119、y = y2 > y3? y2:y3;</p><p> miny = y2 < y3? y2:y3;</p><p> for(int i = miny; i <= maxy;i += 54)</p><p> putimage(x2,i,&tianchong);</p><p><b> }
120、</b></p><p> else if(y2 == y3)</p><p><b> {</b></p><p> maxx = x2 > x3? x2:x3;</p><p> minx = x2 < x3? x2:x3;</p><p> for(int
121、j = minx; j <= maxx;j += 48)</p><p> putimage(j,y2,&tianchong);</p><p><b> }</b></p><p> if(x3 == x4)</p><p><b> {</b></p>&l
122、t;p> maxy = y3 > y4? y3:y4;</p><p> miny = y3 < y4? y3:y4;</p><p> for(int i = miny; i <= maxy;i += 54)</p><p> putimage(x3,i,&tianchong);</p><p>&l
123、t;b> }</b></p><p> else if(y3 == y4)</p><p><b> {</b></p><p> maxx = x3 > x4? x3:x4;</p><p> minx = x3 < x4? x3:x4;</p><p&g
124、t; for(int j = minx; j <= maxx;j += 48)</p><p> putimage(j,y3,&tianchong);</p><p><b> }</b></p><p><b> }</b></p><p> void progressb
125、ar()//進度條的初始化</p><p><b> {</b></p><p> setcolor(YELLOW);</p><p> rectangle(150,50,530,75);</p><p> setcolor(YELLOW);</p><p> rectangle(153
126、,53,527,72);</p><p> setfillstyle(RED);</p><p> floodfill(151,51,YELLOW);</p><p> setfillstyle(RED);</p><p> floodfill(160,60,YELLOW);</p><p><b>
127、 }</b></p><p> void updateprogressbar(long t)//進度條的更新</p><p><b> {</b></p><p> setcolor(WHITE);</p><p> rectangle(524-DGREE*t,54,526,71);</p&g
128、t;<p> setfillstyle(WHITE);</p><p> floodfill(525-DGREE*t,60,WHITE);</p><p><b> }</b></p><p> void main()</p><p><b> {</b></p>
129、;<p> long t_base,t_run,t;</p><p> IMAGE bye,fail;</p><p> initgraph(M,N);</p><p><b> Init();</b></p><p> loadimage(&bye,"d:\\llk\\end.
130、bmp");//成功時的圖</p><p> loadimage(&fail,"d:\\llk\\fail.bmp");//失敗時的圖</p><p> PlaySound("d:\\llk\\sound.wav", NULL, SND_FILENAME | SND_ASYNC);//背景音樂</p><p&
131、gt; progressbar();</p><p> t_base= time(NULL);</p><p><b> while(1)</b></p><p><b> {</b></p><p> t_run=time(NULL);</p><p> t=
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論