Java實(shí)現(xiàn)中國(guó)象棋游戲
本文實(shí)例為大家分享了Java實(shí)現(xiàn)中國(guó)象棋游戲的具體代碼,供大家參考,具體內(nèi)容如下
實(shí)現(xiàn)一個(gè)小游戲需要知道從哪里下手,一步步實(shí)現(xiàn)和完善,對(duì)于一個(gè)中國(guó)象棋的小游戲,我們可以按這樣的順序展開(kāi):
一、界面
下棋的棋盤(pán)首先要準(zhǔn)備好,這就是一個(gè)合適大小合適比例合適位置的界面,然后在窗體上畫(huà)上(沒(méi)錯(cuò)drawLine的那種畫(huà)上)n條直線和斜線,具體數(shù)值根據(jù)你的界面大小設(shè)置。這樣畫(huà)出的界面整齊好看~
public void paint(Graphics g){ ?? ??? ? ?? ??? ?super.paint(g);//重寫(xiě)畫(huà)圖函數(shù) ?? ??? ?Font f=new Font("微軟雅黑",Font.BOLD,30); ?? ??? ?g.setFont(f); ?? ??? ? ?? ??? ?g.drawRect(60, 50, 500, 560);//外圈 ?? ??? ?g.drawRect(70, 60, 480, 540);//內(nèi)圈 ?? ??? ?//橫線部分 ?? ??? ?int length=60; ?? ??? ?for(int i=0;i<9;i++){ ?? ??? ??? ?g.drawLine(70, length, 550, length); ?? ??? ??? ?length+=60; ?? ??? ?} ?? ??? ?//中間漢字 ?? ? ? ?g.drawString("楚河", 160, 340); ?? ? ? ?g.drawString("漢界", 400, 340); ?? ??? ?//豎線部分 ?? ??? ?length=130; ?? ??? ?for(int i=0;i<7;i++){ ?? ??? ??? ?//上半部分豎線 ?? ??? ??? ?g.drawLine( length,60, length,300); ?? ??? ??? ?//下半部分豎線 ?? ??? ??? ?g.drawLine( length,360, length,600); ?? ??? ??? ?length+=60; ?? ??? ?} ?? ??? ?//上半部分九宮格斜線 ?? ??? ?g.drawLine(250, 60, 370, 180); ?? ? ?? ?g.drawLine(370, 60, 250, 180); ?? ? ?? ?//下半部分九宮格斜線 ?? ? ?? ?g.drawLine(250, 480, 370, 600); ?? ? ?? ?g.drawLine(250, 600, 370, 480); ?? ?? ?? ?}
二、按鈕
畫(huà)好棋盤(pán)之后加上功能按鈕,這個(gè)時(shí)候的功能暫時(shí)不考慮實(shí)現(xiàn),可以根據(jù)喜好隨意添加。這里推薦將按鈕類(lèi)型設(shè)置成數(shù)組,便于及時(shí)增刪。
//添加到面板上 ?? ??? ?String[] type = {"開(kāi)始游戲","重新開(kāi)始","認(rèn) 輸","悔 棋"}; ?? ??? ?for(int i=0;i<type.length;i++){ ?? ??? ??? ?Button btn = new Button(type[i]); ?? ??? ??? ?btn.setPreferredSize(new Dimension(150,50)); ?? ??? ??? ?anniu.add(btn); ?? ??? ?}
這個(gè)時(shí)候你會(huì)發(fā)現(xiàn)在加按鈕的地方貼的十分緊湊,我的解決辦法是在這一塊面板上再加一個(gè)面板設(shè)置為白色覆蓋在上面,這樣根據(jù)面板的流式布局按鈕就會(huì)下移,調(diào)整空白面板的寬度可以改變按鈕的位置。
三、加棋子
將找到的棋子圖片加到棋盤(pán)交叉的位置上才是給棋盤(pán)注入靈魂,將所有的十四類(lèi)圖片加到package中以便程序之后可以在其他電腦上運(yùn)行(這里推薦png格式,jpg格式會(huì)有方形邊框)。
接下來(lái)分三步走
1.創(chuàng)建一個(gè)10行9列的整數(shù)數(shù)組,用來(lái)存儲(chǔ)每個(gè)位置的數(shù)據(jù);
2.創(chuàng)建一個(gè)長(zhǎng)度為14的Image數(shù)組,用來(lái)與棋子類(lèi)型對(duì)應(yīng);
3.遍歷整數(shù)數(shù)組畫(huà)出對(duì)應(yīng)的棋子;
這是棋盤(pán)的直觀圖,也就是我們的整數(shù)數(shù)組的初始值:
將Image與棋子圖片對(duì)應(yīng):
//初始化給每個(gè)chess定義 ?? ??? ?for(int k=0; k<14; k++){ ?? ??? ??? ?chess[k] = new ImageIcon(this.getClass().getResource((k+1)+".png")).getImage(); ?? ??? ?}
遍歷畫(huà)圖:
//根據(jù)棋盤(pán)布局 ?? ??? ?for(int i=0;i<place.length;i++){ ?? ??? ??? ?for(int j=0;j<place[0].length;j++){ ?? ??? ??? ??? ?if(place[i][j] >0){ ?? ??? ??? ??? ??? ?bg.drawImage(chess[place[i][j]-1], chessX+60*j, chessY+60*i, 50, 50, null);? ?? ??? ??? ??? ?} ?? ??? ??? ?} ?? ??? ?}
四、實(shí)現(xiàn)棋子的移動(dòng)
通過(guò)函數(shù)獲得鼠標(biāo)拖動(dòng)前后兩個(gè)點(diǎn)所代表的棋盤(pán)上的位置,并將這兩個(gè)位置的二維數(shù)組的值交換,然后重新繪圖實(shí)現(xiàn)棋子的移動(dòng)。
int x1, y1, x2, y2; public void mousePressed(MouseEvent e) { ?? ??? ? ?? ??? ??? ?x1 = e.getX(); ?? ??? ??? ?y1 = e.getY(); ?? ??? ??? ?x1 = getj(x1); ?? ??? ??? ?y1 = geti(y1); ?? ?} ?? ?public void mouseReleased(MouseEvent e) { ?? ??? ? ?? ??? ??? ?x2 = e.getX(); ?? ??? ??? ?y2 = e.getY(); ?? ??? ??? ?x2 = getj(x2); ?? ??? ??? ?y2 = geti(y2); ?? ?} ?? ?//根據(jù)點(diǎn)的坐標(biāo)得到其代表的位置,具體參數(shù)可以微調(diào),我的格子是60x60大小 ?? ?public int getj(int x){ ?? ??? ?return (x-50)/60; ?? ?} ?? ?public int geti(int y){ ?? ??? ?return (y-40)/60; ?? ?}
這個(gè)時(shí)候遇到的狀況就是你每次移動(dòng)一次之后,整個(gè)界面都要重繪一次,而畫(huà)面是直接畫(huà)在窗體上的,數(shù)據(jù)會(huì)直接傳到電腦硬件,這樣一來(lái)畫(huà)圖速度就慢了,所以會(huì)出現(xiàn)每走一步界面就閃爍一次的情況,這種情況下,我們可以將畫(huà)面先存在緩存中,就不經(jīng)過(guò)硬件直接畫(huà)出來(lái),這樣效率就可以明顯提高。
BufferedImage buffer = new BufferedImage(this.getWidth(), this.getHeight(), BufferedImage.TYPE_INT_ARGB); Graphics bg = buffer.getGraphics(); //這個(gè)中間寫(xiě)的是你畫(huà)界面的方法,也就是上面提到的paint方法內(nèi)部 //...... //繪制緩存到窗體上 g.drawImage(buffer, 0, 0, null);
五、判斷勝負(fù)
率先吃掉對(duì)方帥或?qū)⒌年?duì)伍獲勝,寫(xiě)一個(gè)函數(shù)判斷誰(shuí)勝誰(shuí)負(fù)顯示勝局,同時(shí)將數(shù)據(jù)初始化為0,準(zhǔn)備再來(lái)一局:
(showMessageDialog方法可以直接跳出一個(gè)框)
//判斷游戲結(jié)束并顯示勝局 public void isWine() { ?? ??? ? ?? ??? ?System.out.println(place[y1][x1]+" "+place[y2][x2]); ?? ??? ?if (place[y2][x2]==7&&place[y1][x1]!=0) { ?? ??? ??? ?place[y2][x2] = place[y1][x1]; ?? ??? ??? ?place[y1][x1] = 0; ?? ??? ??? ?UI.repaint(); ?? ??? ??? ?JOptionPane.showMessageDialog(null, "黑方 ?勝利!"); ?? ??? ??? ?again(); ?? ??? ?} else if(place[y2][x2]==14&&place[y1][x1]!=0) { ?? ??? ??? ?place[y2][x2] = place[y1][x1]; ?? ??? ??? ?place[y1][x1] = 0; ?? ??? ??? ?UI.repaint(); ?? ??? ??? ?JOptionPane.showMessageDialog(null, "紅方 ?勝利!"); ?? ??? ??? ?again(); ?? ??? ?} ?? ?} ?? ?//游戲結(jié)束時(shí)要重繪 ?? ?public void again(){ ?? ??? ? ?for(int i=0; i<place.length; i++){ ?? ??? ? ??? ? ?? ??? ? ??? ?for(int j=0; j<place[0].length; j++){ ?? ??? ? ??? ??? ? ?? ??? ? ??? ??? ?place[i][j] = 0; ?? ??? ? ??? ?} ?? ??? ? } ?? ?}
六、按鈕“開(kāi)始游戲”和“重新開(kāi)始”的實(shí)現(xiàn)
加動(dòng)作監(jiān)聽(tīng)器
public void actionPerformed(ActionEvent e) { ?? ??? ? ?? ??? ?type = e.getActionCommand(); ?? ??? ?if("開(kāi)始游戲".equals(type)||"重新開(kāi)始".equals(type)){ ?? ??? ??? ?x=0; ?? ??? ??? ?count = 1;//這里要把每次的走棋方刷新,認(rèn)輸時(shí)也需要刷新 ?? ??? ??? ?init(); ?? ??? ??? ?UI.repaint(); ?? ??? ?} ?? ?} ?? ?//初始化place坐標(biāo) ?? ?public void init(){ ?? ? ? ?/*紅兵 1.png ?? ? ? ? *紅炮 2.png ?? ? ? ? *紅車(chē) 3.png ?? ? ? ? *紅馬 4.png ?? ? ? ? *紅相 5.png ?? ? ? ? *紅仕 6.png ?? ? ? ? *紅帥 7.png ?? ? ? ? *黑卒 8.png ?? ? ? ? *黑炮 9.png ?? ? ? ? *黑車(chē) 10.png ?? ? ? ? *黑馬 11.png ?? ? ? ? *黑象 12.png ?? ? ? ? *黑士 13.png ?? ? ? ? *黑將 14.png ?? ? ? ? */ ?? ? ? ? ?? ??? ??? ? ?? ??? ?for(int i=0;i<place.length;i++){ ?? ??? ??? ??? ? ?? ??? ??? ?for(int j=0;j<place[0].length;j++){ ?? ??? ??? ??? ??? ??? ??? ? ?? ??? ??? ??? ?place[i][j] = 0; ?? ??? ??? ?} ?? ??? ?} ?? ??? ??? ?place[0][0] = 10;?? ?place[9][0] = 3; ?? ??? ??? ?place[0][1] = 11;?? ?place[9][1] = 4; ?? ??? ??? ?place[0][2] = 12;?? ?place[9][2] = 5; ?? ??? ??? ?place[0][3] = 13;?? ?place[9][3] = 6; ?? ??? ??? ?place[0][4] = 14;?? ?place[9][4] = 7; ?? ??? ??? ?place[0][5] = 13;?? ?place[9][5] = 6; ?? ??? ??? ?place[0][6] = 12;?? ?place[9][6] = 5; ?? ??? ??? ?place[0][7] = 11;?? ?place[9][7] = 4; ?? ??? ??? ?place[0][8] = 10;?? ?place[9][8] = 3; ?? ??? ??? ?place[2][1] = 9;?? ?place[7][1] = 2; ?? ??? ??? ?place[2][7] = 9;?? ?place[7][7] = 2; ?? ??? ??? ?place[3][0] = 8;?? ?place[6][0] = 1; ?? ??? ??? ?place[3][2] = 8;?? ?place[6][2] = 1; ?? ??? ??? ?place[3][4] = 8;?? ?place[6][4] = 1; ?? ??? ??? ?place[3][6] = 8;?? ?place[6][6] = 1; ?? ??? ??? ?place[3][8] = 8;?? ?place[6][8] = 1; ?? ??? ??? ? ?? ?}?? ?
這里的init函數(shù)是給整數(shù)二維數(shù)組初始化為開(kāi)局后遍歷可以加上棋子的狀態(tài)。
七、加規(guī)則
//規(guī)定各個(gè)棋子的移動(dòng)規(guī)則 public boolean rule(int gi, int gj,int si, int sj){ ?? ??? ?int x = place[gi][gj]; ?? ??? ?int y = place[si][sj]; ?? ??? ?int start, end; ?? ??? ? ?? ??? ?//判斷為何種棋子 ?? ??? ?//車(chē):只能走直線 ?? ??? ?if(x == 3||x == 10){ ?? ??? ??? ? ?? ??? ??? ?if(gi != si&&gj != sj)?? ?return false; ?? ??? ??? ?else if(gi == si){ ?? ??? ??? ??? ?start = Math.min(gj, sj); ?? ??? ??? ??? ?end = Math.max(gj, sj); ?? ??? ??? ??? ?for(int m = 1; m < end - start; m++){ ?? ??? ??? ??? ??? ?if(place[gi][start+m] != 0)?? ?return false; ?? ??? ??? ??? ?} ?? ??? ??? ??? ?return true; ?? ??? ??? ?} ?? ??? ??? ?else if(gj == sj){ ?? ??? ??? ??? ?start = Math.min(gi, si); ?? ??? ??? ??? ?end = Math.max(gi, si); ?? ??? ??? ??? ?for(int m = 1; m < end - start; m++){ ?? ??? ??? ??? ??? ?if(place[start+m][gj] != 0)?? ?return false; ?? ??? ??? ??? ?} ?? ??? ??? ??? ?return true;? ?? ??? ??? ?} ?? ??? ??? ?else return true; ?? ??? ?} ?? ??? ?//馬:走日,且某個(gè)位置不可以有棋子 ?? ??? ?else if(x == 4||x == 11){ ?? ??? ??? ?//下 ?? ??? ??? ?if(si - gi == 2&&Math.abs(gj-sj) == 1&&place[gi+1][gj] == 0)?? ?return true; ?? ??? ??? ?//上 ?? ??? ??? ?else if(gi - si == 2&&Math.abs(gj-sj) == 1&&place[gi-1][gj] == 0)?? ?return true; ?? ??? ??? ?//右 ?? ??? ??? ?else if(sj - gj == 2&&Math.abs(gi-si) == 1&&place[gi][gj+1] == 0)?? ?return true; ?? ??? ??? ?//左 ?? ??? ??? ?else if(gj - sj == 2&&Math.abs(gi-si) == 1&&place[gi][gj-1] == 0)?? ?return true; ?? ??? ??? ?//否則不可以走 ?? ??? ??? ?else return false; ?? ??? ?} ?? ??? ?//相:走田,且不能過(guò)河 ?? ??? ?else if(x == 5||x == 12){ ?? ??? ??? ?//左上 ?? ??? ??? ?if(gi - si == 2&&gj - sj == 2&&place[gi-1][gj-1] == 0){ ?? ??? ??? ??? ? ?? ??? ??? ??? ?if((x == 5&&si >= 5)||(x == 12&&si < 5))?? ?return true; ?? ??? ??? ??? ?else return false; ?? ??? ??? ?} ?? ??? ??? ?//右上 ?? ??? ??? ?else if(gi - si == 2&&sj - gj == 2&&place[gi-1][gj+1] == 0){ ?? ??? ??? ??? ? ?? ??? ??? ??? ?if((x == 5&&si >= 5)||(x == 12&&si < 5))?? ?return true; ?? ??? ??? ??? ?else return false; ?? ??? ??? ?} ?? ??? ??? ?//左下 ?? ??? ??? ?else if(si - gi == 2&&gj - sj == 2&&place[gi+1][gj-1] == 0){ ?? ??? ??? ??? ? ?? ??? ??? ??? ?if((x == 5&&si >= 5)||(x == 12&&si < 5))?? ?return true; ?? ??? ??? ??? ?else return false; ?? ??? ??? ?} ?? ??? ??? ?//右下 ?? ??? ??? ?else if(si - gi == 2&&sj - gj == 2&&place[gi+1][gj+1] == 0){ ?? ??? ??? ??? ? ?? ??? ??? ??? ?if((x == 5&&si >= 5)||(x == 12&&si < 5))?? ?return true; ?? ??? ??? ??? ?else return false; ?? ??? ??? ?} ?? ??? ??? ?else return false; ?? ??? ?} ?? ??? ?//士:斜著走不能出田字格 ?? ??? ?else if(x == 6||x == 13){ ?? ??? ??? ? ?? ??? ??? ?if(Math.abs(gj-sj)==1&&Math.abs(gi-si)==1){ ?? ??? ??? ??? ? ?? ??? ??? ??? ?if(x == 6&&si >= 7&&sj >= 3&&sj <= 5)?? ?return true; ?? ??? ??? ??? ?else if(x == 13&&si <= 2&&sj >= 3&&sj <= 5)?? ?return true; ?? ??? ??? ??? ?else return false; ?? ??? ??? ?} ?? ??? ??? ?else return false; ?? ??? ?} ?? ??? ?//將:不能出田字格且不能會(huì)面 ?? ??? ?else if(x == 7||x == 14){ ?? ??? ??? ? ?? ??? ??? ?if((Math.abs(gj-sj)==1&&gi - si ==0)||(gj - sj ==0&&Math.abs(gi-si)==1)){ ?? ??? ??? ??? ? ?? ??? ??? ??? ?if(x == 7&&si >= 7&&sj >= 3&&sj <= 5)?? ?return true; ?? ??? ??? ??? ?else if(x == 14&&si <= 2&&sj >= 3&&sj <= 5)?? ?return true; ?? ??? ??? ??? ?else return false; ?? ??? ??? ?} ?? ??? ??? ?else return false; ?? ??? ??? ? ?? ??? ?} ?? ??? ?//炮:隔一個(gè) ?? ??? ?else if(x == 2||x == 9){ ?? ??? ??? ? ?? ??? ??? ?//若要吃棋子,必須中間有且只有一枚棋子 ?? ??? ??? ?if(x*y!=0){ ?? ??? ??? ??? ?int t = 0; ?? ??? ??? ??? ?if(gi == si){ ?? ??? ??? ??? ??? ?for(int m = Math.min(gj, sj); m <= Math.max(gj, sj); m++){ ?? ??? ??? ??? ??? ??? ?if(place[gi][m] != 0)?? ?t++; ?? ??? ??? ??? ??? ?} ?? ??? ??? ??? ?} ?? ??? ??? ??? ?else if(gj == sj){ ?? ??? ??? ??? ??? ?for(int m = Math.min(gi, si); m <= Math.max(gi, si); m++){ ?? ??? ??? ??? ??? ??? ?if(place[m][gj] != 0)?? ?t++; ?? ??? ??? ??? ??? ?} ?? ??? ??? ??? ?} ?? ??? ??? ??? ?if(t == 3)?? ?return true; ?? ??? ??? ??? ? ?? ??? ??? ?}?? ? ?? ??? ??? ??? ? ?? ??? ??? ?//若為不吃棋子的情況,中間不可以有其他棋子,且只能走直線 ?? ??? ??? ?else { ?? ??? ??? ??? ?int t = 0; ?? ??? ??? ??? ?if(gi == si){ ?? ??? ??? ??? ??? ?for(int m = Math.min(gj, sj); m <= Math.max(gj, sj); m++){ ?? ??? ??? ??? ??? ??? ?if(place[gi][m] != 0)?? ?t++; ?? ??? ??? ??? ??? ?} ?? ??? ??? ??? ?} ?? ??? ??? ??? ?else if(gj == sj){ ?? ??? ??? ??? ??? ?for(int m = Math.min(gi, si); m <= Math.max(gi, si); m++){ ?? ??? ??? ??? ??? ??? ?if(place[m][gj] != 0)?? ?t++; ?? ??? ??? ??? ??? ?} ?? ??? ??? ??? ?} ?? ??? ??? ??? ?if(t == 1) return true; ?? ??? ??? ??? ?else return false; ?? ??? ??? ?} ?? ??? ?} ?? ??? ?//兵:不能后退,且過(guò)了河才可以左右移動(dòng) ?? ??? ?else if(x == 1||x == 8){ ?? ??? ??? ?//判斷是否過(guò)河 ?? ??? ??? ?if(x == 1){ ?? ??? ??? ??? ?if(gi >=5){ ?? ??? ??? ??? ??? ?if(gi - si == 1&&gj == sj)?? ?return true; ?? ??? ??? ??? ??? ?else return false; ?? ??? ??? ??? ?} ?? ??? ??? ??? ?else if((gi - si == 1&&sj - gj == 0)||(gi - si == 0&&Math.abs(sj-gj) == 1))?? ?return true; ?? ??? ??? ??? ?else return false; ?? ??? ??? ?} ?? ??? ??? ?else if(x == 8){ ?? ??? ??? ??? ?if(gi <5){ ?? ??? ??? ??? ??? ?if(si - gi == 1&&gj == sj)?? ?return true; ?? ??? ??? ??? ??? ?else return false; ?? ??? ??? ??? ?} ?? ??? ??? ??? ?else if(((si - gi == 1&&sj - gj == 0))||(gi - si == 0&&Math.abs(sj-gj) == 1))?? ?return true; ?? ??? ??? ??? ?else return false; ?? ??? ??? ?} ?? ??? ??? ?else return false; ?? ??? ?} ?? ??? ? ?? ??? ?return false; ?? ?}
長(zhǎng)長(zhǎng)的一大串,這里對(duì)于炮和將需單獨(dú)考慮,炮有直行和隔一個(gè)兩種走法,需分開(kāi)考慮,而將就更是麻煩
//判斷將是否會(huì)面 public boolean meet(){ ?? ??? ?int jiangi=0, jiangj=0, shuaii=0, shuaij=0, temp=0; ?? ??? ?for(int i=0; i<10; i++){ ?? ??? ??? ?for(int j=0; j<9; j++){ ?? ??? ??? ??? ?if(place[i][j]==7){ ?? ??? ??? ??? ??? ?shuaii = i; ?? ??? ??? ??? ??? ?shuaij = j; ?? ??? ??? ??? ?} ?? ??? ??? ??? ?else if(place[i][j]==14){ ?? ??? ??? ??? ??? ?jiangi = i; ?? ??? ??? ??? ??? ?jiangj = j; ?? ??? ??? ??? ?} ?? ??? ??? ?} ?? ??? ?} ?? ??? ?if(shuaij == jiangj){ ?? ??? ??? ?for(int i=jiangi+1; i<shuaii; i++){ ?? ??? ??? ??? ?if(place[i][shuaij] != 0)?? ?temp++; ?? ??? ??? ?} ?? ??? ?} ?? ??? ?else return false;//沒(méi)會(huì)面 ?? ??? ?if(temp != 0)?? ?return false;//沒(méi)會(huì)面 ?? ??? ?else return true;//會(huì)面了 ?? ?}
八、輪次
紅黑輪流下棋
我單獨(dú)寫(xiě)了一個(gè)方法判斷將是否會(huì)面,因?yàn)閷?dǎo)致將會(huì)面的不僅是將自身的移動(dòng)導(dǎo)致,還可能是其他棋子的移動(dòng),所以也是一個(gè)boolean函數(shù),只有同時(shí)滿足前一個(gè)函數(shù)以及這個(gè)函數(shù)返回的是不會(huì)面,才可以移動(dòng),移動(dòng)時(shí)我定義了一個(gè)參數(shù)x記錄局?jǐn)?shù),根據(jù)他的奇偶判斷輪到哪一方走。這樣就實(shí)現(xiàn)了象棋的規(guī)則。
九、悔棋
難免會(huì)有失誤,加上悔棋功能更合適。
我們?cè)诮粨Q兩個(gè)點(diǎn)的值時(shí)(或者吃子的情況)需記錄下之前的值,然后當(dāng)動(dòng)作監(jiān)聽(tīng)器監(jiān)聽(tīng)到點(diǎn)擊悔棋時(shí)又交換回來(lái)。
一次只能悔棋一次,且剛開(kāi)始時(shí)棋子沒(méi)有移動(dòng)不能悔棋。
十、背景 及 提示
加上自己挑的背景,并為了方便下棋,標(biāo)注輪到哪一方。
加背景可以用到畫(huà)棋子同樣的方法,所以要畫(huà)在棋盤(pán)前面,防止被覆蓋住。
這樣加上去又有一個(gè)很明顯的問(wèn)題,就是你每操作一次右邊的按鈕都會(huì)消失,被你的背景圖覆蓋了,這怎么辦呢?
于是乎,又總結(jié)出了三種方法:
1.重寫(xiě)按鈕的paint方法;
2.將按鈕以菜單的形式加在左上角;
3.將按鈕直接p在背景圖上(截圖),再畫(huà)就可以了;
此外你還可以在背景圖上加上“當(dāng)前下棋方”的字樣,在邊上顯示當(dāng)前下棋方將領(lǐng)的圖片。
這里借用了count參數(shù)并將其傳到了監(jiān)聽(tīng)器中,重寫(xiě)了構(gòu)造函數(shù)。
int count=1; if(listener.count==1){ ?? ??? ??? ?//畫(huà)帥 ?? ??? ?bg.drawImage(chess[6], 708, 322, 50, 50, null);? ?? ?}else if(listener.count==-1){ ?? ??? ??? ?//畫(huà)將 ?? ??? ?bg.drawImage(chess[13], 708, 322, 50, 50, null);? }
每下一子,count×(-1),以此標(biāo)記是哪一方并畫(huà)圖。
附一張成果圖:
最后導(dǎo)出到電腦上,這樣就完成了一個(gè)中國(guó)象棋的小游戲。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
groovy腳本定義結(jié)構(gòu)表一鍵生成POJO類(lèi)
這篇文章主要為大家介紹了groovy腳本定義結(jié)構(gòu)表一鍵生成POJO類(lèi)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03IDEA創(chuàng)建parent項(xiàng)目(聚合項(xiàng)目)
這篇文章主要介紹了IDEA創(chuàng)建parent項(xiàng)目(聚合項(xiàng)目),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08SpringBoot項(xiàng)目啟動(dòng)打包報(bào)錯(cuò)類(lèi)文件具有錯(cuò)誤的版本 61.0, 應(yīng)為 52.0的解決
這篇文章主要給大家介紹了關(guān)于SpringBoot項(xiàng)目啟動(dòng)打包報(bào)錯(cuò)類(lèi)文件具有錯(cuò)誤的版本 61.0, 應(yīng)為 52.0的解決方法,文中有詳細(xì)的排查過(guò)程和解決方法,通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-11-11SpringBoot+MyBatis-Plus實(shí)現(xiàn)分頁(yè)功能
在SpringBoot項(xiàng)目中,結(jié)合MyBatis-Plus(簡(jiǎn)稱(chēng)MP)可以非常方便地實(shí)現(xiàn)分頁(yè)功能,MP為開(kāi)發(fā)者提供了分頁(yè)插件PaginationInterceptor,只需簡(jiǎn)單配置即可使用,本文給大家介紹了SpringBoot+MyBatis-Plus實(shí)現(xiàn)分頁(yè)功能,文中通過(guò)代碼示例給大家介紹的非常詳細(xì),需要的朋友可以參考下2024-01-01一步步教你搭建Scala開(kāi)發(fā)環(huán)境(非常詳細(xì)!)
Scala是一門(mén)基于jvm的函數(shù)式的面向?qū)ο缶幊陶Z(yǔ)言,擁有比java更加簡(jiǎn)潔的語(yǔ)法,下面這篇文章主要給大家介紹了關(guān)于搭建Scala開(kāi)發(fā)環(huán)境的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2022-04-04深入詳解Java中synchronized鎖升級(jí)的套路
synchronized鎖是啥?鎖其實(shí)就是一個(gè)對(duì)象,隨便哪一個(gè)都可以,Java中所有的對(duì)象都是鎖,換句話說(shuō),Java中所有對(duì)象都可以成為鎖。本文我們主要來(lái)聊聊synchronized鎖升級(jí)的套路,感興趣的可以收藏一下2023-04-04