C語(yǔ)言中沒(méi)有類這個(gè)概念的。
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)建站!專注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、微信小程序定制開發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了偃師免費(fèi)建站歡迎大家使用!
不太明白啟動(dòng)是什么意思。
這個(gè)類中含有純虛函數(shù),屬于抽象類,只能通過(guò)具體子類對(duì)象來(lái)完成相關(guān)操作,可以使用Rtpart指針。
#include graphics.h
#include conio.h
#include time.h
/////////////////////////////////////////////
// 定義常量、枚舉量、結(jié)構(gòu)體、全局變量
/////////////////////////////////////////////
#define WIDTH 10 // 游戲區(qū)寬度
#define HEIGHT 22 // 游戲區(qū)高度
#define SIZE 20 // 每個(gè)游戲區(qū)單位的實(shí)際像素
// 定義操作類型
enum CMD
{
CMD_ROTATE, // 方塊旋轉(zhuǎn)
CMD_LEFT, CMD_RIGHT, CMD_DOWN, // 方塊左、右、下移動(dòng)
CMD_SINK, // 方塊沉底
CMD_QUIT // 退出游戲
};
// 定義繪制方塊的方法
enum DRAW
{
SHOW, // 顯示方塊
HIDE, // 隱藏方塊
FIX // 固定方塊
};
// 定義七種俄羅斯方塊
struct BLOCK
{
WORD dir[4]; // 方塊的四個(gè)旋轉(zhuǎn)狀態(tài)
COLORREF color; // 方塊的顏色
} g_Blocks[7] = { {0x0F00, 0x4444, 0x0F00, 0x4444, RED}, // I
{0x0660, 0x0660, 0x0660, 0x0660, BLUE}, // 口
{0x4460, 0x02E0, 0x0622, 0x0740, MAGENTA}, // L
{0x2260, 0x0E20, 0x0644, 0x0470, YELLOW}, // 反L
{0x0C60, 0x2640, 0x0C60, 0x2640, CYAN}, // Z
{0x0360, 0x4620, 0x0360, 0x4620, GREEN}, // 反Z
{0x4E00, 0x4C40, 0x0E40, 0x4640, BROWN}}; // T
// 定義當(dāng)前方塊、下一個(gè)方塊的信息
struct BLOCKINFO
{
byte id; // 方塊 ID
char x, y; // 方塊在游戲區(qū)中的坐標(biāo)
byte dir:2; // 方向
} g_CurBlock, g_NextBlock;
// 定義游戲區(qū)
BYTE g_World[WIDTH][HEIGHT] = {0};
/////////////////////////////////////////////
// 函數(shù)聲明
/////////////////////////////////////////////
void Init(); // 初始化游戲
void Quit(); // 退出游戲
void NewGame(); // 開始新游戲
void GameOver(); // 結(jié)束游戲
CMD GetCmd(); // 獲取控制命令
void DispatchCmd(CMD _cmd); // 分發(fā)控制命令
void NewBlock(); // 生成新的方塊
bool CheckBlock(BLOCKINFO _block); // 檢測(cè)指定方塊是否可以放下
void DrawBlock(BLOCKINFO _block, DRAW _draw = SHOW); // 畫方塊
void OnRotate(); // 旋轉(zhuǎn)方塊
void OnLeft(); // 左移方塊
void OnRight(); // 右移方塊
void OnDown(); // 下移方塊
void OnSink(); // 沉底方塊
/////////////////////////////////////////////
// 函數(shù)定義
/////////////////////////////////////////////
// 主函數(shù)
void main()
{
Init();
CMD c;
while(true)
{
c = GetCmd();
DispatchCmd(c);
// 按退出時(shí),顯示對(duì)話框咨詢用戶是否退出
if (c == CMD_QUIT)
{
HWND wnd = GetHWnd();
if (MessageBox(wnd, _T("您要退出游戲嗎?"), _T("提醒"), MB_OKCANCEL | MB_ICONQUESTION) == IDOK)
Quit();
}
}
}
// 初始化游戲
void Init()
{
initgraph(640, 480);
srand((unsigned)time(NULL));
// 顯示操作說(shuō)明
setfont(14, 0, _T("宋體"));
outtextxy(20, 330, _T("操作說(shuō)明"));
outtextxy(20, 350, _T("上:旋轉(zhuǎn)"));
outtextxy(20, 370, _T("左:左移"));
outtextxy(20, 390, _T("右:右移"));
outtextxy(20, 410, _T("下:下移"));
outtextxy(20, 430, _T("空格:沉底"));
outtextxy(20, 450, _T("ESC:退出"));
// 設(shè)置坐標(biāo)原點(diǎn)
setorigin(220, 20);
// 繪制游戲區(qū)邊界
rectangle(-1, -1, WIDTH * SIZE, HEIGHT * SIZE);
rectangle((WIDTH + 1) * SIZE - 1, -1, (WIDTH + 5) * SIZE, 4 * SIZE);
// 開始新游戲
NewGame();
}
// 退出游戲
void Quit()
{
closegraph();
exit(0);
}
// 開始新游戲
void NewGame()
{
// 清空游戲區(qū)
setfillstyle(BLACK);
bar(0, 0, WIDTH * SIZE - 1, HEIGHT * SIZE - 1);
ZeroMemory(g_World, WIDTH * HEIGHT);
// 生成下一個(gè)方塊
g_NextBlock.id = rand() % 7;
g_NextBlock.dir = rand() % 4;
g_NextBlock.x = WIDTH + 1;
g_NextBlock.y = HEIGHT - 1;
// 獲取新方塊
NewBlock();
}
// 結(jié)束游戲
void GameOver()
{
HWND wnd = GetHWnd();
if (MessageBox(wnd, _T("游戲結(jié)束。\n您想重新來(lái)一局嗎?"), _T("游戲結(jié)束"), MB_YESNO | MB_ICONQUESTION) == IDYES)
NewGame();
else
Quit();
}
// 獲取控制命令
DWORD m_oldtime;
CMD GetCmd()
{
// 獲取控制值
while(true)
{
// 如果超時(shí),自動(dòng)下落一格
DWORD newtime = GetTickCount();
if (newtime - m_oldtime = 500)
{
m_oldtime = newtime;
return CMD_DOWN;
}
// 如果有按鍵,返回按鍵對(duì)應(yīng)的功能
if (kbhit())
{
switch(getch())
{
case 'w':
case 'W': return CMD_ROTATE;
case 'a':
case 'A': return CMD_LEFT;
case 'd':
case 'D': return CMD_RIGHT;
case 's':
case 'S': return CMD_DOWN;
case 27: return CMD_QUIT;
case ' ': return CMD_SINK;
case 0:
case 0xE0:
switch(getch())
{
case 72: return CMD_ROTATE;
case 75: return CMD_LEFT;
case 77: return CMD_RIGHT;
case 80: return CMD_DOWN;
}
}
}
// 延時(shí) (降低 CPU 占用率)
Sleep(20);
}
}
// 分發(fā)控制命令
void DispatchCmd(CMD _cmd)
{
switch(_cmd)
{
case CMD_ROTATE: OnRotate(); break;
case CMD_LEFT: OnLeft(); break;
case CMD_RIGHT: OnRight(); break;
case CMD_DOWN: OnDown(); break;
case CMD_SINK: OnSink(); break;
case CMD_QUIT: break;
}
}
// 生成新的方塊
void NewBlock()
{
g_CurBlock.id = g_NextBlock.id, g_NextBlock.id = rand() % 7;
g_CurBlock.dir = g_NextBlock.dir, g_NextBlock.dir = rand() % 4;
g_CurBlock.x = (WIDTH - 4) / 2;
g_CurBlock.y = HEIGHT + 2;
// 下移新方塊直到有局部顯示
WORD c = g_Blocks[g_CurBlock.id].dir[g_CurBlock.dir];
while((c 0xF) == 0)
{
g_CurBlock.y--;
c = 4;
}
// 繪制新方塊
DrawBlock(g_CurBlock);
// 繪制下一個(gè)方塊
setfillstyle(BLACK);
bar((WIDTH + 1) * SIZE, 0, (WIDTH + 5) * SIZE - 1, 4 * SIZE - 1);
DrawBlock(g_NextBlock);
// 設(shè)置計(jì)時(shí)器,用于判斷自動(dòng)下落
m_oldtime = GetTickCount();
}
// 畫方塊
void DrawBlock(BLOCKINFO _block, DRAW _draw)
{
WORD b = g_Blocks[_block.id].dir[_block.dir];
int x, y;
int color = BLACK;
switch(_draw)
{
case SHOW: color = g_Blocks[_block.id].color; break;
case HIDE: color = BLACK; break;
case FIX: color = g_Blocks[_block.id].color / 3; break;
}
setfillstyle(color);
for(int i=0; i16; i++)
{
if (b 0x8000)
{
x = _block.x + i % 4;
y = _block.y - i / 4;
if (y HEIGHT)
{
if (_draw != HIDE)
bar3d(x * SIZE + 2, (HEIGHT - y - 1) * SIZE + 2, (x + 1) * SIZE - 4, (HEIGHT - y) * SIZE - 4, 3, true);
else
bar(x * SIZE, (HEIGHT - y - 1) * SIZE, (x + 1) * SIZE - 1, (HEIGHT - y) * SIZE - 1);
}
}
b = 1;
}
}
// 檢測(cè)指定方塊是否可以放下
bool CheckBlock(BLOCKINFO _block)
{
WORD b = g_Blocks[_block.id].dir[_block.dir];
int x, y;
for(int i=0; i16; i++)
{
if (b 0x8000)
{
x = _block.x + i % 4;
y = _block.y - i / 4;
if ((x 0) || (x = WIDTH) || (y 0))
return false;
if ((y HEIGHT) (g_World[x][y]))
return false;
}
b = 1;
}
return true;
}
// 旋轉(zhuǎn)方塊
void OnRotate()
{
// 獲取可以旋轉(zhuǎn)的 x 偏移量
int dx;
BLOCKINFO tmp = g_CurBlock;
tmp.dir++; if (CheckBlock(tmp)) { dx = 0; goto rotate; }
tmp.x = g_CurBlock.x - 1; if (CheckBlock(tmp)) { dx = -1; goto rotate; }
tmp.x = g_CurBlock.x + 1; if (CheckBlock(tmp)) { dx = 1; goto rotate; }
tmp.x = g_CurBlock.x - 2; if (CheckBlock(tmp)) { dx = -2; goto rotate; }
tmp.x = g_CurBlock.x + 2; if (CheckBlock(tmp)) { dx = 2; goto rotate; }
return;
rotate:
// 旋轉(zhuǎn)
DrawBlock(g_CurBlock, HIDE);
g_CurBlock.dir++;
g_CurBlock.x += dx;
DrawBlock(g_CurBlock);
}
// 左移方塊
void OnLeft()
{
BLOCKINFO tmp = g_CurBlock;
tmp.x--;
if (CheckBlock(tmp))
{
DrawBlock(g_CurBlock, HIDE);
g_CurBlock.x--;
DrawBlock(g_CurBlock);
}
}
// 右移方塊
void OnRight()
{
BLOCKINFO tmp = g_CurBlock;
tmp.x++;
if (CheckBlock(tmp))
{
DrawBlock(g_CurBlock, HIDE);
g_CurBlock.x++;
DrawBlock(g_CurBlock);
}
}
// 下移方塊
void OnDown()
{
BLOCKINFO tmp = g_CurBlock;
tmp.y--;
if (CheckBlock(tmp))
{
DrawBlock(g_CurBlock, HIDE);
g_CurBlock.y--;
DrawBlock(g_CurBlock);
}
else
OnSink(); // 不可下移時(shí),執(zhí)行“沉底方塊”操作
}
// 沉底方塊
void OnSink()
{
int i, x, y;
// 連續(xù)下移方塊
DrawBlock(g_CurBlock, HIDE);
BLOCKINFO tmp = g_CurBlock;
tmp.y--;
while (CheckBlock(tmp))
{
g_CurBlock.y--;
tmp.y--;
}
DrawBlock(g_CurBlock, FIX);
// 固定方塊在游戲區(qū)
WORD b = g_Blocks[g_CurBlock.id].dir[g_CurBlock.dir];
for(i = 0; i 16; i++)
{
if (b 0x8000)
{
if (g_CurBlock.y - i / 4 = HEIGHT)
{ // 如果方塊的固定位置超出高度,結(jié)束游戲
GameOver();
return;
}
else
g_World[g_CurBlock.x + i % 4][g_CurBlock.y - i / 4] = 1;
}
b = 1;
}
// 檢查是否需要消掉行,并標(biāo)記
int row[4] = {0};
bool bRow = false;
for(y = g_CurBlock.y; y = max(g_CurBlock.y - 3, 0); y--)
{
i = 0;
for(x = 0; x WIDTH; x++)
if (g_World[x][y] == 1)
i++;
if (i == WIDTH)
{
bRow = true;
row[g_CurBlock.y - y] = 1;
setfillstyle(WHITE, DIAGCROSS2_FILL);
bar(0, (HEIGHT - y - 1) * SIZE + SIZE / 2 - 2, WIDTH * SIZE - 1, (HEIGHT - y - 1) * SIZE + SIZE / 2 + 2);
}
}
if (bRow)
{
// 延時(shí) 200 毫秒
Sleep(200);
// 擦掉剛才標(biāo)記的行
IMAGE img;
for(i = 0; i 4; i++)
{
if (row[i])
{
for(y = g_CurBlock.y - i + 1; y HEIGHT; y++)
for(x = 0; x WIDTH; x++)
{
g_World[x][y - 1] = g_World[x][y];
g_World[x][y] = 0;
}
getimage(img, 0, 0, WIDTH * SIZE, (HEIGHT - (g_CurBlock.y - i + 1)) * SIZE);
putimage(0, SIZE, img);
}
}
}
// 產(chǎn)生新方塊
NewBlock();
}
以下代碼來(lái)自 easyx 官網(wǎng),已經(jīng)測(cè)試過(guò)可以用,支持各版本 vc。需要安裝 easyx 庫(kù)才能編譯。
項(xiàng)目直接建立控制臺(tái)項(xiàng)目就好了。
////////////////////////////////////////////
//?程序名稱:俄羅斯方塊
//?編譯環(huán)境:Visual?C++?6.0?/?2010,EasyX_v20131006(beta)
//?程序編寫:krissi?zhaoh1987@qq.com
//?更新記錄:2010-12-18 zhaoh1987@qq.com?編寫
//? 2011-9-28 yw80@qq.com?修改了下落超時(shí)的邏輯
//? 2013-10-7??zhaoh1987@qq.com?修改了繪制方法,將原來(lái)的立體效果修改為扁平效果
//
#include?easyx.h
#include?conio.h
#include?time.h
/////////////////////////////////////////////
//?定義常量、枚舉量、結(jié)構(gòu)體、全局變量
/////////////////////////////////////////////
#define WIDTH 10 //?游戲區(qū)寬度
#define HEIGHT 22 //?游戲區(qū)高度
#define UNIT 20 //?每個(gè)游戲區(qū)單位的實(shí)際像素
//?定義操作類型
enum?CMD
{
CMD_ROTATE, //?方塊旋轉(zhuǎn)
CMD_LEFT,?CMD_RIGHT,?CMD_DOWN, //?方塊左、右、下移動(dòng)
CMD_SINK, //?方塊沉底
CMD_QUIT //?退出游戲
};
//?定義繪制方塊的方法
enum?DRAW
{
SHOW, //?顯示方塊
CLEAR, //?擦除方塊
FIX //?固定方塊
};
//?定義七種俄羅斯方塊
struct?BLOCK
{
WORD?dir[4]; //?方塊的四個(gè)旋轉(zhuǎn)狀態(tài)
COLORREF?color; //?方塊的顏色
} g_Blocks[7]?=?{ {0x0F00,?0x4444,?0x0F00,?0x4444,?RED}, //?I
{0x0660,?0x0660,?0x0660,?0x0660,?BLUE}, //?口
{0x4460,?0x02E0,?0x0622,?0x0740,?MAGENTA}, //?L
{0x2260,?0x0E20,?0x0644,?0x0470,?YELLOW}, //?反L
{0x0C60,?0x2640,?0x0C60,?0x2640,?CYAN}, //?Z
{0x0360,?0x4620,?0x0360,?0x4620,?GREEN}, //?反Z
{0x4E00,?0x4C40,?0x0E40,?0x4640,?BROWN}}; //?T
//?定義當(dāng)前方塊、下一個(gè)方塊的信息
struct?BLOCKINFO
{
byte?id; //?方塊?ID
char?x,?y; //?方塊在游戲區(qū)中的坐標(biāo)
byte?dir:2; //?方向
} g_CurBlock,?g_NextBlock;
//?定義游戲區(qū)
BYTE?g_World[WIDTH][HEIGHT]?=?{0};
/////////////////////////////////////////////
//?函數(shù)聲明
/////////////////////////////////////////////
void?Init(); //?初始化游戲
void?Quit(); //?退出游戲
void?NewGame(); //?開始新游戲
void?GameOver(); //?結(jié)束游戲
CMD??GetCmd(); //?獲取控制命令
void?DispatchCmd(CMD?_cmd); //?分發(fā)控制命令
void?NewBlock(); //?生成新的方塊
bool?CheckBlock(BLOCKINFO?_block); //?檢測(cè)指定方塊是否可以放下
void?DrawUnit(int?x,?int?y,?COLORREF?c,?DRAW?_draw); //?畫單元方塊
void?DrawBlock(BLOCKINFO?_block,?DRAW?_draw?=?SHOW); //?畫方塊
void?OnRotate(); //?旋轉(zhuǎn)方塊
void?OnLeft(); //?左移方塊
void?OnRight(); //?右移方塊
void?OnDown(); //?下移方塊
void?OnSink(); //?沉底方塊
/////////////////////////////////////////////
//?函數(shù)定義
/////////////////////////////////////////////
//?主函數(shù)
void?main()
{
Init();
CMD?c;
while(true)
{
c?=?GetCmd();
DispatchCmd(c);
//?按退出時(shí),顯示對(duì)話框咨詢用戶是否退出
if?(c?==?CMD_QUIT)
{
HWND?wnd?=?GetHWnd();
if?(MessageBox(wnd,?_T("您要退出游戲嗎?"),?_T("提醒"),?MB_OKCANCEL?|?MB_ICONQUESTION)?==?IDOK)
Quit();
}
}
}
//?初始化游戲
void?Init()
{
initgraph(640,?480);
srand((unsigned)time(NULL));
setbkmode(TRANSPARENT); //?設(shè)置圖案填充的背景色為透明
//?顯示操作說(shuō)明
settextstyle(14,?0,?_T("宋體"));
outtextxy(20,?330,?_T("操作說(shuō)明"));
outtextxy(20,?350,?_T("上:旋轉(zhuǎn)"));
outtextxy(20,?370,?_T("左:左移"));
outtextxy(20,?390,?_T("右:右移"));
outtextxy(20,?410,?_T("下:下移"));
outtextxy(20,?430,?_T("空格:沉底"));
outtextxy(20,?450,?_T("ESC:退出"));
//?設(shè)置坐標(biāo)原點(diǎn)
setorigin(220,?20);
//?繪制游戲區(qū)邊界
rectangle(-1,?-1,?WIDTH?*?UNIT,?HEIGHT?*?UNIT);
rectangle((WIDTH?+?1)?*?UNIT?-?1,?-1,?(WIDTH?+?5)?*?UNIT,?4?*?UNIT);
//?開始新游戲
NewGame();
}
//?退出游戲
void?Quit()
{
closegraph();
exit(0);
}
//?開始新游戲
void?NewGame()
{
//?清空游戲區(qū)
setfillcolor(BLACK);
solidrectangle(0,?0,?WIDTH?*?UNIT?-?1,?HEIGHT?*?UNIT?-?1);
ZeroMemory(g_World,?WIDTH?*?HEIGHT);
//?生成下一個(gè)方塊
g_NextBlock.id?=?rand()?%?7;
g_NextBlock.dir?=?rand()?%?4;
g_NextBlock.x?=?WIDTH?+?1;
g_NextBlock.y?=?HEIGHT?-?1;
//?獲取新方塊
NewBlock();
}
//?結(jié)束游戲
void?GameOver()
{
HWND?wnd?=?GetHWnd();
if?(MessageBox(wnd,?_T("游戲結(jié)束。\n您想重新來(lái)一局嗎?"),?_T("游戲結(jié)束"),?MB_YESNO?|?MB_ICONQUESTION)?==?IDYES)
NewGame();
else
Quit();
}
//?獲取控制命令
DWORD?m_oldtime;
CMD?GetCmd()
{
//?獲取控制值
while(true)
{
//?如果超時(shí),自動(dòng)下落一格
DWORD?newtime?=?GetTickCount();
if?(newtime?-?m_oldtime?=?500)
{
m_oldtime?=?newtime;
return?CMD_DOWN;
}
//?如果有按鍵,返回按鍵對(duì)應(yīng)的功能
if?(kbhit())
{
switch(getch())
{
case?'w':
case?'W': return?CMD_ROTATE;
case?'a':
case?'A': return?CMD_LEFT;
case?'d':
case?'D': return?CMD_RIGHT;
case?'s':
case?'S': return?CMD_DOWN;
case?27: return?CMD_QUIT;
case?'?': return?CMD_SINK;
case?0:
case?0xE0:
switch(getch())
{
case?72: return?CMD_ROTATE;
case?75: return?CMD_LEFT;
case?77: return?CMD_RIGHT;
case?80: return?CMD_DOWN;
}
}
}
//?延時(shí)?(降低?CPU?占用率)
Sleep(20);
}
}
//?分發(fā)控制命令
void?DispatchCmd(CMD?_cmd)
{
switch(_cmd)
{
case?CMD_ROTATE: OnRotate(); break;
case?CMD_LEFT: OnLeft(); break;
case?CMD_RIGHT: OnRight(); break;
case?CMD_DOWN: OnDown(); break;
case?CMD_SINK: OnSink(); break;
case?CMD_QUIT: break;
}
}
//?生成新的方塊
void?NewBlock()
{
g_CurBlock.id?=?g_NextBlock.id, g_NextBlock.id?=?rand()?%?7;
g_CurBlock.dir?=?g_NextBlock.dir, g_NextBlock.dir?=?rand()?%?4;
g_CurBlock.x?=?(WIDTH?-?4)?/?2;
g_CurBlock.y?=?HEIGHT?+?2;
//?下移新方塊直到有局部顯示
WORD?c?=?g_Blocks[g_CurBlock.id].dir[g_CurBlock.dir];
while((c??0xF)?==?0)
{
g_CurBlock.y--;
c?=?4;
}
//?繪制新方塊
DrawBlock(g_CurBlock);
//?繪制下一個(gè)方塊
setfillcolor(BLACK);
solidrectangle((WIDTH?+?1)?*?UNIT,?0,?(WIDTH?+?5)?*?UNIT?-?1,?4?*?UNIT?-?1);
DrawBlock(g_NextBlock);
//?設(shè)置計(jì)時(shí)器,用于判斷自動(dòng)下落
m_oldtime?=?GetTickCount();
}
//?畫單元方塊
void?DrawUnit(int?x,?int?y,?COLORREF?c,?DRAW?_draw)
{
//?計(jì)算單元方塊對(duì)應(yīng)的屏幕坐標(biāo)
int?left?=?x?*?UNIT;
int?top?=?(HEIGHT?-?y?-?1)?*?UNIT;
int?right?=?(x?+?1)?*?UNIT?-?1;
int?bottom?=?(HEIGHT?-?y)?*?UNIT?-?1;
//?畫單元方塊
switch(_draw)
{
case?SHOW:
//?畫普通方塊
setlinecolor(0x006060);
roundrect(left?+?1,?top?+?1,?right?-?1,?bottom?-?1,?5,?5);
setlinecolor(0x003030);
roundrect(left,?top,?right,?bottom,?8,?8);
setfillcolor(c);
setlinecolor(LIGHTGRAY);
fillrectangle(left?+?2,?top?+?2,?right?-?2,?bottom?-?2);
break;
case?FIX:
//?畫固定的方塊
setfillcolor(RGB(GetRValue(c)?*?2?/?3,?GetGValue(c)?*?2?/?3,?GetBValue(c)?*?2?/?3));
setlinecolor(DARKGRAY);
fillrectangle(left?+?1,?top?+?1,?right?-?1,?bottom?-?1);
break;
case?CLEAR:
//?擦除方塊
setfillcolor(BLACK);
solidrectangle(x?*?UNIT,?(HEIGHT?-?y?-?1)?*?UNIT,?(x?+?1)?*?UNIT?-?1,?(HEIGHT?-?y)?*?UNIT?-?1);
break;
}
}
//?畫方塊
void?DrawBlock(BLOCKINFO?_block,?DRAW?_draw)
{
WORD?b?=?g_Blocks[_block.id].dir[_block.dir];
int?x,?y;
for(int?i?=?0;?i??16;?i++,?b?=?1)
if?(b??0x8000)
{
x?=?_block.x?+?i?%?4;
y?=?_block.y?-?i?/?4;
if?(y??HEIGHT)
DrawUnit(x,?y,?g_Blocks[_block.id].color,?_draw);
}
}
//?檢測(cè)指定方塊是否可以放下
bool?CheckBlock(BLOCKINFO?_block)
{
WORD?b?=?g_Blocks[_block.id].dir[_block.dir];
int?x,?y;
for(int?i?=?0;?i??16;?i++,?b?=?1)
if?(b??0x8000)
{
x?=?_block.x?+?i?%?4;
y?=?_block.y?-?i?/?4;
if?((x??0)?||?(x?=?WIDTH)?||?(y??0))
return?false;
if?((y??HEIGHT)??(g_World[x][y]))
return?false;
}
return?true;
}
//?旋轉(zhuǎn)方塊
void?OnRotate()
{
//?獲取可以旋轉(zhuǎn)的?x?偏移量
int?dx;
BLOCKINFO?tmp?=?g_CurBlock;
tmp.dir++; if?(CheckBlock(tmp)) { dx?=?0; goto?rotate; }
tmp.x?=?g_CurBlock.x?-?1; if?(CheckBlock(tmp)) { dx?=?-1; goto?rotate; }
tmp.x?=?g_CurBlock.x?+?1; if?(CheckBlock(tmp)) { dx?=?1; goto?rotate; }
tmp.x?=?g_CurBlock.x?-?2; if?(CheckBlock(tmp)) { dx?=?-2; goto?rotate; }
tmp.x?=?g_CurBlock.x?+?2; if?(CheckBlock(tmp)) { dx?=?2; goto?rotate; }
return;
rotate:
//?旋轉(zhuǎn)
DrawBlock(g_CurBlock,?CLEAR);
g_CurBlock.dir++;
g_CurBlock.x?+=?dx;
DrawBlock(g_CurBlock);
}
//?左移方塊
void?OnLeft()
{
BLOCKINFO?tmp?=?g_CurBlock;
tmp.x--;
if?(CheckBlock(tmp))
{
DrawBlock(g_CurBlock,?CLEAR);
g_CurBlock.x--;
DrawBlock(g_CurBlock);
}
}
//?右移方塊
void?OnRight()
{
BLOCKINFO?tmp?=?g_CurBlock;
tmp.x++;
if?(CheckBlock(tmp))
{
DrawBlock(g_CurBlock,?CLEAR);
g_CurBlock.x++;
DrawBlock(g_CurBlock);
}
}
//?下移方塊
void?OnDown()
{
BLOCKINFO?tmp?=?g_CurBlock;
tmp.y--;
if?(CheckBlock(tmp))
{
DrawBlock(g_CurBlock,?CLEAR);
g_CurBlock.y--;
DrawBlock(g_CurBlock);
}
else
OnSink(); //?不可下移時(shí),執(zhí)行“沉底方塊”操作
}
//?沉底方塊
void?OnSink()
{
int?i,?x,?y;
//?連續(xù)下移方塊
DrawBlock(g_CurBlock,?CLEAR);
BLOCKINFO?tmp?=?g_CurBlock;
tmp.y--;
while?(CheckBlock(tmp))
{
g_CurBlock.y--;
tmp.y--;
}
DrawBlock(g_CurBlock,?FIX);
//?固定方塊在游戲區(qū)
WORD?b?=?g_Blocks[g_CurBlock.id].dir[g_CurBlock.dir];
for(i?=?0;?i??16;?i++,?b?=?1)
if?(b??0x8000)
{
if?(g_CurBlock.y?-?i?/?4?=?HEIGHT)
{ //?如果方塊的固定位置超出高度,結(jié)束游戲
GameOver();
return;
}
else
g_World[g_CurBlock.x?+?i?%?4][g_CurBlock.y?-?i?/?4]?=?1;
}
//?檢查是否需要消掉行,并標(biāo)記
BYTE?remove?=?0; //?低?4?位用來(lái)標(biāo)記方塊涉及的?4?行是否有消除行為
for(y?=?g_CurBlock.y;?y?=?max(g_CurBlock.y?-?3,?0);?y--)
{
i?=?0;
for(x?=?0;?x??WIDTH;?x++)
if?(g_World[x][y]?==?1)
i++;
if?(i?==?WIDTH)
{
remove?|=?(1??(g_CurBlock.y?-?y));
setfillcolor(LIGHTGREEN);
setlinecolor(LIGHTGREEN);
setfillstyle(BS_HATCHED,?HS_DIAGCROSS);
fillrectangle(0,?(HEIGHT?-?y?-?1)?*?UNIT?+?UNIT?/?2?-?5,?WIDTH?*?UNIT?-?1,?(HEIGHT?-?y?-?1)?*?UNIT?+?UNIT?/?2?+?5);
setfillstyle(BS_SOLID);
}
}
if?(remove) //?如果產(chǎn)生整行消除
{
//?延時(shí)?300?毫秒
Sleep(300);
//?擦掉剛才標(biāo)記的行
IMAGE?img;
for(i?=?0;?i??4;?i++,?remove?=?1)
{
if?(remove??1)
{
for(y?=?g_CurBlock.y?-?i?+?1;?y??HEIGHT;?y++)
for(x?=?0;?x??WIDTH;?x++)
{
g_World[x][y?-?1]?=?g_World[x][y];
g_World[x][y]?=?0;
}
getimage(img,?0,?0,?WIDTH?*?UNIT,?(HEIGHT?-?(g_CurBlock.y?-?i?+?1))?*?UNIT);
putimage(0,?UNIT,?img);
}
}
}
//?產(chǎn)生新方塊
NewBlock();
}
/*
**太多錯(cuò)誤了,包括語(yǔ)法和邏輯上的錯(cuò)誤都有。。。。
**我修改了一下,現(xiàn)在可以了。
**請(qǐng)注意,下面我說(shuō)的字符串均指純數(shù)字字符串,這個(gè)程序中是以字符方式來(lái)處理成數(shù)字的
**輸入的時(shí)候,第一次輸入的必須是順序串(否則還要加一個(gè)排序算法),
**不是順序串的話輸入也沒(méi)有問(wèn)題,但是第一個(gè)字符串不會(huì)被排序
**第二個(gè)字符串不要求順序。因?yàn)槭且粋€(gè)個(gè)插入第一個(gè)字符串的對(duì)應(yīng)位置
**而且這里輸入的會(huì)被按照單個(gè)字符來(lái)錄入
**(即數(shù)組元素只能為0~9中的任一個(gè)整數(shù)),
**如果想要以多位數(shù)(比如一個(gè)數(shù)組元素為67、345、2351等)來(lái)作為一個(gè)數(shù)組元素,
**則要修改判斷輸入的部分(我只是根據(jù)你的來(lái)改的,不知道是不是你想要的結(jié)果)。
*/
#includeiostream
//可去掉#includestdlib.h
using namespace std;
typedef int datatype;
#define maxsize 1024
typedef struct
{
datatype data[maxsize];
int last;
}sequenlist;
sequenlist *combine (sequenlist *scrptr,sequenlist *sinkptr);//添加函數(shù)聲明
void main ()
{
sequenlist *Aptr,*Bptr,*Cptr;
Aptr = new sequenlist;//注意,要申請(qǐng)空間,初始化指針,下同
Bptr = new sequenlist;
Cptr = NULL;
//Cptr不用申請(qǐng)空間,因?yàn)楹竺嬗蟹祷刂羔?,這里初始為NULL,以防非法操作
char ch; //注意這里
int i=0;
//注意這里
do
{
ch = getchar();
Aptr-data[i]= ch - '0';//*Aptr.data[i]——Aptr-data[i]
i++;
}
while (ch!='\n' imaxsize);
Aptr-last = i-1; //添加這句
i = 0;
do
{
ch = getchar();
Bptr-data[i]= ch - '0';//*Aptr.data[i]——Aptr-data[i]
i++;
}
while (ch!='\n' imaxsize);
Bptr-last = i-1;
Cptr=combine(Aptr,Bptr);//注意這里
for(i=0;iCptr-last;i++)//注意
printf("%d",Cptr-data[i]);
delete Aptr;//前面new的,現(xiàn)在要delete,否則內(nèi)存泄漏(雖然編譯可通過(guò))
delete Bptr;
Aptr = Bptr = Cptr = NULL;//這句可要可不要,只是一個(gè)習(xí)慣,即delete掉的指針要置空,以防非法操作。
}
void insertlist (sequenlist *lstptr,int x)//istpter——lstptr
{
int i=0,j=0;
//沒(méi)有do....until ();應(yīng)用while
while(ilstptr-last)
{
if (x=lstptr-data[i])
break;
else i++;
}
if (lstptr-last=maxsize)
{
printf ("overflow");
exit(0);//exit (overflow);overflow不是一個(gè)整數(shù)值
}
for (j=lstptr-last-1;j=i;j--)//注意,j=lstptr-last-1
{
lstptr-data[j+1]=lstptr-data[j];
// lstptr-data[i]=x;
// lstptr-last++;
//這兩句要放for外面
}
lstptr-data[i]=x;
lstptr-last++;
}
sequenlist *combine (sequenlist *scrptr,sequenlist *sinkptr)
{
//int x;不需要
int j;
for (j=0;jsinkptr-last;j++)
insertlist (scrptr,sinkptr-data[j]);
return scrptr;//注意
}
打字不易,如滿意,望采納。