posts - 14,  comments - 11,  trackbacks - 0

设计要求:

设计要求实现如下功能:

1)设计实现一个连连看游戏;

2)玩家选择两个相同的棋子则两棋子同时消去,可消去的子之间应该能连通,且连接时拐角不能超过两个;

3)当玩家找不到相应棋子时,玩家输入“?? ??”,系统应该提示可消去的棋子位置;

4)棋盘面积至少为20x20,中间应该空出大约10%~20%的空间用‘-’表示。棋子用大写字母ABCD表示。(提示:棋子种类不宜太多,且每种为偶数);

这是一个比较简单的搜索问题。
比如说:game[i][j];按其四个方向进行搜索,在i和j上的标号为1,表示没有拐角,在对1周围四个方向进行展开并标为2,表示有一个拐点;再对为2的拐点展开,同样的标为3,表示经过两次拐角能够到达!其他的点为0;
if(game[i][j]==0)return false;//表示不能找到这样的点
if(game[i][j]>0&&game[i][j]<4)return true;//表示可以找到这样的点


下面是关键部分的代码,如有错误,请高手指点
 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]四个方向是空格的标为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的四个方向是空格的标为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的四个方向是空格的标为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;//如果连同且拐角不超过两个,返回true 
89          if(gk[x2][y2]==0return false;  //否则返回false 
90       }
posted on 2010-06-18 13:10 路修远 阅读(2908) 评论(1)  编辑 收藏 引用

FeedBack:
# re: C++连连看源程序(课程设计ccsu)
2010-07-01 14:01 | 王不留
思路很好,学习了。赞!  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2012年4月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

转载,请标明出处!谢谢~~

常用链接

留言簿(1)

随笔分类

随笔档案

文章档案

搜索

  •  

最新评论

  • 1. re: HDU 2433 最短路
  • @test
    的确这组数据应该输出20的
  • --YueYueZha
  • 2. re: HDU 2433 最短路
  • 这方法应该不对。 看下面这组数据
    4 4
    1 2
    2 3
    3 4
    2 4

    画个图,删去最后一条边 2 4 后的结果应该是20,但是此方法的输出是19
  • --test
  • 3. re: HDU 2433 最短路
  • ans = ans + sum_u + sum_v - sum[u] - sum[v],
    这个公式不是很理解啊,不知道博主怎么想的啊,谢谢咯
  • --姜
  • 4. re: HDU 2433 最短路
  • @attacker
    the i-th line is the new SUM after the i-th road is destroyed
  • --路修远
  • 5. re: HDU 2433 最短路
  • 你这样可以AC????删除<U,V>不仅改变 u,v最短路啊、、、求解
  • --attacker

阅读排行榜

评论排行榜