nullITeye - 牛牛娱乐

nullITeye

2019年03月06日11时17分22秒 | 作者: 鸿祯 | 标签: | 浏览: 187

代码的结构挺好,mvc形式的,给我们共享出来

原创不易,转载请注明出处:共享网上找到的一个中国象棋源码

 

部分代码

Controller.java

 

package com.zuidaima.chess.controller;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import com.yaoyun.chess.entity.ChessBoard;
import com.yaoyun.chess.entity.ChessMan;
import com.yaoyun.chess.panel.GamePanel;
import com.yaoyun.chess.util.MusicUtil;
public class Controller extends MouseAdapter {
 private static ChessBoard chessBoard;
 private static ChessMan chessMan;
 private static GamePanel gamePanel;
 private static boolean gameover = false;
 * 从头显现游戏界面
 public Controller(GamePanel gamePanel, ChessBoard chess, ChessMan chessMan) {
 Controller.chessBoard = chess;
 Controller.chessMan = chessMan;
 Controller.gamePanel = gamePanel;
 * 功用:呼应鼠标点击事情
 public void mouseClicked(MouseEvent e) {
 // 获取鼠标的方位,20代表的是菜单栏的高度
 int x = e.getX();
 int y = e.getY()-20;
 // 假如鼠标点击的坐标有用
 if ((x = 40 x = 570) (y = 40 y = 630) !gameover) {
 // 把鼠标的坐标转换成棋子数组的下标,25代表棋子的半径
 int newi = (y + 25) / 60 - 1;
 int newj = (x + 25) / 60 - 1;
 // 获取鼠标上一步点击方位数组的下标
 int oldi = chessMan.getOldX();
 int oldj = chessMan.getOldY();
 // 获取保存棋子方位的数组
 int[][] chessFlag = chessMan.getChessFlag();
 // 判别选中的当地是否有棋子
 if (chessFlag[newi][newj]  0) {
 // 判别上一步是否有选中棋子
 if (oldi != -1 oldj != -1) {
 // 判别棋子是否能移动
 if (isChessManMove(chessFlag, newi, newj)) {
 //播映下棋声响
 if(MusicUtil.isGameMusic()){
 MusicUtil.playMusic("go");
 // 移动棋子
 chessMan.setChessFlag(newi, newj, chessFlag[oldi][oldj]);
 chessMan.setChessFlag(oldi, oldj, 0);
 // 移动成功后,铲除上一步选中的棋子
 chessMan.setOldX(-1);
 chessMan.setOldY(-1);
 gamePanel.dispaly(chessBoard, chessMan);
 // 轮到对方下棋
 chessMan.setRedMove(!chessMan.isRedMove());
 } else {
 // 判别上一步是否有棋子
 if (oldi  -1 oldj  -1) { // 上一步没有棋子
 // 假如有棋子,并且是自己
 if ((oldi  newi oldj  newj)) {
 } else {
 // 把选中的棋子设为选中状况
 chessMan.setSelect(newi, newj);
 // 并把其保存为上一颗棋子
 chessMan.setOldX(newi);
 chessMan.setOldY(newj);
 showGame();
 } else { // 假如上一步有棋子
 // 判别是否吃的到下一步的棋子
 if (isChessManMove(chessFlag, newi, newj)) {
 // 判别是否是自己一方的棋子
 if ((chessFlag[oldi][oldj] = 8 chessFlag[newi][newj] 8) || (chessFlag[oldi][oldj] 8 chessFlag[newi][newj] = 8)) {
 if (chessFlag[newi][newj]  5) {
 gamePanel.setMessage(1);
 gameover = true;
 } else if (chessFlag[newi][newj]  14) {
 gamePanel.setMessage(2);
 gameover = true;
 //播映吃棋子的声响
 if(MusicUtil.isGameMusic()){
 MusicUtil.playMusic("eat");
 // 吃棋子
 chessMan.setChessFlag(newi, newj,chessFlag[oldi][oldj]);
 chessMan.setChessFlag(oldi, oldj, 0);
 // 轮到对方下棋
 chessMan.setRedMove(!chessMan.isRedMove());
 // 并铲除上一步棋子
 chessMan.setOldX(-1);
 chessMan.setOldY(-1);
 // 从头显现界面
 showGame();
 * 功用:从头显现界面
 public static void showGame(){
 gamePanel.dispaly(chessBoard, chessMan);
 * 判别棋子是否能移动
 * chessFlag:棋盘棋子坐标
 * newi、newj:棋子下一步的坐标
 public boolean isChessManMove(int[][] chessFlag, int newi, int newj) {
 // 默许棋子不能移动
 boolean b = false;
 // 获取上一步选中的棋子坐标
 int oldi = chessMan.getOldX();
 int oldj = chessMan.getOldY();
 // 默许该棋子是红方的
 boolean redFlag = true;
 // 棋子不是为红方的
 if (chessFlag[oldi][oldj] = 8) {
 redFlag = false;
 // 假如棋子是红方且不是红方下棋,则回来
 if(redFlag != chessMan.isRedMove()){
 System.out.println("还没轮到你下呢!");
 return false;
 // 获取棋盘中所有的棋子
 String[] chessStr = chessMan.getChessStr();
 // 获取上一步选中的是什么棋子
 String name = chessStr[chessFlag[oldi][oldj] - 1];
 // 依据棋子称号挑选棋子的走法
 if(name.equals("兵")) {
 if (oldi = 5) { // 没有过河
 if ((oldi - newi  1) (newj  oldj)) {
 b = true;
 } else { // 已过河
 if ((oldi - newi  1) (newj  oldj)) {
 b = true;
 } else if ((Math.abs(newj - oldj)  1) (newi  oldi)) {
 b = true;
 } else {
 return false;
 else if(name.equals("卒")) {
 if (oldi 5) { // 没有过河
 if ((newi - oldi  1) (newj  oldj)) {
 b = true;
 } else { // 已过河
 if ((newi - oldi  1) (newj  oldj)) {
 b = true;
 } else if ((Math.abs(newj - oldj)  1) (newi  oldi)) {
 b = true;
 } else {
 return false;
 else if(name.equals("车")) {
 if (newi  oldi) {
 int k = 0;
 if (newj oldj) { // 红车水平向右方向移动
 for (int i = oldj; i = newj; i++) {
 if (chessFlag[oldi][i] 0) {
 k++;
 } else {
 for (int i = oldj; i = newj; i) { // 红车水平向左方向移动
 if (chessFlag[oldi][i] 0) {
 k++;
 if (k = 2) {
 b = true;
 } else if (newj  oldj) { // 红车笔直下方向移动
 int k = 0;
 if (newi oldi) {
 for (int i = oldi; i = newi; i++) {
 if (chessFlag[i][oldj] 0) {
 k++;
 } else {
 for (int i = oldi; i = newi; i) { // 红车笔直上方向移动
 if (chessFlag[i][oldj] 0) {
 k++;
 if (k = 2) {
 b = true;
 else if(name.equals("炮")) {
 int s = 0;
 if (newi  oldi) {
 if (newj oldj) {
 for (int i = oldj; i = newj; i++) {
 if (chessFlag[oldi][i] 0) {
 s++;
 } else {
 for (int i = oldj; i = newj; i) {
 if (chessFlag[oldi][i] 0) {
 s++;
 } else if (newj  oldj) {
 if (newi oldi) {
 for (int i = oldi; i = newi; i++) {
 if (chessFlag[i][oldj] 0) {
 s++;
 } else {
 for (int i = oldi; i = newi; i) {
 if (chessFlag[i][oldj] 0) {
 s++;
 if (s  1 || (s  3 chessFlag[newi][newj] 0)) {
 b = true;
 else if(name.equals("帅")||name.equals("将")) {
 if (newj  oldj (Math.abs(newi - oldi) = 5)) {
 int flag = 0;
 if (newi oldi) { // 将吃帅
 for (int i = oldi; i = newi; i++) {
 if ((chessFlag[oldi][oldj]  5)
 (chessFlag[newi][newj]  14)) {
 if (chessFlag[i][oldj] 0) {
 flag++;
 } else { // 帅吃将
 for (int i = newi; i = oldi; i++) {
 if ((chessFlag[oldi][oldj]  14)
 (chessFlag[newi][newj]  5)) {
 if (chessFlag[i][oldj] 0) {
 flag++;
 if (flag  2) {
 b = true;
 } else if (((newi = 2 redFlag  true) || (newi = 7 redFlag  false))
 (newj = 5 newj = 3)) {
 if (Math.abs(newi - oldi)  1 newj  oldj) {
 b = true;
 } else if (Math.abs(newj - oldj)  1 newi  oldi) {
 b = true;
 else if(name.equals("士")) {
 if (redFlag) { // 红方棋子
 if (newi = 2 newj = 5 newj = 3) {
 if (Math.abs(newi - oldi)  1
 Math.abs(newj - oldj)  1) {
 b = true;
 } else { // 黑方棋子
 if (newi = 7 newj = 5 newj = 3) {
 if (Math.abs(newi - oldi)  1
 Math.abs(newj - oldj)  1) {
 b = true;
 else if(name.equals("象")||name.equals("相")) {
 if ((newi = 5 redFlag  false)
 || (newi 5 redFlag  true)) {
 if ((newi - oldi)  2 (newj - oldj)  2) { // 移到右下方
 if (chessFlag[oldi + 1][oldj + 1]  0) {
 b = true;
 } else if ((newi - oldi)  -2 (newj - oldj)  2) { // 移到右上方
 if (chessFlag[oldi - 1][oldj + 1]  0) {
 b = true;
 } else if ((newi - oldi)  2 (newj - oldj)  -2) { // 移到左下方
 if (chessFlag[oldi + 1][oldj - 1]  0) {
 b = true;
 } else if ((newi - oldi)  -2 (newj - oldj)  -2) { // 移到左上方
 if (chessFlag[oldi - 1][oldj - 1]  0) {
 b = true;
 else if(name.equals("马")) {
 if ((newi - oldi)  -2 (newj - oldj)  1) { // 移到NE方
 if (chessFlag[oldi - 1][oldj]  0) {
 b = true;
 } else if ((newi - oldi)  -2 (newj - oldj)  -1) { // 移到NW方
 if (chessFlag[oldi - 1][oldj]  0) {
 b = true;
 } else if ((newi - oldi)  2 (newj - oldj)  1) { // 移到SE方
 if (chessFlag[oldi + 1][oldj]  0) {
 b = true;
 } else if ((newi - oldi)  2 (newj - oldj)  -1) { // 移到SW方
 if (chessFlag[oldi + 1][oldj]  0) {
 b = true;
 } else if ((newi - oldi)  -1 (newj - oldj)  2) { // 移到EN方
 if (chessFlag[oldi][oldj + 1]  0) {
 b = true;
 } else if ((newi - oldi)  1 (newj - oldj)  2) { // 移到ES方
 if (chessFlag[oldi][oldj + 1]  0) {
 b = true;
 } else if ((newi - oldi)  -1 (newj - oldj)  -2) { // 移到WN方
 if (chessFlag[oldi][oldj - 1]  0) {
 b = true;
 } else if ((newi - oldi)  1 (newj - oldj)  -2) { // 移到WS方
 if (chessFlag[oldi][oldj - 1]  0) {
 b = true;
 return b;
 * 功用:设置游戏状况
 public static void setGameover(boolean gameover) {
 Controller.gameover = gameover;
}

 

ChessMain.java

 

package com.zuidaima.chess.entity;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Stroke;
import java.io.Serializable;
import com.yaoyun.chess.util.FontUtil;
@SuppressWarnings("serial")
public class ChessMan implements Serializable {
 private int oldX = -1; // 棋子上一步所在方位的x坐标
 private int oldY = -1; // 棋子上一步所在方位的y坐标
 private int newX = -1; // 棋子现在所在方位的x坐标
 private int newY = -1; // 棋子现在所在方位的y坐标
 private boolean redMove = true; // 红棋先行
 private String[] chessStr = { "车", "马", "象", "士", "将", "炮", "卒", "兵", "炮", "车", "马", "相", "士", "帅" };
 private static int[][] chessFlag = new ChessFlag().getChessFlag();
 private boolean[][] select = new boolean[10][9]; // 保存棋子被选中的坐标
 * 功用: 画出象棋棋盘中的棋子
 public void drawChessMan(Graphics g) {
 // 转成2D形式
 Graphics2D g2d = (Graphics2D) g;
 // 获取当时的画刷
 Stroke stroke = g2d.getStroke();
 // 遍历棋盘中所有的方位
 for (int i = 0; i chessFlag.length; i++) {
 for (int j = 0; j chessFlag[i].length; j++) {
 // 判别指定方位是否有棋子
 if (chessFlag[i][j] != 0) {
 // 把棋子数组的下标转换成棋子的坐标
 int x = (j + 1) * 60;
 int y = (i + 1) * 60;
 // 判别指定方位的棋子是否被选中
 if (select[i][j]) {
 // 设置画刷的色彩
 g2d.setColor(new Color(0, 200, 0));
 // 设置画刷的巨细
 g2d.setStroke(new BasicStroke(3));
 // 画选中棋子时的棋子边框
 g2d.drawLine(x - 25, y - 20, x - 25, y - 25);
 g2d.drawLine(x - 25, y + 20, x - 25, y + 25);
 g2d.drawLine(x - 20, y - 25, x - 25, y - 25);
 g2d.drawLine(x - 20, y + 25, x - 25, y + 25);
 g2d.drawLine(x + 25, y - 20, x + 25, y - 25);
 g2d.drawLine(x + 25, y + 20, x + 25, y + 25);
 g2d.drawLine(x + 25, y + 25, x + 20, y + 25);
 g2d.drawLine(x + 25, y - 25, x + 20, y - 25);
 // 还原为默许画刷
 g2d.setStroke(stroke);
 // 把棋子设为没有选中的状况
 select[i][j] = !select[i][j];
 // 画内圆
 g2d.setColor(new Color(219, 196, 154));
 g2d.fillOval(x - 25, y - 25, 50, 50);
 // 画大外圆
 g2d.setColor(new Color(109, 98, 77));
 g2d.drawOval(x - 25, y - 25, 50, 50);
 // 依据棋子的所属一方,显现不同的棋子色彩
 if (chessFlag[i][j] 8) {
 g2d.setColor(Color.RED);
 } else {
 g2d.setColor(Color.BLACK);
 // 画小外圆
 g2d.drawOval(x - 20, y - 20, 40, 40);
 g2d.setFont(FontUtil.myFont2);
 String newstring = new String(chessStr[chessFlag[i][j] - 1]);
 g2d.drawString(newstring, x - 20, y + 10);
 public int getOldX() {
 return oldX;
 public boolean isRedMove() {
 return redMove;
 public void setRedMove(boolean redMove) {
 this.redMove = redMove;
 public void setOldX(int oldX) {
 this.oldX = oldX;
 public int getOldY() {
 return oldY;
 public void setOldY(int oldY) {
 this.oldY = oldY;
 public int getNewX() {
 return newX;
 public void setNewX(int newX) {
 this.newX = newX;
 public int getNewY() {
 return newY;
 public void setNewY(int newY) {
 this.newY = newY;
 // 获取棋子对应的字符串
 public String[] getChessStr() {
 return chessStr;
 // 获取棋盘中所有棋子的方位
 public int[][] getChessFlag() {
 return chessFlag;
 // 设置棋子对应的字符串
 public void setChessFlag(int[][] chessFlag) {
 ChessMan.chessFlag = chessFlag;
 // 设置棋子的坐标
 public void setChessFlag(int i, int j, int z) {
 chessFlag[i][j] = z;
 // 获取选中状况
 public boolean[][] getSelect() {
 return select;
 // 设置选中状况
 public void setSelect(int i, int j) {
 select[i][j] = !select[i][j];                          
			
版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表牛牛娱乐立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章

阅读排行

  • 1
  • 2

    UTLITeye

    数据,目录,文件
  • 3
  • 4
  • 5

    java与函数式编程ITeye

    函数,编程,一些
  • 6
  • 7
  • 8
  • 9
  • 10