Hello!大家好!我又做出来了一个国际象棋游戏,跟之前的斗兽棋比起来国际象棋无异要更大众化一些,所以还是希望各位编程爱好者和国际象棋爱好者支持一下啊!

其实看过我之前写的五子棋和斗兽棋的朋友们应该已经了解到,写棋类游戏都是有一定的框架可以搭建的,只是在游戏的规则上有不同的复杂程度。而国际象棋在我看来时规则最复杂的棋类游戏之一了,我用java写了有足足一千多行的代码(当然,有可能是我的代码不够简便),这次分两次肯定是解释不清楚了,我打算分四次来写。第一步是设计棋盘以及实现基本的走棋功能;第二步是棋子的走法与吃法;第三步是加入将军的概念;第四步是判断输赢与和棋的方法,以及实现自定义棋盘的功能。

我们先进行第一步——设计棋盘以及基本的走棋功能
在这一步我们将把国际象棋的棋盘呈现出来,并实现初步的走棋功能,之后我们再来介绍规则的写法。这一步的方法可以应用到各种棋类游戏上去。

这些是国际象棋需要的类库,跟五子棋和斗兽棋差不多。
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import javax.swing.BorderFactory;
import javax.swing.JButton;
public class 国际象棋 extends JPanel{、、还是JPanel的子类国际象棋里的变量是真的很多了,我在这一次要用到的变量后面会加上横线。private static long serialVersionUID=1l;————private static int rows=8,cols=8;————一共8行8列private int BLOCKWIDTH=55,BLOCKHEIGHT=55;————private int SMALLERWIDTH=15,SMALLERHEIGHT=15;————private static int clickcount;————记录点击次数private static MyIcon movingpiece;————要走的棋子private static String sidetomove;————轮到哪一方走棋private static boolean ischecking;private static MyIcon capturedpiece;————上一步被吃掉的棋子(可以为空)private static MyIcon capturedpiece2;private static boolean justcastled;private static MyLabel movinglabel;————要走的棋子所在的格子private static Color[] colors= {Color.WHITE,Color.GRAY};————格子的背景颜色private static ArrayList<MyLabel[]> recordedmove;————走过的棋进行记录private String[] str={"a","b","c","d","e","f","g","h"};————代表格子所在的列private static String[] paths= {————棋子的存储地址,和斗兽棋一样,国际象棋的棋子图案我是从网上下载下来后用光影魔术手抠的图。大家也可以从网上寻找自己喜欢的棋子样式,如果大家需要我的图片的话可以给我留言哦!"C:/Users/Lenovo/eclipse-workspace/xiaoyouxi/src/国际象棋/timg_副本6_副本.png","C:/Users/Lenovo/eclipse-workspace/xiaoyouxi/src/国际象棋/timg_副本12_副本.png","C:/Users/Lenovo/eclipse-workspace/xiaoyouxi/src/国际象棋/timg_副本5_副本.png","C:/Users/Lenovo/eclipse-workspace/xiaoyouxi/src/国际象棋/timg_副本4_副本.png","C:/Users/Lenovo/eclipse-workspace/xiaoyouxi/src/国际象棋/timg_副本3_副本.png","C:/Users/Lenovo/eclipse-workspace/xiaoyouxi/src/国际象棋/timg_副本_副本.png","C:/Users/Lenovo/eclipse-workspace/xiaoyouxi/src/国际象棋/timg_副本2_副本.png","C:/Users/Lenovo/eclipse-workspace/xiaoyouxi/src/国际象棋/timg_副本11.png","C:/Users/Lenovo/eclipse-workspace/xiaoyouxi/src/国际象棋/timg_副本10_副本.png","C:/Users/Lenovo/eclipse-workspace/xiaoyouxi/src/国际象棋/timg_副本9_副本.png","C:/Users/Lenovo/eclipse-workspace/xiaoyouxi/src/国际象棋/timg_副本7_副本.png","C:/Users/Lenovo/eclipse-workspace/xiaoyouxi/src/国际象棋/timg_副本8_副本.png"};private static MyLabel[][] labels; ————表示整个棋盘private static MyIcon selectedpiece;private static boolean settingmode;

没有看过我之前写的斗兽棋的朋友肯定,会对MyLabel和MyIcon比较陌生。在这里MyLabel的目的是在JLabel的基础上赋予两个新的变量,即他所在的行与列。

import javax.swing.JLabel;public class MyLabel extends JLabel{private static final long serialVersionUID = 1L;protected int row;protected int col;public MyLabel(String a,int b) {super(a,b);}
}

而MyIcon的目的是通过比较图片的存储地址来分辨图片,从而能够去判断棋子的种类和所属一方。

import java.awt.Image;
import javax.swing.ImageIcon;public class MyIcon extends ImageIcon{private static final long serialVersionUID = 1L;protected String pathname;表示存储地址protected boolean hasmoved=false;表示棋子是否已经走动,以后会用到的public MyIcon(String str) {super(str);this.pathname=str;    }public MyIcon(Image img) {super(img);}public String getPath() {return pathname;}
}

接下来是constructor

 public 国际象棋() {clickcount=0; (计数器初始化为0)sidetomove="white";(白棋先走)labels=new MyLabel[rows+1][cols+1];(这里多设置一行一列是为了显示行与列,行用数字1到8来表示,列用字母a到h来表示)this.setLayout(null);initlabels();}

然后跟五子棋和斗兽棋一样,是initlabel()和move()两个函数。

private void initlabels() {for(int i=0;i<rows+1;i++) {for(int j=0;j<cols+1;j++) {if(!(i==0&&j==0)) {MyLabel jl=new MyLabel("",JLabel.CENTER);jl.row=i;jl.col=j;jl.setBounds(i*BLOCKWIDTH-40, j*BLOCKHEIGHT, BLOCKWIDTH, BLOCKHEIGHT);jl.setBorder(BorderFactory.createLineBorder(Color.BLACK));jl.setOpaque(true);jl.setBackground(colors[(i+j)%2]);if(i==0) {————这是设置好1到8行jl.setBounds(i*BLOCKWIDTH, j*BLOCKHEIGHT, SMALLERHEIGHT, BLOCKWIDTH);for(int x=1;x<cols+1;x++) {jl.setBackground(Color.WHITE);if(x==j) {jl.setText(String.valueOf(9-x));}}}if(j==0) {————这是设置好a到h列jl.setBounds(i*BLOCKWIDTH-40, j*BLOCKHEIGHT+40, BLOCKHEIGHT, SMALLERWIDTH);for(int x=1;x<cols+1;x++) {jl.setBackground(Color.WHITE);if(x==i) {jl.setText(str[x-1]);}}}接下来很长的一段都是把对应的棋子摆到对应的格子上去if(j==2&&i!=0) {黑兵MyIcon icon=new MyIcon(paths[0]);jl.setIcon(icon);}if(j==7&&i!=0) {白兵MyIcon icon=new MyIcon(paths[1]);jl.setIcon(icon);}if(j==1){if((i==1||i==8)) {黑车MyIcon icon=new MyIcon(paths[2]);jl.setIcon(icon);}if(i==2||i==7) {黑马MyIcon icon=new MyIcon(paths[3]);jl.setIcon(icon);}if(i==3||i==6) {黑象MyIcon icon=new MyIcon(paths[4]);jl.setIcon(icon);}if(i==4) {黑后MyIcon icon=new MyIcon(paths[5]);jl.setIcon(icon);}if(i==5) {黑王MyIcon icon=new MyIcon(paths[6]);jl.setIcon(icon);}}if(j==8) {if((i==1||i==8)) {白车MyIcon icon=new MyIcon(paths[7]);jl.setIcon(icon);    }if(i==2||i==7) {白马MyIcon icon=new MyIcon(paths[8]);jl.setIcon(icon);}if(i==3||i==6) {白象   MyIcon icon=new MyIcon(paths[9]);jl.setIcon(icon);}if(i==4) { 白后MyIcon icon=new MyIcon(paths[10]);jl.setIcon(icon);}if(i==5) {白王MyIcon icon=new MyIcon(paths[11]);jl.setIcon(icon);}}this.add(jl);    labels[i][j]=jl;      jl.addMouseListener(new MouseAdapter() { 给每一个格子加上监听器    public void mouseClicked(MouseEvent e) {if(e.getButton()==MouseEvent.BUTTON1){ if(jl.row!=0&&jl.col!=0) {当然不包括最边上的move(jl);       }}}      }});    }  }}}

然后是move(),在这里跟大家说明一下,现在写的initlabels()和move()两个函数并不是他们最终的样子,随着以后更深入地讲解我会一步一步地把这两个函数补充完整,在最后,我也会把我完整的代码呈现给大家。

这应该是整个程序中最复杂的函数了,他的整体一共有八十多行,这里呈现的只有他的一半不到。
因为我们今天只是要实现初步的走棋功能,还没有牵扯到具体的规则。
private static void move(MyLabel jl){  MyIcon icon1=(MyIcon) jl.getIcon();  ————这一步是获得点击格子上的棋子clickcount++;——————每点击一次鼠标我们就把计数器加1if(clickcount%2==1) {当计数器是奇数的时候if(jl.getIcon()==null) {第一种情况是最简单的情况,点到了一个空的(没有棋子)格子就要把计数器减1,重新点击clickcount--;}else {————点到了棋子  jl.setBackground(Color.YELLOW); 把棋子所在格子背景设置成黄色,表示已选中要走的棋子movingpiece=icon1; 设置好要走的棋子      movinglabel=jl;设置好要走的棋子所在的格子既然走棋了我们就把轮到走棋的一方换成对方if(getside(movingpiece)=="white"&&sidetomove=="white") {白的换成黑的sidetomove="black";}   else if(getside(movingpiece)=="black"&&sidetomove=="black") {黑的换成白的sidetomove="white";}else {————不可以连续走两步棋clickcount--;把计数器减一,重新进行点击System.out.println("not your turn");向玩家说明还没有轮到你走棋jl.setBackground(colors[(movinglabel.col+movinglabel.row)%2]);因为刚刚把格子的背景颜色设置成了黄色,现在要重新设置回来。因为国际象棋的格子都是黑白交替的,所以只要算出所在行数与列数之和的奇偶性就可以设置上相应的颜色。偶数为白色,奇数为黑色。}    }}  else { 当计数器是偶数的时候,这表示玩家选择了一个他想走到的格子    jl.setIcon(movingpiece);   把目标格子设置上要走的棋子然后我们要把原来格子上的棋子去掉,背景色也要还原for(int i=1;i<rows+1;i++) {for(int j=1;j<cols+1;j++) {if((labels[i][j].getBackground()).equals(Color.YELLOW)) {如果背景色是黄色,也就是说这个格子是之前点过的。     labels[i][j].setIcon(null);    去掉图片labels[i][j].setBackground(colors[(i+j)%2]);          还原背景颜色}}}  MyLabel[] record=new MyLabel[2];建立一个长度为2的Arrayrecord[0]=movinglabel;把刚才走棋的两个格子放进去record[1]=jl;recordedmove.add(record); 把这个Array放进recordedmove}                  }

在写完这些代码之后我们就可以实现初步的走棋功能了,只不过现在还没有规则的约束,玩家可以天马行空地走棋。接下来我就会加入棋子的走法,一步一步地约束走棋的范围。

用java编写国际象棋相关推荐

  1. java模拟国际象棋游戏_java国际象棋小游戏

    [实例简介] 用java编写的国际象棋游戏 在eclipse环境下可以运行 界面美观 适合初学者 [实例截图] [核心代码] https___download.csdn.net_download_mo ...

  2. java编写代码用什么_如何学习用Java编写代码:为什么要学习以及从哪里开始

    java编写代码用什么 by John Selawsky 约翰·塞劳斯基(John Selawsky) 如何学习用Java编写代码:为什么要学习以及从哪里开始 (How to learn to cod ...

  3. java培训教程分享:Java编写软件代码自动提示功能

    本期的java培训教程分享主要是介绍的java编写软件代码的一个自动提示功能,很多零基础和初学java的同学们对这一块还不是很了解,Eclipse for android 实现代码自动提示智能提示功能 ...

  4. 【项目展示】一个有点难度的猜数字小游戏(Java编写)

    (声明:本文部分图片来自网络,如有侵权请联系,将第一时间删除或更换图片) 本文目录 1.前言 2.规格说明 3.源代码 4.运行结果 5.感想 1.前言 我在自己的博客里上传了一些本科时编过.最近又改 ...

  5. Java编写的五子棋小游戏

    看书的时候看到一个不完整的Java编写的一个五子棋小游戏,为了恢复一下编程能力刚刚把这个小程序完成了. 实现的功能很简单,两人对下五子棋,程序自动回判断输赢.在ubuntu下搞得,没有装什么高端的输入 ...

  6. java编写词法分析器

    词法分析器就是通过扫描一段程序判断是否是关键字.标识符.常数.分界符.运算符.一般分为一符一种和经典五中: 这里我用的是经典五中,此词法分析器是用java编写的: /* 保留字|关键字:1 操作符|运 ...

  7. 【使用Java编写的B*算法】

    使用XP系统之家Java编写的B*算法 package rpg.stage.path; import java.util.ArrayList; import java.util.HashSet; im ...

  8. java编写存钱_用Java编写一个简单的存款

    package desposit.money; public class DespositMoney { public static void main(String[] args) { Custom ...

  9. java applet 记事本_jsb java编写的安卓app记事本程序,适合app初学者 Applet 243万源代码下载- www.pudn.com...

    文件名称: jsb下载  收藏√  [ 5  4  3  2  1 ] 开发工具: Java 文件大小: 86 KB 上传时间: 2015-08-25 下载次数: 0 提 供 者: dr 详细说明:j ...

  10. java 输入 方程,用java 编写一程序,求解一元二次方程:aX2+bX+c=0.参数a、b及c从命令行做参数输入 java...

    题目: 用java 编写一程序,求解一元二次方程:aX2+bX+c=0.参数a.b及c从命令行做参数输入 java 答案参考: 以下程序在jdk5.0测试通过 import java.util.Sca ...

最新文章

  1. GIt/Github常用命令
  2. Linux bash命令操作和VI编辑器操作
  3. R 语言开发环境搭建
  4. 【阿里云课程】图神经网络基础:图的应用、表示与图卷积
  5. 惠普前总裁孙振耀指点职业规划
  6. myeclipse 9.0安装 vss1.6.2不显示问题
  7. 【最详细解析】1070 结绳 (25分)_18行代码AC
  8. JBUILDER 2006怎么配置 STRUTS?[
  9. 如何使用CppUnit进行单元测试
  10. MySQL数据库的自动备份与数据库被破坏后的恢复
  11. Cocoa编程中视图控制器与视图类详解
  12. 排列组合算法之三: 递归法
  13. java中res是什么意思_java中的set是什么意思
  14. Android系统信息获取 之十三:Linux内核版本信息获取
  15. b样条和三次样条_B样条(贝塞尔曲线和b样条曲线)
  16. 数据挖掘实验--非负矩阵分解
  17. 富士通Fujitsu DPK1180K 打印机驱动
  18. 从堂兄平淡人生看人生价值的实现---有感于堂兄54岁成为家乡新闻人物
  19. index ffs、index fs原理考究
  20. 品优购商城——手机详情页(作业)

热门文章

  1. Echarts饼状图空心圆技巧 | 爱骇客 | 骇客
  2. 洛谷 P5564: [Celeste-B]Say Goodbye
  3. HDU - 2567 寻梦 ac代码
  4. java触屏改_一个JAVA游戏改键改触屏的教程!
  5. 埃默里大学有计算机专业吗,埃默里大学计算机科学研究生最新专业排名
  6. excel 永久保存宏命令
  7. 「实战」南京房价的秘密——准备篇
  8. 2.4g无线模块 java_ESP32 2.4G无线模块 WIFI和蓝牙双模模块
  9. 高精度ua级恒流源_一种高精度可调恒流源电路的制作方法
  10. 制订项目进度计划的讨论