版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第用Java實(shí)現(xiàn)連連看小游戲很多人寫游戲都是從連連看或者五子棋這類的簡單小游戲入手的,最近我也嘗試著寫了一個連連看,想要再梳理一遍其中的思路。
連連看的規(guī)則
連連看要求在一定范圍內(nèi)找到兩個特征一樣并且能夠通過空白的通道在兩折(直角)以內(nèi)相連的東西,連續(xù)點(diǎn)擊兩個東西之后消除。
通常我們會選擇用圖片來進(jìn)行匹配,這樣更直觀有趣。
如何存儲連連看的數(shù)據(jù)
使用二維數(shù)組進(jìn)行存儲,每一個數(shù)組元素對應(yīng)一個位置上的圖片種類。
例如我們分別用1,2,3,4代表四個不同的圖片,用0代表沒有圖片;那么二維數(shù)組{{},{},{},{}}就相應(yīng)地存儲對應(yīng)位置的數(shù)據(jù)。如果要對圖片進(jìn)行變更(連連看中的消除),那么只需要改變該位置對應(yīng)的數(shù)組元素的值就行了(在這個例子中,消除就改為0)。
如何實(shí)現(xiàn)數(shù)組數(shù)據(jù)的初始化
1、一般來說連連看開始都會隨機(jī)生成圖片,此處的隨機(jī)生成需要用到Random類里面的nextInt方法,能隨機(jī)生成給定范圍內(nèi)的隨機(jī)一個整數(shù)。
2、我們生成數(shù)組的時候要考慮一個問題:連連看相同的圖片個數(shù)是偶數(shù),這樣才不會到最后形成落單的尷尬局面。
//隨機(jī)給出數(shù)組值,初始化游戲數(shù)據(jù)
publicint[][]DATA(int[][]data){
int[][]d=data;
Randomrandom=newRandom();
for(inti=0;ii++){
d[0][i]=0;
d[7][i]=0;
}
for(inti=1;ii++){
d[i][0]=0;
d[i][7]=0;
}
for(inti=0;ii++){
intm=random.nextInt(Const.Const_TYPECOUNNT)+1;
intx1=random.nextInt(Const.COL)+1;
inty1=random.nextInt(Const.COL)+1;
while(d[x1][y1]!=0){
x1=random.nextInt(Const.COL)+1;
y1=random.nextInt(Const.COL)+1;
}
d[x1][y1]=m;
intx2=random.nextInt(Const.COL)+1;
inty2=random.nextInt(Const.COL)+1;
while(d[x2][y2]!=0){
x2=random.nextInt(Const.COL)+1;
y2=random.nextInt(Const.COL)+1;
}
d[x2][y2]=m;
}
return(d);
}
如何繪制圖片
連連看的存儲都是以int的類型存儲的,可我們要呈現(xiàn)出來的效果是一張一張的圖片
先用Image導(dǎo)入所有圖片,最好圖片的命名能夠用數(shù)字命名,這樣就可以批量導(dǎo)入了。這里就不過多贅述了,看實(shí)例代碼吧:
publicvoidinit(){
imgArr=newImage[Const.Const_TYPECOUNNT];
for(inti=0;iimgArr.length;i++){
imgArr[i]=newImageIcon("llkImage/"+i+".jpg").getImage();
}
}
關(guān)于圖片大小的調(diào)整我用的是比較原始的方法:編輯圖片本身像素大?。贿€可以通過drawImage來直接規(guī)定大小。
沒有重繪的窗體在我們對其進(jìn)行拖動或者最小化等改變的時候會變成空白的,重繪就是將窗體的paint方法重寫,這樣對窗體的任何操作都會將paint方法重新寫一遍。也就是在屏幕上重新畫一遍。
我們的棋子都存在一個二維數(shù)組里面,那么我們就可以將棋子繪制的步驟放在重繪里面來實(shí)現(xiàn),那么棋子就跟窗體一樣,可以一直存在了,也可以根據(jù)數(shù)組的改變來改變。
代碼示例:
publicvoidpaint(Graphicsg){
//重繪paint方法
super.paint(g);
//
for(inti=1;iConst.COL+1;i++){
for(intj=1;jConst.ROW+1;j++){
if(data[i][j]==0){
g.setColor(newColor(69,175,198));
g.fillRect(Const.START_X+i*Const.SIZE,Const.START_Y+j*Const.SIZE,Const.SIZE,Const.SIZE);
}
else{
g.drawImage(imgArr[data[i][j]-1],Const.START_X+i*Const.SIZE,Const.START_Y+j*Const.SIZE,null);
}
}
}
連連看的實(shí)現(xiàn)算法
兩個圖片消除的方法有三種:
1.直線連接
2.一折連接
3.二折連接
其中二折連接可以找一個點(diǎn)既與其中一個圖片一折連接又與另一個圖片直線連接;一折連接又可以找一個點(diǎn)與其中一個圖片直線連接又與另一個圖片直線連接。
所以綜上所述,只需要寫出一個直線連接的判斷方法,我們所有的規(guī)則方法就都可以實(shí)現(xiàn)了。
數(shù)組的元素=0時代表這里的圖片為空,有路可走。
首先,兩個數(shù)組元素直線相連的前提是這兩個元素的橫坐標(biāo)或者縱坐標(biāo)相等且路徑上的數(shù)組元素全部為零。
代碼示例:
//0折點(diǎn)的方法
publicbooleanzero(int[][]data,intX1,intY1,intX2,intY2){
intmax;
intmin;
//x值相等
if(X1==X2){
max=Y1Y2Y1:Y2;
min=Y1Y2Y1:Y2;
for(inti=min+1;ii++){
if(data[X1][i]!=0){
returnfalse;
}
}
returntrue;
}
//y值相等
elseif(Y1==Y2){
max=X1X2X1:X2;
min=X1X2X1:X2;
for(inti=min+1;ii++){
if(data[i][Y1]!=0){
returnfalse;
}
}
returntrue;
}
elsereturnfalse;
}
//1折點(diǎn)的方法
publicbooleanone(int[][]data,intX1,intY1,intX2,intY2){
if((zero(data,X1,Y1,X1,Y2)zero(data,X1,Y2,X2,Y2)data[X1][Y2]==0)||(data[X2][Y1]==0zero(data,X1,Y1,X2,Y1)zero(data,X2,Y1,X2,Y2))){
returntrue;
}
returnfalse;
}
//2折點(diǎn)的方法
publicbooleantwo(int[][]data,intX1,intY1,intX2,intY2){
//向下尋找一個第一折點(diǎn)
for(inti=X1+1;i=Const.COL+1;i++){
if(zero(data,X1,Y1,i,Y1)one(data,i,Y1,X2,Y2)){
returntrue;
}
}
//向上尋找一個第一折點(diǎn)
for(inti=X1-1;ii--){
if(zero(data,X1,Y1,i,Y1)one(data,i,Y1,X2,Y2)){
returntrue;
}
}
//向左
for(inti=Y1-1;ii--){
if(zero(data,X1,Y1,X1,i)one(data,X1,i,X2,Y2)){
returntrue;
}
}
//向右
for(inti=Y1+1;i=Const.ROW+1;i++){
if(zero(data,X1,Y1,X1,i)one(data,X1,i,X2,Y2)){
returntrue;
}
}
returnfalse;
}
如何獲取兩次鼠標(biāo)點(diǎn)擊的位置
廢話不多說,直接上代碼:
//鼠標(biāo)點(diǎn)擊松開事件
publicvoidmouseReleased(MouseEvente){
intx,y;
Rulerule=newRule();
x=e.getX();
y=e.getY();
if(count%2==0){
X1=(x-Const.START_X)/Const.SIZE;
Y1=(y-Const.START_Y)/Const.SIZE;
count++;
}
else{
X2=(x-Const.START_X)/Const.SIZE;
Y2=(y-Const.START_Y)/Const.SIZE;
count++;
if(rule.judge(X1,Y1,X2,Y2,data)
(rule.zero(data,X1,Y1,X
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 課程審議制度
- 論代履行制度
- 2026年上半年七臺河市事業(yè)單位公開招聘工作人員132人備考考試題庫附答案解析
- 2026年聊城市中醫(yī)醫(yī)院“水城優(yōu)才”青年人才引進(jìn)參考考試題庫附答案解析
- 2026河南師范大學(xué)招聘科研助理1人備考考試試題附答案解析
- 2026云南省人力資源和社會保障廳所屬事業(yè)單位招聘12人備考考試試題附答案解析
- 2026廣東廣州市越秀區(qū)安全生產(chǎn)巡查員招聘參考考試題庫附答案解析
- 2026綿陽農(nóng)商銀行寒假實(shí)習(xí)生招聘備考考試題庫附答案解析
- 2026湖北省奕派科技高級管理崗位招聘備考考試試題附答案解析
- 閥門生產(chǎn)檢驗(yàn)制度
- 蒙古駕駛證考試題目及答案
- 頭發(fā)白轉(zhuǎn)黑課件
- 醫(yī)院藥劑科窗口服務(wù)規(guī)范化培訓(xùn)
- 家紡產(chǎn)品綠色生命周期管理
- 消化內(nèi)鏡治療進(jìn)修匯報
- 2025-2030塞爾維亞電力行業(yè)市場現(xiàn)狀供需分析及重點(diǎn)企業(yè)投資評估規(guī)劃分析研究報告
- 設(shè)備日常點(diǎn)檢管理制度
- QGDW11059.2-2018氣體絕緣金屬封閉開關(guān)設(shè)備局部放電帶電測試技術(shù)現(xiàn)場應(yīng)用導(dǎo)則第2部分特高頻法
- (高清版)DB62∕T 25-3128-2017 定型臺架綁扎預(yù)制箱梁鋼筋骨架施工規(guī)程
- 電梯更換配件勞務(wù)合同(2篇)
- 冀人版四年級科學(xué)上冊復(fù)習(xí)資料(分課)
評論
0/150
提交評論