MFC 俄羅斯方塊

2021-07-10 12:14:40 字數 3961 閱讀 7704

(提取碼:a2a3)

一、定義了一些結構體和常量

// 每個俄羅斯方塊(block)由4個正方形(pston)組成,乙個正方形(pston)的定義如下:

typedef struct pston

ty_pston;

// 定義乙個俄羅斯方塊(block),包含了4個正方形pst,及顏色屬性color,距離左l與頂t的位置

typedef struct block

ty_block;

// 遊戲區域(gamepst)的座標(ps)是否有方塊(bset)

typedef struct gamepst

ty_gamepst;

// 隨機顏色

#define color_rand rgb(rand()%256, rand() % 256, rand() % 256)

// 俄羅斯方塊(block)的種類(pst_kind)有7種,每種有4個正方形(pston)

const ty_pston pst_kind[7][4] = , , , },

,,, },

,,, },

,,, },

,,, },

,,, },

,,, },

};// 俄羅斯方塊的移動方向(direction)

enum direction ;

// 每個正方形(pston)的寬度

const int pst_width = 24;

// 遊戲區域相對於左邊與上邊的距離

const int game_side_left = 10;

const int game_side_top = 10;

二、俄羅斯方塊標頭檔案和cpp

#pragma once

class cstone

;

------------

#include "stdafx.h"

#include "stone.h"

#include #include #include #include "tetrisdlg.h"

cstone::cstone()

}; // 初始化分數

score = 0;

}cstone::~cstone()

// 生成乙個俄羅斯方塊

void cstone::makeblock(ty_block& block)

// 繪製介面

void cstone::drawblock()

// 繪製遊戲區的底部正方形

for (int i = 0; i < 18;++i)

}} // 將緩衝區的點陣圖顯示在遊戲區

p_dc->bitblt(game_side_left, game_side_top, 10 * pst_width, 18 * pst_width, &mdc, 0, 0, srccopy);

mdc.deletedc();

// 獲取相容的繪圖裝置

cdc premdc;

premdc.createcompatibledc(p_dc);

// 繪製預覽區的俄羅斯方塊

cbitmap bmp_precpb;

bmp_precpb.createcompatiblebitmap(p_dc, 6 * pst_width, 18 * pst_width);

// 載入位圖

premdc.selectobject(&bmp_precpb);

// 填充背景色為白色

premdc.fillsolidrect(crect(0, 0, 6 * pst_width, 18 * pst_width), rgb(255, 255, 255));

for (int b = 0; b < 4; ++b)

// 繪製遊戲得分情況

cstring curscore;

curscore.format(_t("score:%d"), score);

premdc.textout(2*pst_width, 300, curscore);

// 將緩衝區的點陣圖顯示在預覽區

p_dc->bitblt((10+1)*pst_width +game_side_left, game_side_top, (10+1+6) * pst_width, 18 * pst_width, &premdc, 0, 0, srccopy);

premdc.deletedc();

p_dc->deletedc();

}// 獲取俄羅斯方塊中的正方形區域

crect cstone::getpstrect(pston pst)

return crect(

(pst.col+m_block.l)*pst_width,

(pst.row+m_block.t)*pst_width,

(pst.col + m_block.l+1) *pst_width,

(pst.row + m_block.t+1) *pst_width

);}// 獲取遊戲區域中的每個正方形的區域

crect cstone::getgamepstrect(pston pst)

// 獲取預覽區的俄羅斯方塊的區域

crect cstone::getprepstrect(pston pst)

// 變形

void cstone::alterblock()

; for (ty_pston &ps : tempcopy.pst)

if (canmove(tempcopy))

}// 移動

void cstone::moveto(int to)

} else }}

// 判斷能否移動

bool cstone::canmove(ty_block block)

int colmax = *std::max_element(vcol.begin(), vcol.end());

int colmin = *std::min_element(vcol.begin(), vcol.end());

int rowmax = *std::max_element(vrow.begin(),vrow.end());

return (colmin + block.l) >= 0 && (colmax + block.l) < 10 && (rowmax + block.t) < 18;

}// 重新生成俄羅斯方塊

void cstone::remakeblock()

auto isfull = [=](int row) ;

for (int i=0; i < 18; )

}score += 100;

continue;

} ++i;

} m_block = m_preblock;

makeblock(m_preblock);

istop();

}bool cstone::istop()

--m_block.t;

return 0;

}

三、對話方塊

void ctetrisdlg::onpaint()

else

}bool ctetrisdlg::pretranslatemessage(msg* pmsg)

switch (pmsg->wparam)

m_stone->drawblock();

return true;

} return cdialog::pretranslatemessage(pmsg);

}void ctetrisdlg::ontimer(uint_ptr nidevent)

default:

break;

} m_stone->drawblock();

cdialog::ontimer(nidevent);

}

mfc筆記 俄羅斯方塊

一年前剛學完 c就很想寫俄羅斯方塊。自己看了點 windows 程式設計的書。但是因為沒有學 c 對 class 完全沒有概念。隨便乙個 point 的物件就可以搞到頭暈都沒懂。現在寫完 painter 來寫俄羅斯方塊頓覺清晰很多。1 將乙個字串寫到螢幕指定位置。bool textout hdchd...

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

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

俄羅斯方塊

俄羅斯方塊 tetris,俄文 是一款風靡全球的電視遊戲機 和掌上遊戲機遊戲,它由俄羅斯人阿列克謝 帕基特諾夫 發明,故得此名。俄羅斯方塊的基本規則是移動 旋轉和擺放遊戲自動輸出的各種方塊,使之排列成完整的一行或多行並且消除得分。由於上手簡單 老少皆宜,從而家喻戶曉,風靡世界。俄羅斯方塊的開發者是阿...