大二上學期前兩周的課程設計寫(更多的是借鑑)了乙個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 ...