main.c
上传用户:fhtm20
上传日期:2022-06-30
资源大小:28k
文件大小:11k
源码类别:

其他智力游戏

开发平台:

Visual C++

  1. #include <windows.h>
  2. #define TIMER  1
  3. LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
  4. INT checkleft();
  5. INT checkright();
  6. VOID buildfram(HWND);
  7. VOID restart1(HWND);
  8. VOID restart2(HWND);
  9. VOID drawrect(HWND,int,int,COLORREF);
  10. VOID drawrect2(HWND,int,int,int,COLORREF);
  11. VOID change(int);
  12. VOID godown(int,HWND);
  13. VOID clean(int,HWND);
  14. VOID gameover(HWND);
  15. const int rx[28][4]={{-1,0,1,0},{0,0,0,1},{-1,0,1,0},{0,0,0,-1},//   _|_
  16.                     {0,0,0,1},{-1,0,1,-1},{-1,0,0,0},{-1,0,1,1},//   __|
  17.                     
  18.                     {0,0,0,-1},{-1,0,1,-1},{1,0,0,0},{-1,0,1,1},//   |__
  19.                     
  20.                     {0,0,1,1},{0,0,1,1},{0,0,1,1},{0,0,1,1},//       田 
  21.                     
  22.                     {-1,0,1,2},{0,0,0,0},{-1,0,1,2},{0,0,0,0},//     ___
  23.                     
  24.                     {-1,0,0,1},{0,0,-1,-1},{-1,0,0,1},{0,0,-1,-1},// -|_ 
  25.                     
  26.                     {1,0,0,-1},{0,0,1,1},{1,0,0,-1},{0,0,1,1}},//    _|-
  27.           //the x of rect ↑  the y of rect ↓ 
  28.           ry[28][4]={{0,0,0,1},{1,0,-1,0},{0,0,0,-1},{1,0,-1,0},
  29.                 {1,0,-1,-1},{0,0,0,-1},{1,1,0,-1},{0,0,0,1},
  30.                     {1,0,-1,-1},{0,0,0,1},{1,1,0,-1},{0,0,0,-1},
  31.                     {1,0,1,0},{1,0,1,0},{1,0,1,0},{1,0,1,0},
  32.                     {0,0,0,0},{1,0,-1,-2},{0,0,0,0},{1,0,-1,-2},
  33.                     {0,0,-1,-1},{1,0,0,-1},{0,0,-1,-1},{1,0,0,-1},
  34.                     {0,0,-1,-1},{1,0,0,-1},{0,0,-1,-1},{1,0,0,-1}},
  35.           rlen[7]={4,4,4,4,4,4,4};
  36. const COLORREF rcolor[7]={RGB(150,0,0),RGB(0,150,0),RGB(0,0,150),
  37.                           RGB(150,150,0),RGB(150,0,150),RGB(0,150,150),
  38.                           RGB(200,200,100)},
  39.                bcolor=RGB(200,200,240);//colorm of background
  40. const int sx=20,           //start x
  41.           sy=320,          //start y
  42.           slen=20,         //side length
  43.           w=12,            //wide of fram
  44.           h=15;            //high of fram
  45. int nrect=0,prect,x=7,y=15,map[15][20],linenum[20],score2,level2;
  46. long int interval=1000;
  47. //prect(prepare) is the next one of nrect(now);
  48. char szClassName[ ] = "WindowsApp";
  49. int WINAPI
  50. WinMain (HINSTANCE hThisInstance,HINSTANCE hPrevInstance,
  51.          LPSTR lpszArgument,     int nFunsterStil)
  52. {
  53.     HWND hwnd;              
  54.     MSG messages;            
  55.     WNDCLASSEX wincl;    
  56.     
  57.     srand((unsigned)time(NULL));
  58.     prect=(rand()%28);   
  59.     wincl.hInstance = hThisInstance;
  60.     wincl.lpszClassName = szClassName;
  61.     wincl.lpfnWndProc = WindowProcedure;     
  62.     wincl.style = CS_DBLCLKS;                 
  63.     wincl.cbSize = sizeof (WNDCLASSEX);
  64.     wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
  65.     wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
  66.     wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
  67.     wincl.lpszMenuName = NULL;                 
  68.     wincl.cbClsExtra = 0;                      
  69.     wincl.cbWndExtra = 0;                      
  70.     wincl.hbrBackground = (HBRUSH)CreateSolidBrush(bcolor);
  71.     if (!RegisterClassEx (&wincl))
  72.     {
  73.      MessageBox(NULL,TEXT("您的RP过高,窗口创建失败,请重试"),TEXT("RP蹦圈错误"),MB_OK);
  74.         return 0;
  75.     }
  76.     hwnd = CreateWindowEx (0,szClassName,"game2_1.01",WS_OVERLAPPEDWINDOW,
  77.            400,200,400,400,HWND_DESKTOP,NULL,hThisInstance,NULL);
  78.     ShowWindow (hwnd, nFunsterStil);
  79.     UpdateWindow(hwnd);
  80.     while (GetMessage (&messages, NULL, 0, 0))
  81.     {
  82.         TranslateMessage(&messages);
  83.         DispatchMessage(&messages);
  84.     }
  85.     return messages.wParam;
  86. }
  87. LRESULT CALLBACK
  88. WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  89. {
  90. PAINTSTRUCT ps;
  91. HDC hdc;
  92. RECT rt;
  93. int i,j;
  94.     switch (message)                  
  95.     {
  96.      case WM_CREATE:
  97.          for(i=1;i<=w;i++)
  98.            for(j=1;j<=h+4;j++)map[i][j]=-1;
  99.            for(i=0;i<=w+1;i++)map[i][0]=1;
  100. //           for(i=0;i<=w+1;i++)map[i][h+1]=1;
  101.            for(j=0;j<=h+1;j++)map[0][j]=1;
  102.            for(j=0;j<=h+1;j++)map[w+1][j]=1;
  103.            for(j=0;j<=h+1;j++)linenum[j]=0;
  104.            restart2(hwnd);
  105.            restart1(hwnd);
  106.            SetTimer(hwnd,TIMER,interval-level2*100,NULL);
  107.          break;
  108.      case WM_PAINT:
  109. hdc = BeginPaint(hwnd, &ps);
  110. buildfram(hwnd);
  111.            restart1(hwnd);
  112. drawrect2(hwnd,nrect,x,y,rcolor[nrect/4]);
  113. EndPaint(hwnd, &ps);
  114. break;
  115.         case WM_DESTROY:
  116.             KillTimer(hwnd,TIMER);
  117.             PostQuitMessage (0);       
  118.             break;
  119.         case WM_TIMER:
  120. //  MessageBox(NULL,"!","!",MB_OK);
  121.             godown(nrect,hwnd);
  122.             break;
  123.     case WM_KEYDOWN:
  124. // drawrect2(hwnd,nrect,x,y,bcolor);
  125. //            nrect=nrect/4*4+(nrect%4+1)%4;
  126. // drawrect2(hwnd,nrect,x,y,rcolor[nrect/4]);
  127.             switch(wParam)
  128.             {
  129.               case VK_LEFT:
  130.                   if(checkleft(nrect))
  131.                   {
  132.                    drawrect2(hwnd,nrect,x,y,bcolor);
  133.                         x--;
  134. drawrect2(hwnd,nrect,x,y,rcolor[nrect/4]);
  135.                   }
  136.                  break;
  137.              case VK_RIGHT:
  138.                   if(checkright(nrect))
  139.                   {
  140.                    drawrect2(hwnd,nrect,x,y,bcolor);
  141.                         x++;
  142. drawrect2(hwnd,nrect,x,y,rcolor[nrect/4]);
  143.                   }
  144.                  break;
  145.              case VK_UP:
  146.                      drawrect2(hwnd,nrect,x,y,bcolor);
  147.                      change(nrect/4*4+(nrect%4+1)%4);
  148.                      drawrect2(hwnd,nrect,x,y,rcolor[nrect/4]);
  149.                     break;
  150.              case VK_DOWN:
  151.                     KillTimer(hwnd,TIMER);
  152.                  godown(nrect,hwnd);
  153.                  SetTimer(hwnd,TIMER,interval-level2*100,NULL);
  154.                  break;
  155.             }
  156.         break;
  157.         default:                      
  158.             return DefWindowProc (hwnd, message, wParam, lParam);
  159.     }
  160.     return 0;
  161. }
  162. VOID buildfram(HWND hwnd)       //初始化框架
  163. {
  164. //the map is 12(W240)*15(H300)
  165.   HDC hdc;
  166.   RECT rect;
  167.   HBRUSH hbrush;
  168.   TCHAR *next="NEXT:",*score="SCORE:",*level="LEVEL:",*exp="EXP:",
  169.         *AD="俄罗斯方块1.01版  幻梦帝国荣誉出品"; 
  170.   hdc=GetDC(hwnd);
  171.   hbrush=(HBRUSH)CreateSolidBrush(RGB(0,0,0));
  172.   SetRect(&rect,18,18,260,20);
  173.   FillRect(hdc,&rect,hbrush);
  174.   SetRect(&rect,18,18,20,320);
  175.   FillRect(hdc,&rect,hbrush);
  176.   SetRect(&rect,18,320,260,322);
  177.   FillRect(hdc,&rect,hbrush);
  178.   SetRect(&rect,260,18,262,322);
  179.   FillRect(hdc,&rect,hbrush);
  180.   SetRect(&rect,290,30,370,50);
  181.   DrawText(hdc,next,lstrlen(next),&rect,DT_LEFT);
  182.   SetRect(&rect,290,150,370,170);
  183.   DrawText(hdc,score,lstrlen(score),&rect,DT_LEFT);
  184.   SetRect(&rect,290,200,370,220);
  185.   DrawText(hdc,level,lstrlen(level),&rect,DT_LEFT);
  186.   SetRect(&rect,290,250,370,270);
  187.   DrawText(hdc,exp,lstrlen(exp),&rect,DT_LEFT);
  188.   SetRect(&rect,20,340,300,360);
  189.   DrawText(hdc,AD,lstrlen(AD),&rect,DT_LEFT);
  190.   DeleteObject(hbrush);
  191.   ReleaseDC(hwnd,hdc);
  192. }
  193. VOID restart1(HWND hwnd)
  194. {
  195.   HDC hdc;
  196.   RECT rect;
  197.   TCHAR s1[20]="",ss[20]="";
  198.   int i,j;
  199.   for(i=1;i<=12;i++)
  200.     for(j=1;j<=15;j++)
  201.       if(map[i][j]>=0)drawrect(hwnd,i,j,rcolor[map[i][j]]);
  202.       else drawrect(hwnd,i,j,bcolor);
  203.   hdc=GetDC(hwnd);    
  204.   drawrect2(hwnd,nrect,15,12,bcolor);
  205.   drawrect2(hwnd,prect,15,12,rcolor[prect/4]);
  206.   level2=score2/100;
  207.   itoa(level2,s1,10);
  208.   SetRect(&rect,290,225,370,245);
  209.   DrawText(hdc,s1,lstrlen(s1),&rect,DT_LEFT);
  210.   itoa(score2,s1,10);
  211.   SetRect(&rect,290,175,370,195);
  212.   DrawText(hdc,s1,lstrlen(s1),&rect,DT_LEFT);
  213.   i=level2*100+100;
  214.   itoa(i,ss,10);
  215.   lstrcat(s1,"/");
  216.   lstrcat(s1,ss);
  217.   SetRect(&rect,290,275,370,295);
  218.   DrawText(hdc,s1,lstrlen(s1),&rect,DT_LEFT);
  219.   ReleaseDC(hwnd,hdc);
  220. }
  221. VOID restart2(HWND hwnd)
  222. {
  223.   nrect=prect;
  224.   srand((unsigned)time(NULL));
  225.   prect=(rand()%28);
  226.   prect=(rand()%28);
  227.   x=7;
  228.   y=16;
  229. }
  230. VOID drawrect(HWND hwnd,int nx,int ny,COLORREF color)
  231. {
  232.   HDC hdc;
  233.   RECT rect;
  234.   HBRUSH hbrush;
  235.   hdc=GetDC(hwnd);
  236.   hbrush=(HBRUSH)CreateSolidBrush(color);
  237.   SetRect(&rect,sx+(nx-1)*slen+1,sy-ny*slen+1,sx+(nx)*slen-1,sy-(ny-1)*slen-1);
  238.   FillRect(hdc,&rect,hbrush);
  239.   DeleteObject(hbrush);
  240.   ReleaseDC(hwnd,hdc);
  241. }
  242. VOID drawrect2(HWND hwnd,int num,int nx,int ny,COLORREF color)
  243. {
  244.   int i;
  245.   for(i=0;i<rlen[(int)(num/4)];i++)
  246.     if(ny+ry[num][i]<16)
  247.       drawrect(hwnd,nx+rx[num][i],ny+ry[num][i],color);
  248. }
  249. BOOL checkleft(int v)
  250. {
  251.   int i;
  252.   for(i=0;i<rlen[v/4];i++)
  253.     if(map[x+rx[v][i]-1][y+ry[v][i]]!=-1)return(0);
  254.   return(1);
  255. }
  256. BOOL checkright(int v)
  257. {
  258.   int i;
  259.   for(i=0;i<rlen[v/4];i++)
  260.     if(map[x+rx[v][i]+1][y+ry[v][i]]!=-1)return(0);
  261.   return(1);
  262. }
  263. VOID change(int v)
  264. {
  265.   int bl,br,bb,i;   //b means bool,and l,left,r,right,b,bottom
  266.   bl=br=bb=0;
  267.   for(i=0;i<rlen[v/4];i++)
  268.     if(map[x+rx[v][i]][y+ry[v][i]]!=-1)
  269. {
  270.   if((rx[v][i]<0)&&(rx[v][i]<bl))bl=rx[v][i];
  271.       if((rx[v][i]>0)&&(rx[v][i]>br))br=rx[v][i];
  272.       if(ry[v][i]<0)bb=1;
  273. }
  274.   if((bl!=0&&br!=0)||bb!=0)return;
  275.   nrect=v;
  276.   if(bl!=0)x-=bl;
  277.   if(br!=0)x-=br;
  278. }
  279. VOID godown(int v,HWND hwnd)
  280. {
  281. int i,nx,ny,bb,bf;  //bf means bool full;
  282. //    TCHAR ss[60]="";
  283. drawrect2(hwnd,nrect,x,y,bcolor);
  284. bb=bf=0;
  285. nx=x;
  286. ny=y-1;
  287. for(i=0;i<rlen[v/4];i++)
  288.   if(map[nx+rx[v][i]][ny+ry[v][i]]!=-1)bb=1;
  289.     if(bb)
  290.     {
  291.      for(i=0;i<rlen[v/4];i++)
  292.         if(y+ry[v][i]>15)
  293.         {
  294.          gameover(hwnd);
  295.          return;
  296.         }
  297.         
  298.      for(i=0;i<rlen[nrect/4];i++)
  299.      {
  300.      map[x+rx[nrect][i]][y+ry[nrect][i]]=nrect/4;
  301.      linenum[y+ry[nrect][i]]+=1;
  302.      if(linenum[y+ry[nrect][i]]>11)bf=1;
  303.      }
  304.      if(bf)clean(nrect,hwnd);
  305.      restart2(hwnd);
  306.      restart1(hwnd);
  307.      drawrect2(hwnd,nrect,x,y,rcolor[nrect/4]);
  308.      return;
  309.     }
  310.     y--;
  311. drawrect2(hwnd,nrect,x,y,rcolor[nrect/4]);
  312. }
  313. VOID clean(int v,HWND hwnd)
  314. {
  315.   int i,j,j2,k,num;
  316.   num=0;
  317.   for(i=0;i<rlen[v/4];i++)
  318.     if(linenum[y+ry[v][i]]>11)
  319.     {
  320.      for(j=1;j<=12;j++)map[j][y+ry[v][i]]=-1;
  321. linenum[y+ry[v][i]]=0;
  322. num++;
  323.     }
  324.   restart1(hwnd);
  325.   for(k=0;k<num;k++)
  326.    for(j=1;j<15;j++)
  327.    if(linenum[j]==0)
  328.     {
  329.      for(j2=j;j2<15;j2++)
  330.      {
  331.         for(i=1;i<=12;i++)map[i][j2]=map[i][j2+1];
  332.        linenum[j2]=linenum[j2+1];
  333.        linenum[j2+1]=0;
  334.      }   
  335.     }
  336.   
  337. //score...  
  338.   switch(num)
  339.   {
  340.    case 1:
  341.    score2+=10;
  342.    break;
  343.    case 2:
  344.    score2+=30;
  345.    break;
  346.    case 3:
  347.    score2+=50;
  348.    break;
  349.    case 4:
  350.    score2+=90;
  351.    break;
  352.   }
  353.   if(score2>490)
  354.   MessageBox(NULL,TEXT("恭喜您通关"),TEXT("通关成功"),MB_OK);
  355. }
  356. VOID gameover(HWND hwnd)
  357. {
  358. KillTimer(hwnd,TIMER);
  359. MessageBox(NULL,"GAMEOVER","GAMEOVER",MB_OK);
  360. return;
  361. }