欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java實(shí)現(xiàn)中國(guó)象棋游戲

 更新時(shí)間:2022年05月10日 11:32:39   作者:Seven、琪  
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)中國(guó)象棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(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)

    這篇文章主要為大家介紹了groovy腳本定義結(jié)構(gòu)表一鍵生成POJO類(lèi)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • Java API操作HDFS方法詳細(xì)講解

    Java API操作HDFS方法詳細(xì)講解

    這篇文章主要介紹了Java API操作Hdfs詳細(xì)示例,遍歷當(dāng)前目錄下所有文件與文件夾,可以使用listStatus方法實(shí)現(xiàn)上述需求,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-02-02
  • Java圖片轉(zhuǎn)字符圖片的生成方法

    Java圖片轉(zhuǎn)字符圖片的生成方法

    本文主要實(shí)現(xiàn)了將一張圖片轉(zhuǎn)成字符圖片,同樣可以遍歷每個(gè)像素點(diǎn),然后將像素點(diǎn)由具體的字符來(lái)替換,從而實(shí)現(xiàn)字符化處理,感興趣的可以了解一下
    2021-11-11
  • java多線程開(kāi)啟的三種方式你知道嗎

    java多線程開(kāi)啟的三種方式你知道嗎

    這篇文章主要為大家詳細(xì)介紹了java多線程開(kāi)啟的三種方式,使用數(shù)據(jù)庫(kù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下<BR>
    2022-02-02
  • IDEA創(chuàng)建parent項(xiàng)目(聚合項(xiàng)目)

    IDEA創(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-08
  • SpringBoot集成阿里云OSS圖片上傳

    SpringBoot集成阿里云OSS圖片上傳

    這篇文章主要為大家詳細(xì)介紹了SpringBoot集成阿里云OSS圖片上傳,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • SpringBoot項(xiàng)目啟動(dòng)打包報(bào)錯(cuò)類(lèi)文件具有錯(cuò)誤的版本 61.0, 應(yīng)為 52.0的解決方法

    SpringBoot項(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-11
  • SpringBoot+MyBatis-Plus實(shí)現(xiàn)分頁(yè)功能

    SpringBoot+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開(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í)的套路

    深入詳解Java中synchronized鎖升級(jí)的套路

    synchronized鎖是啥?鎖其實(shí)就是一個(gè)對(duì)象,隨便哪一個(gè)都可以,Java中所有的對(duì)象都是鎖,換句話說(shuō),Java中所有對(duì)象都可以成為鎖。本文我們主要來(lái)聊聊synchronized鎖升級(jí)的套路,感興趣的可以收藏一下
    2023-04-04

最新評(píng)論