久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8289|回復: 0
打印 上一主題 下一主題
收起左側

c語言編程俄羅斯方塊游戲源程序代碼

[復制鏈接]
跳轉到指定樓層
樓主
ID:101489 發表于 2016-1-3 02:03 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
這個游戲的代碼,我找了很多,但其不是tc編的就是mfc...
同屆的某新生lhs找到個vc++編的。
我就將其拿來借鑒了哈
雖然源代碼長了點,方塊變形時也有點奇怪,但已經算很不錯了的。
截圖如下:


源代碼如下:
  1. #include <iostream>
  2. #include <windows.h>
  3. #include <vector>
  4. #include <mmsystem.h>
  5. #include<stdio.h>
  6. #pragma comment(lib, "winmm.lib")
  7. using namespace std;

  8. #define GameW 10
  9. #define GameH 20
  10. const int CtrlLeft = GameW*2+4 + 3;

  11. struct Point {
  12.     Point(){}
  13.     Point(int x, int y) {_x = x, _y = y;}
  14.     int _x, _y;
  15. };

  16. HANDLE g_hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
  17. HANDLE g_hInput  = GetStdHandle(STD_INPUT_HANDLE);

  18. Point g_ptCursor(0,0);
  19. BOOL isChecking = FALSE;
  20. BOOL g_bGameOver = FALSE;
  21. int g_nGameBack[GameH][GameW], Case;
  22. int nowKeyInfo = -1;
  23. int g_nDiff = 1;
  24. int g_nLife = 2;
  25. int g_nScore = 0;

  26. void SetCursor(COORD cd) {
  27.     SetConsoleCursorPosition(g_hOutput, cd);
  28. }
  29. void SetCursor(int x, int y){
  30.     COORD cd = {x, y};
  31.     SetCursor(cd);
  32. }
  33. void SetBlockCursor(int x, int y){
  34.     COORD cd = {2*x + 2, y + 1};
  35.     SetCursor(cd);
  36. }

  37. void SetBack(int x, int y, BOOL bk) {
  38.     SetBlockCursor(x, y);
  39.     if (bk)
  40.         printf("%s", "■");
  41.     else
  42.         printf(" ");
  43. }

  44. bool Out(int x, int y) {
  45.     return x < 0 || y < 0 || x >= GameW || y >= GameH;
  46. }

  47. struct xBlock {
  48. public:
  49.     int len;
  50.     int nowRotateID;
  51.     BOOL mask[4][4][4];
  52.     static vector <xBlock> List;

  53.     xBlock() { len = 0; }
  54.     xBlock(int l, char *str) {
  55.         int i, j, k;
  56.         len = l;
  57.         memset(mask, FALSE, sizeof(mask));
  58.         for(i = 0; i < l; i++) {
  59.             for(j = 0; j < l; j++) {
  60.                 mask[0][i][j] = str[i*l + j] - '0';
  61.             }
  62.         }
  63.         for(k = 1; k < 4; k++) {
  64.             for(i = 0; i < len; i++) {
  65.                 for(j = 0; j < len; j++) {
  66.                     mask[k][i][j] = mask[k-1][j][len-1-i];
  67.                 }
  68.             }
  69.         }
  70.         nowRotateID = rand() % 4;
  71.     }

  72.     void rotate() {
  73.         nowRotateID ++;
  74.         if (nowRotateID >= 4)
  75.             nowRotateID = 0;
  76.     }

  77.     BOOL getUnit(int x, int y, int roID) {
  78.         if (roID == -1) {
  79.             roID = nowRotateID;
  80.         }
  81.         return mask[roID][y][x];
  82.     }
  83. };

  84. vector <xBlock> xBlock::List;

  85. class Block {
  86. public:
  87.     int x, y;
  88.     int ID;
  89.     xBlock bk;

  90.     void reset(xBlock *pbk) {
  91.         bk = *pbk;

  92.         x = 4, y = 0;
  93.         ID = ++ Case;

  94.         if(collide(0,0)) {
  95.             lifeDown();
  96.         }
  97.         draw();
  98.       
  99.         *pbk = xBlock::List[rand() % xBlock::List.size()];
  100.     }
  101.    
  102.     void lifeDown() {
  103.         int i, j;
  104.         for(i = 0; i < GameH; i++) {
  105.             for(j = 0; j < GameW; j++) {
  106.                 SetBack(j, i, TRUE);
  107.                 Sleep(10);
  108.             }
  109.         }
  110.         if(g_nLife) {
  111.             g_nLife --;
  112.             for(i = g_nLife; i < 6; i++) {
  113.                 SetCursor(CtrlLeft + i, 15);
  114.                 printf("%c", ' ');
  115.             }
  116.             for(i = GameH-1; i >= 0; i--) {
  117.                 for(j = GameW-1; j >= 0; j--) {
  118.                     SetBack(j, i, FALSE);
  119.                     Sleep(10);
  120.                     g_nGameBack[i][j] = 0;
  121.                 }
  122.             }
  123.         }else {
  124.             g_bGameOver = TRUE;
  125.         }
  126.     }

  127.     void erase() {
  128.         int i, j;
  129.         for(i = 0; i < bk.len; i++) {
  130.             for(j = 0; j < bk.len; j++) {
  131.                 if (bk.getUnit(j, i, -1)) {
  132.                     if(!Out(j+x, i+y) && g_nGameBack[i+y][j+x]) {
  133.                         SetBack(j+x, i+y, FALSE);
  134.                         g_nGameBack[i+y][j+x] = 0;
  135.                     }
  136.                 }
  137.             }
  138.         }
  139.     }
  140.     void draw() {
  141.         int i, j;
  142.         for(i = 0; i < bk.len; i++) {
  143.             for(j = 0; j < bk.len; j++) {
  144.                 if (bk.getUnit(j, i, -1)) {
  145.                     if(!Out(j+x, i+y) && !g_nGameBack[i+y][j+x]) {
  146.                         SetBack(j+x, i+y, TRUE);
  147.                         g_nGameBack[i+y][j+x]  = ID;
  148.                     }
  149.                 }
  150.             }
  151.         }
  152.     }
  153.     void draw(int x, int y) {
  154.         int i, j;
  155.         for(i = 0; i < 4; i++) {
  156.             for(j = 0; j < 4; j++) {
  157.                 SetCursor(x + 2*j, y + i);
  158.                 if (bk.getUnit(j, i, -1)) {   
  159.                     printf("%s", "■");
  160.                 }else
  161.                     printf(" ");
  162.             }
  163.         }
  164.     }
  165.     bool collide(int dx, int dy, int roID = -1) {
  166.         int i, j;
  167.         for(i = 0; i < bk.len; i++) {
  168.             for(j = 0; j < bk.len; j++) {
  169.                 if (bk.getUnit(j, i, roID)) {
  170.                     Point ptPos(j + x + dx, i + y + dy);
  171.                     if(Out(ptPos._x, ptPos._y)
  172.                     || g_nGameBack[ptPos._y][ptPos._x] && ID != g_nGameBack[ptPos._y][ptPos._x]) {
  173.                         return TRUE;
  174.                     }
  175.                 }
  176.             }
  177.         }
  178.         return FALSE;
  179.     }

  180.     void rotate(int nTimes = 1) {
  181.         int nextro = (bk.nowRotateID + nTimes) % 4;
  182.         if(collide(0, 0, nextro)) {
  183.             return ;
  184.         }
  185.         Beep(12000, 50);
  186.         erase();
  187.         bk.nowRotateID = nextro;
  188.         draw();
  189.     }

  190.     BOOL changepos(int dx, int dy) {
  191.         if(collide(dx, dy)) {
  192.             return FALSE;
  193.         }
  194.         erase();
  195.         x += dx;
  196.         y += dy;
  197.         draw();
  198.         return TRUE;
  199.     }
  200. };

  201. void GameInit() {
  202.     CONSOLE_CURSOR_INFO cursor_info;
  203.     cursor_info.bVisible = FALSE;
  204.     cursor_info.dwSize   = 100;
  205.     SetConsoleCursorInfo(g_hOutput, &cursor_info);
  206.     xBlock::List.push_back(xBlock(3, "010111000"));
  207.     xBlock::List.push_back(xBlock(3, "110110000"));
  208.     xBlock::List.push_back(xBlock(3, "111001000"));
  209.     xBlock::List.push_back(xBlock(3, "111100000"));
  210.     xBlock::List.push_back(xBlock(3, "110011000"));
  211.     xBlock::List.push_back(xBlock(3, "011110000"));
  212.     xBlock::List.push_back(xBlock(4, "1000100010001000"));
  213. }

  214. void DrawFrame(int x, int y, int nWidth, int nHeight) {
  215.     int i;
  216.     for(i = 0; i < nWidth; i++) {
  217.         SetCursor(x + 2*i + 2, y);
  218.         printf("%s", "一");
  219.         SetCursor(x + 2*i + 2, y + nHeight+1);
  220.         printf("%s", "┄");
  221.     }
  222.     for(i = 0; i < nHeight; i++) {
  223.         SetCursor(x, y + i + 1);
  224.         printf("%s", "┆");
  225.         SetCursor(x + nWidth*2+2, y + i + 1);
  226.         printf("%s", "┆");
  227.     }      
  228.     SetCursor(x, y);
  229.     printf("%s", "┌");   
  230.     SetCursor(x, y + nHeight+1);
  231.     printf("%s", "└");
  232.     SetCursor(x + nWidth*2+2, y);
  233.     printf("%s", "┐");   
  234.     SetCursor(x + nWidth*2+2, y + nHeight+1);
  235.     printf("%s", "┘");
  236. }

  237. void MissionInit() {
  238.     memset(g_nGameBack, FALSE, sizeof(g_nGameBack));
  239.     Case = 1;
  240.     int i;
  241.     DrawFrame(0, 0, GameW, GameH);
  242.     DrawFrame(GameW*2+4, 0, 4, GameH);
  243.     SetCursor(CtrlLeft, 2);
  244.     printf("Next");
  245.    
  246.     SetCursor(CtrlLeft, 8);
  247.     printf("Speed");
  248.     for(i = 0; i < g_nDiff; i++) {
  249.         SetCursor(CtrlLeft + i, 9);
  250.         printf("%c", 1);
  251.     }

  252.     SetCursor(CtrlLeft, 11);
  253.     printf("Score");
  254.     SetCursor(CtrlLeft, 12);
  255.     printf("%d", g_nScore);

  256.     SetCursor(CtrlLeft, 14);
  257.     printf("Life");
  258.     for(i = 0; i < g_nLife; i++) {
  259.         SetCursor(CtrlLeft + i, 15);
  260.         printf("%c", 3);
  261.     }

  262.     SetCursor(CtrlLeft-1, 19);
  263.     printf("by Zty");
  264.     SetCursor(CtrlLeft-1, 20);
  265.     printf("Baidu A*");
  266. }

  267. void Check() {
  268.     isChecking = TRUE;
  269.     int i, j, k;
  270.     vector <int> line;
  271.     for(i = 0; i < GameH; i++) {
  272.         for(j = 0; j < GameW; j++) {
  273.             if(!g_nGameBack[i][j])
  274.                 break;
  275.         }
  276.         if(j == GameW) {
  277.             line.push_back(i);
  278.         }
  279.     }
  280.     if(line.size()) {
  281.         int nCount = 7;
  282.         while(nCount --) {
  283.             for(i = 0; i < line.size(); i++) {
  284.                 for(j = 0; j < GameW; j++) {
  285.                     SetBack(j, line[i], nCount&1);
  286.                 }
  287.             }
  288.             Sleep(70);
  289.         }
  290.         for(i = 0; i < line.size(); i++) {
  291.             for(j = 0; j < GameW; j++) {
  292.                 g_nGameBack[line[i]][j] = 0;
  293.             }
  294.         }

  295.         for(i = 0; i < GameW; i++) {
  296.             int next = GameH-1;
  297.             for(j = GameH-1; j >= 0; j--) {
  298.                 for(k = next; k >= 0; k--) {
  299.                     if(g_nGameBack[k][i])
  300.                         break;
  301.                 }
  302.                 next = k - 1;
  303.                 BOOL is = (k >= 0);
  304.                 SetBack(i, j, is);
  305.                 g_nGameBack[j][i] = is;
  306.             }
  307.         }

  308.         g_nScore += 2*line.size()-1;
  309.         SetCursor(CtrlLeft, 12);
  310.         printf("%d", g_nScore);

  311.         if( g_nScore >= g_nDiff * g_nDiff * 10) {
  312.             if(g_nDiff <= 6)
  313.                 g_nDiff ++;
  314.         }
  315.         if( g_nScore >= 50 * (g_nLife+1)) {
  316.             if(g_nLife <= 6)
  317.                 g_nLife ++;
  318.         }
  319.     }

  320.     isChecking = FALSE;
  321. }
  322. int main() {
  323.     Block* obj = new Block();
  324.     Block* buf = new Block();
  325.    

  326.     BOOL bCreateNew = FALSE;
  327.     int nTimer = GetTickCount();
  328.     int LastKeyDownTime = GetTickCount();


  329.     GameInit();
  330.     MissionInit();
  331.    
  332.     buf->bk = xBlock::List[rand() % xBlock::List.size()];
  333.     while(1) {
  334.         if(!bCreateNew) {
  335.             bCreateNew = TRUE;
  336.             obj->reset(&buf->bk);
  337.             if(g_bGameOver)
  338.                 break;
  339.             buf->draw(CtrlLeft - 1, 4);
  340.         }
  341.         if (GetTickCount() - nTimer >= 1000 / g_nDiff) {
  342.             nTimer = GetTickCount();
  343.             if (!obj->collide(0, 1))
  344.                 obj->changepos(0, 1);
  345.             else {
  346.                 Check();
  347.                 bCreateNew = FALSE;
  348.             }
  349.         }
  350.         if (GetTickCount() - LastKeyDownTime >= 100) {
  351.             if(FALSE == isChecking) {
  352.                 LastKeyDownTime = GetTickCount();
  353.                 if (GetAsyncKeyState(VK_UP)) {
  354.                     obj->rotate();
  355.                 }
  356.                 if (GetAsyncKeyState(VK_LEFT)) {
  357.                     obj->changepos(-1, 0);
  358.                 }
  359.                 if (GetAsyncKeyState(VK_RIGHT)) {
  360.                     obj->changepos(1, 0);
  361.                 }
  362.                 if (GetAsyncKeyState(VK_DOWN)) {
  363.                     if( FALSE == obj->changepos(0, 2) )
  364.                         obj->changepos(0, 1);
  365.                 }
  366.             }
  367.         }
  368.     }
  369.     SetCursor(8, 10);
  370.     printf("Game Over");

  371.     SetCursor(0, GameH+3);
  372.     printf("按ESC鍵退出游戲");

  373.     while(1) {
  374.         if (GetAsyncKeyState(VK_ESCAPE))
  375.             break;
  376.     }
  377.     return 0;
  378. }
復制代碼



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美日韩国产精品一区二区 | 337p日本欧洲亚洲大胆鲁鲁 | 欧美簧片 | 久久成人高清视频 | 91精品国产综合久久久久 | 日韩黄色av | 亚洲日韩中文字幕一区 | 国产精品视频观看 | 91aiai| 女同久久另类99精品国产 | 免费日韩av网站 | 国产成人一区二区 | 美女国产一区 | 国产在线精品免费 | 欧美毛片免费观看 | 欧美中文字幕一区二区三区亚洲 | 国产免费麻豆视频 | 久久综合国产精品 | 欧美日韩综合精品 | 精品国产乱码久久久久久图片 | 欧美精品在线免费观看 | 蜜桃视频一区二区三区 | 亚洲免费在线 | 亚洲一区二区高清 | 黄毛片| 男插女下体视频 | 三级视频在线观看电影 | 毛片a区 | 密室大逃脱第六季大神版在线观看 | 亚洲成av| 亚洲一区二区三区免费在线观看 | 日韩成人在线观看 | 黑人久久 | 欧美日韩亚洲视频 | 欧美一区在线看 | 色精品 | 欧美黄色一级毛片 | 精品亚洲一区二区三区四区五区 | 欧美天堂在线 | 精久久久 | 97av视频在线观看 |