設(shè)計(jì)要求:
設(shè)計(jì)要求實(shí)現(xiàn)如下功能:
(1)設(shè)計(jì)實(shí)現(xiàn)一個(gè)連連看游戲;
(2)玩家選擇兩個(gè)相同的棋子則兩棋子同時(shí)消去,可消去的棋子之間應(yīng)該能連通,且連接時(shí)拐角不能超過兩個(gè);
(3)當(dāng)玩家找不到相應(yīng)棋子時(shí),玩家輸入“?? ??”,系統(tǒng)應(yīng)該提示可消去的棋子位置;
(4)棋盤面積至少為20x20,中間應(yīng)該空出大約10%~20%的空間用‘-’表示。棋子用大寫字母ABCD表示。(提示:棋子種類不宜太多,且每種為偶數(shù));
這是一個(gè)比較簡單的搜索問題。
比如說:game[i][j];按其四個(gè)方向進(jìn)行搜索,在i和j上的標(biāo)號為1,表示沒有拐角,在對1周圍四個(gè)方向進(jìn)行展開并標(biāo)為2,表示有一個(gè)拐點(diǎn);再對為2的拐點(diǎn)展開,同樣的標(biāo)為3,表示經(jīng)過兩次拐角能夠到達(dá)!其他的點(diǎn)為0;
if(game[i][j]==0)return false;//表示不能找到這樣的點(diǎn)
if(game[i][j]>0&&game[i][j]<4)return true;//表示可以找到這樣的點(diǎn)
下面是關(guān)鍵部分的代碼,如有錯(cuò)誤,請高手指點(diǎn)
bool search(int x1,int y1,int x2,int y2)
2 {
3 memset(gk,0,sizeof(gk));
4 char t=game[x2][y2];
5 game[x2][y2]=' ';
6 gk[x1][y1]=1;
7 //對game[x1][y1]四個(gè)方向是空格的標(biāo)為1
8 for (int i=x1-1;i>=0;i--){
9 if(game[i][y1]==' ')gk[i][y1]=1;
10 else break;
11 }
12 for (int j=x1+1;j<26;j++){
13 if(game[j][y1]==' ')gk[j][y1]=1;
14 else break;
15 }
16
17 for (int i=y1-1;i>=0;i--){
18 if(game[x1][i]==' ')gk[x1][i]=1;
19 else break;
20 }
21 for (int i=y1+1;i<26;i++){
22 if(game[x1][i]==' ')gk[x1][i]=1;
23 else break;
24 }
25
26 //對gk[i][j]為1的四個(gè)方向是空格的標(biāo)為2
27 for (int i=1;i<26;i++)
28 for (int j=1;j<26;j++)
29 if (gk[i][j]==1){
30 for (int k=i-1;k>=0;k--){
31 if (game[k][j]==' '){
32 if(gk[k][j]==0)gk[k][j]=2;
33 }
34 else break;
35 }
36 for (int k=i+1;k<26;k++){
37 if (game[k][j]==' '){
38 if(gk[k][j]==0)gk[k][j]=2;
39 }
40 else break;
41 }
42
43 for (int k=j-1;k>=0;k--){
44 if (game[i][k]==' '){
45 if(gk[i][k]==0)gk[i][k]=2;
46 }
47 else break;
48 }
49 for (int k=j+1;k<26;k++){
50 if (game[i][k]==' '){
51 if(gk[i][k]==0)gk[i][k]=2;
52 }
53 else break;
54 }
55 }
56 //對gk[i][j]為2的四個(gè)方向是空格的標(biāo)為3
57 for (int i=1;i<26;i++)
58 for (int j=1;j<26;j++)
59 if (gk[i][j]==2){
60 for (int k=i-1;k>=0;k--){
61 if (game[k][j]==' '){
62 if(gk[k][j]==0)gk[k][j]=3;
63 }
64 else break;
65 }
66 for (int k=i+1;k<26;k++){
67 if (game[k][j]==' '){
68 if(gk[k][j]==0)gk[k][j]=3;
69 }
70 else break;
71 }
72
73 for (int k=j-1;k>=0;k--){
74 if (game[i][k]==' '){
75 if(gk[i][k]==0)gk[i][k]=3;
76 }
77 else break;
78 }
79 for (int k=j+1;k<26;k++){
80 if (game[i][k]==' '){
81 if(gk[i][k]==0)gk[i][k]=3;
82 }
83 else break;
84 }
85 }
86
87 game[x2][y2]=t;
88 if(gk[x2][y2]>0&&gk[x2][y2]<4)return true;//如果連同且拐角不超過兩個(gè),返回true
89 if(gk[x2][y2]==0) return false; //否則返回false
90 }
posted on 2010-06-18 13:10
路修遠(yuǎn) 閱讀(2912)
評論(1) 編輯 收藏 引用