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