TC官方合作论坛

 找回密码
 立即注册
查看: 14059|回复: 80

[游戏] 【有源码】TC扫雷游戏,开源

  [复制链接]
发表于 2012-9-20 21:34:46 | 显示全部楼层 |阅读模式
游客,如果您要查看本帖隐藏内容请回复
用兴趣的同学可以修改下,做毕业设计
插件附带在打包的源码里了,TC毕业设计要求纯TC,所以需要的同学可以用控件来完成,我这里偷懒,直接写了个插件,画上去的
  1. #import "T.Class" x
  2. //此为画图插件,将图片画到主显示画面上
  3. //函数1 画图(来源句柄,绘图句柄,绘图x位置,绘图y位置,图片宽,图片高)
  4. //函数2 画图2(来源句柄,绘图句柄,绘图x位置,绘图y位置,图片宽,图片高)
  5. namespace dd


  6. //*************这里是全局变量***********************

  7. int[][] What                  //点
  8. int[][] Save                  //存
  9. int mX                        //x坐标
  10. int mY                       //y坐标
  11. int mTime                    //时间
  12. int MineFlag                 //标记雷数量
  13. int OpenFlag                //标记已打开的
  14. int NowWidth                //宽度,横向数量
  15. int NowHeight               //高度,纵向数量
  16. int TotMine                //总雷数
  17. bool Game                  //控制游戏
  18. bool pick                  //控制小红旗不为负数
  19. //************变量定义结束********************


  20. //******自定义功能区开始********************************

  21. //预设雷位置
  22. function int ClearStart(int mWidth,int mHeight,int MineNumber)
  23.     int T,X,Y
  24.     mTime = 0
  25.     MineFlag = 0
  26.     OpenFlag = 0
  27.     Game=true
  28.     timer.register("timer0",1000)
  29.    
  30.     for(int i=0;i<=31;i++)
  31.         for(int j=0;j<=17;j++)
  32.             What[i][j]=0
  33.             Save[i][j]=0      
  34.         endfor        
  35.     endfor
  36.     //清空数组
  37.     while(T<=MineNumber)
  38.         //任意取一个坐标(X,Y)
  39.         X=help.randto(0,mWidth-1)
  40.         Y=help.randto(0,mHeight-1)
  41.         //如果已经取过该坐标则重新再取
  42.         if(What[X+1][Y+1]==10)
  43.             continue
  44.         endif
  45.         //将当前坐标标记为有雷
  46.         What[X+1][Y+1]=10
  47.         Save[X+1][Y+1]=10
  48.         T=T+1
  49.     endwhile
  50.     return 0
  51. endfunction


  52. //写入数据
  53. function int WriteNumber(int mWidth,int mHeight)
  54.    
  55.     int StartX
  56.     int StartY
  57.     int EndX
  58.     int EndY
  59.     int mNumber
  60.    
  61.     for(int X=1;X<=mWidth;X++)
  62.         //从当前列的上一列开始
  63.         StartX=X-1
  64.         if(StartX==0)
  65.             StartX=1
  66.         endif
  67.         //在当前列的下一列结束
  68.         EndX=X+1
  69.         if(EndX>mWidth)
  70.             EndX=mWidth
  71.         endif
  72.         for(int Y=1;Y<=mHeight;Y++)
  73.             //如果当前位置不是雷则开始计算
  74.             if(What[X][Y]!=10)
  75.                 //从当前行的上一行开始
  76.                 StartY=Y-1
  77.                 if(StartY==0)
  78.                     StartY=1
  79.                 endif
  80.                 //在当前行的下一行结束
  81.                 EndY=Y+1
  82.                 if(EndY>mHeight)
  83.                     EndY=mHeight
  84.                 endif
  85.                 //累加器置0
  86.                 mNumber=0
  87.                 //计算四周有多少颗雷
  88.                 for(int T=StartX;T<=EndX;T++)
  89.                     for(int TT=StartY;TT<=EndY;TT++)
  90.                         if(TT==Y&&T==X)
  91.                             //如果是当前位置则不计入
  92.                            
  93.                         else
  94.                             //如果是雷则计入
  95.                             if(What[T][TT]==10)
  96.                                 mNumber=mNumber+1
  97.                             endif
  98.                         endif
  99.                     endfor
  100.                 endfor
  101.                 if(mNumber==0)
  102.                     //如果没有雷在其四周则打开当前位置
  103.                     What[X][Y]=0
  104.                     Save[X][Y]=0
  105.                 else
  106.                     //写入雷数
  107.                     What[X][Y]=mNumber
  108.                     Save[X][Y]=mNumber
  109.                 endif
  110.             endif
  111.         endfor
  112.     endfor
  113.     return 0
  114. endfunction



  115. //雷区打开,模拟windows扫雷点击展开临近一片区域
  116. function int OpenBlank(int zmX,int zmY)
  117.    
  118.    
  119.    
  120.    
  121.     bool Continues
  122.    
  123.     OpenFlag = OpenFlag + 1
  124.    
  125.     while(true)
  126.         Continues = false
  127.         
  128.         for(mY=1;mY<=NowHeight;mY++)
  129.             for(mX=1;mX<=NowWidth;mX++)
  130.                
  131.                 if(What[mX][mY]==11)
  132.                     //如果存在未判断的空
  133.                     Continues = true
  134.                     
  135.                     //把它周围的8个点打开
  136.                     //先打开左面的点
  137.                     if(mX-1>=1)
  138.                         if(What[mX-1][mY]==0)
  139.                             What[mX-1][mY]=11
  140.                             x.画图2(控件.获得句柄("picture2"),控件.获得句柄("picture0"),(mX-2)*15,(mY-1)*15,16,16)
  141.                             OpenFlag = OpenFlag + 1
  142.                         else
  143.                            
  144.                             if(What[mX-1][mY]>=1&&What[mX-1][mY]<=9)
  145.                                 x.画图2(控件.获得句柄("picture"+convert.inttostr(What[mX-1][mY]+2)),控件.获得句柄("picture0"),(mX-2)*15,(mY-1)*15,16,16)
  146.                                 What[mX-1][mY]=-What[mX-1][mY]
  147.                                 OpenFlag = OpenFlag + 1
  148.                             endif
  149.                         endif
  150.                     endif
  151.                     
  152.                     //打开左上的点
  153.                     if(mX-1>=1&&mY-1>=1)
  154.                         if(What[mX-1][mY-1]==0)
  155.                             What[mX-1][mY-1]=11
  156.                             x.画图2(控件.获得句柄("picture2"),控件.获得句柄("picture0"),(mX-2)*15,(mY-2)*15,16,16)
  157.                             OpenFlag=OpenFlag+1
  158.                         else
  159.                            
  160.                             if(What[mX-1][mY-1]>=1&&What[mX-1][mY-1]<=9)
  161.                                 x.画图2(控件.获得句柄("picture"+convert.inttostr(What[mX-1][mY-1]+2)),控件.获得句柄("picture0"),(mX-2)*15,(mY-2)*15,16,16)
  162.                                 What[mX-1][mY-1]=-What[mX-1][mY-1]
  163.                                 OpenFlag=OpenFlag+1
  164.                             endif
  165.                         endif
  166.                     endif
  167.                     
  168.                     //再打开上面的点
  169.                     if(mY-1>=1)
  170.                         if(What[mX][mY-1]==0)
  171.                             What[mX][mY-1]=11
  172.                             x.画图2(控件.获得句柄("picture2"),控件.获得句柄("picture0"),(mX-1)*15,(mY-2)*15,16,16)
  173.                             OpenFlag=OpenFlag+1
  174.                         else
  175.                            
  176.                             if(What[mX][mY-1]>=1&&What[mX][mY-1]<=9)
  177.                                 x.画图2(控件.获得句柄("picture"+convert.inttostr(What[mX][mY-1]+2)),控件.获得句柄("picture0"),(mX-1)*15,(mY-2)*15,16,16)
  178.                                 What[mX][mY-1]=-What[mX][mY-1]
  179.                                 OpenFlag=OpenFlag+1
  180.                             endif
  181.                         endif
  182.                     endif
  183.                     
  184.                     //打开右上的点
  185.                     if(mY-1>=1&&mX+1<=NowWidth)
  186.                         if(What[mX+1][mY-1]==0)
  187.                             What[mX+1][mY-1]=11
  188.                             x.画图2(控件.获得句柄("picture2"),控件.获得句柄("picture0"),(mX)*15,(mY-2)*15,16,16)
  189.                             OpenFlag=OpenFlag+1
  190.                         else
  191.                            
  192.                             if(What[mX+1][mY-1]>=1&&What[mX+1][mY-1]<=9)
  193.                                 x.画图2(控件.获得句柄("picture"+convert.inttostr(What[mX+1][mY-1]+2)),控件.获得句柄("picture0"),(mX)*15,(mY-2)*15,16,16)
  194.                                 What[mX+1][mY-1]=-What[mX+1][mY-1]
  195.                                 OpenFlag=OpenFlag+1
  196.                             endif
  197.                         endif
  198.                     endif
  199.                     
  200.                     //再打开右面的点
  201.                     if(mX+1<=NowWidth)
  202.                         if(What[mX+1][mY]==0)
  203.                             What[mX+1][mY]=11
  204.                             x.画图2(控件.获得句柄("picture2"),控件.获得句柄("picture0"),(mX)*15,(mY-1)*15,16,16)
  205.                             OpenFlag=OpenFlag+1
  206.                         else
  207.                            
  208.                             if(What[mX+1][mY]>=1&&What[mX+1][mY]<=9)
  209.                                 x.画图2(控件.获得句柄("picture"+convert.inttostr(What[mX+1][mY]+2)),控件.获得句柄("picture0"),(mX)*15,(mY-1)*15,16,16)
  210.                                 What[mX+1][mY]=-What[mX+1][mY]
  211.                                 OpenFlag=OpenFlag+1
  212.                             endif
  213.                         endif
  214.                     endif
  215.                     
  216.                     //再打开右下的点
  217.                     if(mY+1<=NowHeight&&mX+1<=NowWidth)
  218.                         if(What[mX+1][mY+1]==0)
  219.                             What[mX+1][mY+1]=11
  220.                             x.画图2(控件.获得句柄("picture2"),控件.获得句柄("picture0"),mX*15,mY*15,16,16)
  221.                             OpenFlag=OpenFlag+1
  222.                         else
  223.                            
  224.                             if(What[mX+1][mY+1]>=1&&What[mX+1][mY+1]<=9)
  225.                                 x.画图2(控件.获得句柄("picture"+convert.inttostr(What[mX+1][mY+1]+2)),控件.获得句柄("picture0"),mX*15,mY*15,16,16)
  226.                                 What[mX+1][mY+1]=-What[mX+1][mY+1]
  227.                                 OpenFlag=OpenFlag+1
  228.                             endif
  229.                         endif
  230.                     endif
  231.                     
  232.                     //打开下面的点
  233.                     if(mY+1<=NowHeight)
  234.                         if(What[mX][mY+1]==0)
  235.                             What[mX][mY+1]=11
  236.                             x.画图2(控件.获得句柄("picture2"),控件.获得句柄("picture0"),(mX-1)*15,(mY)*15,16,16)
  237.                             OpenFlag=OpenFlag+1
  238.                         else
  239.                            
  240.                             if(What[mX][mY+1]>=1&&What[mX][mY+1]<=9)
  241.                                 x.画图2(控件.获得句柄("picture"+convert.inttostr(What[mX][mY+1]+2)),控件.获得句柄("picture0"),(mX-1)*15,(mY)*15,16,16)
  242.                                 What[mX][mY+1]=-What[mX][mY+1]
  243.                                 OpenFlag=OpenFlag+1
  244.                             endif
  245.                         endif
  246.                     endif
  247.                     
  248.                     //最后打开左下的点
  249.                     if(mY+1<=NowHeight&&mX-1>=1)
  250.                         if(What[mX-1][mY+1]==0)
  251.                             What[mX-1][mY+1]=11
  252.                             x.画图2(控件.获得句柄("picture2"),控件.获得句柄("picture0"),(mX-2)*15,(mY)*15,16,16)
  253.                             OpenFlag=OpenFlag+1
  254.                         else
  255.                            
  256.                             if(What[mX-1][mY+1]>=1&&What[mX-1][mY+1]<=9)
  257.                                 x.画图2(控件.获得句柄("picture"+convert.inttostr(What[mX-1][mY+1]+2)),控件.获得句柄("picture0"),(mX-2)*15,(mY)*15,16,16)
  258.                                 What[mX-1][mY+1]=-What[mX-1][mY+1]
  259.                                 OpenFlag=OpenFlag+1
  260.                             endif
  261.                         endif
  262.                     endif
  263.                     
  264.                     //四点判断完后将本点标记为已判断过
  265.                     What[mX][mY]=12
  266.                 endif
  267.                
  268.             endfor
  269.         endfor
  270.         
  271.         if(Continues==false)
  272.             break
  273.         endif
  274.     endwhile
  275.     return 0
  276. endfunction


  277. //游戏结束,显示所有雷,并且标记雷错误显示
  278. function int EndGame()
  279.     for(int Y=1;Y<=NowHeight;Y++)
  280.         for(int X=1;X<=NowWidth;X++)
  281.             if(What[X][Y]==10)
  282.                 x.画图2(控件.获得句柄("picture15"),控件.获得句柄("picture0"),(X-1)*15,(Y-1)*15,16,16)
  283.             else
  284.                 if(What[X][Y]==13)
  285.                     if(Save[X][Y]!=10)
  286.                         x.画图2(控件.获得句柄("picture14"),控件.获得句柄("picture0"),(X-1)*15,(Y-1)*15,16,16)
  287.                     endif
  288.                 else
  289.                     if(What[X][Y]==14)
  290.                         if(Save[X][Y]==10)
  291.                             x.画图2(控件.获得句柄("picture15"),控件.获得句柄("picture0"),(X-1)*15,(Y-1)*15,16,16)
  292.                         endif
  293.                     endif
  294.                 endif
  295.             endif
  296.         endfor
  297.     endfor
  298.     return 0
  299. endfunction

  300. //*******自定义功能区结束***************************************

  301. function bool start_click()
  302.     int a
  303.     a=combo.getcursel("ComboBox0")
  304.     select(a)
  305.         case 0:
  306.         NowHeight = 9
  307.         NowWidth = 9
  308.         TotMine = 10
  309.         case 1:
  310.         NowHeight = 16
  311.         NowWidth = 16
  312.         TotMine = 40
  313.         case 2:
  314.         NowHeight = 16
  315.         NowWidth = 30
  316.         TotMine = 99
  317.     endselect
  318.     edit.settext("edit1",convert.inttostr(TotMine))
  319.     edit.settext("edit0","0")
  320.     window.setwindowsize(控件.获得句柄("picture0"),NowWidth*15,NowHeight*15)
  321.     for(int X=0;X<=NowWidth-1;X++)
  322.         for(int Y=0;Y<=NowHeight-1;Y++)
  323.             x.画图2(控件.获得句柄("picture11"),控件.获得句柄("picture0"),X*15,Y*15,16,16)
  324.         endfor
  325.     endfor
  326.     dd.ClearStart(NowWidth,NowHeight,TotMine)
  327.     dd.WriteNumber(NowWidth,NowHeight)
  328.    
  329.     return true
  330. endfunction

  331. function bool exit_click()
  332. help.exit()

  333. return true
  334. endfunction




  335. function bool init()
  336. help.regdll("rc:T.dll",true)
  337. What=int[32][18]
  338. Save=int[32][18]
  339. combo.setcursel("ComboBox0",0)
  340. int i
  341. for(i=0;i<=14;i++)
  342.     picture.setpicture("picture"+convert.inttostr(i+2),"rc:"+convert.inttostr(i)+".bmp")
  343. endfor
  344. return true
  345. endfunction

  346. function bool dd_pretranslatemessage(int hwnd,int message,int wParam,int lParam,int time,int x,int y)
  347.     int T
  348.     int X1
  349.     int Y1
  350.     int x2
  351.     int y2
  352.     if(Game==true)
  353.         if(hwnd==控件.获得句柄("picture0"))
  354.             window.screentoclient(控件.获得句柄("picture0"),x,y,x,y)
  355.             mX=x/15
  356.             mY=y/15
  357.             
  358.             
  359.             //左键按下
  360.             if(message==513)
  361.                 if(What[mX+1][mY+1]>=0&&What[mX+1][mY+1]<=10)
  362.                     x.画图2(控件.获得句柄("picture16"),控件.获得句柄("picture0"),mX*15,mY*15,16,16)
  363.                 endif
  364.                
  365.             endif
  366.             
  367.             
  368.             //左键弹起
  369.             if(message==514)
  370.                 if(What[mX+1][mY+1]==10)
  371.                     //点到雷
  372.                     x.画图2(控件.获得句柄("picture15"),控件.获得句柄("picture0"),mX*15,mY*15,16,16)
  373.                     dd.EndGame()
  374.                     Game=false   //游戏结束,路由消息停止响应
  375.                     timer.kill("timer0")//销毁定时器,停止时间
  376.                     
  377.                 endif
  378.                 if(What[mX+1][mY+1]>=1&&What[mX+1][mY+1]<=9)
  379.                     //点到数字
  380.                     OpenFlag=OpenFlag+1
  381.                     x.画图2(控件.获得句柄("picture"+convert.inttostr(What[mX+1][mY+1]+2)),控件.获得句柄("picture0"),mX*15,mY*15,16,16)
  382.                     What[mX+1][mY+1]=-What[mX+1][mY+1]
  383.                 endif
  384.                 if(What[mX+1][mY+1]==0)
  385.                     //点到空
  386.                     x.画图2(控件.获得句柄("picture2"),控件.获得句柄("picture0"),mX*15,mY*15,16,16)
  387.                     What[mX+1][mY+1]=11
  388.                     dd.OpenBlank(mX+1,mY+1)
  389.                 endif
  390.                 if(MineFlag+OpenFlag==NowHeight*NowWidth)
  391.                     //通关
  392.                     
  393.                 endif
  394.                
  395.             endif
  396.             
  397.             
  398.             //右键按下
  399.             if(message==516)
  400.                 if(What[mX+1][mY+1]>=-9&&What[mX+1][mY+1]<=-1)
  401.                     T = 0
  402.                     //计算标记的雷
  403.                     for(X1=mX;X1<=mX + 2;X1++)
  404.                         for(Y1=mY;Y1<=mY+2;Y1++)
  405.                             if(X1==mX+1&&Y1==mY+1)
  406.                             else
  407.                                 if(X1>=1&&X1<=NowWidth)
  408.                                     if(Y1>=1&&Y1<=NowHeight)
  409.                                         if(What[X1][Y1]==13)
  410.                                             T=T+1
  411.                                         endif
  412.                                     endif
  413.                                 endif
  414.                             endif
  415.                         endfor
  416.                     endfor
  417.                     //如果标记数大于等于雷数则不处理
  418.                     if(T>=-What[mX+1][mY+1])
  419.                         //这里不处理,有全局变量控制
  420.                     endif
  421.                     //如果标记数等于雷数则打开
  422.                     if(T==-What[mX+1][mY+1])
  423.                         for(X1=mX;X1<=mX+2;X1++)
  424.                             for(Y1=mY;Y1<=mY+2;Y1++)
  425.                                 if(X1==mX+1&&Y1==mY+1)
  426.                                 else
  427.                                     if(X1>=1&&X1<=NowWidth)
  428.                                         if(Y1>=1&&Y1<=NowHeight)
  429.                                             x2=X1
  430.                                             y2=Y1
  431.                                             //获胜
  432.                                         endif
  433.                                     endif
  434.                                 endif
  435.                             endfor
  436.                         endfor
  437.                     endif
  438.                     //如果标记数小于雷数则按下余下的
  439.                     for(X1=mX;X1<=mX+2;X1++)
  440.                         for(Y1=mY;Y1<=mY+2;Y1++)
  441.                             if(X1==mX+1&&Y1==mY+1)
  442.                             else
  443.                                 if(X1>=1&&X1<=NowWidth)
  444.                                     if(Y1>=1&&Y1<=NowHeight)
  445.                                         if(What[X1][Y1]>=0&&What[X1][Y1]<=10)
  446.                                             
  447.                                         endif
  448.                                     endif
  449.                                 endif
  450.                                 
  451.                             endif
  452.                         endfor
  453.                     endfor
  454.                 endif
  455.             endif
  456.             
  457.             
  458.             //右键弹起
  459.             if(message==517)
  460.                 if(What[mX+1][mY+1]>=0&&What[mX+1][mY+1]<=10)
  461.                     if(pick==true)//这里控制了小红旗数量
  462.                         //未标记过的进行标记
  463.                         Save[mX+1][mY+1]=What[mX+1][mY+1]
  464.                         What[mX+1][mY+1]=13
  465.                         x.画图2(控件.获得句柄("picture12"),控件.获得句柄("picture0"),mX*15,mY*15,16,16)
  466.                         MineFlag=MineFlag+1
  467.                         edit.settext("edit1",convert.inttostr(TotMine-MineFlag))
  468.                     endif
  469.                 else
  470.                     if(What[mX+1][mY+1]==13)
  471.                         //已经标记过则改为?
  472.                         What[mX+1][mY+1]=14
  473.                         MineFlag=MineFlag-1
  474.                         edit.settext("edit1",convert.inttostr(TotMine-MineFlag))
  475.                         x.画图2(控件.获得句柄("picture13"),控件.获得句柄("picture0"),mX*15,mY*15,16,16)
  476.                     else
  477.                         if(What[mX+1][mY+1]==14)
  478.                             //标记过?号的则
  479.                             What[mX+1][mY+1]=Save[mX+1][mY+1]
  480.                             x.画图2(控件.获得句柄("picture11"),控件.获得句柄("picture0"),mX*15,mY*15,16,16)
  481.                         endif
  482.                     endif
  483.                 endif
  484.             endif
  485.         endif
  486.     endif
  487.     return false
  488. endfunction


  489. function bool timer0_ontime()
  490.     mTime=mTime+1
  491.     edit.settext("edit0",convert.inttostr(mTime))
  492.     return true

  493. endfunction

  494. function bool edit1_enchange()
  495.     int a
  496.     a=convert.strtoint(edit.gettext("edit1"),0)
  497.     if(a>0)
  498.         pick=true
  499.     else
  500.         pick=false
  501.     endif
  502.    
  503.     return true
  504. endfunction


  505. endnamespace
复制代码




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

发表于 2012-9-20 21:39:07 | 显示全部楼层

回复 支持 反对

使用道具 举报

发表于 2012-9-20 21:41:56 | 显示全部楼层
顶顶
回复 支持 反对

使用道具 举报

发表于 2012-9-20 21:47:16 | 显示全部楼层
***** 该内容需会员权限高于300才可浏览 *****
回复 支持 反对

使用道具 举报

发表于 2012-9-21 00:08:59 | 显示全部楼层
kkkkkkkkkkkkkkkk
回复 支持 反对

使用道具 举报

发表于 2012-9-21 10:14:51 | 显示全部楼层
回复 支持 反对

使用道具 举报

发表于 2012-9-21 10:50:14 | 显示全部楼层
新手报到
回复 支持 反对

使用道具 举报

发表于 2012-10-1 19:17:28 | 显示全部楼层
我勒个去
回复 支持 反对

使用道具 举报

发表于 2012-10-3 20:20:12 | 显示全部楼层
复杂么
回复 支持 反对

使用道具 举报

发表于 2012-10-11 14:54:40 | 显示全部楼层
看看
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条

关闭

小黑屋|TC官方合作论坛 (苏ICP备18045623号)

GMT+8, 2024-5-3 03:55 , Processed in 0.059041 second(s), 25 queries .

Powered by 海安简单软件服务部

© 2008-2019 版权所有 保留所有权利

快速回复 返回顶部 返回列表