Ⅰ QQ游戲里那游戲為什麼叫「俄羅斯方塊」
顧名思義,俄羅斯方塊自然是俄羅斯人發明的。這位偉人叫做阿列克謝·帕基特諾夫(Alexey Patnov) 。
然而,很少有人知道,這個著名的游戲在80年代曾經在法律界掀起軒然大波,那就是著名的俄羅斯方塊產權之爭。這次產權爭奪,幾家歡喜,幾家哀愁,幾家公司倒閉,幾家公司賺錢,其中的是是非非,一言難盡。
歐美列強竊取瓜分:版權之爭由此開始
1985年6月工作於莫斯科科學計算機中心的阿列克謝·帕基特諾夫在玩過一個拼圖游戲之後受到啟發,從而製作了一個以Electronica 60(一種計算機)為平台的俄羅斯方塊的游戲。後來經瓦丁·格拉西莫夫(Vadim Gerasimov)移植到PC上,並且在莫斯科的電腦界傳播。帕基特諾夫因此開始小有名氣。
PC版俄羅斯方塊在匈牙利的布達佩斯被當地的一群電腦專家移植到了Apple II 和 Commodore 64 上,這些版本的軟體引起了當時英國一個叫Andromeda的游戲公司經理羅伯特·斯坦恩(Robert Stein)的注意,他向帕基特諾夫以及匈牙利的電腦專家們收購了俄羅斯方塊的版權,並且在買到版權之前把它們倒手賣給了英國的Mirrorsoft (注意不是Microsoft!) 以及美國的Spectrum Holobyte。(什麼人……)
1986年11月斯坦恩和帕基特諾夫經過談判,就版權收購問題未取得成果。斯坦恩甚至直接飛到莫斯科和帕基特諾夫面談,但是空手而歸。由於俄羅斯人對於已經在西方興起的電子游戲產業知道不多,斯坦恩決定竊取Tetris的版權,於是他放出謠言說這是匈牙利人開發的游戲。
與此同時,PC版的俄羅斯方塊已經由英國的Mirrorsoft出品並且在歐洲銷售,受到當時人們的極大關注。不僅僅因為這個游戲好玩,而且這是「第一個來自鐵幕國家的游戲。」當時的游戲宣傳海報上有濃郁的冷戰色彩,比如戰爭畫面,加加林太空飛行等。而斯坦恩仍然沒有正式合法的版權。
1987年6月斯坦恩最終取得了在IBM-PC及其兼容機上的Tetris的版權,版權機種包括「其他任何電腦系統」。但是,他沒有和蘇聯方面簽署協議,也就是說,這個版權是不完全的。(譯者註: 這個「其他任何電腦系統」在原文中的描述是"any other computer system",這種說法在當時看來也很不嚴密,從而為後來的產權之爭埋下了伏筆)
1988年1月Tetris在電腦平台的熱銷,一時造成「洛陽紙貴」(倫敦磁碟貴??)的局面。而當CBS晚報采訪了俄羅斯方塊之父帕基特諾夫之後,斯坦恩盜竊版權的計劃徹底泡湯了。(活該!)一個新的公司ELORG(Electronorgtechinca,蘇聯一家軟體公司)開始和斯坦恩就游戲程序問題進行協商。ELORG的負責人亞歷山大·阿列欣科( Alexander Alexinko)知道斯坦恩雖然沒有版權,但是會以手中的游戲開發程序為籌碼威脅中斷談判。
Ⅱ QQ游戲俄羅斯方塊按哪個鍵是直接下落的系統說是space鍵,可我不知道哪個是space鍵。按空格鍵也沒用
space就是空格
Ⅲ 俄羅斯方塊下降的速度是通過什麼技術實現的
俄羅斯方塊實現下降速度使用編程技術:JAVA,C語言,C#。
俄羅斯方塊
俄羅斯方塊是款非常流行的小游戲,通過七個方塊的旋轉和位移,構成各種變幻莫測的圖案。而游戲者也在不斷的疊加和消除中找到樂趣。
從編程的角度來說,這個游戲混合了鍵盤事件,定時器,隨機數,滑鼠事件(如果沒有菜單,這個也不是必需的),數據結構比較清晰,演算法比較靈活,圖形是比較簡單的矩形,所以很適合剛學習完某種語言的語法又想做點什麼的初學者。
本文使用的語言包括:c(Turboc2.0,VC6.0),JAVA(Applet),c#(.NET2003)
編寫這個游戲的基本過程是:
首先,把這七個方塊用一種數據結構存儲起來
其次,在游戲中將這七個方塊隨機挑選出來並顯示在屏幕上,根據鍵盤事件進行旋轉
最後,判斷到達底部的方塊是簡單疊加還是引發消除事件
另外,對這個游戲來說,還有一些記分和過關加速的規則,這些會穿插在上面的內容中講述。
1存儲和旋轉七個方塊
對於OOP語言(JAVA,C#)來講,可以寫一個數據結構類,處理本游戲中的全部數據。在界面中調用這個類,以實現界面操作與數據結構分離。在後面展示這兩個數據結構類的時候,會發現除了語法外,這兩個類是基本相同的(把C#的類改了改,再加上鍵盤操作就成Applet了)。
對於過程化語言(c)來說,界面顯示函數與數據結構函數地位相當,所以在形式上稍微分分就行了。
1.1存儲七個方塊
普通俄羅斯方塊游戲中,只有七個基本方塊:|,Z,N,L,7,|-,O,如果加上旋轉,一共是19種方塊(要注意哦,最後一個正方形的方塊不能旋轉)。這19種方塊都可以畫在一個4*4的方格中。
於是就有兩個方法:一個是只存儲七個方塊,在游戲運行的時候計算旋轉後的方塊形狀;另一個是將19種方塊全部存儲起來,在游戲運行的時候計算取其中的哪個方塊。
另外,考慮到4*4是16,而一個int正好是16位(TC2是16位,其他的是32位),所以可以把一個方塊存儲在一個int數據中,取出的時候,判斷它的每個bit位,為1處有小方塊,為0處是空白。
分別用二維數組和bit的方法來表示這19個方塊:
int blocks_shape[19][16]={
0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,/*11*/
0,0,0,0,0,1,0,0,1,1,0,0,1,0,0,0,/*12*/
0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,/*21*/
0,0,0,0,1,0,0,0,1,1,0,0,0,1,0,0,/*22*/
0,0,0,0,1,1,1,0,1,0,0,0,0,0,0,0,/*31*/
0,0,0,0,1,0,0,0,1,0,0,0,1,1,0,0,/*32*/
0,0,0,0,0,0,1,0,1,1,1,0,0,0,0,0,/*33*/
0,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,/*34*/
0,0,0,0,1,0,0,0,1,1,1,0,0,0,0,0,/*41*/
0,0,0,0,0,1,0,0,0,1,0,0,1,1,0,0,/*42*/
0,0,0,0,1,1,1,0,0,0,1,0,0,0,0,0,/*43*/
0,0,0,0,1,1,0,0,1,0,0,0,1,0,0,0,/*44*/
0,0,0,0,0,1,0,0,1,1,1,0,0,0,0,0,/*51*/
0,0,0,0,0,1,0,0,1,1,0,0,0,1,0,0,/*52*/
0,0,0,0,0,0,0,0,1,1,1,0,0,1,0,0,/*53*/
0,0,0,0,1,0,0,0,1,1,0,0,1,0,0,0,/*54*/
0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,/*61*/
0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,/*62*/
0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,/*71*/
};
注釋里第一個數字表示方塊編號,第二個數字表示該方塊的第幾個變形。
private int[] blocks_shape = {3168,1224,1728,2244,3712,2188,736,3140,2272,1100,3616,3208,1248,1220,228,2248,3840,17476,3264};
顯然,第二種方法節約了一些內存。
1.2旋轉七個方塊
在游戲中計算旋轉後的方塊形狀:
這個其實就是考考二維坐標知識。還是不貼圖。先在腦袋裡想像一個4*4的方格,上面有個|-。|佔三個方格的長度,-佔一個。以左下角為原點,從左向右畫x軸;從下向上畫y軸。如果在游戲中想逆時針旋轉方塊,就把這個坐標軸順時針旋轉一次。多想幾遍得到結論:原來的x坐標與新的y坐標相同,原來的y坐標與新的x坐標方向正好相反。這里的「相反」意思是,原來是4,現在是1,原來是2,現在是3。語言不好表達啦,不過想通的話就很容易理解。
在游戲中計算調用19個方塊中的哪個方塊:
將19個方塊存入數組後,再設一數組告訴程序哪七個下標是七個基本方塊。比如:private int[] start_bricks = {0,2,4,8,12,16,18};每次隨機產生的方塊下標都為start_bricks里的元素。當游戲者旋轉方塊時,將當前方塊下標加1,再判斷加1後的下標是否在start_bricks里。如果在的話,說明已經是另一個形狀了,舍掉,使用start_bricks里原來的下標。最後根據此下標在blocks_shape數組中取出形狀,顯示在屏幕上。
看看代碼。
private int[] bricks = {3168,1224,1728,2244,3712,2188,736,3140,2272,1100,3616,3208,1248,1220,228,2248,3840,17476,3264};
private int[] start_bricks = {0,2,4,8,12,16,18};
/*mid是當前方塊在bricks中的下標*/
for(i=0;i<7;i++)
{
if(mid+1==start_bricks[i])
/*如果mid加1後是start_bricks中的元素*/
/*則還是取start_bricks中原來的元素,即七個基本方塊之一,不讓它變形*/
mid=start_bricks[i-1];
}
2方塊落下的處理
2.1判斷方塊已經到達底部或是否碰到牆壁
不論是用二維數組還是用bit的方法存儲的方塊,最終都需要遍歷方塊的16個小方塊中為1的地方是否將會碰到障礙物。「將會」指的是方塊如果向左,向右,向下移動後就會碰到障礙物;「障礙物」指的是左右下牆壁和底部已經落下未被消除的小方塊。
比較困難的地方,就是把為1的地方轉換為相應的坐標,用此坐標判斷是否碰到了障礙物。用旋轉的辦法比較簡單,根據旋轉的方向轉換一下坐標就可以了。如果採用存儲19個方塊的方法的話,直接看下程序:
用二維數組:
/*遍歷16個小方塊*/
for(j=0;j<16;j++)
{
/*此處有小方塊,判斷它是否碰到障礙物*/
if(blocks_shape[i][j]==1)
{
/*a,b是方塊左上角坐標,aaa,bbb是新得到的小方塊的坐標*/
aaa=a-1+j/4;
bbb=b+j%4;
if( ( aaa==h )||( aa[aaa][bbb]>0 )||( bbb<0 )||( bbb>9 ) )
/*aaa==h表示該小塊已經到達底部;aa[aaa][bbb]>0表示底部該位置已經有了小方塊*/
{
/*返回false,表示會碰到障礙物*/
return false;
}
}
}
用bit與此類似,只是多了一個移位處理:
for(int i=0;i<16;i++)
{
/*num是當前方塊的int值,a,b是當前方塊的左上角坐標*/
if( (num>>(15-i)&1)!=0 )/*此位為1*/
{
if( (a+i/4>22)||(b+i%4<0)||(b+i%4>11) )/*取得新坐標並加以判斷*/
{
flag=false;
break;
}
if( (arr[a+i/4][b+i%4]>0) )/*底部該位置是否有已經落下的小方塊*/
{
flag=false;
break;
}
}
}
2.2消除一行
判斷到方塊落下後,就開始檢查是否有滿足消除條件的行了。
規則很簡單:只要某行被小方塊全部填充,該行就被消除,上面的小方塊全部下移一行。所以,只要把原來的小方塊全部擦去,計算完新方塊位置後,再全部畫出就可以了,計算的時候,可以遍歷整個游戲區域,看有沒有可以消除的行。但是在實際編程中就會發現,這樣的設計雖然簡單,但是計算量大,而且會引起閃爍(因為是整個擦除和重畫),效果不是很好。仔細觀察這個游戲,就會發現,其實每次消除的時候,只要判斷當前方塊所在的四行就足夠了。在編程的時候,還可以為方塊設一個最高高度h,每次刷新的時候,只刷新從h到當前方塊底部的行。雖然這樣有點煩瑣,但是節約了計算時間,減少了重繪面積,效果還是挺明顯的。
另外,一些關於這個游戲演算法的介紹,有人建議把隨機產生下一個方塊的計算放在當前方塊正在下落的時候,因為那時比較空閑。總之,只要用心去想,一定會寫出代碼緊湊,資源利用合理,界面舒適的游戲。
Ⅳ QQ游戲里的俄羅斯方塊在哪找啊
你在QQ游戲的左邊點擊「比賽」,然後再點擊「家族比賽專區」,再找找,就會找到
Ⅳ QQ游戲 俄羅斯方塊
俄羅斯方塊有很多版本,都可以在電腦上玩啊,還有很多聯網的平台,可以和別人對戰,qq游戲就有
Ⅵ 哪個交友軟體里有雙人俄羅斯方塊游戲
QQ小程序。
促進兩個人感情更近一步的方式有很多,一起散步,一起吃飯,也有一起開心的玩游戲。
通過簡單的游戲娛樂,不僅放鬆了一天緊張的心情,但能讓人在平淡的生活中體會難得的開心,何樂不為呢。
Ⅶ 用c語言編寫俄羅斯方塊程序 求詳解
1、用C語言繪制圖形界面
EasyX圖形庫(http://www.easyx.cn)即TC的圖形庫在VC下的移植。
包含庫#include <graphics.h>
先初始化圖形窗口
initgraph(WINDOW_WIDTH, WINDOW_HIGH) ;WINDOW_WIDTH為窗口的寬頻,WINDOW_HIGH為窗口的高度。
清空繪圖設備
cleardevice();
設置畫筆顏色
setcolor(RED) ;
設置線條風格
setlinestyle(PS_SOLID, NULL, 0);
畫矩形
rectangle
還有畫線、顯示文字等函數,可以參照其幫助文檔。
注意:由於我們用的是EasyX圖形庫,故源文件後綴要為.cpp,但其中內容都是C的語法。
2、存儲表示出俄羅斯方塊的形狀
一、我們可以用編號,不同的編號代表不同的俄羅斯方塊,根據編號把不同方塊的畫法寫在代碼中,這樣19種
方塊就得有19種相應的代碼來描繪。而且這樣擴展性不好,若以後設計了新的方塊,則需要更改大量源代碼。
二、我們很自然的想到可用字模點陣的形式來表示,即設置一個4行4列的數組,元素置1即代表這個位置有小
方塊,元素置0即代表這個位置無小方塊,這個整個的4*4的數組組成俄羅斯方塊的形狀。
1000
1000
1100
0000
我們把俄羅斯方塊點陣的數位存在rockArray中,我們可以事先把這19種方塊的字模點陣自己轉化成十六進制,然後在rockArray數組的初始化時賦值進去。
但這樣做未免有點太費力,且擴展性也不太好,若以後設計的新方塊種類加入,要改變數組rockArray中的值。
我們可以考慮把所有俄羅斯方塊的點陣存儲在配置文件中,在程序初始化時讀取文件,把這些點陣轉換成unsigned int的變數存儲在rockArray中。
這樣,以後我們增添新的方塊形狀只需要在配置文件中增加新的點陣即可。
@###
@###
@@##
####(為使得看起來更醒目,我們用@表示1,用#表示0)
3、讓圖形動起來
在某位置處用函數DrawRock在屏幕上畫出俄羅斯方塊,然後再擦除掉(即用背景色在原位置處重繪一次方塊),最後在下落的下一個位置處用函數DrawRock在屏幕上畫出俄羅斯方塊,如此循環,中間用計時器間隔一段時間以控制下落的速度。
同理,按下屏幕的左右鍵也是如此,只是在按下鍵盤時把方塊的位置重新計算了。
那麼按下上方向鍵時,如何讓方塊翻轉呢?
我們在配置文件中就把方塊的順時針翻轉形態放在了一起:
@###
@###
@@##
####
@@@#
@###
####
####
@@##
#@##
#@##
####
##@#
@@@#
####
####
我們每按一次上方向鍵改變一次方塊的形狀即可。若一直按上鍵,形狀應該是循環地翻滾。
我們想到了循環鏈表的數據結構可實現這個效果。
可是我們若把這些一種類的方塊的各種形態串成循環鏈表形式,那麼每次重新生成方塊時我們就難以隨機地生成方塊了。
故還是得用數組來存儲,但又要有循環鏈表的功能,於是我們想到了靜態循環鏈表。
我們用結構體來作為一個方塊在rockArray中的元素
typedef struct ROCK
{ //用來表示方塊的形狀(每一個位元組是8位,用每4位表示方塊中的一行)
unsigned int rockShapeBits ;
int nextRockIndex ; //下一個方塊,在數組中的下標
} RockType ;
這樣,當我們按下上方向鍵時,把傳入函數DrawRock中的rockIndex變為當前方塊結構體中的nextRockIndex即可。
Ⅷ QQ游戲俄羅斯方塊
有兩種方法,首先是常規的。在控制面板里 ---鍵盤 ---速度 重復延遲 調到最短,這樣就快了。
第二種是用插件的,例如用火拚俄羅斯鍵盤加速器,可以加快鍵盤反應速度。
Ⅸ QQ俄羅斯方塊
完全空的+用道具消不掉+突然死了
應該是你的電腦太慢的
別人給你用道具反映慢顯示不出來
你用道具反映更慢就乾脆不顯示了
最後因為太慢了所以死了
原來我的電腦也經常出現這些狀況
是電腦運行速度太慢
我的解決辦法的刪除不需要的東西
游戲時只開游戲,不同時運行其他程序了