謝謝大家的支持,您的一鍵三連是 罡罡同學前進的最大動力!
一鍵三連 一鍵三連 一鍵三連 一鍵三連 一鍵三連 一鍵三連
傳送地址
資料結構課程設計——校園導游系統(C語言):
B站視頻: https://www.bilibili.com/video/BV1ui4y137X9
CSDN原始碼:
https://blog.csdn.net/m0_46625346/article/details/107149473
Java課程設計——中國象棋
B站視頻:https://www.bilibili.com/video/BV1MV411t71f
準備
壓縮包里面內容: 1.MyChess 檔案夾 2. 答辯PPT 3.課程設計報告 (大家可以參考)
百度網盤傳送地址:https://pan.baidu.com/s/1Hi-lHP470iLqi3zUa5dvUg
提取碼:sdzz
復制這段內容后打開百度網盤手機App,操作更方便哦

先說一下,大家需要將本專案部署到本地應該如何操作,CSDN上面有源代碼,
但為了讓大家能夠更好的使程式成功在本地運行,
我將代碼壓縮包發到了百度網盤上,大家可以直接下載壓縮包,
匯入專案
大家解開壓縮包,會得到一個MyChess的檔案夾,大家用Eclipse打開就可以了,但有些同學可能不會,在這說一下,如何匯入一個專案,
1.打開Eclipse時,選擇MyChess檔案夾所在位置,
2.點擊左上角的File,選擇 import 選項,
3.在import 彈窗中,點擊General 檔案夾,
再點擊 第二個 Existing Projects into Workspace ,
4.再點擊 右側的 Browse 選項,找到 MyChess檔案夾所在位置,選中即可,
匯入成功!
修改Eclipse代碼字體
1.修改代碼字體,修改為程式員必備字體(老師說的 哈哈)
點擊標題欄中的 Windows -->Preferences -->
General --> Appearance --> Colors and Fonts 然后在右側中,
找到Java檔案夾,
再選中 Java Editor Text Font (set to default: Text Font)
推薦字體 Consals 常規 14號大小,
2.顯示代碼行數
點擊標題欄中的 Windows -->Preferences -->
General --> Editors 中Text Editors 會看到很多行選項
我們選擇 Show line numbers 選擇項
3.設定代碼提示
點擊標題欄中的 Windows -->Preferences -->
Java --> Editor --> 點擊Content Assist
在右側中下面 有 Auto activation triggers for Java: .
在里面輸入 從A到Z 和 a到z 即可
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
到目前基本準備操作已經完成,
下面正式開始介紹中國象棋,
中國象棋
下面是 中國象棋 MyChess 的結構框圖(架構是老師幫忙寫的)

所有棋子 繼承一個父類 org.chess 中的 chess.java
Canvas.java 主要負責 棋盤的繪制,棋子的拜訪,棋盤初始化,
ChessGame.java 主要負責 框圖的初始化,按鈕以及按鈕事件的建立,
ChessManager.java 主要負責 注冊各類棋子,并且區分 黑紅棋子,
ArmsChess.java 主要負責 卒和兵的移動規則,
CannonChess.java 主要負責 炮的移動規則(不區分黑紅方)
ChapChess.java 主要負責 仕、士的移動規則
Chess.java 所有棋子的父類,所有棋子繼承自該類
ElephantChess.java 主要負責 象的移動規則
GeneralChess.java 主要負責 將、帥的移動規則
HorseChess.java 主要負責 馬 的移動規則
ImageTool.java 主要負責 加載所有棋子的圖片
musicStuff.java 主要負責 音樂的回圈播放(此處需要說明一下,該功能只能回圈播放音樂,不能暫停,大家可以修改此功能)
RangeChecker.java 主要負責 判斷所有棋子的走法是否合法,
Test檔案夾中 是所有棋子的測驗類,用來測驗各類棋子的移動規則是否正確
image檔案夾中是 所有棋子和棋盤的圖片(來自網路)
music檔案夾中是 音樂(高山流水),此處要注意檔案格式為wav格式的,當然,主要還是看大家如何實作這個音樂播放器,不同的方法對于格式要求不同,此模塊,是我們組的一個同學在網上學的比較簡單的一個方法,
下圖是MyChess檔案下的所有內容 :

謝謝大家的支持,您的一鍵三連是 罡罡同學前進的最大動力!
一鍵三連 一鍵三連 一鍵三連 一鍵三連 一鍵三連 一鍵三連
廢話不多說,直接上代碼(下面是一大波代碼 哈哈):
1.ChessGame.java 代碼:
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Container;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import org.chess.musicStuff;
/*2020-第一組-中國象棋專案分工
* 姜權罡(組長):炮、馬、架構、圖形化界面、視頻講解、報告(結構和代碼和總結)、
* PPT代碼和總結反思部分、所有作業的審核,
*
* 龐義俊:車、音樂、圖片搜集、繪制結構圖,
* 董玟彤:象、PPT,
* 李若彤:將、士、PPT,
* 曹佳榕:卒、PPT、報告(專案介紹)
*
* 2020/12/22 所有作業全部完成!
* */
public class ChessGame {
public static void main(String[] args) {
JFrame f =new JFrame("中國象棋:觀棋不語真君子,棋死無悔大丈夫");
ImageIcon icon = new ImageIcon("image\\紅將.gif");
f.setIconImage(icon.getImage());
f.setSize(730,750);
f.setLocationRelativeTo(null);
f.setLayout(new BorderLayout());//學習一下BorderLayout()布局管理器,把按鈕放進去,
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final Canvas c= new Canvas();
f.add(c);
JButton newStartGame = new JButton("新游戲");
JButton startMusic = new JButton("播放音樂");
JButton ExitGame = new JButton("退出游戲");
//為新游戲按鈕 添加事件
newStartGame.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
c.initMap();//新游戲
c.repaint();//新游戲后,出棋先后順序互換
c.select_c = -1;
c.select_r = -1;
c.isBlack=!c.isBlack;
//System.out.println("點擊\n");
}
});
//為退出按鈕 添加事件
ExitGame.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
int j=JOptionPane.showConfirmDialog(null, "真的要退出嗎?","退出",JOptionPane.YES_OPTION,JOptionPane.QUESTION_MESSAGE);
if(j==JOptionPane.YES_OPTION){
System.exit(0);
}
}
});
//為音樂播放按鈕 添加事件
startMusic.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
String filepath = "music\\music.wav";
musicStuff musicObject = new musicStuff();
musicObject.playMusic(filepath);//音樂播放
}
});
//f.setIconImage(new ImageIcon("紅將.gif").getImage());
f.add(newStartGame,BorderLayout.WEST);
f.add(startMusic,BorderLayout.EAST);
f.add(ExitGame,BorderLayout.SOUTH);
f.setVisible(true);
}
}
2.Canvas.java 代碼:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.WindowConstants;
import javax.xml.bind.Marshaller.Listener;
import org.chess.Chess;
import org.chess.ImageTool;
import org.chess.RangeChecker;
import sun.tools.jar.resources.jar;
import com.sun.org.apache.bcel.internal.generic.NEW;
public class Canvas extends JPanel {
public static final int row=10;//棋盤行數
public static final int line=9;//棋盤列數
int[][] map = new int[row][line];
JLabel Icon;
Image chessimage = null;
Font font;
public static final int BLACK = 1000;
public static final int WHITE = 0;
boolean isBlack = false; //當前是誰下子
int select_c = -1;
int select_r = -1;
public Canvas(){//棋盤為10行9列,默認就好,不用改
//chessimage = new ImageIcon("黑車.gif").getImage();
font = new Font("宋體",Font.BOLD,30);
initMap();
addMouseListener(new MouseAdapter(){
@Override
public void mouseClicked(MouseEvent e){
//super.mouseClicked(e);
//System.out.println(e.getButton());
if(e.getButton()==MouseEvent.BUTTON1){
int x = e.getX();
int y = e.getY();
//System.out.println(e.getX()+","+e.getY()+"["+x+","+y+"]");
int r = (y - 25) /58;
int c = (x - 25) /58;
//System.out.println("r = "+r+", c = "+c);
//選子
if(select_c == -1&&map[r][c]!=0){
if(RangeChecker.selectInRange(map,r,c,isBlack)){//isBlack 是 紅方
select_c = c;
select_r = r;
repaint();
}
else{
showFail("請選擇己方棋子");
}
return ;// 選子階段結束
}
boolean valid = RangeChecker.inRange(map, select_r,select_c,r, c, isBlack);
if(!valid){
showFail("下子失敗");
}
Chess chess = manager.getTheChess(map[select_r][select_c]);
valid = chess.check(map, select_r, select_c, r, c, isBlack);
if(!valid||(map[select_r][select_c]<1000&&map[r][c]<1000&&map[r][c]!=0)||(map[select_r][select_c]>1000&&map[r][c]>1000&&map[r][c]!=0)){
showFail("下子失敗,規則不允許");
select_c = -1;
select_r = -1;
repaint();
return ;
}
map[r][c] = map[select_r][select_c ];
map[select_r][select_c ] = 0;
select_c = -1;
select_r = -1;
isBlack = !isBlack;//對方來下
repaint();
}
}
});
}
protected void showFail(String msg) {
System.out.println(msg);
}
ChessManager manager = new ChessManager();
private Image mainGif;
public void initMap(){
int c=0;
int i,k;
map=new int [][]{{1000+'C',1000+'H',1000+'E',1000+'S',1000+'G',1000+'S',1000+'E',1000+'H',1000+'C'}, {0,0,0,0,0,0,0,0,0,},
{0,1000+'P',0,0,0,0,0,1000+'P',0},{1000+'A',0,1000+'A',0,1000+'A',0,1000+'A',0,1000+'A'},
{0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0},
{'A',0,'A',0,'A',0,'A',0,'A'},{0,'P',0,0,0,0,0,'P',0},
{0,0,0,0,0,0,0,0,0},{'C','H','E','S','G','S','E','H','C'}};
//System.out.println(map[9][4]);
mainGif = ImageTool.loadImage("main.gif");
manager.loadAllImage();
}
//內部類
public static class MyPoint{
public int r;
public int c;
public MyPoint(int r,int c) {
this.r = r;
this.c = c;
}
}
int pw = 60;
@Override
public void paint(Graphics g){
super.paint(g);
//System.out.println("paint called ----------------");
g.setFont(font);
int w = this.getWidth();
int h = this.getHeight();
//System.out.println("寬"+w+" 高"+h);
g.drawImage(mainGif, 0, 0,null);
for(int r = 0;r<map.length;r++){
for(int c = 0;c<map[r].length;c++){
safelyDraw(g, manager.getImage(map[r][c]), 25+58*c, r*58+25);
}
}
g.drawRect(25+58*select_c, 25+58*select_r, 58, 58);
g.drawString(isBlack?"黑方下棋":"紅方下棋", 220 , 650);
}
public void safelyDraw(Graphics g,Image img,int x,int y){
try {
if(img == null){
//System.err.println("img = null ,skip drawing "+x+" , "+y);
}
g.drawImage(img, x, y,null);
} catch (Exception e) {
e.printStackTrace();
}
}
}
3.ChessManager.java 代碼:
import java.awt.Image;
import java.util.HashMap;
import org.chess.ArmsChess;
import org.chess.CannonChess;
import org.chess.CarChess;
import org.chess.ChapChess;
import org.chess.Chess;
import org.chess.ElephantChess;
import org.chess.GeneralChess;
import org.chess.HorseChess;
import org.chess.ImageTool;
public class ChessManager {
HashMap<Integer,Chess> chesses = new HashMap<Integer,Chess>();
public ChessManager(){
ArmsChess a = new ArmsChess();
chesses.put(a.getType(), a);
CannonChess b =new CannonChess();
chesses.put(b.getType(),b);
CarChess c = new CarChess();
chesses.put(c.getType(), c);
ChapChess d = new ChapChess();
chesses.put(d.getType(), d);
ElephantChess e = new ElephantChess();
chesses.put(e.getType(), e);
GeneralChess f = new GeneralChess();
chesses.put(f.getType(), f);
HorseChess g = new HorseChess();
chesses.put(g.getType(), g);
//其它其子類也在這里注冊
}
public Chess getTheChess(int type){
if(type > 1000) type -= 1000;
return chesses.get(type);
}
HashMap<String, Image> img_map=new HashMap<String, Image>();
public void loadAllImage() {
for(Chess c : chesses.values()){
Image img_black = c.getImage(true);
Image img_red = c.getImage(false);
img_map.put(c.getType()+"_黑", img_black);
img_map.put(c.getType()+"_紅", img_red);
}
}
public Image getImage(int type){
int color = type /1000;
type = type % 1000;
return img_map.get(type+(color==1?"_黑":"_紅"));
}
}
4.ArmsChess.java代碼:
package org.chess;
import java.awt.Image;
import javax.swing.JOptionPane;
/**
* 兵 A
* @author 曹佳榕 董玟彤(姜權罡最后修改成功)
*/
public class ArmsChess extends Chess{
@Override
public boolean check(int[][] map, int now_r, int now_c, int to_r, int to_c,boolean isBlack) {
// TODO Auto-generated method stub
int cc = to_c - now_c;
int rc = to_r - now_r;
if(isBlack==true){//黑卒
if(now_r<=4){//黑卒未過河
boolean succ = cc == 0 && rc == 1;//黑卒未過河,向下前進一格
if(!succ) return false;//如果不是向下前進一格,直接失敗
else{
return true;
}
}
else{//黑卒過河
cc = Math.abs(to_c - now_c);
boolean succ = (cc == 1&&rc==0) || (rc == 1&&cc==0);//黑卒過河,向下前進一格
if(!succ) return false;//如果不是向下/向左/向右前進一格,直接失敗
else{
if(map[to_r][to_c]=='G'){
JOptionPane.showMessageDialog(null, "黑方勝利!");
}
return true;
}
//return map[to_r][to_c]==0;
}
}
else{//紅卒
if(now_r>=5){//紅卒未過河
boolean succ = cc == 0 && rc == -1;//紅卒未過河,向上前進一格
if(!succ) return false;//如果不是向上前進一格,直接失敗
else{
return true;
}
}
else{//紅卒過河
cc = Math.abs(to_c - now_c);
boolean succ = (cc == 1&&rc==0) || (rc == -1&&cc==0);//紅卒過河,向上前進一格
if(!succ) return false;//如果不是向上/向左/向右前進一格,直接失敗
else{
if(map[to_r][to_c]==1000+'G'){
JOptionPane.showMessageDialog(null, "紅方勝利!");
}
return true;
}
}
}
}
@Override
public String getName() {
// TODO Auto-generated method stub
return "卒";
}
@Override
public int getType() {
// TODO Auto-generated method stub
return 'A';
}
@Override
public Image getImage(boolean isBlack) {
// TODO Auto-generated method stub
return ImageTool.loadImage(isBlack?"黑卒.gif":"紅卒.gif");
}
}
5.CannonChess.java代碼:
package org.chess;
import java.awt.Image;
import javax.swing.JOptionPane;
/*
*
* @author 姜權罡
* */
public class CannonChess extends Chess {
@Override
public boolean check(int[][] map, int now_r, int now_c, int to_r, int to_c,boolean isBlack) {
// TODO Auto-generated method stub
int cc = Math.abs(now_c - to_c);
int rc = Math.abs(now_r - to_r);
//count為 0 說明炮與目標之間沒有棋子
//count為 1 說明炮與目標之間有 1個 棋子
//count為 2 說明炮與目標之間有 2個 棋子
boolean succ = (cc==0 &&rc!=0 )||(cc!=0 &&rc==0 );//如果不是單條線,直接失敗
if(!succ) return false;
int count=0;
int from,to;
//目標點沒有棋子,且目標點和初始點之間無棋子,成功,
//目標點有棋子,且為敵方棋子,且目標點和初始點之間有一個棋子,成功,
if(rc==0){//橫著走
if(now_c<to_c){//向右走
from = now_c+1;
to=to_c;
}else{//向左走
from = to_c+1;
to = now_c;
}
for(int i=from;i<to;i++){
if(map[now_r][i]!=0){
count++;
}
}
System.out.println("棋子個數:\n"+count);
if(map[to_r][to_c]==0&&count==0)
{
return true;
}
if(map[to_r][to_c]==0&&count==1)
{
return false;
}
//黑方,對面為紅方; 紅方,對面為黑方,
if(map[to_r][to_c]!=0&&((isBlack==true&&map[to_r][to_c]<1000)||(isBlack==false&&map[to_r][to_c]>1000))&&count==1){
//將軍
if(isBlack==true&&map[to_r][to_c]=='G'){
JOptionPane.showMessageDialog(null, "黑方勝利!");
return true;
}
if(isBlack==false&&map[to_r][to_c]==1000+'G'){
JOptionPane.showMessageDialog(null, "紅方勝利!");
return true;
}
return true;
}
else{
return false;
}
}else{//豎著走
if(now_r<to_r){//向下走
from = now_r+1;
to = to_r;
}else{//向上走
from = to_r+1;
to = now_r;
}
for(int i=from;i<to;i++){
if(map[i][now_c]!=0){
count++;
}
}
System.out.println("棋子個數:\n"+count);
if(map[to_r][to_c]==0&&count==0)
{
return true;
}
if(map[to_r][to_c]==0&&count==1)
{
return false;
}
//黑方,對面為紅方; 紅方,對面為黑方,
if(map[to_r][to_c]!=0&&((isBlack==true&&map[to_r][to_c]<1000)||(isBlack==false&&map[to_r][to_c]>1000))&&count==1){
//將軍
if(isBlack==true&&map[to_r][to_c]=='G'){
JOptionPane.showMessageDialog(null, "黑方勝利!");
return true;
}
if(isBlack==false&&map[to_r][to_c]==1000+'G'){
JOptionPane.showMessageDialog(null, "紅方勝利!");
return true;
}
//return true;
}else{
return false;
}
}
return true;
}
@Override
public String getName() {
// TODO Auto-generated method stub
return "炮";
}
@Override
public int getType() {
// TODO Auto-generated method stub
return 'P';
}
@Override
public Image getImage(boolean isBlack) {
// TODO Auto-generated method stub
return ImageTool.loadImage(isBlack?"黑炮.gif":"紅炮.gif");
}
}
6.CarChess代碼:
package org.chess;
import java.awt.Image;
import javax.swing.JOptionPane;
/*
* 黑車1
* 紅車11
* @author 龐義俊(姜權罡最后修改成功)
* */
public class CarChess extends Chess {
@Override
public boolean check(int[][] map, int now_r, int now_c, int to_r, int to_c,boolean isBlack) {
// TODO Auto-generated method stub
int cc = Math.abs(now_c - to_c);
int rc = Math.abs(now_r - to_r);
//車類比炮寫,車比炮簡單
boolean succ = (cc==0 &&rc!=0 )||(cc!=0 &&rc==0 );//如果不是單條線,直接失敗
if(!succ) return false;
int from,to;
if(rc == 0){//橫著走
if(now_c < to_c){//向右走
from = now_c+1 ;
to = to_c;
}else{ // d 0 0 x
//from = to_c;
//to = now_c-1;
from = now_c-1;
to = to_c;
}
for(int i=from;i<to;i++){
if(map[now_r][i] != 0 )return false; //中間有棋子,失敗!!
}
}else{ //豎著走
//TODO
if(now_r<to_r){//向上走
from = to_r;
to=now_r-1;
}else{//向下走
from = now_r+1;
to=to_r;
}
for(int i=from;i<to;i++){
if(map[i][now_c] != 0 )return false; //中間有棋子,失敗!!
}
}
if(isBlack==true&&map[to_r][to_c]=='G'){
JOptionPane.showMessageDialog(null, "黑方勝利!");
return true;
}
if(isBlack==false&&map[to_r][to_c]==1000+'G'){
JOptionPane.showMessageDialog(null, "紅方勝利!");
return true;
}
return true;
}
@Override
public String getName() {
// TODO Auto-generated method stub
return "車";
}
@Override
public int getType() {
// TODO Auto-generated method stub
return 'C';
}
@Override
public Image getImage(boolean isBlack) {
// TODO Auto-generated method stub
return ImageTool.loadImage(isBlack?"黑車.gif":"紅車.gif");
}
}
7.ChapChess代碼:
package org.chess;
import java.awt.Image;
/*
* 士4
* 仕44
* @author 曹佳榕(姜權罡最后修改成功)
* */
public class ChapChess extends Chess {
@Override
public boolean check(int[][] map, int now_r, int now_c, int to_r, int to_c,boolean isBlack) {
// TODO Auto-generated method stub
int cc = Math.abs(now_c - to_c);
int rc = Math.abs(now_r - to_r);
//要分黑士 和紅仕!!(to_r>=7&&to_r<=9&&to_c>=3&&to_c<=5)
//黑士(to_r>=0&&to_r<=2&&to_c>=3&&to_c<=5)
boolean succ;
if(isBlack==true){//黑士
//如果不是一條斜線,直接失敗,還要保證目標位置沒有棋子
//succ = cc==1 && rc==1 &&(to_r>=0&&to_r<=2&&to_c>=3&&to_c<=5)&&(map[to_r][to_c]==0);
succ = cc==1 && rc==1 && (to_r>=0&&to_r<=2&&to_c>=3&&to_c<=5);
}
else{//紅仕
//如果不是一條斜線,直接失敗
//succ = cc==1 && rc==1 &&(to_r>=7&&to_r<=9&&to_c>=3&&to_c<=5)&&(map[to_r][to_c]==0);
succ = cc==1 && rc==1 &&(to_r>=7&&to_r<=9&&to_c>=3&&to_c<=5);
}
if(!succ) return false;
else{
return true;
}
}
@Override
public String getName() {
// TODO Auto-generated method stub
return "士";
}
@Override
public int getType() {
// TODO Auto-generated method stub
return 'S';
}
@Override
public Image getImage(boolean isBlack) {
// TODO Auto-generated method stub
return ImageTool.loadImage(isBlack?"黑士.gif":"紅士.gif");
}
}
8.Chess.java 代碼:
package org.chess;
import java.awt.Image;
/*
* 棋子父類、
* 所有棋子繼承該類
* @author 姜權罡
* */
public abstract class Chess {
/**
* 檢查落子是否合法
* @param map 地圖
* @param now_r 當前棋子的行號
* @param now_c 當前棋子的列號
* @param to_r 想去地方的行號
* @param to_c 想去地方的列號
* @param isBlack 如果黑方 傳true 否則傳false
* @return 如果可以去,回傳true, 否則回傳false
*/
public abstract boolean check(int[][] map,int now_r,int now_c ,int to_r, int to_c,boolean isBlack);
public abstract int getType();
public abstract String getName();
public abstract Image getImage(boolean isBlack);
}
9.ElephantChess.java 代碼:
package org.chess;
import java.awt.Image;
/**
* 象3
* 相33
* @author 董玟彤(姜權罡最后修改成功)
*/
public class ElephantChess extends Chess{
@Override
public boolean check(int[][] map, int now_r, int now_c, int to_r, int to_c,boolean isBlack) {
int cc = Math.abs(now_c - to_c);
int rc = Math.abs(now_r - to_r);
boolean succ = cc == 2 && rc == 2;
if(!succ ) return false; //如果不是田,直接失敗!
int c = (now_c+to_c)/2;
int r = (now_r+to_r)/2;
if(isBlack==true){//黑象
return map[r][c] == 0&&to_r<=4;//象不能過河
//該點二維陣列為0說明,象眼為空,可以走棋,不考慮目標點有沒有棋子!
}
else{//紅象
return map[r][c] == 0&&to_r>=5;//象不能過河
}
}
@Override
public String getName() {
return "象";
}
@Override
public int getType() {
return 'E';
}
@Override
public Image getImage(boolean isBlack) {
return ImageTool.loadImage(isBlack?"黑象.gif":"紅象.gif");
}
}
10.GeneralChess.java 代碼:
package org.chess;
import java.awt.Image;
import javax.swing.JOptionPane;
/*
* 將5
* 帥55
* @author 龐義俊(姜權罡最后修改成功)
* */
public class GeneralChess extends Chess {
@Override
public boolean check(int[][] map, int now_r, int now_c, int to_r, int to_c,boolean isBlack) {
// TODO Auto-generated method stub
int cc = Math.abs(now_c - to_c);
int rc = Math.abs(now_r - to_r);
boolean succ;
int count=0;
int min_r= now_r<to_r?now_r:to_r;
int max_r=now_r>to_r?now_r:to_r;
for(int i=min_r+ 1;i<max_r;i++){//如果雙方 將軍之間有棋子的話,不可走棋
if(cc==0&&map[i][now_c]!=0){
count=1;
return false;
}
}
if(isBlack==true){//黑將
//如果是一條斜線,直接失敗
//目標為紅將,且之間沒有棋子,移動
if(map[to_r][to_c]=='G'&&count==0){
JOptionPane.showMessageDialog(null, "黑方勝利");
return true;
}
succ = ((cc==1 && rc==0)||(cc==0 && rc==1)) &&(to_r>=0&&to_r<=2&&to_c>=3&&to_c<=5);
}
else{//紅帥
//如果是一條斜線,直接失敗
//目標為黑將,且之間沒有棋子,移動
if(map[to_r][to_c]==1000+'G'&&count==0){
JOptionPane.showMessageDialog(null, "紅方勝利");
return true;
}
succ = ((cc==1 && rc==0)||(cc==0 && rc==1)) &&(to_r>=7&&to_r<=9&&to_c>=3&&to_c<=5);
}
if(!succ) return false;
return true;
}
@Override
public String getName() {
// TODO Auto-generated method stub
return "將";
}
@Override
public int getType() {
// TODO Auto-generated method stub
return 'G';
}
@Override
public Image getImage(boolean isBlack) {
// TODO Auto-generated method stub
return ImageTool.loadImage(isBlack?"黑將.gif":"紅將.gif");
}
}
11.HorseChess.java 代碼:
package org.chess;
import java.awt.Image;
import javax.swing.JOptionPane;
/*
* 馬 H
* @author 姜權罡
* */
public class HorseChess extends Chess {
@Override
public boolean check(int[][] map, int now_r, int now_c, int to_r, int to_c,boolean isBlack) {
// TODO Auto-generated method stub
int cc=Math.abs(now_c - to_c);
int rc=Math.abs(now_r - to_r);
boolean succ = (cc ==2&&rc==1)||(cc ==1&&rc==2);
if(!succ) return false;//如果不是日,直接失敗!
int r;//r為馬腳的行坐標
int c;//c為馬腳的列坐標
if(cc==1){//走日
r=(to_r+now_r)/2;
c=now_c;
}
else{//走橫著的 日
r=now_r;
c=(to_c+now_c)/2;
}
if(isBlack==true&&map[to_r][to_c]=='G'){
JOptionPane.showMessageDialog(null, "黑方勝利!");
return true;
}
if(isBlack==false&&map[to_r][to_c]==1000+'G'){
JOptionPane.showMessageDialog(null, "紅方勝利!");
return true;
}
return map[r][c]==0;
}
@Override
public String getName() {
// TODO Auto-generated method stub
return "馬";
}
@Override
public int getType() {
// TODO Auto-generated method stub
return 'H';
}
@Override
public Image getImage(boolean isBlack) {
// TODO Auto-generated method stub
return ImageTool.loadImage(isBlack?"黑馬.gif":"紅馬.gif");
}
}
12.ImageToool.java 代碼:
package org.chess;
import java.awt.Image;
import javax.swing.ImageIcon;
public class ImageTool {
public static Image loadImage(String path){
try {
ImageIcon im = new ImageIcon("image\\"+path);
return im.getImage();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public static void main(String[] args) {
ImageIcon im=new ImageIcon("image\\main.gif");
System.out.println(im);
}
}
13.musicStuff.java 代碼:
package org.chess;
import java.io.File;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
/*
* 音樂播放器
* 龐義俊
* */
public class musicStuff {
public void playMusic(String musicLocation)
{
try
{
File musicPath = new File(musicLocation);
if(musicPath.exists())
{
AudioInputStream audioInput = AudioSystem.getAudioInputStream(musicPath);
Clip clip = AudioSystem.getClip();
clip.open(audioInput);
clip.start();
clip.loop(Clip.LOOP_CONTINUOUSLY);
}
else
{
}
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
}
14.RangeChecker.java 代碼:
package org.chess;
import java.awt.Canvas;
import javax.swing.JOptionPane;
public class RangeChecker {
// 1 r和c 是不是合法的
// 2 目標位置是否已經有其它棋子,如果有敵方棋子可以走,有己方不可走
public static boolean inRange(int[][] map,int p_r,int p_c,int r,int c,boolean isBlack){
if(r<0 || r>9 || c< 0 || c>9) return false;
if(map[r][c]==0){//目標位置沒有棋子,走棋
return false;
}else{//目標位置有棋子 判斷是否為友方!友方不可走,敵對方可走,
if(map[r][c]<1000&&map[p_r][p_c]>1000){//紅方,之前的是黑方, 結果是敵方 可以走棋
return true;
}else if(map[r][c]>1000&&map[p_r][p_c]<1000){//黑方,之前的是紅方,結果是敵方 不可走棋
return true;
}else{
return false;
}
}
}
public static boolean selectInRange(int[][] map, int r, int c,boolean isBlack) {
//下表在范圍內,且當前點由自己放的棋子可以, 否則不可以,
if(r<0 || r>9 || c< 0 || c>9) return false;
if(map[r][c] == 0) return true;
return (isBlack==true && map[r][c]>1000) || (isBlack==false && map[r][c]<1000);
}
}
15.test檔案夾下的測驗類 這里只舉其中一個例子(測驗炮),其他的按照這個寫就可以了,
TestCannonChess.java 代碼如下:
import org.chess.CannonChess;
import junit.framework.TestCase;
public class TestCannonChess extends TestCase {
CannonChess chess = new CannonChess();
//炮水平向右移動(程序無棋子)
public void testCheck1(){
int[][] map = {
{ 0 ,0 ,0, 0, 0, 0, 0 },
{ 0 ,0 ,0, 0, 0, 0, 0 },
{ 0 ,0 ,0, 1006, 0, 0, 0 },
{ 0 ,0 ,0, 0, 0, 0, 0 },
{ 0 ,0 ,0, 0, 0, 0, 0 }
};
boolean b = chess.check(map, 2,3,2, 6, true);//黑方還是紅方, true為黑方
assertEquals(b, true);
}
//炮水平向右移動(程序有一個棋子)
public void testCheck31(){
int[][] map = {
{ 0 ,0 ,0, 0, 0, 0, 0 },
{ 0 ,0 ,0, 0, 0, 0, 0 },
{ 0 ,0 ,0, 1006, 0, 1, 0 },
{ 0 ,0 ,0, 0, 0, 0, 0 },
{ 0 ,0 ,0, 0, 0, 0, 0 }
};
boolean b = chess.check(map, 2,3,2, 6, true);//黑方還是紅方, true為黑方
assertEquals(b, false);
}
//炮水平向右移動(程序有一個棋子)
public void testCheck32(){
int[][] map = {
{ 0 ,0 ,0, 0, 0, 0, 0 },
{ 0 ,0 ,0, 0, 0, 0, 0 },
{ 0 ,0 ,0, 1006, 0, 1, 6 },
{ 0 ,0 ,0, 0, 0, 0, 0 },
{ 0 ,0 ,0, 0, 0, 0, 0 }
};
boolean b = chess.check(map, 2,3,2, 6, true);//黑方還是紅方, true為黑方
assertEquals(b, true);
}
//炮水平向右移動(程序有兩個棋子)
public void testCheck33(){
int[][] map = {
{ 0 ,0 ,0, 0, 0, 0, 0 },
{ 0 ,0 ,0, 0, 0, 0, 0 },
{ 0 ,0 ,0, 1006, 1, 1, 6 },
{ 0 ,0 ,0, 0, 0, 0, 0 },
{ 0 ,0 ,0, 0, 0, 0, 0 }
};
boolean b = chess.check(map, 2,3,2, 6, true);//黑方還是紅方, true為黑方
assertEquals(b, false);
}
//炮水平向左移動(程序無棋子)
public void testCheck41(){
int[][] map = {
{ 0 ,0 ,0, 0, 0, 0, 0 },
{ 0 ,0 ,0, 0, 0, 0, 0 },
{ 0 ,0 ,0, 1006, 0, 0, 0 },
{ 0 ,0 ,0, 0, 0, 0, 0 },
{ 0 ,0 ,0, 0, 0, 0, 0 }
};
boolean b = chess.check(map, 2,3,2, 0, true);//黑方還是紅方, true為黑方
assertEquals(b, true);
}
//炮水平向左移動(程序一個棋子)
public void testCheck42(){
int[][] map = {
{ 0 ,0 ,0, 0, 0, 0, 0 },
{ 0 ,0 ,0, 0, 0, 0, 0 },
{ 0 ,0 ,1, 1006, 0, 0, 0 },
{ 0 ,0 ,0, 0, 0, 0, 0 },
{ 0 ,0 ,0, 0, 0, 0, 0 }
};
boolean b = chess.check(map, 2,3,2, 0, true);//黑方還是紅方, true為黑方
assertEquals(b, false);
}
//炮水平向左移動(程序一個棋子)
public void testCheck43(){
int[][] map = {
{ 0 ,0 ,0, 0, 0, 0, 0 },
{ 0 ,0 ,0, 0, 0, 0, 0 },
{ 6 ,0 ,1, 1006, 0, 0, 0 },
{ 0 ,0 ,0, 0, 0, 0, 0 },
{ 0 ,0 ,0, 0, 0, 0, 0 }
};
boolean b = chess.check(map, 2,3,2, 0, true);//黑方還是紅方, true為黑方
assertEquals(b, true);
}
//炮水平向左移動(程序兩個棋子)
public void testCheck44(){
int[][] map = {
{ 0 ,0 ,0, 0, 0, 0, 0 },
{ 0 ,0 ,0, 0, 0, 0, 0 },
{ 6 ,1,1, 1006, 0, 0, 0 },
{ 0 ,0 ,0, 0, 0, 0, 0 },
{ 0 ,0 ,0, 0, 0, 0, 0 }
};
boolean b = chess.check(map, 2,3,2, 0, true);//黑方還是紅方, true為黑方
assertEquals(b, false);
}
//炮豎直向上移動(程序0個棋子)
public void testCheck51(){
int[][] map = {
{ 0 ,0 ,0, 0, 0, 0, 0 },
{ 0 ,0 ,0, 0, 0, 0, 0 },
{ 0 ,0,0, 0, 0, 0, 0 },
{ 0 ,0 ,0, 1006, 0, 0, 0 },
{ 0 ,0 ,0, 0, 0, 0, 0 },
{ 0 ,0 ,0, 0, 0, 0, 0 },
{ 0 ,0 ,0, 0, 0, 0, 0 },
{ 0 ,0 ,0, 0, 0, 0, 0 }
};
boolean b = chess.check(map, 3,3,0,3 , true);//黑方還是紅方, true為黑方
assertEquals(b, true);
}
//炮豎直向上移動(程序1個棋子)
public void testCheck52(){
int[][] map = {
{ 0 ,0 ,0, 0, 0, 0, 0 },
{ 0 ,0 ,0, 0, 0, 0, 0 },
{ 0 ,0,0, 1, 0, 0, 0 },
{ 0 ,0 ,0, 1006, 0, 0, 0 },
{ 0 ,0 ,0, 0, 0, 0, 0 },
{ 0 ,0 ,0, 0, 0, 0, 0 },
{ 0 ,0 ,0, 0, 0, 0, 0 },
{ 0 ,0 ,0, 0, 0, 0, 0 }
};
boolean b = chess.check(map, 3,3,0,3 , true);//黑方還是紅方, true為黑方
assertEquals(b, false);
}
//炮豎直向上移動(程序1個棋子)
public void testCheck53(){
int[][] map = {
{ 0 ,0 ,0, 1, 0, 0, 0 },
{ 0 ,0 ,0, 0, 0, 0, 0 },
{ 0 ,0,0, 1, 0, 0, 0 },
{ 0 ,0 ,0, 1006, 0, 0, 0 },
{ 0 ,0 ,0, 0, 0, 0, 0 },
{ 0 ,0 ,0, 0, 0, 0, 0 },
{ 0 ,0 ,0, 0, 0, 0, 0 },
{ 0 ,0 ,0, 0, 0, 0, 0 }
};
boolean b = chess.check(map, 3,3,0,3 , true);//黑方還是紅方, true為黑方
assertEquals(b, true);
}
//炮豎直向上移動(程序2個棋子)
public void testCheck54(){
int[][] map = {
{ 0 ,0 ,0, 0, 0, 0, 0 },
{ 0 ,0 ,0, 2, 0, 0, 0 },
{ 0 ,0,0, 1, 0, 0, 0 },
{ 0 ,0 ,0, 1006, 0, 0, 0 },
{ 0 ,0 ,0, 0, 0, 0, 0 },
{ 0 ,0 ,0, 0, 0, 0, 0 },
{ 0 ,0 ,0, 0, 0, 0, 0 },
{ 0 ,0 ,0, 0, 0, 0, 0 }
};
boolean b = chess.check(map, 3,3,0,3 , true);//黑方還是紅方, true為黑方
assertEquals(b, false);
}
//炮豎直向上移動(程序2個棋子)
public void testCheck55(){
int[][] map = {
{ 0 ,0 ,0, 1, 0, 0, 0 },
{ 0 ,0 ,0, 2, 0, 0, 0 },
{ 0 ,0,0, 1, 0, 0, 0 },
{ 0 ,0 ,0, 1006, 0, 0, 0 },
{ 0 ,0 ,0, 0, 0, 0, 0 },
{ 0 ,0 ,0, 0, 0, 0, 0 },
{ 0 ,0 ,0, 0, 0, 0, 0 },
{ 0 ,0 ,0, 0, 0, 0, 0 }
};
boolean b = chess.check(map, 3,3,0,3 , true);//黑方還是紅方, true為黑方
assertEquals(b, false);
}
//炮豎直向下移動(程序0個棋子)
public void testCheck61(){
int[][] map = {
{ 0 ,0 ,0, 0, 0, 0, 0 },
{ 0 ,0 ,0, 0, 0, 0, 0 },
{ 0 ,0,0, 0, 0, 0, 0 },
{ 0 ,0 ,0, 1006, 0, 0, 0 },
{ 0 ,0 ,0, 0, 0, 0, 0 },
{ 0 ,0 ,0, 0, 0, 0, 0 },
{ 0 ,0 ,0, 0, 0, 0, 0 },
{ 0 ,0 ,0, 0, 0, 0, 0 }
};
boolean b = chess.check(map, 3,3,6,3 , true);//黑方還是紅方, true為黑方
assertEquals(b, true);
}
//炮豎直向下移動(程序1個棋子)
public void testCheck62(){
int[][] map = {
{ 0 ,0 ,0, 0, 0, 0, 0 },
{ 0 ,0 ,0, 0, 0, 0, 0 },
{ 0 ,0,0, 0, 0, 0, 0 },
{ 0 ,0 ,0,1006, 0, 0, 0 },
{ 0 ,0 ,0, 1, 0, 0, 0 },
{ 0 ,0 ,0, 0, 0, 0, 0 },
{ 0 ,0 ,0, 0, 0, 0, 0 },
{ 0 ,0 ,0, 0, 0, 0, 0 }
};
boolean b = chess.check(map, 3,3,6,3 , true);//黑方還是紅方, true為黑方
assertEquals(b, false);
}
//炮豎直向下移動(程序1個棋子)
public void testCheck63(){
int[][] map = {
{ 0 ,0 ,0, 0, 0, 0, 0 },
{ 0 ,0 ,0, 0, 0, 0, 0 },
{ 0 ,0,0, 0, 0, 0, 0 },
{ 0 ,0 ,0,1006, 0, 0, 0 },
{ 0 ,0 ,0, 1, 0, 0, 0 },
{ 0 ,0 ,0, 0, 0, 0, 0 },
{ 0 ,0 ,0, 2, 0, 0, 0 },
{ 0 ,0 ,0, 0, 0, 0, 0 }
};
boolean b = chess.check(map, 3,3,6,3 , true);//黑方還是紅方, true為黑方
assertEquals(b, true);
}
//炮豎直向下移動(程序2個棋子)
public void testCheck64(){
int[][] map = {
{ 0 ,0 ,0, 0, 0, 0, 0 },
{ 0 ,0 ,0, 0, 0, 0, 0 },
{ 0 ,0,0, 0, 0, 0, 0 },
{ 0 ,0 ,0,1006, 0, 0, 0 },
{ 0 ,0 ,0, 1, 0, 0, 0 },
{ 0 ,0 ,0, 1, 0, 0, 0 },
{ 0 ,0 ,0, 2, 0, 0, 0 },
{ 0 ,0 ,0, 0, 0, 0, 0 }
};
boolean b = chess.check(map, 3,3,6,3 , true);//黑方還是紅方, true為黑方
assertEquals(b, false);
}
}
謝謝大家的支持,您的一鍵三連是 罡罡同學前進的最大動力!
一鍵三連 一鍵三連 一鍵三連 一鍵三連 一鍵三連 一鍵三連
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/245759.html
標籤:其他
