找回密碼 或 安全提問
 註冊
|註冊|登錄

伊莉討論區

搜索
感激所有對伊莉作出奉獻的人儲值後自動升級用戶組你準備好成為出色的版主了嗎?
fc2ge出包王女人妖柯南按摩
wmv@無碼美少女萬小川美同僚の恋劍星milfs pl

休閒聊天興趣交流學術文化旅遊交流飲食交流家庭事務PC GAMETV GAME
熱門線上其他線上感情感性寵物交流家族門派動漫交流貼圖分享BL/GL
音樂世界影視娛樂女性頻道潮流資訊BT下載區GB下載區下載分享短片
電腦資訊數碼產品手機交流交易廣場網站事務長篇小說體育運動時事經濟
上班一族博彩娛樂

✡ 斗破蒼穹 年番/鬥

(4月新番)[繁]狼與辛

[超清繁中]霹靂英雄戰

✡ 斗破蒼穹 年番/鬥

(4月新番)[繁]為美好

(4月新番)[簡]怪異與
C & C++ 語言C# 語言Visual Basic 語言PHP 語言JAVA 語言
查看: 41592|回復: 48
打印上一主題下一主題

簡易俄羅斯方塊[複製鏈接]

Rank: 3Rank: 3Rank: 3

帖子
1061
積分
1327 點
潛水值
4415 米
跳轉到指定樓層
樓主
發表於 2008-7-28 08:10 AM|只看該作者|倒序瀏覽
簡易俄羅斯方塊。
可調整 delay_time 與 flexible_time 修改遊戲速度。
共 10 級,每 200 分升一級,一次消越多磚塊得越多分。
  1. #include <windows.h>
  2. #include <iostream>
  3. #include <stdio.h>
  4. #include <conio.h>
  5. #include <time.h>
  6. using namespace std ;
  7. #define set_color(c) SetConsoleTextAttribute(hOut,c)

  8. enum {H=23, W=14, nBlock=7};                //畫面長寬, 方塊數目
  9. HANDLE hIn, hOut;                           //I/O 控制器
  10. bool   bExit = false;                       //是否持續遊戲
  11. int    level=0, score=0;                    //關卡, 積分
  12. int    ox=4, oy=1;                          //畫面左上原點
  13. int    B, N;                                //當前&下一個 方塊的編號
  14. int    X, Y, dir=0;                         //方塊位置, 所處方位(0~3)
  15. int    delay_time = 20;                     //延遲時間
  16. int    flexible_time = 20;                  //加速按鍵控制的程度
  17. char   room[W][H];                          //畫面
  18. int    block[nBlock][4] =                   //方塊樣式
  19.        {{0x6220,0x1700,0x2230,0x0740},      // L
  20.         {0x6440,0x0e20,0x44c0,0x8e00},      // _|
  21.         {0x04e0,0x0464,0x00e4,0x04c4},      // T
  22.         {0x4620,0x6c00,0x4620,0x6c00},      // z
  23.         {0x2640,0xc600,0x2640,0xc600},      // 反z
  24.         {0x0f00,0x4444,0x0f00,0x4444},      // |
  25.         {0x0660,0x0660,0x0660,0x0660}};     // 田

  26. void gotoxy (int x, int y)
  27. {
  28.     static COORD c; c.X = x; c.Y = y;
  29.     SetConsoleCursorPosition (hOut, c);
  30. }
  31. void draw (int x, int y, char* s) {gotoxy (x*2,y); cout<<s;}
  32. void over (int x, int y, char* s) {draw(x,y,s);getch();exit(1);}

  33. bool bMove_block (int bx, int by, int d)        //傳入新位置與旋轉方向
  34. {                                               //檢驗方塊能否變動     
  35.     for (int p = 0x8000, x, y=0; y<4; y++)
  36.         for (x=0; x<4; x++, p>>=1)
  37.             if ((block[B][d]&p) && room[bx+x-ox][by+y-oy])
  38.                 return false;
  39.     return true;
  40. }

  41. void show_next_block (char* s)
  42. {
  43.     set_color (N+7);                            //設定顯示色
  44.     int x, y, p = 0x8000;
  45.     for (y=0; y<4; y++)
  46.         for (x=0; x<4; x++, p>>=1)
  47.             if (block[N][0] & p) draw (ox+W+2+x, 2+y, s);
  48. }
  49. void show_block (char* s)
  50. {
  51.     set_color (B+7);                            //設定顯示色
  52.     int x, y, p = 0x8000;
  53.     for (y=0; y<4; y++)
  54.         for (x=0; x<4; x++, p>>=1)
  55.             if (block[B][dir] & p) draw (x+X, y+Y, s);
  56. }
  57. void show_room()
  58. {
  59.     for (int x,y=0; y<H; y++)
  60.         for (x=0; x<W; x++)
  61.             if (room[x][y]) {
  62.                 set_color (room[x][y]);
  63.                 draw (ox+x, oy+y, "█");
  64.             }else draw (ox+x, oy+y, "  ");
  65. }

  66. void try_move_block (int x, int y, int d)       //嘗試移動
  67. {
  68.     if (!bMove_block (x,y,d)) return;
  69.     show_block ("  "); X = x; Y = y; dir = d;
  70.     show_block ("█");
  71. }

  72. int remove_lines()
  73. {
  74.     int x, y, i,j, line=0;
  75.     for (y=1; y<H-1; y++) {
  76.         for (x=1; x<W-1; x++)
  77.             if (!room[x][y]) break;
  78.         if (x==W-1) {
  79.             line++;
  80.             for (i=1; i<W-1; i++) room[i][0] = 0;
  81.             for (i=y; i>1; i--)
  82.                 for (j=1; j<W-1; j++)
  83.                     room[j][i] = room[j][i-1];
  84.             show_room ();
  85.         }        
  86.     }return line;
  87. }

  88. void move_block()
  89. {
  90.     if (bMove_block (X,Y+1,dir)) {try_move_block (X,Y+1,dir); return;}
  91.     if (Y==0) over (ox+2, H/2, "G a m e    O v e r");
  92.          
  93.     for (int p = 0x8000, x, y=0; y<4; y++)
  94.         for (x=0; x<4; x++, p>>=1)
  95.             if (block[B][dir] & p)
  96.                 room[X+x-ox][Y+y-oy] = B+7;

  97.     int n = remove_lines();
  98.     level = (score+=(1+n*n)*4)/200;
  99.     delay_time = 10-level;
  100.     if (level > 10) over (ox+4, H/2, "Y o u    W i n");
  101.    
  102.     show_next_block ("  ");
  103.     B = N; X = ox+W/2-1; Y = 0;
  104.     N = rand() % nBlock;
  105.     show_next_block ("█");      
  106. }

  107. void init()                                     //初始配置
  108. {
  109.     srand (time(0));
  110.     hOut = GetStdHandle (STD_OUTPUT_HANDLE);
  111.     hIn  = GetStdHandle (STD_INPUT_HANDLE);
  112.     HANDLE err = INVALID_HANDLE_VALUE;
  113.     if (hIn == err || hOut == err) {
  114.         puts ("handle failed"); getch (); exit (1);
  115.     }   
  116.     for (int x=0; x<W; x++) room[x][H-1] = 4;  
  117.     for (int y=0; y<H; y++) room[0][y] = room[W-1][y] = 4;
  118.    
  119.     B = rand() % nBlock;
  120.     N = rand() % nBlock;
  121.     X = ox+W/2-1;
  122.     Y = 0;
  123.     show_room();   
  124.     show_next_block ("█");
  125. }

  126. void key_control()                              //按鍵控制
  127. {
  128.     static DWORD count;
  129.     static INPUT_RECORD ir;   
  130.     ReadConsoleInput (hIn, &ir, 1, &count);
  131.     if (!ir.Event.KeyEvent.bKeyDown) return;                       
  132.    
  133.     switch (ir.Event.KeyEvent.wVirtualKeyCode) {                    
  134.         case VK_ESCAPE: bExit = true; break;
  135.         case VK_DOWN : try_move_block (X,Y+1,dir); break;
  136.         case VK_LEFT : try_move_block (X-1,Y,dir); break;
  137.         case VK_RIGHT: try_move_block (X+1,Y,dir); break;
  138.         case VK_UP   : try_move_block (X,Y,(dir+1)&3); break;
  139.     }        
  140. }

  141. void main ()                                    //主程式
  142. {
  143.     int i; init();
  144.     while (!bExit)
  145.     {     
  146.         for (i=0; i<flexible_time; i++) {       //加速按鍵處理      
  147.             if (kbhit()) key_control();
  148.             Sleep (delay_time);
  149.         }         
  150.         move_block ();         
  151.         set_color (14);
  152.         gotoxy (ox+W*2+8, 10); cout<< "Level: "<<level+1;
  153.         gotoxy (ox+W*2+8, 12); cout<< "Score: "<<score;
  154.     }
  155. }
複製代碼

這是黑白圖執行結果:

█                        █
█                        █
█                        █    ████
█                        █
█                        █
█                        █
█                        █
█                        █
█                        █
█                        █    Level: 1
█                        █
█                        █    Score: 36
█                        █
█                        █
█                        █
█                        █
█                        █
█                █      █
█      █      ███    █
█      ██    ███    █
██    ██    ████  █
██  ███████████
██████████████
...
瀏覽完整內容,請先 註冊登入會員

點評

orcinusorca 讚喔~  發表於 2012-6-17 01:40 AM
分享分享0收藏收藏1支持支持2

使用道具檢舉

Rank: 2Rank: 2

帖子
59
積分
205 點
潛水值
13028 米
頭香
發表於 2008-7-28 12:30 PM|只看該作者
真有趣東西

最近暑假無聊 也在些俄羅斯方塊

不過時間的控制 和 windows的函式都不太會用

這個讓我學到很多 真是感謝阿!

使用道具檢舉

Rank: 1

帖子
23
積分
126 點
潛水值
10514 米
3
發表於 2008-8-21 01:11 AM|只看該作者
若對尊貴或贊助會員有任何疑問,歡迎向我們查詢。我們的即時通或MSN: admin@eyny.com
天啊....166行就寫出來的,我寫了三百多行還沒寫出來....努力中

使用道具檢舉

帖子
32
積分
0 點
潛水值
2000 米
4
發表於 2008-8-26 12:27 PM|只看該作者
所有積分大於負-100的壞孩子,將可獲得重新機會成為懲罰生,權限跟幼兒生一樣。
void main ()                                    //主程式
{
    int i; init();
    while (!bExit)

這邊第二行是不是有錯阿?我用程式跑他出現一條紅色有錯誤的樣子
所有積分大於負-100的壞孩子,將可獲得重新機會成為懲罰生,權限跟幼兒生一樣。

使用道具檢舉

Rank: 2Rank: 2

帖子
1656
積分
290 點
潛水值
18342 米
5
發表於 2008-8-26 08:19 PM|只看該作者

daviddr....你好利害喔

daviddr....你好利害喔.....




如果你忘記伊莉的密碼,請在登入時按右邊出現的 '找回密碼'。輸入相關資料後送出,系統就會把密碼寄到你的E-Mail。

使用道具檢舉

Rank: 2Rank: 2

帖子
517
積分
341 點
潛水值
15724 米
6
發表於 2008-8-30 11:52 AM|只看該作者
若新密碼無法使用,可能是數據未更新。請使用舊密碼看看。
怎麼編譯不出來

一直說有錯誤
如果你忘記伊莉的密碼,請在登入時按右邊出現的 '找回密碼'。輸入相關資料後送出,系統就會把密碼寄到你的E-Mail。

使用道具檢舉

Rank: 3Rank: 3Rank: 3

帖子
1061
積分
1327 點
潛水值
4415 米
7
發表於 2008-8-30 12:58 PM|只看該作者
回覆中加入附件並不會使你增加積分,請使用主題方式發佈附件。
> 怎麼編譯不出來 一直說有錯誤
若非用 VC++,void main 要改成 int main 才正確。
若有其他錯誤,可將錯誤訊息貼上來,以便修正。
如果瀏覽伊莉時速度太慢或無法連接,可以使用其他分流瀏覽伊莉,www01.eyny.com(02,03)。

使用道具檢舉

Rank: 5Rank: 5Rank: 5Rank: 5Rank: 5

帖子
2979
積分
12825 點
潛水值
41478 米
8
發表於 2008-8-30 11:44 PM|只看該作者
若有安裝色情守門員,可用無界、自由門等軟件瀏覽伊莉。或使用以下網址瀏覽伊莉: http://www.eyny.com:81/index.php

回復 #7 daviddr 的帖子

其實我有編過…

重點是 for(int i=0;....)

第二個 for(int i=0; ....) 說是重復宣告

我想是 complier 的問題吧
如果我說,灌了二頁的水是因為lag / 系統不穩,
我想應該也不會有人相信吧..
若對尊貴或贊助會員有任何疑問,歡迎向我們查詢。我們的即時通或MSN: admin@eyny.com

使用道具檢舉

Rank: 3Rank: 3Rank: 3

帖子
1061
積分
1327 點
潛水值
4415 米
9
發表於 2008-8-31 01:23 PM|只看該作者

回復 #8 goodbye_mylove 的帖子

唔.. 我用 Dev C++ 和 VC8 測試,沒找到 for 重復宣告處,
是否為別的程式呢?

這隻程式有個移植性問題,因為用到了非標準函式 getch()...
大部分 gcc 版本無 conio.h,故無法編譯,
須將 conio.h 改為 curses.h,並在程式初始化時執行 initscr(),
用 raw() 關閉 line buffer,用 noecho() 關閉鍵盤回應。

非標準的原因是:他不符合 console 設計原則
(也就是:須等到按下enter鍵時,程式才由鍵盤緩衝區讀取字元) ,
...
瀏覽完整內容,請先 註冊登入會員
若新密碼無法使用,可能是數據未更新。請使用舊密碼看看。

使用道具檢舉

Rank: 5Rank: 5Rank: 5Rank: 5Rank: 5

帖子
2979
積分
12825 點
潛水值
41478 米
10
發表於 2008-8-31 08:02 PM|只看該作者
所有積分大於負-100的壞孩子,將可獲得重新機會成為懲罰生,權限跟幼兒生一樣。

回復 #9 daviddr 的帖子

sorry....
我記到 "貪食蛇" 那裡去了
這個程式於 VC6.0 的確也是正確無誤
( 如果也是正常 new 一個 Win32 console application 的話...)




如果我說,灌了二頁的水是因為lag / 系統不穩,
我想應該也不會有人相信吧..

使用道具檢舉

miceiiaa 該用戶已被刪除
11
發表於 2009-1-16 05:21 PM|只看該作者
若瀏覽伊莉的時侯發生問題或不正常情況,請使用Internet Explorer(I.E)。
出現下面的訊息@@

編譯器: Default compiler
編譯器: Default compiler
執行檔案 '' g++.exe...''
g++.exe "C:\WBin Project\Dev\魔術方塊.cpp" -o "C:\WBin Project\Dev\魔術方塊.exe"    -I"C:\Dev-Cpp\lib\gcc\mingw32\3.4.2\include"  -I"C:\Dev-Cpp\include\c++\3.4.2\backward"  -I"C:\Dev-Cpp\include\c++\3.4.2\mingw32"  -I"C:\Dev-Cpp\include\c++\3.4.2"  -I"C:\Dev-Cpp\include"  -I"C:\Dev-Cpp\SDL-1.2.13\include\SDL"   -L"C:\Dev-Cpp\lib" -L"C:\Dev-Cpp\SDL-1.2.13\lib" -lmingw32 -lSDLmain -lSDL
...
瀏覽完整內容,請先 註冊登入會員
如果發覺自己無法使用一些功能或出現問題,請按重新整理一次,並待所有網頁內容完全載入後5秒才進行操作。

使用道具檢舉

Rank: 3Rank: 3Rank: 3

帖子
1061
積分
1327 點
潛水值
4415 米
12
發表於 2009-1-16 10:10 PM|只看該作者
若對尊貴或贊助會員有任何疑問,歡迎向我們查詢。我們的即時通或MSN: admin@eyny.com
本帖最後由 daviddr 於 2009-1-16 10:17 PM 編輯

論壇「升級」後,不但程式板塊變得醜,
而且把程式碼中的 & 抹掉了,
(複製到剪貼版時,非 IE browser 也會有問題)
你在 p 前加個 & 就可編譯過。

error 132 也是一樣,ir 前的 & 被轉掉了,
要改回 ReadConsoleInput (hIn, &ir, 1, &count);

至於 error 144 就照上面的討論去改。
...
瀏覽完整內容,請先 註冊登入會員

使用道具檢舉

帖子
215
積分
0 點
潛水值
4037 米
13
發表於 2009-1-29 11:36 PM|只看該作者
回覆中加入附件並不會使你增加積分,請使用主題方式發佈附件。
終於 ok 了 很好玩的 那個貪食蛇 怎麼不見了呢 ?

使用道具檢舉

Rank: 1

帖子
491
積分
133 點
潛水值
11900 米
14
發表於 2009-1-30 12:38 AM|只看該作者
成為伊莉的版主,你將獲得更高級和無限的權限。把你感興趣的版面一步步地發展和豐盛,那種滿足感等著你來嚐嚐喔。
多謝分享
大大真厲害
我也來寫寫看XD
成為伊莉的版主,你將獲得更高級和無限的權限。把你感興趣的版面一步步地發展和豐盛,那種滿足感等著你來嚐嚐喔。

使用道具檢舉

ak56g 該用戶已被刪除
15
發表於 2009-2-11 09:20 AM|只看該作者
如果你忘記伊莉的密碼,請在登入時按右邊出現的 '找回密碼'。輸入相關資料後送出,系統就會把密碼寄到你的E-Mail。
請問要用什麼軟體compile?謝謝!




若對尊貴或贊助會員有任何疑問,歡迎向我們查詢。我們的即時通或MSN: admin@eyny.com

使用道具檢舉

您需要登錄後才可以回帖 登錄 | 註冊

Powered by Discuz!

© Comsenz Inc.

重要聲明:本討論區是以即時上載留言的方式運作,對所有留言的真實性、完整性及立場等,不負任何法律責任。而一切留言之言論只代表留言者個人意見,並非本網站之立場,用戶不應信賴內容,並應自行判斷內容之真實性。於有關情形下,用戶應尋求專業意見(如涉及醫療、法律或投資等問題)。 由於本討論區受到「即時上載留言」運作方式所規限,故不能完全監察所有留言,若讀者發現有留言出現問題,請聯絡我們。有權刪除任何留言及拒絕任何人士上載留言,同時亦有不刪除留言的權利。切勿上傳和撰寫 侵犯版權(未經授權)、粗言穢語、誹謗、渲染色情暴力或人身攻擊的言論,敬請自律。本網站保留一切法律權利。
回頂部