俄羅斯方塊遊戲

2021-07-22 16:32:13 字數 4389 閱讀 4401

大二上學期前兩周的課程設計寫(更多的是借鑑)了乙個500多行的俄羅斯方塊遊戲,畢竟也是花了兩天時間把被人的看懂,然後花了兩天多的時間敲出來,又花了兩天時間寫了4000多字的專案報告,所有有必要在部落格中寫下來以留作紀念。

struct block

blocks[7] = , //

i , // 口

, //

l , // 反l

, //

z , // 反z

// t

};

用十六進製制數轉化為16位的二進位制數,在將16位的二進位制看成4*4的矩陣,1構成的圖形即方塊的形狀。上面的**表示7中形狀的方塊,每個方塊有4中旋轉狀態和一種顏色。

for(i = 0; i < 16; i++, b <<= 1)

}

上面的**將十六進製制代表的4*4矩陣中1所在的位置計算出來,傳送給drawunit函式,drawunit函式將所有的1畫出了,就形成了完整的方塊。

if (b & 0x8000) b(十六進製制數)和0x8000做與運算是為了測試最高位是否為1。每一次都是取b的最高一位來判斷(b & 0x8000,這是位且,遮蔽了低位)。然後再用b <<= 1; 把次高位移到最高位。

源**(在vc++6.0中可執行,需要用到easyx圖形庫):

#include 

#include

#include

#include

//////

//////

//////

//////

//////

//////

//////

////////

//定義常量、全域性變數、結構體、列舉

//////

//////

//////

//////

//////

//////

//////

////////

#define wid 10 //寬為10個單元

#define hig 20 //高為20個單元

#define unit 30 //單元方塊的大小

struct block

blocks[7] = , // 1

, // 口

, // l

, // 反l

, // z

, // 反z

// t

};

// 定義當前方塊、下乙個方塊的資訊

struct blockid

nowblock, nextblock;

enum cmd

;//時間變數

long

int old_time, new_time;

//固定方塊區

char fixblock[wid][hig] = ;

//分數

int score;

//////

//////

//////

//////

//////

//////

//////

////////

//函式宣告

//////

//////

//////

//////

//////

//////

//////

////////

void init();

void newgame();

void creatblock();

void drawblock(blockid block);

void drawunit(int x, int y, colorref color);

void clearblock(blockid block);

void clearunit(int x, int y, colorref color = black);

cmd getcommand();

void sendcommand(cmd cmd);

void go_down();

void go_left();

void go_right();

void go_sink();

void go_rotate();

bool checkblock(blockid temp);

void gameover();

void quit();

//建立遊戲視窗

void init()

//開始新遊戲

void newgame()

void creatblock()

//畫方塊

void drawblock(blockid block)}/*

和0x8000做與運算是為了測試最高位是否為1.

b左移一位的意義在與,b這個值以二進位制來看,是否還有某位為1.

把每個俄羅斯圖形都看成是乙個4x4的矩陣,

可以在紙上畫個4x4的方塊圖,

從左邊第一列,從上往下開始,依次開始編碼,

如果某個塊對應俄羅斯圖為實心塊,編碼時為1,否則為0.

從for(int i=0; i<16; i++)可以看出,要畫16次。

每一次都是取b的最高一位來判斷(b & 0x8000,這是位且,遮蔽了低位)。

畫完後再用b <<= 1; 把次高位移到最高位。

*/}void clearblock(blockid block)

}}void drawunit(int x, int y, colorref color)

void clearunit(int x, int y, colorref color)

cmd getcommand()

// 如果有按鍵,返回按鍵對應的功能

if (kbhit())}}

}void sendcommand(cmd cmd)

}void go_down()

else

go_sink(); //不能下移時,執行沉澱操作

}void go_left()

}void go_right()

}//沉澱、消行

void go_sink()

drawblock(nowblock);

//固定方塊

int b = blocks[nowblock.id].dir[nowblock.dir];

for (i = 0; i < 16; i++, b = b << 1)

else

fixblock[x][y] = 1;}}

//4位用來標記方塊涉及的 4 行是否有消除行為

char remove = 0; //標記是否要消掉行

for (y = nowblock.y; y >= 0; y--)

if (n == wid)

}if(m != 0)

if (remove)

//呼叫getimage()儲存螢幕影象

getimage(&img, 0, 0, wid * unit, (hig - (nowblock.y - i + 1)) * unit);

//用函式putimage()輸出getimage()儲存的螢幕影象。

putimage(0, unit, &img);}}

}creatblock();

}void go_rotate()

temp.x = nowblock.x - 1;

if (checkblock(temp))

temp.x = nowblock.x + 1;

if (checkblock(temp))

temp.x = nowblock.x - 2;

if (checkblock(temp))

temp.x = nowblock.x + 2;

if (checkblock(temp))

return;

rotate:

// 旋轉

clearblock(nowblock);

nowblock.dir++;

nowblock.x += dx;

drawblock(nowblock);

}bool checkblock(blockid temp)

}return

true;

}// 結束遊戲

void gameover()

// 退出遊戲

void quit()

//主函式

int main(void)

getch();

closegraph();

return

0;}

參考**:

俄羅斯方塊高階 AI俄羅斯方塊

前文回顧 致青春 python實現俄羅斯方塊 人工智慧大火的今天,如果還是自己玩俄羅斯方塊未免顯得太low,為什麼不對遊戲公升級,讓機器自己去玩俄羅斯方塊呢?有了這個想法之後利用週六週日兩天的時間去蒐集了大量的資料,在電腦宕機好多次之後終於將ai俄羅斯方塊實現了。所謂讓機器自己去玩俄羅斯方塊,就是讓...

C 俄羅斯方塊遊戲

俄羅斯方塊是一款非常經典的老遊戲,相比現在的網路遊戲和大型遊戲而言,俄羅斯方塊非常小。不要看似小,要實現俄羅斯方塊的全部功能也不容易。先說說涉及的知識點 繼承 不同的方塊繼承於方塊類 多型 每種方塊都可以旋轉 初始化,但是每種方塊的旋轉都不一樣,採用抽象方法定義 簡單工廠設計模式 由工廠隨機建立方塊...

Canvas 遊戲 俄羅斯方塊

我第三個動畫遊戲終於可以玩了,demo 由於 wikipedia 的素材很像磚塊,我 裡就把 tetromino 稱為了磚塊 brick 整個拼板稱為牆面 wall 分別對應了遊戲中玩家控制目標和地圖。變形首先觀察 j 形狀轉置 t 和旋轉 r 的圖形,零表示空心部位,非零實心部位 j 1,0,0 ...