鱼C论坛

 找回密码
 立即注册
查看: 4453|回复: 24

问题求助!!!【前十位有鱼币!!】

[复制链接]
发表于 2015-11-5 07:19:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

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

x
我编写了一个要输入密码的程序,还编写了一个俄罗斯方块的程序。我想要做到在输入密码后进入俄罗斯方块,请问要怎么做?
(附上源码)
  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<conio.h>
  4. #include<stdlib.h>
  5. #include<windows.h>


  6. #define STACK_INIT_SIZE 10
  7. #define OK 1
  8. #define TRUE 1
  9. #define FALSE  0
  10. #define ERROR 0
  11. char PASSWORD[10]="123456";
  12. typedef char SElemType;
  13. typedef struct STACK
  14. {
  15.         SElemType *base;
  16.         SElemType *top;
  17.         int stacksize;
  18.         int length;
  19. }SqStack,*Stack;
  20. typedef int Status;

  21. void gotoxy(int x,int y)    //因为VC中没有gotoxy这个命令,所以定义一个子程序来代替他
  22. {
  23.     COORD coord;
  24.     coord.X=x;
  25.     coord.Y=y;
  26.     SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord);
  27. }

  28. void InitStack(Stack *S)
  29. {
  30.         *S=(SqStack *)malloc(sizeof(SqStack));
  31.     (*S)->base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
  32.         if(!(*S)->base)exit(-1);
  33.         (*S)->top=(*S)->base;
  34.         (*S)->stacksize=STACK_INIT_SIZE;
  35.         (*S)->length=0;
  36. }

  37. Status DestroyStack(Stack *S)
  38. {
  39.         free((*S)->base);
  40.         free((*S));
  41.         return OK;

  42. }
  43. void ClearStack(Stack *S)
  44. {
  45.         (*S)->top=(*S)->base;
  46.         (*S)->length=0;
  47. }
  48. Status StackEmpty(SqStack S)
  49. {
  50.         if(S.top==S.base) return TRUE;
  51.         else
  52.                 return FALSE;
  53. }
  54. void Push(Stack *S,SElemType e)
  55. {
  56.         if((*S)->top - (*S)->base>=(*S)->stacksize)
  57.         {
  58.                 (*S)->base=(SElemType *) realloc((*S)->stacksize,
  59.                     ((*S)->stacksize + 2) * sizeof(SElemType));
  60.                 if(!(*S)->base)exit(-1);
  61.                 (*S)->top=(*S)->base+(*S)->stacksize;
  62.                 (*S)->stacksize += 2;
  63.         }
  64.         *((*S)->top++)=e;
  65.     ++(*S)->length;
  66. }
  67. Status Pop(Stack *S)
  68. {
  69.         if((*S)->top==(*S)->base) return ERROR;
  70.         (*S)->top--;
  71.         --(*S)->length;
  72.         return OK;
  73. }
  74. Status GetTop(Stack S,SElemType *e)
  75. {
  76.         if(S->top==S->base) return ERROR;
  77.         *e=*(S->top-1);
  78.         S->top--;
  79. }
  80. void Change(SqStack S,char *a)
  81. {
  82.         int n=S.length-1;
  83.         while (!StackEmpty(S))
  84.                 GetTop(&S,&a[n--]);
  85. }
  86. void Control(Stack *s)
  87. {
  88.         int i=0,k,j=0;
  89.         SElemType ch,*a;
  90.         k=strlen(PASSWORD);
  91.     printf("输入密码,你有三次机会:\n",k);
  92.         for(;;)
  93.         {
  94.                 if(i>=3)
  95.                 {
  96.                         i++;
  97.                         system("cls");
  98.                         gotoxy(1,1);
  99.                         break;
  100.                 }
  101.                 else if(i>0&&i<3)
  102.                 {
  103.                         gotoxy(5,2);
  104.                         for(j-1;j<=(*s)->length;j++)printf(" ");
  105.                         gotoxy(5,2);ClearStack(s);
  106.                 }
  107.                 for(;;)
  108.                 {
  109.                         ch=getch();
  110.                         if(ch!=13)
  111.                         {
  112.                                 if(ch==8)
  113.                                 {
  114.                                         Pop(s);
  115.                                         gotoxy(4+j,2);
  116.                                         printf(" ");
  117.                                         gotoxy(4+j,2);
  118.                                 }
  119.                                 else
  120.                                 {
  121.                                         printf("*");
  122.                                         Push(s,ch);
  123.                                 }
  124.                                 j=(*s)->length;
  125.                         }
  126.                         else break;
  127.                 }
  128.                 i++;
  129.                 if(k!=j) continue;
  130.                 else
  131.                 {
  132.                         a=(SElemType *)malloc((*s)->length*sizeof(SElemType));

  133.                 }
  134.                 Change(**s,a);
  135.                 for(j=1;j<=(*s)->length;)
  136.                 {
  137.                         if(a[j-1]==PASSWORD[j-1]) j++;
  138.                         else
  139.                         {
  140.                                 j=(*s)->length+2;break;
  141.                         }
  142.                 }
  143.             if(j==(*s)->length+2) continue;
  144.                 else break;
  145.         }
  146.     if(i==4) printf("\n 密码错误!");
  147.         else printf("\n 密码正确!");
  148.         free(a);
  149. }
  150. main()
  151. {
  152.         Stack s;
  153.         system("cls");
  154.         InitStack(&s);
  155.         Control(&s);
  156.         getch();
  157.         DestroyStack(&s);
  158. }
复制代码


下面是俄罗斯方块的
  1. #include <windows.h>
  2. #include <stdio.h>
  3. #include <time.h>

  4. #define CELL 20
  5. #define ROWS 25
  6. #define COLS 15
  7. //升级所需分数值
  8. #define SCORE_LEVEL_INC 80
  9. #define ID_TIMER 1

  10. /////////////////全局变量/////////////////////////////
  11. HWND hwnd;                  //保存窗口句柄

  12. int score=0;                //分数
  13. int level=0;                //级数
  14. int interval_unit=25;       //随级数递增的时间间隔增量
  15. int interval_base=300;      //时间间隔基量
  16. int old_interval;           //保存当前的时间间隔,用于加速操作

  17. int cur_left,cur_top;       //记录方块当前的位置
  18. int width_block,height_block;   //方块的宽带和高度

  19. bool isPause=false;             //暂停标识
  20. UINT timer_id=0;                //保存计时器ID

  21. static byte *block=NULL;        //方块,方块为随机大小,采用动态分配内存方式,所以这里是指针变量
  22. byte g_panel[ROWS][COLS]={0};
  23. ////////////////////////////////////////////////////
  24. LRESULT CALLBACK WndProc ( HWND,UINT,WPARAM,LPARAM );
  25. void DrawPanel ( HDC hdc );     //绘制表格
  26. void RefreshPanel ( HDC hdc );      //刷新面板
  27. void DoDownShift ( HDC hdc );       //下移
  28. void DoLeftShift ( HDC hdc );       //左移
  29. void DoRightShift ( HDC hdc );      //右移
  30. void DoAccelerate ( HDC hdc );      //加速
  31. void DoRedirection ( HDC hdc ); //改变方向
  32. void ClearRow ( HDC hdc );          //消行
  33. bool ExportBlock();     //输出方块,
  34. //该函数会直接修改全局变量block,width_block,height_block,
  35. //cur_left和cur_top
  36. bool IsTouchBottom ( HDC hdc );         //判断是否到达底部

  37. int main()
  38. {
  39.     HINSTANCE hInstance=GetModuleHandle ( NULL );
  40.     TCHAR szAppName[]=TEXT ( "teris" );
  41.     MSG msg;
  42.     WNDCLASS wc;

  43.     wc.style=CS_HREDRAW|CS_VREDRAW;
  44.     wc.lpfnWndProc=WndProc;
  45.     wc.cbClsExtra=0;
  46.     wc.cbWndExtra=0;
  47.     wc.hInstance=hInstance;
  48.     wc.hIcon=LoadIcon ( NULL,IDI_APPLICATION );
  49.     wc.hCursor=LoadCursor ( NULL,IDC_ARROW );
  50.     wc.hbrBackground= ( HBRUSH ) GetStockObject ( WHITE_BRUSH );
  51.     wc.lpszMenuName=NULL;
  52.     wc.lpszClassName=szAppName;
  53.     if ( !RegisterClass ( &wc ) )
  54.     {
  55.         printf ( "RegisterClass occur errors!" );
  56.         return 0;
  57.     }
  58.     hwnd=CreateWindow ( szAppName,TEXT ( "Teris Demo" ),
  59.                         WS_OVERLAPPEDWINDOW,
  60.                         0,0,0,0,
  61.                         NULL,
  62.                         NULL,
  63.                         hInstance,
  64.                         NULL );
  65.     ShowWindow ( hwnd,SW_SHOW );
  66.     UpdateWindow ( hwnd );
  67.     while ( GetMessage ( &msg,NULL,0,0 ) )
  68.     {
  69.         TranslateMessage ( &msg );
  70.         DispatchMessage ( &msg );
  71.     }
  72.     return msg.wParam;
  73. }

  74. void DrawPanel ( HDC hdc )          //绘制游戏面板
  75. {
  76.     int x,y;
  77.     RECT rect;

  78.     for ( y=0; y<ROWS; y++ )
  79.     {
  80.         for ( x=0; x<COLS; x++ )
  81.         {
  82.             //计算方块的边框范围
  83.             rect.top=y*CELL+1;
  84.             rect.bottom= ( y+1 ) *CELL-1;
  85.             rect.left=x*CELL+1;
  86.             rect.right= ( x+1 ) *CELL-1;
  87.             FrameRect ( hdc,&rect, ( HBRUSH ) GetStockObject ( BLACK_BRUSH ) );
  88.         }
  89.     }
  90. }

  91. void DoDownShift ( HDC hdc )        //下移
  92. {
  93.     if ( NULL==block ) return;

  94.     //判断是否到达底部
  95.     if ( IsTouchBottom ( hdc ) )    //到底部
  96.     {
  97.         //消行处理
  98.         ClearRow ( hdc );
  99.         ExportBlock();      //输出下一个方块
  100.     }

  101.     cur_top++;
  102.     RefreshPanel ( hdc );
  103. }

  104. void DoLeftShift ( HDC hdc )        //左移
  105. {
  106.     int x,y;
  107.     if ( NULL==block ) return;

  108.     if ( 0==cur_left ) return;
  109.     if ( cur_top<0 ) return; //方块没有完整显示前,不能左移
  110.     for ( y=0; y<height_block; y++ )
  111.     {
  112.         for ( x=0; x<width_block; x++ )          //从左边开始扫描,获取该行最左边的实心方格块
  113.         {
  114.             if ( * ( block+y*width_block+x ) )
  115.             {
  116.                 //判断当前方格在面板上面左边一个方格是否为实心,是就代表不能再左移
  117.                 if ( g_panel[cur_top+y][cur_left+x-1] ) return;

  118.                 break;      //只判断最左边的一个实心方格,之后直接扫描下一行
  119.             }
  120.         }
  121.     }
  122.     cur_left--;
  123.     RefreshPanel ( hdc );
  124. }

  125. void DoRightShift ( HDC hdc )       //右移
  126. {
  127.     int x,y;
  128.     if ( NULL==block ) return;

  129.     if ( COLS-width_block==cur_left ) return;
  130.     if ( cur_top<0 ) return;     //方块完整显示前不能右移
  131.     for ( y=0; y<height_block; y++ )
  132.     {
  133.         for ( x=width_block-1; x>=0; x-- )   //从右边开始扫描,获取该行最右边的实心方格块
  134.         {
  135.             if ( * ( block+y*width_block+x ) )
  136.             {
  137.                 //判断当前方格在面板上右边一个方格是否为实心,是就代表不能再右移
  138.                 if ( g_panel[cur_top+y][cur_left+x+1] ) return;

  139.                 break;      //只判断最右边的一个实心方格
  140.             }
  141.         }
  142.     }
  143.     cur_left++;
  144.     RefreshPanel ( hdc );
  145. }

  146. void DoRedirection ( HDC hdc )      //改变方向
  147. {
  148.     int i,j;
  149.     byte * temp=NULL;
  150.     if ( NULL==block ) return;
  151.     if ( cur_top<0 ) return;     //方块完整显示前不能转向

  152.     temp= ( byte * ) malloc ( sizeof ( byte ) *width_block*height_block );
  153.     for ( i=0; i<width_block; i++ )
  154.     {
  155.         for ( j=0; j<height_block; j++ )
  156.         {
  157.             //temp[i][j]=block[height_block-j-1][i];
  158.             * ( temp+i*height_block+j ) =* ( block+ ( height_block-j-1 ) *width_block+i );
  159.         }
  160.     }

  161.     //给方块重新定位
  162.     int incHeight=width_block-height_block;
  163.     int incWidth=height_block-width_block;
  164.     int temp_cur_top=cur_top-incHeight/2;
  165.     int temp_cur_left=cur_left-incWidth/2;

  166.     //system("cls");
  167.     //printf("temp_top=%d, temp_left=%d",temp_cur_top,temp_cur_left);

  168.     //判断当前空间是否足够让方块改变方向
  169.     int max_len=max ( width_block,height_block );
  170.     //防止下标访问越界
  171.     if ( temp_cur_top+max_len-1>=ROWS||temp_cur_left<0||temp_cur_left+max_len-1>=COLS )
  172.     {
  173.         free ( temp );      //退出前必须先释放内存
  174.         return;
  175.     }
  176.     for ( i=0; i<max_len; i++ )
  177.     {
  178.         for ( j=0; j<max_len; j++ )
  179.         {
  180.             //转向所需的空间内有已被占用的实心方格存在,即转向失败
  181.             if ( g_panel[temp_cur_top+i][temp_cur_left+j] )
  182.             {
  183.                 free ( temp );      //退出前必须先释放内存
  184.                 return;
  185.             }
  186.         }
  187.     }

  188.     //把临时变量的值赋给block,只能赋值,而不能赋指针值
  189.     for ( i=0; i<height_block; i++ )
  190.     {
  191.         for ( j=0; j<width_block; j++ )
  192.         {
  193.             //block[i][j]=temp[i][j];
  194.             * ( block+i*width_block+j ) =* ( temp+i*width_block+j );
  195.         }
  196.     }

  197.     //全局变量重新被赋值
  198.     cur_top=temp_cur_top;
  199.     cur_left=temp_cur_left;
  200.     //交换
  201.     i=width_block;
  202.     width_block=height_block;
  203.     height_block=i;

  204.     free ( temp );      //释放为临时变量分配的内存
  205.     RefreshPanel ( hdc );
  206. }

  207. void DoAccelerate ( HDC hdc )       //加速
  208. {
  209.     if ( NULL==block ) return;

  210.     if ( IsTouchBottom ( hdc ) )
  211.     {
  212.         //消行处理
  213.         ClearRow ( hdc );
  214.         ExportBlock();
  215.     }
  216.     cur_top++;
  217.     RefreshPanel ( hdc );
  218. }

  219. bool IsTouchBottom ( HDC hdc )
  220. {
  221.     int x,y;
  222.     int i,j;

  223.     if ( NULL==block ) return false;
  224.     if ( ROWS==cur_top+height_block )
  225.     {
  226.         //固定方块
  227.         for ( i=0; i<height_block; i++ )
  228.         {
  229.             for ( j=0; j<width_block; j++ )
  230.             {
  231.                 if ( * ( block+i*width_block+j ) ) g_panel[cur_top+i][cur_left+j]=1;
  232.             }
  233.         }
  234.         return true;
  235.     }
  236.     for ( y=height_block-1; y>=0; y-- )          //从底行开始扫描
  237.     {
  238.         //判断第一个实心方块在面板上邻接的下方方格是否为实心,是就代表已经到达底部
  239.         for ( x=0; x<width_block; x++ )
  240.         {
  241.             if ( * ( block+y*width_block+x ) )
  242.             {
  243.                 if ( cur_top+y+1<0 ) return false;
  244.                 if ( g_panel[cur_top+y+1][cur_left+x] )
  245.                 {
  246.                     //判断是否gameover
  247.                     if ( cur_top<=0 )
  248.                     {
  249.                         if ( timer_id )
  250.                         {
  251.                             KillTimer ( hwnd,ID_TIMER );
  252.                             timer_id=0;
  253.                         }
  254.                         MessageBox ( hwnd,TEXT ( "游戏结束" ),TEXT ( "MSG" ),MB_OK|MB_ICONEXCLAMATION );
  255.                         SendMessage ( hwnd,WM_CLOSE,0,0 );
  256.                     }
  257.                     //
  258.                     //固定方块
  259.                     for ( i=0; i<height_block; i++ )
  260.                     {
  261.                         for ( j=0; j<width_block; j++ )
  262.                         {
  263.                             if ( * ( block+i*width_block+j ) ) g_panel[cur_top+i][cur_left+j]=1;
  264.                         }
  265.                     }
  266.                     return true;
  267.                 }
  268.             }
  269.         }
  270.     }
  271.     return false;
  272. }

  273. void ClearRow ( HDC hdc )               //消行
  274. {
  275.     int i,j,k;
  276.     int count=0;        //消行次数
  277.     bool isFilled;
  278.     //消行处理
  279.     for ( i=ROWS-1; i>=0; i-- )
  280.     {
  281.         isFilled=true;
  282.         for ( j=0; j<COLS; j++ )
  283.         {
  284.             if ( !g_panel[i][j] )
  285.             {
  286.                 isFilled=false;
  287.                 break;
  288.             }
  289.         }
  290.         if ( isFilled )
  291.         {
  292.             for ( j=0; j<COLS; j++ )
  293.             {
  294.                 g_panel[i][j]=0;
  295.             }
  296.             //所有方块往下移
  297.             for ( k=i-1; k>=0; k-- )
  298.             {
  299.                 for ( j=0; j<COLS; j++ )
  300.                 {
  301.                     g_panel[k+1][j]=g_panel[k][j];
  302.                 }
  303.             }
  304.             i=i+1;
  305.             count++;
  306.         }
  307.     }

  308.     //最高级别为9级,所以分数极限为(9+1)*SCORE_LEVEL_INC-1
  309.     if ( score>=10*SCORE_LEVEL_INC-1 ) return;

  310.     //加分规则:消除行数,1行加10分,2行加15分,3行加20分,4行加30分
  311.     switch ( count )
  312.     {
  313.     case 1:
  314.         score+=10;
  315.         break;
  316.     case 2:
  317.         score+=15;
  318.         break;
  319.     case 3:
  320.         score+=20;
  321.         break;
  322.     case 4:
  323.         score+=30;
  324.         break;
  325.     }

  326.     int temp_level=score/SCORE_LEVEL_INC;
  327.     if ( temp_level>level )
  328.     {
  329.         level=temp_level;
  330.         //撤销当前计时器,然后重设
  331.         if ( timer_id ) KillTimer ( hwnd,ID_TIMER );
  332.         timer_id=SetTimer ( hwnd,ID_TIMER,interval_base-level*interval_unit,NULL );
  333.     }

  334.     system ( "cls" );
  335.     printf ( "score: %d, level: %d ",score,level );
  336. }

  337. void RefreshPanel ( HDC hdc )           //刷新面板
  338. {
  339.     int x,y;
  340.     RECT rect;
  341.     HBRUSH h_bSolid= ( HBRUSH ) GetStockObject ( GRAY_BRUSH ),
  342.                      h_bEmpty= ( HBRUSH ) GetStockObject ( WHITE_BRUSH );
  343.     if ( NULL==block ) return;

  344.     //先刷屏
  345.     for ( y=0; y<ROWS; y++ )
  346.     {
  347.         for ( x=0; x<COLS; x++ )
  348.         {
  349.             //为避免刷掉方块的边框,rect范围必须比边框范围小1
  350.             rect.top=y*CELL+2;
  351.             rect.bottom= ( y+1 ) *CELL-2;
  352.             rect.left=x*CELL+2;
  353.             rect.right= ( x+1 ) *CELL-2;
  354.             if ( g_panel[y][x] )
  355.                 FillRect ( hdc,&rect,h_bSolid );
  356.             else
  357.                 FillRect ( hdc,&rect,h_bEmpty );
  358.         }
  359.     }
  360.     //再定位方块
  361.     for ( y=0; y<height_block; y++ )
  362.     {
  363.         for ( x=0; x<width_block; x++ )
  364.         {
  365.             if ( * ( block+y*width_block+x ) )          //实心
  366.             {
  367.                 rect.top= ( y+cur_top ) *CELL+2;
  368.                 rect.bottom= ( y+cur_top+1 ) *CELL-2;
  369.                 rect.left= ( x+cur_left ) *CELL+2;
  370.                 rect.right= ( x+cur_left+1 ) *CELL-2;
  371.                 FillRect ( hdc,&rect,h_bSolid );
  372.             }
  373.         }
  374.     }
  375. }

  376. bool ExportBlock()          //输出方块
  377. {
  378.     int sel;
  379.     if ( block )
  380.     {
  381.         free ( block );     //释放之前分配的内存
  382.         block=NULL;
  383.     }

  384.     sel=rand() %7;
  385.     switch ( sel )
  386.     {
  387.     case 0:     //水平条
  388.         width_block=4;
  389.         height_block=1;
  390.         block= ( byte * ) malloc ( sizeof ( byte ) *width_block*height_block );
  391.         * ( block+0 ) =1;       //可以理解为*(block+0*width_block+0)=1,即第一行的第一个方格,下面同理
  392.         * ( block+1 ) =1;       //*(block+0*width_block+1)=1
  393.         * ( block+2 ) =1;       //*(block+0*width_block+2)=1
  394.         * ( block+3 ) =1;       //*(block+0*width_block+3)=1

  395.         cur_top=0-height_block;
  396.         cur_left= ( COLS-width_block ) /2;
  397.         break;
  398.     case 1:     //三角
  399.         width_block=3;
  400.         height_block=2;
  401.         block= ( byte * ) malloc ( sizeof ( byte ) *width_block*height_block );
  402.         * ( block+0 ) =0;       //可以理解为*(block+0*width_block+0)=0,即第一行的第一个方格,下面同理
  403.         * ( block+1 ) =1;       //*(block+0*width_block+1)=1
  404.         * ( block+2 ) =0;       //*(block+0*width_block+2)=0
  405.         * ( block+3 ) =1;       //*(block+1*width_block+0)=1,第二行开始
  406.         * ( block+4 ) =1;       //*(block+1*width_block+1)=1
  407.         * ( block+5 ) =1;       //*(block+1*width_block+2)=1

  408.         cur_top=0-height_block;
  409.         cur_left= ( COLS-width_block ) /2;
  410.         break;
  411.     case 2:     //左横折
  412.         width_block=3;
  413.         height_block=2;
  414.         block= ( byte * ) malloc ( sizeof ( byte ) *width_block*height_block );
  415.         * ( block+0 ) =1;       //可以理解为*(block+0*width_block+0)=1,下面同理
  416.         * ( block+1 ) =0;       //*(block+0*width_block+1)=0
  417.         * ( block+2 ) =0;       //*(block+0*width_block+2)=0
  418.         * ( block+3 ) =1;       //*(block+1*width_block+0)=1
  419.         * ( block+4 ) =1;       //*(block+1*width_block+1)=1
  420.         * ( block+5 ) =1;       //*(block+1*width_block+2)=1

  421.         cur_top=0-height_block;
  422.         cur_left= ( COLS-width_block ) /2;
  423.         break;
  424.     case 3:     //右横折
  425.         width_block=3;
  426.         height_block=2;
  427.         block= ( byte * ) malloc ( sizeof ( byte ) *width_block*height_block );
  428.         * ( block+0 ) =0;       //可以理解为*(block+0*width_block+0)=0,下面同理
  429.         * ( block+1 ) =0;       //*(block+0*width_block+1)=0
  430.         * ( block+2 ) =1;       //*(block+0*width_block+2)=1
  431.         * ( block+3 ) =1;       //*(block+1*width_block+0)=1
  432.         * ( block+4 ) =1;       //*(block+1*width_block+1)=1
  433.         * ( block+5 ) =1;       //*(block+1*width_block+2)=1

  434.         cur_top=0-height_block;
  435.         cur_left= ( COLS-width_block ) /2;
  436.         break;
  437.     case 4:     //左闪电
  438.         width_block=3;
  439.         height_block=2;
  440.         block= ( byte * ) malloc ( sizeof ( byte ) *width_block*height_block );
  441.         * ( block+0 ) =1;       //可以理解为*(block+0*width_block+0)=1,下面同理
  442.         * ( block+1 ) =1;       //*(block+0*width_block+1)=1
  443.         * ( block+2 ) =0;       //*(block+0*width_block+2)=0
  444.         * ( block+3 ) =0;       //*(block+1*width_block+0)=0
  445.         * ( block+4 ) =1;       //*(block+1*width_block+1)=1
  446.         * ( block+5 ) =1;       //*(block+1*width_block+2)=1

  447.         cur_top=0-height_block;
  448.         cur_left= ( COLS-width_block ) /2;
  449.         break;
  450.     case 5:     //右闪电
  451.         width_block=3;
  452.         height_block=2;
  453.         block= ( byte * ) malloc ( sizeof ( byte ) *width_block*height_block );
  454.         * ( block+0 ) =0;       //可以理解为*(block+0*width_block+0)=0,下面同理
  455.         * ( block+1 ) =1;       //*(block+0*width_block+1)=1
  456.         * ( block+2 ) =1;       //*(block+0*width_block+2)=1
  457.         * ( block+3 ) =1;       //*(block+1*width_block+0)=1
  458.         * ( block+4 ) =1;       //*(block+1*width_block+1)=1
  459.         * ( block+5 ) =0;       //*(block+1*width_block+2)=0

  460.         cur_top=0-height_block;
  461.         cur_left= ( COLS-width_block ) /2;
  462.         break;
  463.     case 6:     //石头
  464.         width_block=2;
  465.         height_block=2;
  466.         block= ( byte * ) malloc ( sizeof ( byte ) *width_block*height_block );
  467.         * ( block+0 ) =1;       //可以理解为*(block+0*width_block+0)=1,下面同理
  468.         * ( block+1 ) =1;       //*(block+0*width_block+1)=1
  469.         * ( block+2 ) =1;       //*(block+1*width_block+0)=1
  470.         * ( block+3 ) =1;       //*(block+1*width_block+1)=1

  471.         cur_top=0-height_block;
  472.         cur_left= ( COLS-width_block ) /2;
  473.         break;
  474.     }
  475.     return block!=NULL;
  476. }

  477. LRESULT CALLBACK WndProc ( HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam )
  478. {
  479.     HDC hdc;
  480.     PAINTSTRUCT ps;
  481.     //TCHAR szBuffer[1024];

  482.     switch ( message )
  483.     {
  484.     case WM_CREATE:
  485.         MoveWindow ( hwnd,400,10,CELL*COLS+8,CELL*ROWS+32,FALSE );      //补齐宽度和高度
  486.         srand ( time ( NULL ) );
  487.         ExportBlock();

  488.         timer_id=SetTimer ( hwnd,ID_TIMER,interval_base-level*interval_unit,NULL );
  489.         return 0;
  490.     case WM_TIMER:
  491.         hdc=GetDC ( hwnd );
  492.         DoDownShift ( hdc );
  493.         ReleaseDC ( hwnd,hdc );
  494.         return 0;
  495.     case WM_KEYDOWN:
  496.         hdc=GetDC ( hwnd );
  497.         switch ( wParam )
  498.         {
  499.         case VK_LEFT:                           //左移
  500.             if ( !isPause ) DoLeftShift ( hdc );
  501.             break;
  502.         case VK_RIGHT:                          //右移
  503.             if ( !isPause ) DoRightShift ( hdc );
  504.             break;
  505.         case VK_UP:                             //转向
  506.             if ( !isPause ) DoRedirection ( hdc );
  507.             break;
  508.         case VK_DOWN:                           //加速
  509.             if ( !isPause ) DoAccelerate ( hdc );
  510.             break;
  511.         case VK_SPACE:      //暂停
  512.             isPause=!isPause;
  513.             if ( isPause )
  514.             {
  515.                 if ( timer_id ) KillTimer ( hwnd,ID_TIMER );
  516.                 timer_id=0;
  517.             }
  518.             else
  519.             {
  520.                 timer_id=SetTimer ( hwnd,ID_TIMER,interval_base-level*interval_unit,FALSE );
  521.             }
  522.             break;
  523.         }
  524.         ReleaseDC ( hwnd,hdc );
  525.         return 0;
  526.     case WM_PAINT:
  527.         hdc=BeginPaint ( hwnd,&ps );
  528.         DrawPanel ( hdc );          //绘制面板
  529.         RefreshPanel ( hdc );       //刷新
  530.         EndPaint ( hwnd,&ps );
  531.         return 0;
  532.     case WM_DESTROY:
  533.         if ( block ) free ( block );
  534.         if ( timer_id ) KillTimer ( hwnd,ID_TIMER );
  535.         PostQuitMessage ( 0 );
  536.         return 0;
  537.     }
  538.     return DefWindowProc ( hwnd,message,wParam,lParam );
  539. }
复制代码


求大神解析
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-11-5 07:20:18 | 显示全部楼层
先占楼
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-11-5 12:40:18 | 显示全部楼层

回帖奖励 +5 鱼币

首先把2个程序的代码复制到一起,看看有没有变量和define冲突,然后把俄罗斯方块的main函数改名,比如叫tetrismain(),然后在密码程序里面把 if(i==4) printf("\n 密码错误!");这句改成 if(i==4) tetrismain();
如果有函数位置问题就做前向声明
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-11-5 12:51:59 | 显示全部楼层

回帖奖励 +5 鱼币

先回帖
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-11-5 19:29:56 | 显示全部楼层

回帖奖励 +5 鱼币

先回
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-11-5 19:33:23 From FishC Mobile | 显示全部楼层

回帖奖励 +5 鱼币

先回帖
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-11-5 20:37:55 | 显示全部楼层

回帖奖励 +5 鱼币

先回帖
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-11-5 22:31:58 | 显示全部楼层

回帖奖励 +5 鱼币

既然有了回答那我 恬不知耻的要个币
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-11-6 08:05:23 | 显示全部楼层

回帖奖励 +5 鱼币

很给力的哈!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-11-6 08:59:42 | 显示全部楼层

回帖奖励 +5 鱼币

太多了 俺看着头晕
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-11-6 08:59:54 | 显示全部楼层

回帖奖励 +5 鱼币

赞一个  楼主给力呀
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-11-6 12:06:45 | 显示全部楼层

回帖奖励 +5 鱼币

两段代码复制到一起,并且把两个main函数合到一起,比如把第一个main中的代码加入到第二个中,然后改下定义、变量什么的,这应该没什么问题吧。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-11-6 12:57:38 | 显示全部楼层
..............
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-11-6 14:31:46 | 显示全部楼层
两个工程的,在主exe里验证密码,密码正确通过WinExec 或者 CreateProcess 调用俄罗斯方块的exe,
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-11-7 16:07:19 | 显示全部楼层
先回帖
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-11-8 09:04:24 | 显示全部楼层

先回帖
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-11-8 10:08:24 | 显示全部楼层
我没用纯代码写过俄罗斯方块,但是用过qt写过一个登陆程序。主要是这个思路,首先有两个界面,登陆界面输入密码,然后取出数据判断账号密码是否正确,不正确就return返回;正确就销毁登陆窗口,进入主界面。因为是界面是直接画的,很方便。纯代码写没试过,头痛
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-11-8 14:10:58 | 显示全部楼层
绝对力挺
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-11-8 22:57:14 | 显示全部楼层
晕晕
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-11-9 12:15:23 | 显示全部楼层

太多了 俺看着头晕
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-21 11:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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