導航:首頁 > 源碼編譯 > qt俄羅斯方塊源碼親測通過編譯

qt俄羅斯方塊源碼親測通過編譯

發布時間:2022-02-04 18:12:24

❶ 求一個智能ai俄羅斯方塊的源代碼,就是電腦自動玩的,需要有詳細注釋,謝謝各位了,如果有的話不勝感激

這個你只能自行寫外掛了,就和QQ連連看一樣,原理上都是一個很大的矩陣,但是只能ai的演算法比較難寫。。。

❷ 求Qt版的俄羅斯方塊源代碼,急!郵箱:[email protected]

http://www.yafeilinux.com/?page_id=9
裡面的勞拉方塊就是俄羅斯方塊,有源代碼

❸ 巴黎有俄羅斯方塊的代碼嗎,最好是qt5的

Note: ERS_Block.java uses or overrides a deprec 這句的意思是ERS_Block.java的文件不能被使用或重載 Recompile with -deprecation for details 這句的意思是編譯出現問題. 你先檢查下代碼,出現這種情況的原因可能是因為你們使用不同版本的JDK所造成的,用高版本編輯的文件,低版本的JDK一般在編譯的時候會出現錯誤.而低版本編輯的程序,用高版本編譯也會出現問題.這是因為他們在在包\類等問題上不統一.

❹ 在網上下載了java的俄羅斯方塊的源代碼,用cmd運行總是不能通過編譯,提示「無效的標志」

javac是編譯的命令
運行時用java 包含主方法的類全名
建議學習一下java的基礎再來運行程序

補充回答:根據你的提示,你的電腦上應該是裝有JDK的,並非不給你詳細步驟,只是需要看到代碼才能准確地寫出步驟,因為你連包名、類名都不知道

詳細步驟:
1.先用javac 命令編譯你下載的所有的.java文件
2.用java命令執行這些文件中的一個含有main()方法的那個文件

ps:執行第一步編譯操作時,需要加上包名,查看包名的辦法是,打開你要編譯的一個.java文件,文件的第一行也就是以package 開頭的一行,package 後面有一個空格,然後後面的內容就是包名,他的寫法是package aaa.bbb.ccc;
你在編譯時的操作:
在命令行輸入:
javac aaa/bbb/ccc/Xxx.java
其中Xxx.java即是你打開這個文件的文件名

一般編譯成功的標志就是你在命令行中輸入上面那句話以後敲回車,然後游標直接跳到下一行,沒有任何提示。然後你會發現,在這個.java文件的同路徑下,多了一個前綴相同,後綴為.class的文件
如果有一些英文提示表示你編譯失敗了,應該是你的包名或類名的原因,仔細修改吧!

執行第二步:
java aaa.bbb.ccc.Xxx
將編譯時的/全部換成.
最後的.java就不要寫了
如果執行成功了,你就可以看到那個俄羅斯方塊的界面了。

說得還算詳細吧,貌似有點羅索了,呵呵,樓主將就看吧,為了這10分我可真不易啊!

❺ 求一個俄羅斯方塊的畢設源代碼,必須是c++的,能在2008上運行,6.0的不要

又一個求作業的,鑒定完畢

❻ 急求俄羅斯方塊C++語言源代碼,用Microsoft Visual C++ 6.0能編譯出來 。 郵箱地址:[email protected]!謝

#include <windows.h> //windows.h文件中包含應用程序中所需的數據類型和數據結構的定義
#include <time.h> //包含SetTimer()、KillTimer()等關於定時器的函數
#include <stdlib.h>

#define CELL 15 // 【方格】的邊長(pix)
#define W 20 // 游戲區寬(12個【方格】邊長,8個格子用來繪制"下一個"方塊)
#define H 26 // 游戲區高(26個【方格】邊長)
#define MS_NEWBLOCK WM_USER+1 // 消息ID,產生新的【方塊】
#define MS_DRAW WM_USER+2 // 消息ID,用來畫【方塊】
#define MS_NEXTBLOCK WM_USER+3 //消息ID,用來顯示下一個【俄羅斯方塊】形狀

//------------------------窗口函數的說明------------------------
LRESULT CALLBACK WndProc ( HWND, UINT, WPARAM, LPARAM);

//---------------------------------------------------------------
int WINAPI WinMain ( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
PSTR szCmdLine,
int iCmdShow)

{
static char AppName[]="ToyBrick"; //窗口類名
HWND hwnd;
MSG msg; //消息結構
WNDCLASSEX wndclass; //窗口類
int iScreenWide; //定義一個整型變數來取得窗口的寬度

wndclass.cbSize = sizeof(wndclass);
wndclass.style = CS_HREDRAW|CS_VREDRAW;//窗口類型

//CS_HREDRAW :Redraws the entire window if a movement or size
// adjustment changes the width of the client area.
//CS_VREDRAW :Redraws the entire window if a movement or size
// adjustment changes the height of the client area.

wndclass.lpfnWndProc = WndProc; //窗口處理函數為 WndProc
wndclass.cbClsExtra = 0; //窗口類無擴展
wndclass.cbWndExtra = 0; //窗口實例無擴展
wndclass.hInstance = hInstance; //當前實例句柄
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION); //默認圖標
wndclass.hCursor = LoadCursor (NULL,IDC_ARROW); //箭頭游標
wndclass.hbrBackground = (HBRUSH)GetStockObject (BLACK_BRUSH); //背景為黑色
wndclass.lpszMenuName = NULL; //窗口中無菜單
wndclass.lpszClassName = AppName; //類名為"ToyBrick"
wndclass.hIconSm = LoadIcon (NULL, IDI_APPLICATION);

//----------------------------------窗口類的注冊-----------------------------------------

if(!RegisterClassEx (&wndclass)) //如果注冊失敗則發出警報聲音,返回FALSE
{
MessageBeep(0);
return FALSE;
}

// 獲取顯示器解析度的X值iScreenWide,將程序窗口置於屏幕中央
iScreenWide=GetSystemMetrics (SM_CXFULLSCREEN);

hwnd =CreateWindow (
AppName, //窗口類名
"四面楚歌製作", //窗口實例的標題名
WS_MINIMIZEBOX|WS_SYSMENU , //窗口的風格
iScreenWide/2-W*CELL/2, //窗口左上角橫坐標(X)
CELL, //窗口左上角縱坐標(Y)
W*CELL, //窗口的寬
H*CELL, //窗口的高
NULL, //窗口無父窗口
NULL, //窗口無主菜單
hInstance, //創建此窗口的應用程序的當前句柄
NULL //不使用該值
);
if(!hwnd) return FALSE;
//顯示窗口
ShowWindow (hwnd,iCmdShow);
//繪制用戶區
UpdateWindow (hwnd);
MessageBox(hwnd," 開始游戲\n\n OH YEAH","開始",MB_OK);
SendMessage(hwnd,MS_NEWBLOCK,0,0);

SetTimer (hwnd, 1, 100,NULL);

//消息循環
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg);
DispatchMessage (&msg);
}
//消息循環結束即程序終止時將消息返回系統
return msg.wParam;
}

// 函數DrawRact: 畫【正方形】----- (□)
// 參數: 設備環境句柄和【正方形】的四角坐標
void DrawRect (HDC hdc, int l, int t, int r, int b)
{
MoveToEx (hdc, l, t, NULL); //將游標移動到(l,t)
LineTo (hdc, r, t);
LineTo (hdc, r, b);
LineTo (hdc, l, b);
LineTo (hdc, l,t);
}

// 函數DrawCell: 畫【方格】-----(紅色■)
// 參數: 設備環境句柄和【方格】的四角坐標
void DrawCell (HDC hdc, int l, int t, int r, int b)
{
HBRUSH hbrush;

hbrush=CreateSolidBrush(RGB(255,0,0)); // 紅色畫刷
SelectObject(hdc,hbrush);
Rectangle(hdc,l, t, r, b);
DeleteObject (hbrush);

}

//繪出遊戲區域的方格,其中包括"游戲空間"和"顯示下一個【方塊】空間"
//此函數包含在Cover函數中。參數:設備環境句柄
void DrawGamePlace(HDC hdc)
{
int i,j;
HPEN hpen1,hpen2;
hpen1=CreatePen(PS_SOLID,1,RGB(0,255,0));
hpen2=CreatePen(PS_DASHDOTDOT,3,RGB(0,0,255));

//繪制分割線
SelectObject(hdc,hpen2);
MoveToEx(hdc,(W-8)*CELL,0,NULL);
LineTo(hdc,(W-8)*CELL,H*CELL);

//繪制游戲區域方格線(綠色)
SelectObject(hdc,hpen1);
for (i=1; i<H-1; i++)
for(j=1; j<=W-8; j++)
DrawRect (hdc, (j-1)*CELL, (i-1)*CELL, j*CELL, i*CELL);

//繪制"顯示下一個"區域的方格線
for(i=5;i<9;i++) // 5≤i≤8
for(j=W-5;j<W-1;j++) // 15≤j≤18
DrawRect (hdc, (j-1)*CELL, (i-1)*CELL, j*CELL, i*CELL);

DeleteObject(hpen2);
DeleteObject(hpen1);

}

// 函數DrawBlock: 畫游戲中出現的【俄羅斯方塊】
// 參數: 設備環境句柄和【俄羅斯方塊】中四個【方格】在游戲區域中的位置
// 每個【俄羅斯方塊】由四個【方格】組成7種不同的形狀
void DrawBlock (HDC hdc, int block[4][2])
{
int i;
for(i=0; i<4; i++)
DrawCell (hdc, (block[i][0]-1)*CELL, (block[i][1]-1)*CELL, //....
block[i][0]*CELL, block[i][1]*CELL);

}

// 函數Cover: 清除原來位置的【俄羅斯方塊】
// 參數: 設備環境句柄和待清除的【俄羅斯方塊】
//作用(1) 清除【俄羅斯方塊】即在該【俄羅斯方塊】的每個【方格】處畫一個正方形的白塊
// (2) 重新繪制游戲區域的方格

void Cover (HDC hdc, int org[4][2])
{
int i;
HBRUSH hbrush;
//重新繪制游戲區域
DrawGamePlace(hdc);

hbrush=(HBRUSH)GetStockObject (BLACK_BRUSH);
SelectObject (hdc,hbrush );
for(i=0; i<4; i++)
Rectangle ( hdc, (org[i][0]-1)*CELL, (org[i][1]-1)*CELL, //.....
org[i][0]*CELL, org[i][1]*CELL);
DeleteObject(hbrush);

}

//-------------------窗口過程函數WndProc-----------------------------

LRESULT CALLBACK WndProc ( HWND hwnd,
UINT iMsg,
WPARAM wParam,
LPARAM lParam )
{
int i,j,k,lines,r;
static int top, sel, flag;
static int cells[W-6][H]; // 控制游戲區域的【方格矩陣】
static int org[4][2], block[4][2],org2[4][2]; // 【方塊】
HDC hdc;
HPEN hpen;
PAINTSTRUCT ps;

switch (iMsg)
{
case WM_CREATE:
//當一個應用程序使用函數CreateWindow或CreateWindowEx來創建一個窗口時,
//系統將發送該消息給此新建窗口過程。該消息將在創建窗口之後,顯示窗口
//之前發送該消息,該消息將在CreateWindow或CreateWindowEx函數返回之前發送。

top=H-1;
// 將第一列和最後一列【方格】置1,控制【方塊】不超出遊戲區域
for(i=0; i<H; i++)
{
cells[0][i]=1;
cells[W-7][i]=1;
}

// 將最底下一行【方格】置1,控制【方塊】不超出遊戲區域
for(i=0; i<W-6; i++)
cells[i][H-1]=1;

// 其他【方格】置0,游戲方塊只能在這里移動
for(i=1; i<=W-8; i++)
for(j=0; j<H-1; j++)
cells[i][j]=0;

return 0;

case MS_NEWBLOCK:

flag=0; // flag表示【方塊】旋轉了幾次

for(i=top; i<H-1; i++)
{
lines =0;

// 循環語句檢查是否有某一行全部被【方格】都填滿
for(j=1; j<=W-7; j++)
if(! cells[j][i])
{
lines=1;
break;
}

// 若該行被填滿,則將上一行的填充狀態復制到該行,依此類推
// 即從該行開始,所有的【方格】都下移一行
if(!lines)
{ for(j=1;j<W-7; j++)
for(k=i; k>=top; k--)
cells[j][k]=cells[j][k-1];
top++;

//該函數把指定窗口用戶區域內的矩形加入到該窗口的更新區域之外
//使該矩形無效。這個無效的矩形,連同更新區域中的其他區域,在收到下
//一條WM_PAINT消息時將被重畫。無效區一直積累在更新區域之中,直到
//下一條WM_PAINT消息發生時對該區域進行處理。
InvalidateRect(hwnd, NULL, TRUE);
}
}

// 產生隨機數0~7,分別代表【方塊】的7種形狀
srand( (unsigned)time( NULL ) );
sel =rand()%7;

//【方塊】形狀初始化
//【方塊】的形狀由其每個【方格】的位置決定
// 游戲區寬W=20,block[?][0]=4/5/6/7,block[?][1]=0/1/2
// 這樣【方塊】初始位置在游戲區域的最頂部的中央
switch(sel)
{
case 0:
// ▓▓
// ▓▓
org[0][0]=block[0][0] =5; org[0][1]=block[0][1] =0;
org[1][0]=block[1][0] =6; org[1][1]=block[1][1] =0;
org[2][0]=block[2][0] =5; org[2][1]=block[2][1] =1;
org[3][0]=block[3][0] =6; org[3][1]=block[3][1] =1;
for(i=0;i<4;i++)
{
org2[i][0]=org[i][0]+11;
org2[i][1]=org[i][1]+5;
}

break;

case 1:
//▓▓▓▓
org[0][0]=block[0][0] =4; org[0][1]=block[0][1] =0;
org[1][0]=block[1][0] =5; org[1][1]=block[1][1] =0;
org[2][0]=block[2][0] =6; org[2][1]=block[2][1] =0;
org[3][0]=block[3][0] =7; org[3][1]=block[3][1] =0;
for(i=0;i<4;i++)
{
org2[i][0]=org[i][0]+11;
org2[i][1]=org[i][1]+5;
}

break;

case 2:
//▓
//▓▓
// ▓
org[0][0]=block[0][0] =5; org[0][1]=block[0][1] =0;
org[1][0]=block[1][0] =5; org[1][1]=block[1][1] =1;
org[2][0]=block[2][0] =6; org[2][1]=block[2][1] =1;
org[3][0]=block[3][0] =6; org[3][1]=block[3][1] =2;
for(i=0;i<4;i++)
{
org2[i][0]=org[i][0]+11;
org2[i][1]=org[i][1]+5;
}

break;

case 3:
// ▓
//▓▓
//▓
org[0][0]=block[0][0] =6; org[0][1]=block[0][1] =0;
org[1][0]=block[1][0] =6; org[1][1]=block[1][1] =1;
org[2][0]=block[2][0] =5; org[2][1]=block[2][1] =1;
org[3][0]=block[3][0] =5; org[3][1]=block[3][1] =2;
for(i=0;i<4;i++)
{
org2[i][0]=org[i][0]+11;
org2[i][1]=org[i][1]+5;
}

break;

case 4:
//▓
//▓
//▓▓
org[0][0]=block[0][0] =5; org[0][1]=block[0][1] =0;
org[1][0]=block[1][0] =5; org[1][1]=block[1][1] =1;
org[2][0]=block[2][0] =5; org[2][1]=block[2][1] =2;
org[3][0]=block[3][0] =6; org[3][1]=block[3][1] =2;
for(i=0;i<4;i++)
{
org2[i][0]=org[i][0]+11;
org2[i][1]=org[i][1]+5;
}

break;

case 5:
// ▓
// ▓
//▓▓
org[0][0]=block[0][0] =5; org[0][1]=block[0][1] =0;
org[1][0]=block[1][0] =5; org[1][1]=block[1][1] =1;
org[2][0]=block[2][0] =5; org[2][1]=block[2][1] =2;
org[3][0]=block[3][0] =4; org[3][1]=block[3][1] =2;
for(i=0;i<4;i++)
{
org2[i][0]=org[i][0]+11;
org2[i][1]=org[i][1]+5;
}

break;
case 6:
// ▓
//▓▓▓
org[0][0]=block[0][0] =5; org[0][1]=block[0][1] =0;
org[1][0]=block[1][0] =4; org[1][1]=block[1][1] =1;
org[2][0]=block[2][0] =5; org[2][1]=block[2][1] =1;
org[3][0]=block[3][0] =6; org[3][1]=block[3][1] =1;
for(i=0;i<4;i++)
{
org2[i][0]=org[i][0]+11;
org2[i][1]=org[i][1]+5;
}

SendMessage (hwnd, MS_NEXTBLOCK, 0, 0);
break;

default:

SendMessage (hwnd, MS_NEWBLOCK, 0, 0);
SendMessage (hwnd, MS_NEXTBLOCK, 0, 0);
break;
}

return 0;

case WM_TIMER:

// 每個時間節拍【方塊】自動下移一行
for(i=0; i<4; i++)
block[i][1]++;

// 檢查【方塊】下移是否被檔住,即判斷下移後新位置是否有【方格】
for(i=0; i<4; i++)
if(cells[ block[i][0] ][ block[i][1] ])
{
SendMessage (hwnd, MS_NEXTBLOCK, 0, 0);

for(i=0; i<4; i++)
cells[ org[i][0] ][ org[i][1] ]=1;

if(top>org[0][1]-2)
top=org[0][1]-2;

if (top<1)
{
KillTimer (hwnd, 1);
MessageBox (hwnd, "游戲結束,即將退出 !\n 四面楚歌", "退出", MB_OK);
PostQuitMessage (0);
}

SendMessage (hwnd, MS_NEWBLOCK, 0, 0);
return 0;
}

SendMessage (hwnd, MS_DRAW, 0, 0);

return 0;

// 響應鍵盤控制
case WM_KEYDOWN:
r=0;
switch((int)wParam)
{
case VK_LEFT:
for(i=0; i<4; i++)
block[i][0]--;
break;

case VK_RIGHT:
for(i=0; i<4; i++)
block[i][0]++;
break;
case VK_DOWN:
for(i=0; i<4; i++)
block[i][1]++;
break;

// 按[向上鍵],【方塊】順時針旋轉
//【方塊】的旋轉不是真正的旋轉,而是根據不同的【方塊】形狀和該【方塊】旋轉過的
// 次數來移動其中的一個或幾個【方格】,從而達到旋轉的效果 。這樣做很復雜,演算法
// 不夠理想,但是能夠保持【方塊】旋轉時的重心比較穩定。

case VK_UP:
r=1;
flag++; //【方塊】旋轉加1

switch(sel) // sel代表當前【方塊】的形狀
{
case 0: break;

case 1:
flag =flag%2;
for(i=0; i<4; i++)
{
block[i][(flag+1)%2] =org[2][(flag+1)%2];
block[i][flag] =org[2][flag]-2+i;
}
break;

case 2:
flag =flag%2;
if(flag)
{ block[0][1] +=2; block[3][0] -=2; }
else
{ block[0][1] -=2; block[3][0] +=2; }
break;

case 3:
flag =flag%2;
if(flag)
{ block[0][1] +=2; block[3][0] +=2; }
else
{ block[0][1] -=2; block[3][0] -=2; }
break;

case 4:
flag=flag%4;
switch(flag)
{
case 0:
block[2][0] +=2; block[3][0] +=2;
block[2][1] +=1; block[3][1] +=1;
break;
case 1:
block[2][0] +=1; block[3][0] +=1;
block[2][1] -=2; block[3][1] -=2;
break;
case 2:
block[2][0] -=2; block[3][0] -=2;
block[2][1] -=1; block[3][1] -=1;
break;
case 3:
block[2][0] -=1; block[3][0] -=1;
block[2][1] +=2; block[3][1] +=2;
break;
}
break;

case 5:
flag=flag%4;
switch(flag)
{
case 0:
block[2][0] +=1; block[3][0] +=1;
block[2][1] +=2; block[3][1] +=2;
break;
case 1:
block[2][0] +=2; block[3][0] +=2;
block[2][1] -=1; block[3][1] -=1;
break;
case 2:
block[2][0] -=1; block[3][0] -=1;
block[2][1] -=2; block[3][1] -=2;
break;
case 3:
block[2][0] -=2; block[3][0] -=2;
block[2][1] +=1; block[3][1] +=1;
break;
}
break;

case 6:
flag =flag%4;
switch(flag)
{
case 0:
block[0][0]++; block[0][1]--;
block[1][0]--; block[1][1]--;
block[3][0]++; block[3][1]++;
break;
case 1:
block[1][0]++; block[1][1]++; break;
case 2:
block[0][0]--; block[0][1]++; break;
case 3:
block[3][0]--; block[3][1]--; break;
}
break;
}
break;
}

// 判斷【方塊】旋轉後新位置是否有【方格】,若有,則旋轉取消
for(i=0; i<4; i++)
if(cells[ block[i][0] ][ block[i][1] ])
{
if(r) flag +=3;
for(i=0; i<4; i++)
for(j=0; j<2; j++)
block[i][j]=org[i][j];
return 0;
}
SendMessage(hwnd, MS_DRAW, 0, 0);;
return 0;

// 清楚當前【方塊】,並在顯示「下一個方塊」處繪制下一個【方塊】
case MS_NEXTBLOCK:

hdc=GetDC(hwnd);
Cover(hdc,org2);
// DrawBlock(hdc,org2);

return 0;

// 清除當前【方塊】,並在新的位置重新繪制【方塊】
case MS_DRAW:

hdc =GetDC (hwnd);
Cover (hdc, org);

DrawBlock(hdc,org2);

for(i=0; i<4; i++)
for(j=0; j<2; j++)
org[i][j]=block[i][j];

DrawBlock (hdc,block);
ReleaseDC (hwnd, hdc);

return 0;

// 按照【方格矩陣】重繪游戲區域的【方格】
case WM_PAINT:

hdc =BeginPaint (hwnd, &ps);
DrawGamePlace(hdc);
TextOut(hdc,15*CELL,12*CELL,"Score",lstrlen("Score"));
TextOut(hdc,15*CELL,13*CELL,"i",lstrlen("i"));
TextOut(hdc,15*CELL,15*CELL,"Level",lstrlen("Level"));
TextOut(hdc,15*CELL-5,19*CELL,"四面楚歌",lstrlen("四面楚歌"));
hpen =CreatePen (PS_SOLID,1,RGB(0,255,0));
SelectObject (hdc,hpen);
for (i=top; i<H-1; i++)
for(j=1; j<=W-8; j++)
if( cells[j][i] )
DrawCell (hdc, (j-1)*CELL, (i-1)*CELL, j*CELL, i*CELL);

DeleteObject (hpen);
EndPaint (hwnd, &ps);
return 0;

case WM_DESTROY:
KillTimer (hwnd, 1);
PostQuitMessage (0);
return 0;
}

return DefWindowProc (hwnd, iMsg, wParam, lParam);

}

❼ 求一份用C語言編寫的俄羅斯方塊的源代碼!

俄羅斯方塊C源代碼

#include<stdio.h>

#include<windows.h>

#include<conio.h>

#include<time.h>

#defineZL4 //坐標增量,不使游戲窗口靠邊

#defineWID36 //游戲窗口的寬度

#defineHEI20 //游戲窗口的高度

inti,j,Ta,Tb,Tc; //Ta,Tb,Tc用於記住和轉換方塊變數的值

inta[60][60]={0}; //標記游戲屏幕各坐標點:0,1,2分別為空、方塊、邊框

intb[4]; //標記4個"口"方塊:1有,0無,類似開關

intx,y,level,score,speed; //方塊中心位置的x,y坐標,游戲等級、得分和游戲速度

intflag,next; //當前要操作的方塊類型序號,下一個方塊類型序號

voidgtxy(intm,intn); //以下聲明要用到的自編函數

voidgflag(); //獲得下一方塊序號

voidcsh(); //初始化界面

voidstart(); //開始部分

voidprfk(); //列印方塊

voidclfk(); //清除方塊

voidmkfk(); //製作方塊

voidkeyD(); //按鍵操作

intifmov(); //判斷方塊能否移動或變體

void clHA(); //清除滿行的方塊

voidclNEXT(); //清除邊框外的NEXT方塊

intmain()

{csh();

while(1)

{start();//開始部分

while(1)

{prfk();

Sleep(speed); //延時

clfk();

Tb=x;Tc=flag;//臨存當前x坐標和序號,以備撤銷操作

keyD();

y++;//方塊向下移動

if(ifmov()==0){y--;prfk();dlHA();break;}//不可動放下,刪行,跨出循環

}

for(i=y-2;i<y+2;i++){if(i==ZL){j=0;}} //方塊觸到框頂

if(j==0){system("cls");gtxy(10,10);printf("游戲結束!");getch();break;}

clNEXT(); //清除框外的NEXT方塊

}

return0;

}

voidgtxy(intm,intn)//控制游標移動

{COORDpos;//定義變數

pos.X=m;//橫坐標

pos.Y=n;//縱坐標

SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);

}

voidcsh()//初始化界面

{gtxy(ZL+WID/2-5,ZL-2);printf("俄羅斯方塊");//列印游戲名稱

gtxy(ZL+WID+3,ZL+7);printf("*******NEXT:");//列印菜單信息

gtxy(ZL+WID+3,ZL+13);printf("**********");

gtxy(ZL+WID+3,ZL+15);printf("Esc:退出遊戲");

gtxy(ZL+WID+3,ZL+17);printf("↑鍵:變體");

gtxy(ZL+WID+3,ZL+19);printf("空格:暫停游戲");

gtxy(ZL,ZL);printf("╔");gtxy(ZL+WID-2,ZL);printf("╗");//列印框角

gtxy(ZL,ZL+HEI);printf("╚");gtxy(ZL+WID-2,ZL+HEI);printf("╝");

a[ZL][ZL+HEI]=2;a[ZL+WID-2][ZL+HEI]=2;//記住有圖案

for(i=2;i<WID-2;i+=2){gtxy(ZL+i,ZL);printf("═");}//列印上橫框

for(i=2;i<WID-2;i+=2){gtxy(ZL+i,ZL+HEI);printf("═");a[ZL+i][ZL+HEI]=2;}//下框

for(i=1;i<HEI;i++){gtxy(ZL,ZL+i);printf("║");a[ZL][ZL+i]=2;}//左豎框記住有圖案

for(i=1;i<HEI;i++){gtxy(ZL+WID-2,ZL+i);printf("║");a[ZL+WID-2][ZL+i]=2;}//右框

CONSOLE_CURSOR_INFOcursor_info={1,0};//以下是隱藏游標的設置

SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);

level=1;score=0;speed=400;

gflag();flag=next;//獲得一個當前方塊序號

}

voidgflag() //獲得下一個方塊的序號

{srand((unsigned)time(NULL));next=rand()%19+1; }

voidstart()//開始部分

{gflag();Ta=flag;flag=next;//保存當前方塊序號,將下一方塊序號臨時操作

x=ZL+WID+6;y=ZL+10;prfk();//給x,y賦值,在框外列印出下一方塊

flag=Ta;x=ZL+WID/2;y=ZL-1;//取回當前方塊序號,並給x,y賦值

}

voidprfk()//列印俄羅斯方塊

{for(i=0;i<4;i++){b[i]=1;}//數組b[4]每個元素的值都為1

mkfk();//製作俄羅斯方塊

for(i=x-2;i<=x+4;i+=2)//列印方塊

{for(j=y-2;j<=y+1;j++){if(a[i][j]==1&&j>ZL){gtxy(i,j);printf("□");}}}

gtxy(ZL+WID+3,ZL+1); printf("level:%d",level); //以下列印菜單信息

gtxy(ZL+WID+3,ZL+3); printf("score:%d",score);

gtxy(ZL+WID+3,ZL+5); printf("speed:%d",speed);

}

voidclfk()//清除俄羅斯方塊

{for(i=0;i<4;i++){b[i]=0;}//數組b[4]每個元素的值都為0

mkfk();//製作俄羅斯方塊

for(i=x-2;i<=x+4;i+=2)//清除方塊

{for(j=y-2;j<=y+1;j++){if(a[i][j]==0&&j>ZL){gtxy(i,j);printf("");}}}

}

voidmkfk()//製作俄羅斯方塊

{a[x][y]=b[0];//方塊中心位置狀態:1-有,0-無

switch(flag)//共6大類,19種小類型

{case1:{a[x][y-1]=b[1];a[x+2][y-1]=b[2];a[x+2][y]=b[3];break;}//田字方塊

case2:{a[x-2][y]=b[1];a[x+2][y]=b[2];a[x+4][y]=b[3];break;}//直線方塊:----

case3:{a[x][y-1]=b[1];a[x][y-2]=b[2];a[x][y+1]=b[3];break;}//直線方塊:|

case4:{a[x-2][y]=b[1];a[x+2][y]=b[2];a[x][y+1]=b[3];break;}//T字方塊

case5:{a[x][y-1]=b[1];a[x][y+1]=b[2];a[x-2][y]=b[3];break;}//T字順時針轉90度

case6:{a[x][y-1]=b[1];a[x-2][y]=b[2];a[x+2][y]=b[3];break;}//T字順轉180度

case7:{a[x][y-1]=b[1];a[x][y+1]=b[2];a[x+2][y]=b[3];break;}//T字順轉270度

case8:{a[x][y+1]=b[1];a[x-2][y]=b[2];a[x+2][y+1]=b[3];break;}//Z字方塊

case9:{a[x][y-1]=b[1];a[x-2][y]=b[2];a[x-2][y+1]=b[3];break;}//Z字順轉90度

case10:{a[x][y-1]=b[1];a[x-2][y-1]=b[2];a[x+2][y]=b[3];break;}//Z字順轉180度

case11:{a[x][y+1]=b[1];a[x+2][y-1]=b[2];a[x+2][y]=b[3];break;}//Z字順轉270度

case12:{a[x][y-1]=b[1];a[x][y+1]=b[2];a[x-2][y-1]=b[3];break;}//7字方塊

case13:{a[x-2][y]=b[1];a[x+2][y-1]=b[2];a[x+2][y]=b[3];break;}//7字順轉90度

case14:{a[x][y-1]=b[1];a[x][y+1]=b[2];a[x+2][y+1]=b[3];break;}//7字順轉180度

case15:{a[x-2][y]=b[1];a[x-2][y+1]=b[2];a[x+2][y]=b[3];break;}//7字順轉270度

case16:{a[x][y+1]=b[1];a[x][y-1]=b[2];a[x+2][y-1]=b[3];break;}//倒7字方塊

case17:{a[x-2][y]=b[1];a[x+2][y+1]=b[2];a[x+2][y]=b[3];break;}//倒7字順轉90度

case18:{a[x][y-1]=b[1];a[x][y+1]=b[2];a[x-2][y+1]=b[3];break;}//倒7字順轉180度

case19:{a[x-2][y]=b[1];a[x-2][y-1]=b[2];a[x+2][y]=b[3];break;}//倒7字順轉270度

}

}

voidkeyD()//按鍵操作

{if(kbhit())

{intkey;

key=getch();

if(key==224)

{key=getch();

if(key==75){x-=2;}//按下左方向鍵,中心橫坐標減2

if(key==77){x+=2;}//按下右方向鍵,中心橫坐標加2

if(key==72)//按下向上方向鍵,方塊變體

{if(flag>=2&&flag<=3){flag++;flag%=2;flag+=2;}

if(flag>=4&&flag<=7){flag++;flag%=4;flag+=4;}

if(flag>=8&&flag<=11){flag++;flag%=4;flag+=8;}

if(flag>=12&&flag<=15){flag++;flag%=4;flag+=12;}

if(flag>=16&&flag<=19){flag++;flag%=4;flag+=16;}}

}

if(key==32)//按空格鍵,暫停

{prfk();while(1){if(getch()==32){clfk();break;}}} //再按空格鍵,繼續游戲

if(ifmov()==0){x=Tb;flag=Tc;} //如果不可動,撤銷上面操作

else{prfk();Sleep(speed);clfk();Tb=x;Tc=flag;} //如果可動,執行操作

}

}

intifmov()//判斷能否移動

{if(a[x][y]!=0){return0;}//方塊中心處有圖案返回0,不可移動

else{if((flag==1&&(a[x][y-1]==0&&a[x+2][y-1]==0&&a[x+2][y]==0))||

(flag==2&&(a[x-2][y]==0&&a[x+2][y]==0&&a[x+4][y]==0))||

(flag==3&&(a[x][y-1]==0&&a[x][y-2]==0&&a[x][y+1]==0))||

(flag==4&&(a[x-2][y]==0&&a[x+2][y]==0&&a[x][y+1]==0))||

(flag==5&&(a[x][y-1]==0&&a[x][y+1]==0&&a[x-2][y]==0))||

(flag==6&&(a[x][y-1]==0&&a[x-2][y]==0&&a[x+2][y]==0))||

(flag==7&&(a[x][y-1]==0&&a[x][y+1]==0&&a[x+2][y]==0))||

(flag==8&&(a[x][y+1]==0&&a[x-2][y]==0&&a[x+2][y+1]==0))||

(flag==9&&(a[x][y-1]==0&&a[x-2][y]==0&&a[x-2][y+1]==0))||

(flag==10&&(a[x][y-1]==0&&a[x-2][y-1]==0&&a[x+2][y]==0))||

(flag==11&&(a[x][y+1]==0&&a[x+2][y-1]==0&&a[x+2][y]==0))||

(flag==12&&(a[x][y-1]==0&&a[x][y+1]==0&&a[x-2][y-1]==0))||

( flag==13 && ( a[x-2][y]==0 && a[x+2][y-1]==0 && a[x+2][y]==0 ) ) ||

( flag==14 && ( a[x][y-1]==0 && a[x][y+1]==0 && a[x+2][y+1]==0 ) ) ||

(flag==15 && ( a[x-2][y]==0 && a[x-2][y+1]==0 && a[x+2][y]==0 ) ) ||

(flag==16 && ( a[x][y+1]==0 && a[x][y-1]==0 && a[x+2][y-1]==0 ) ) ||

( flag==17 && ( a[x-2][y]==0 && a[x+2][y+1]==0 && a[x+2][y]==0 ) ) ||

(flag==18 && ( a[x][y-1]==0 &&a[x][y+1]==0 && a[x-2][y+1]==0 ) ) ||

(flag==19 && ( a[x-2][y]==0 && a[x-2][y-1]==0

&&a[x+2][y]==0))){return1;}

}

return0; //其它情況返回0

}

voidclNEXT() //清除框外的NEXT方塊

{flag=next;x=ZL+WID+6;y=ZL+10;clfk();}

void clHA() //清除滿行的方塊

{intk,Hang=0; //k是某行方塊個數,Hang是刪除的方塊行數

for(j=ZL+HEI-1;j>=ZL+1;j--)//當某行有WID/2-2個方塊時,則為滿行

{k=0;for(i=ZL+2;i<ZL+WID-2;i+=2)

{if(a[i][j]==1)//豎坐標從下往上,橫坐標由左至右依次判斷是否滿行

{k++; //下面將操作刪除行

if(k==WID/2-2) { for(k=ZL+2;k<ZL+WID-2;k+=2)

{a[k][j]=0;gtxy(k,j);printf("");Sleep(1);}

for(k=j-1;k>ZL;k--)

{for(i=ZL+2;i<ZL+WID-2;i+=2)//已刪行數上面有方塊,先清除再全部下移一行

{if(a[i][k]==1){a[i][k]=0;gtxy(i,k);printf("");a[i][k+1]=1;

gtxy(i,k+1);printf("□");}}

}

j++;//方塊下移後,重新判斷刪除行是否滿行

Hang++;//記錄刪除方塊的行數

}

}

}

}

score+=100*Hang; //每刪除一行,得100分

if(Hang>0&&(score%500==0||score/500>level-1)) //得分滿500速度加快升一級

{speed-=20;level++;if(speed<200)speed+=20; }

}

❽ 求救,C++編寫一個俄羅斯方塊游戲,能通過VC6.0編譯。

為什麼一定要是MVC結構的呢?一個這樣的小東西弄成MVC那麼復雜!!!
要知道基本上真正的游戲引擎都不使用MVC架構。

❾ 俄羅斯方塊源代碼,並注釋

http://www.zz265.com/Soft/vcycx/vcgame/Soft_8728.html

❿ 環境為QT 求大神在qq上幫我看一段關於俄羅斯方塊的c++代碼

#include <windows.h>

double last_time = glfwGetTime(),
curr_time;

while (game_loop) {
curr_time = glfwGetTime();
double det_time = (curr_time - last_time);
last_time = curr_time;
fps = int(1 / det_time); //每秒幀數
interval = std::min(det_time, max_interval); //每一幀間隔時間

update(interval); //這里可以按照 interval * speed 來移動方塊
render(); //更新畫面畫出方塊

Sleep(1000 / max_fps);
}

閱讀全文

與qt俄羅斯方塊源碼親測通過編譯相關的資料

熱點內容
fib在python是什麼意思 瀏覽:532
c調用命令行 瀏覽:940
阿里雲伺服器中沒有apt 瀏覽:610
發送信息需要用戶加密嗎 瀏覽:636
六年級分數乘分數有幾種演算法 瀏覽:298
到哪裡查自己的app賬號 瀏覽:121
光大app點擊哪裡可以查年費 瀏覽:877
加密狗軟體先安裝還是先先後順序 瀏覽:354
柱頭加密區箍筋間距一般多少 瀏覽:683
美團商家版本服務中心在app哪裡 瀏覽:989
androidgps調試 瀏覽:821
比心app怎麼下載官方 瀏覽:49
安卓怎麼隱藏手機上的app 瀏覽:580
hp光纖交換機命令 瀏覽:897
pythonhive導入數據 瀏覽:674
安卓手機屏幕按住一直抖怎麼辦 瀏覽:196
壓縮率公式 瀏覽:323
藍虎app怎麼下載 瀏覽:616
周易江湖pdf 瀏覽:861
java取主機名 瀏覽:368