java如何实现简单中国象棋
发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇文章主要讲解了"java如何实现简单中国象棋",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"java如何实现简单中国象棋"吧!运行效果代码impor
千家信息网最后更新 2026年11月01日java如何实现简单中国象棋
这篇文章主要讲解了"java如何实现简单中国象棋",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"java如何实现简单中国象棋"吧!
运行效果
代码
import java.awt.Canvas;import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;import java.awt.image.BufferedImage;import java.util.Random;import java.util.Stack;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JOptionPane;public class Chinesechese extends Canvas implements MouseListener { class Record{ int fromx,fromy,tox,toy,fromindex,toindex; Record(int fromx,int fromy,int tox,int toy,int fromindex,int toindex){ this.fromx=fromx; this.fromy=fromy; this.tox=tox; this.toy=toy; this.fromindex=fromindex; this.toindex=toindex; } } int take_x=-1,take_y=-1,player=0; boolean isRuning=true; int table[][]=new int[10][11]; String name[]= {"","将","仕","像","傌","俥","炮","卒","帅","士","相","马","车","炮","兵"}; int value[]= {0,1000,30,30,50,200,100,30,-1000,-30,-30,-50,-200,-100,-30}; int init_table[]= {0,5,4,3,2,1,2,3,4,5}; Random radom=new Random(); BufferedImage map = new BufferedImage(500, 600, BufferedImage.TYPE_INT_RGB); BufferedImage offScreenImage = new BufferedImage(500, 600, BufferedImage.TYPE_INT_RGB); BufferedImage runImage = new BufferedImage(500, 600, BufferedImage.TYPE_INT_RGB); Stack recordstk=new Stack(); Chinesechese(){ this.addMouseListener(this); this.setBounds(150, 0,500, 600); this.setBackground(Color.BLACK); Graphics g=map.getGraphics(); g.setColor(Color.WHITE); g.fillRect(0, 0, 500, 570); g.setColor(Color.black); g.setFont(new Font("Dialog",0,35)); g.drawString(" 楚河 汉界", 130, 285); for(int i=0;i<9;i++) { g.drawLine(i*50+50,30+10, i*50+50, 230+10); g.drawLine(i*50+50,300+10, i*50+50,500+10); } for(int i=0;i<5;i++)g.drawLine(50, 30+i*50+10, 450, 30+i*50+10); for(int i=0;i<5;i++)g.drawLine(50, 300+i*50+10, 450, 300+i*50+10); g.drawLine(50, 230, 50, 330); g.drawLine(450, 230, 450, 330); g.drawLine(200, 30+10, 300, 130+10); g.drawLine(200, 130+10, 300, 30+10); g.drawLine(200, 400+10, 300, 500+10); g.drawLine(200, 500+10, 300, 400+10); for(int i=0;i<10;i++)table[i][1]=init_table[i]; for(int i=0;i<10;i++)table[i][10]=init_table[i]+7; for(int i=1;i<10;i+=2)table[i][4]=7; for(int i=1;i<10;i+=2)table[i][7]=14; table[2][3]=table[8][3]=6; table[2][8]=table[8][8]=13; paintTable(); } public void paint(Graphics g) { g.drawImage(offScreenImage, 0, 0, 500, 600, this); } void paintTable() { Graphics g=offScreenImage.getGraphics(); g.drawImage(map, 0, 0, 500, 600, this); for(int h=1;h<=10;h++) for(int w=1;w<10;w++) { if(table[w][h]==0)continue; if(h<=5) { g.setColor(Color.white); g.fillArc(w*50-25, h*50-35, 50, 50, 0, 360); if(table[w][h]<=7)g.setColor(Color.green); else g.setColor(Color.red); g.drawArc(w*50-25, h*50-35,50, 50, 0, 360); g.drawArc(w*50-25+5, h*50-35+5,40, 40, 0, 360); g.setFont(new Font("Dialog",0,35)); g.drawString(name[table[w][h]], w*50-18, h*50+2); }else { g.setColor(Color.white); g.fillArc(w*50-25, h*50-15, 50, 50, 0, 360); if(table[w][h]<=7)g.setColor(Color.green); else g.setColor(Color.red); g.drawArc(w*50-25, h*50-15,50, 50, 0, 360); g.drawArc(w*50-20, h*50-10,40, 40, 0, 360); g.setFont(new Font("Dialog",0,35)); g.drawString(name[table[w][h]], w*50-18, h*50+22); } } } void run(int startx,int starty,int endx,int endy,int index) { int k=Math.abs(endx-startx)*5+Math.abs(endy-starty)*5; startx=startx*50-25; if(starty<=5)starty=starty*50-35; else starty=starty*50-15; endx=endx*50-25; if(endy<=5)endy=endy*50-35; else endy=endy*50-15; Graphics tg=runImage.getGraphics(); Graphics g=this.getGraphics(); paintTable(); for(int i=1;i<=k;i++) { try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } int x=(-startx+endx)/k*i+startx; int y=(-starty+endy)/k*i+starty; tg.drawImage(offScreenImage, 0, 0, 500, 600, this); tg.setColor(Color.white); tg.fillArc(x, y, 50, 50, 0, 360); if(index<=7)tg.setColor(Color.green); else tg.setColor(Color.red); tg.drawArc(x, y,50, 50, 0, 360); tg.drawArc(x+5, y+5,40, 40, 0, 360); tg.setFont(new Font("Dialog",0,35)); tg.drawString(name[index], x+7, y+37); g.drawImage(runImage, 0, 0, 500, 600, this); } int x=endx; int y=endy; tg.drawImage(offScreenImage, 0, 0, 500, 600, this); tg.setColor(Color.white); tg.fillArc(x, y, 50, 50, 0, 360); if(index<=7)tg.setColor(Color.green); else tg.setColor(Color.red); tg.drawArc(x, y,50, 50, 0, 360); tg.drawArc(x+5, y+5,40, 40, 0, 360); tg.setFont(new Font("Dialog",0,35)); tg.drawString(name[index], x+7, y+37); g.drawImage(runImage, 0, 0, 500, 600, this); } int getnum(int sx,int sy,int ex,int ey) { int cnt=0,t; cnt-=(table[sx][sy]==0)?0:1; cnt-=(table[ex][ey]==0)?0:1; if(sx>ex) {t=sx;sx=ex;ex=t;} if(sy>ey) {t=sy;sy=ey;ey=t;} for(int i=sx;i<=ex;i++) for(int j=sy;j<=ey;j++) cnt+=(table[i][j]==0)?0:1; return cnt; } boolean canmove(int sx,int sy,int ex,int ey) { if(sx==ex&&sy==ey||table[sx][sy]==0||table[ex][ey]!=0&&table[ex][ey]/8==table[sx][sy]/8)return false; if(table[sx][sy]%7==1&&table[ex][ey]%7==1&&Math.abs(ex-sx)==0&&getnum(ex,ey,sx,sy)==0)return true; switch(table[sx][sy]) { case 1:return ex>3&&ex<7&&ey<4&&Math.abs(ex-sx)+Math.abs(ey-sy)==1; case 2:return ex>3&&ex<7&&ey<4&&Math.abs(ex-sx)==1&&Math.abs(ey-sy)==1; case 3:return ey<6&&Math.abs(ex-sx)==2&&Math.abs(ey-sy)==2&&table[(ex+sx)/2][(sy+ey)/2]==0; case 4:return Math.abs(ex-sx)==2&&Math.abs(ey-sy)==1&&table[(ex+sx)/2][sy]==0|| Math.abs(ex-sx)==1&&Math.abs(ey-sy)==2&&table[sx][(ey+sy)/2]==0; case 5:return (Math.abs(ex-sx)==0||Math.abs(ey-sy)==0)&&getnum(ex,ey,sx,sy)==0; case 6:return (Math.abs(ex-sx)==0||Math.abs(ey-sy)==0)&& (table[ex][ey]!=0&&getnum(ex,ey,sx,sy)==1||table[ex][ey]==0&&getnum(ex,ey,sx,sy)==0); case 7:return ey<6&&Math.abs(ex-sx)==0&&ey-sy==1||ey>=6&&Math.abs(ex-sx)+Math.abs(ey-sy)==1&&ey>=sy; } switch(table[sx][sy]-7) { case 1:return ex>3&&ex<7&&ey>7&&Math.abs(ex-sx)+Math.abs(ey-sy)==1; case 2:return ex>3&&ex<7&&ey>7&&Math.abs(ex-sx)==1&&Math.abs(ey-sy)==1; case 3:return ey>5&&Math.abs(ex-sx)==2&&Math.abs(ey-sy)==2&&table[(ex+sx)/2][(sy+ey)/2]==0; case 4:return Math.abs(ex-sx)==2&&Math.abs(ey-sy)==1&&table[(ex+sx)/2][sy]==0|| Math.abs(ex-sx)==1&&Math.abs(ey-sy)==2&&table[sx][(ey+sy)/2]==0; case 5:return (Math.abs(ex-sx)==0||Math.abs(ey-sy)==0)&&getnum(ex,ey,sx,sy)==0; case 6:return (Math.abs(ex-sx)==0||Math.abs(ey-sy)==0)&& (table[ex][ey]!=0&&getnum(ex,ey,sx,sy)==1||table[ex][ey]==0&&getnum(ex,ey,sx,sy)==0); case 7:return ey>5&&Math.abs(ex-sx)==0&&ey-sy==-1||ey<6&&Math.abs(ex-sx)+Math.abs(ey-sy)==1&&ey<=sy; } return false; } int AImovefour() { int re=0; for(int w=1;w<10;w++) for(int h=1;h<11;h++) if(table[w][h]>7) { for(int x=1;x<10;x++) for(int y=1;y<11;y++) if(canmove(w,h,x,y)) { int t=table[x][y]; if(table[x][y]==1)return -3000; int score=-value[t]; if(score0&&table[w][h]<8) { for(int x=1;x<10;x++) for(int y=1;y<11;y++) if(canmove(w,h,x,y)) { if(table[x][y]==8)return 3000; int t=table[x][y]; table[x][y]=table[w][h]; table[w][h]=0; int score=-value[t]+AImovefour(); if(score>re&&score+value[t]!=-3000) re=score; table[w][h]=table[x][y]; table[x][y]=t; } } return re; } int AImovetwo() { int re=3000; for(int w=1;w<10;w++) for(int h=1;h<11;h++) if(table[w][h]>7) { for(int x=1;x<10;x++) for(int y=1;y<11;y++) if(canmove(w,h,x,y)) { if(table[x][y]==1)return -3000; int t=table[x][y]; table[x][y]=table[w][h]; table[w][h]=0; int score=-value[t]+AImovethree(); if(score0&&table[w][h]<8) { for(int x=1;x<10;x++) { for(int y=1;y<11;y++) if(canmove(w,h,x,y)) { int movenum=0; for(int i=1;i<10;i++) for(int j=1;j<11;j++) if(canmove(w,h,i,j)) movenum-=value[table[i][j]]/10+1; int t=table[x][y]; table[x][y]=table[w][h]; table[w][h]=0; int score=-value[t]+AImovetwo(); table[w][h]=table[x][y]; table[x][y]=t; for(int i=1;i<10;i++) for(int j=1;j<11;j++) if(canmove(x,y,i,j)) movenum+=value[table[i][j]]/10+1; if(score+movenum>=maxval&&score+value[t]!=-3000) { if(score+movenum>maxval||radom.nextBoolean()) { maxval=score+movenum; take_x=w; take_y=h; q_x=x; q_y=y; } } if(t==8) { maxval=3000; flag=1; take_x=w; take_y=h; q_x=x; q_y=y; break; } } if(flag==1)break; } if(flag==1)break; } if(flag==1)break; } if(maxval<=-3000) { JOptionPane.showMessageDialog(null,"你赢了"); isRuning=false; }else { if(maxval>=3000) { JOptionPane.showMessageDialog(null,"你输了"); isRuning=false; } int index=table[take_x][take_y]; table[take_x][take_y]=0; recordstk.push(new Record(take_x,take_y,q_x,q_y,index,table[q_x][q_y])); run(take_x,take_y,q_x,q_y,index); table[q_x][q_y]=index; paintTable(); } } public static void main(String[] args) { JFrame gameFrame=new JFrame("中国象棋"); JButton regame=new JButton("重新开始"); JButton retake=new JButton("悔棋"); JButton complay=new JButton("电脑出手"); Chinesechese chinesechese=new Chinesechese(); retake.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if(chinesechese.recordstk.empty())JOptionPane.showMessageDialog(null,"无法再次悔棋"); else { for(int i=0;i<2;i++) { Chinesechese.Record record=chinesechese.recordstk.pop(); chinesechese.table[record.tox][record.toy]=record.toindex; chinesechese.paintTable(); chinesechese.run(record.tox, record.toy, record.fromx,record.fromy,record.fromindex); chinesechese.table[record.fromx][record.fromy]=record.fromindex; chinesechese.take_x=chinesechese.take_y=-1; chinesechese.paintTable(); chinesechese.repaint(); } } } }); regame.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { while(chinesechese.recordstk.empty()==false) { Chinesechese.Record record=chinesechese.recordstk.pop(); chinesechese.table[record.tox][record.toy]=record.toindex; chinesechese.paintTable(); chinesechese.run(record.tox, record.toy, record.fromx,record.fromy,record.fromindex); chinesechese.table[record.fromx][record.fromy]=record.fromindex; chinesechese.take_x=chinesechese.take_y=-1; chinesechese.paintTable(); chinesechese.repaint(); } chinesechese.isRuning=true; } }); complay.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { chinesechese.AImove(); } }); regame.setBounds(670, 450, 100, 50); retake.setBounds(670, 350, 100, 50); complay.setBounds(670,250, 100, 50); gameFrame.setBounds(100, 100, 800, 600); gameFrame.setLayout(null); gameFrame.add(chinesechese); gameFrame.add(regame); gameFrame.add(retake); gameFrame.add(complay); gameFrame.setVisible(true); gameFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public void mouseClicked(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mousePressed(MouseEvent e) { int x=e.getX(); int y=e.getY(); int q_x=-1,q_y=-1; if(y<=265) { q_y=(y+35)/50; q_x=(x+25)/50; } if(y>=285) { q_y=(y+15)/50; q_x=(x+25)/50; } if(q_x>9||q_y>10||q_x<1||q_y<1) { q_x=-1; q_y=-1; } if(q_x!=-1&&q_y!=-1&&isRuning) { if(take_x!=-1) { if(table[take_x][take_y]>0&&canmove(take_x,take_y,q_x,q_y)) { int index=table[take_x][take_y]; table[take_x][take_y]=0; recordstk.push(new Record(take_x,take_y,q_x,q_y,index,table[q_x][q_y])); run(take_x,take_y,q_x,q_y,index); take_x=-1;take_y=-1; table[q_x][q_y]=index; Graphics g=this.getGraphics(); g.fillRect(100, 220, 300, 100); g.setColor(Color.green); g.setFont(new Font("Dialog",0,35)); g.drawString(" 等待绿方下棋 ", 130, 285); paintTable(); AImove(); } else { take_x=-1;take_y=-1; paintTable(); repaint(); } } else if(table[q_x][q_y]!=0&&take_x==-1) { take_x=q_x; take_y=q_y; Graphics g=offScreenImage.getGraphics(); g.setColor(Color.BLACK); if(take_y<=5)g.drawRect(take_x*50-25, take_y*50-35, 50, 50); else g.drawRect(take_x*50-25, take_y*50-15, 50, 50); g.setColor(Color.gray); for(int w=1;w<10;w++) for(int h=1;h<11;h++) { if(canmove(take_x,take_y,w,h)) { if(h<=5)g.drawRect(w*50-20, h*50-30, 40, 40); else g.drawRect(w*50-20, h*50-10, 40, 40); } } repaint(); } } } public void mouseReleased(MouseEvent e) { // TODO Auto-generated method stub } public void mouseEntered(MouseEvent e) { // TODO Auto-generated method stub } public void mouseExited(MouseEvent e) { // TODO Auto-generated method stub }} 感谢各位的阅读,以上就是"java如何实现简单中国象棋"的内容了,经过本文的学习后,相信大家对java如何实现简单中国象棋这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!
中国象棋
象棋
中国
学习
内容
代码
再次
就是
思路
情况
效果
文章
更多
电脑
知识
知识点
篇文章
跟着
问题
楚河
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
精品咖啡豆
互联网科技官网
互联网科技深圳
平安科技 互联网
云电互联网科技
顺网科技2021年互联网排名
天速互联网络科技有限公司
以后互联网后是啥科技
广州恒生互联网科技有限
重庆互联网医院沙龙医盟信息科技
花神(南京)互联网科技有限公司
互联网公司黑科技创始人
朱啸虎曾投资哪些互联网科技企业
互联网公司高科技产品
广州智享互联网科技
中国互联网公司的科技投入
互联网时代高科技布局
北京品多多互联网科技有限公司
承德科技产业互联网平台
知域互联网科技有限公司官网
互联网中国科技
互联网金融 金融科技
九亚互联网科技
新华互联网科技校企合作
成都玖崟互联网科技有限公司乐商圈怎么样
农村开互联网科技讲堂
语蝶互联网科技有限公司
互联网科技和信息
互联网保险科技创业
上海互联网科技公司ppt