四子棋的JAVA实现源代码

合集下载

四子棋游戏程序设计

四子棋游戏程序设计

四子棋游戏程序设计1设计任务及要求1.1设计任务设计一个四子棋游戏程序,棋盘为8X8(64格),先达到4子成一条线即结束游戏。

(该程序在DOS下运行)。

1.2任务要求(1)画出棋盘界面。

(2)定义键盘的功能,可以实现棋子左右移动及落子。

(3)棋子不能悬空,落子后不能再移动。

(4)人、人分别落子。

(5)用不同的颜色区分各方的棋子。

(6)撰写设计说明书及调试心得。

2程序设计思路2.1 主程序及模块链接四子棋的程序中包含许多模块,其中有棋盘的绘制,棋子的绘制以及棋子坐标位置的计算,棋子胜负的算法等等,在主程序中需要将这些模块链接起来。

程序主流程图:流程图程序运行界面图图2-1 程序运行界面截图2.2棋盘的绘制本次课程设计要求是绘制8x8格的棋盘,在绘制过程中,需要调用dos 功能调用中的int 10h命令,利用该命令中的多项功能可以完成绘制棋盘中所需要的划线和填充颜色,从而绘制出8x8格棋盘!绘制棋盘程序代码:ro rcolor,rrow,rcol,endcol ;调用划线的命令local rline1; line horizonmov dx,rrowmov cx,rcolrline1:mov al,rcolor ;调用int 10h 中的och功能mov ah,0chint 10hinc cx ;累加1的功能cmp cx,endcol ;比较cx和endcol的大小jl rline1 ;小于就再循环执行一次endm段程序中, dx的值没有变化,不断的累加cx的值,不断的写像素,从而达到画横线的功能.cline macro color,crow,ccol,endrow ;画竖线local cline1;line verticalmov dx,crowmov cx,ccolcline1: ;和上一段的程序相似mov al,colormov ah,0chint 10hinc dxcmp dx,endrowjl cline1endmdx的值没有变化,不断的累加cx的值,不断的写像素,从而完成画横线的功能。

java实现四子棋游戏

java实现四子棋游戏

java实现四⼦棋游戏⾮常简单的四⼦棋游戏本⼈是刚学java的⼩⽩,最近在书上看到了有关四⼦棋游戏的编程题,就试着来写⼀写,代码也⽐较简单。

思路写四⼦棋的难点是如何判断四个棋⼦连在⼀起。

下⾯给出图解:观察上图,先从落棋点开始,设置⼀个计数器 i ,并初始化它为1,像左端移动,遇到的是跟落棋点相同颜⾊的棋⼦,则使 i 加1,继续向左端移动,没有棋⼦,则回到落棋点从⽽向右移动,向右端移动遇到第三个相同的棋,这时i = 3,然后继续向右移动遇到第四个棋⼦使 i = 4,到最后只要i = 4,即游戏胜利。

再看下图。

按照上⾯的流程,先向左边移动,遇到没有棋⼦的点停⽌后 i = 2,再向右移动,遇到不同颜⾊的棋⼦后停⽌,i = 3,这样落棋点两边⽅向判断结束后,i < 4即游戏继续。

总结判断游戏是否胜利,就是从棋⼦落点两个相反的⽅向,遇到相同的棋⼦使计数器数值加1,遇到⽆棋或颜⾊不同就结束向另⼀个⽅向,直到遇到⽆棋⼦和不同颜⾊的棋⼦,然后判断计数器是否为4。

在四⼦棋中有7个⽅向需要判断。

import java.util.Scanner;/***** 玩法:1.跟五⼦棋玩法差不多,只是少⼀颗⼦,下棋只能选择每列下在每列棋⼦上⾯⼀格。

* 2.棋⼦分为黄、红,执黄先⾏。

* 3.胜利条件跟五⼦棋⼀样,就是少⼀颗⼦。

*/class Desk {//棋桌类private char[][] date = new char[6][7];private Scanner scanner = new Scanner(System.in) ;private int hand = 1 ;//画出整个棋盘以及上⾯的棋⼦public void draw() {for (int i = 0; i < this.date.length; i++) {System.out.print("|");for (int j = 0; j < this.date[i].length; j++) {System.out.print(this.date[i][j] + "|");}System.out.println();}if (this.hand % 2 == 1) {System.out.print("现在是第" + this.hand + "⼿,轮到黄棋: ");playchess('Y');}else {System.out.print("现在是第" + this.hand + "⼿,轮到红棋: ") ;playchess('R');}}//控制落⼦public void playchess(char color) {this.hand ++;int place = scanner.nextInt() ;int i ;for (i = 5; i >= 0; i--) { //if (date[i][place] == '\u0000') {date[i][place] = color;break;}}if (i < 0)System.exit(1);else win(i, place, color) ;}//判断游戏是否有⼈胜利或平局(依据是根据落⼦位置的两个⽅向是否连成四⼦) public void win(int x, int place,char color) {int number = 1;//第⼀个⽅向(右斜线⽅向)for (int i = x - 1, j = place - 1; (i >= 0) && (j >= 0); i--, j--) {if (date[i][j] == color) {number++;}else break;}for (int i = x + 1, j = place + 1; (i <= 5) && (j <= 6); i++, j++) {if (date[i][j] == color) {number ++ ;}else break;}if (number == 4)end(color, "win");//第⼆个⽅向(左斜线⽅向)number = 1;for (int i = x - 1, j = place + 1; (i >= 0) && (j <= 6); i--, j++) {if (date[i][j] == color) {number++;}else break;}for (int i = x + 1, j = place - 1; (i <= 5) && (j >= 0); i++, j--) {if (date[i][j] == color) {number ++ ;}else break;}if (number == 4)end(color, "win");//第三个⽅向(⽔平)number = 1;for (int i = x, j = place - 1; j >= 0; j--) {if (date[i][j] == color) {number ++ ;}else break ;}for (int i = x, j = place + 1; j <= 6; j++) {if (date[i][j] == color) {number ++ ;}else break;}if (number == 4)end(color, "win");//第四个⽅向(竖直)number = 1;for (int i = x + 1, j = place; i <= 5; i++) {if (date[i][j] == color) {number ++ ;}else break;}if (number == 4)end(color, "win") ;//判断平局for (int i = 0; i < date.length; i++) {for (int j = 0; j < date[i].length; j++) {if (date[i][j] != 'Y' || date[i][j] != 'R')draw() ;}}end(color, "s") ;}//判断游戏是否结束public void end(char color, String str) {if (str.equals("win")) {System.out.print(color + "棋获得胜利");System.exit(0);}else {System.out.print("两棋⼦平局.") ;System.exit(0);}}}public class ChessOffour {public static void main(String[] args) {Desk desk = new Desk() ;desk.draw() ;}}以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

java中国象棋代码(单机版)

java中国象棋代码(单机版)

import javax.swing.*;import java.util.*;import java.io.*;import java.awt.*;import java.awt.event.*;public class Chess{public static void main(String args[]){new ChessMainFrame("中国象棋:观棋不语真君子,棋死无悔大丈夫");}}//主框架类class ChessMainFrame extends JFrame implements ActionListener,MouseListener,Runnable{ //玩家JLabel play[] = new JLabel[32];//棋盘JLabel image;//窗格Container con;//工具栏JToolBar jmain;//重新开始JButton anew;//悔棋JButton repent;//退出JButton exit;//当前信息JLabel text;//保存当前操作Vector Var;//规则类对象(使于调用方法)ChessRule rule;/**** 单击棋子** chessManClick = true 闪烁棋子并给线程响应** chessManClick = false 吃棋子停止闪烁并给线程响应*/boolean chessManClick;/**** 控制玩家走棋** chessPlayClick=1 黑棋走棋** chessPlayClick=2 红棋走棋默认红棋** chessPlayClick=3 双方都不能走棋*/int chessPlayClick=2;//控制棋子闪烁的线程Thread tmain;//把第一次的单击棋子给线程响应static int Man,i;ChessMainFrame(){new ChessMainFrame("中国象棋");}/**** 构造函数** 初始化图形用户界面*/ChessMainFrame(String Title){//获行客格引用con = this.getContentPane();con.setLayout(null);//实例化规则类rule = new ChessRule();Var = new Vector();//创建工具栏jmain = new JToolBar();text = new JLabel("欢迎使用象棋对弈系统");//当鼠标放上显示信息text.setToolTipText("信息提示");anew = new JButton(" 新游戏");anew.setToolTipText("重新开始新的一局");exit = new JButton(" 退出");exit.setToolTipText("退出象棋程序程序");repent = new JButton(" 悔棋");repent.setToolTipText("返回到上次走棋的位置");//把组件添加到工具栏jmain.setLayout(new GridLayout(0,4));jmain.add(anew);jmain.add(repent);jmain.add(exit);jmain.add(text);jmain.setBounds(0,0,558,30);con.add(jmain);//添加棋子标签drawChessMan();//注册按扭监听anew.addActionListener(this);repent.addActionListener(this);exit.addActionListener(this);//注册棋子移动监听for (int i=0;i<32;i++){con.add(play[i]);play[i].addMouseListener(this);}//添加棋盘标签con.add(image = new JLabel(new ImageIcon("image\\Main.GIF"))); image.setBounds(0,30,558,620);image.addMouseListener(this);//注册窗体关闭监听this.addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent we){System.exit(0);}});//窗体居中Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); Dimension frameSize = this.getSize();if (frameSize.height > screenSize.height){frameSize.height = screenSize.height;}if (frameSize.width > screenSize.width){frameSize.width = screenSize.width;}this.setLocation((screenSize.width - frameSize.width) / 2 - 280 ,(screenSize.height - frameSize.height ) / 2 - 350);//设置this.setIconImage(new ImageIcon("image\\红将.GIF").getImage());this.setResizable(false);this.setTitle(Title);this.setSize(558,670);this.show();}/**** 添加棋子方法*/public void drawChessMan(){//流程控制int i,k;//图标Icon in;//黑色棋子//车in = new ImageIcon("image\\黑车.GIF");for (i=0,k=24;i<2;i++,k+=456){play[i] = new JLabel(in);play[i].setBounds(k,56,55,55);play[i].setName("车1");}//马in = new ImageIcon("image\\黑马.GIF");for (i=4,k=81;i<6;i++,k+=342){play[i] = new JLabel(in);play[i].setBounds(k,56,55,55);play[i].setName("马1");}//相in = new ImageIcon("image\\黑象.GIF");for (i=8,k=138;i<10;i++,k+=228){play[i] = new JLabel(in);play[i].setBounds(k,56,55,55);play[i].setName("象1");}//士in = new ImageIcon("image\\黑士.GIF"); for (i=12,k=195;i<14;i++,k+=114){play[i] = new JLabel(in);play[i].setBounds(k,56,55,55);play[i].setName("士1");}//卒in = new ImageIcon("image\\黑卒.GIF"); for (i=16,k=24;i<21;i++,k+=114){play[i] = new JLabel(in);play[i].setBounds(k,227,55,55);play[i].setName("卒1" + i);}//炮in = new ImageIcon("image\\黑炮.GIF"); for (i=26,k=81;i<28;i++,k+=342){play[i] = new JLabel(in);play[i].setBounds(k,170,55,55);play[i].setName("炮1" + i);}//将in = new ImageIcon("image\\黑将.GIF"); play[30] = new JLabel(in);play[30].setBounds(252,56,55,55); play[30].setName("将1");//红色棋子//车in = new ImageIcon("image\\红车.GIF"); for (i=2,k=24;i<4;i++,k+=456){play[i] = new JLabel(in);play[i].setBounds(k,569,55,55);play[i].setName("车2");}//马in = new ImageIcon("image\\红马.GIF"); for (i=6,k=81;i<8;i++,k+=342){play[i] = new JLabel(in);play[i].setBounds(k,569,55,55);play[i].setName("马2");}//相in = new ImageIcon("image\\红象.GIF"); for (i=10,k=138;i<12;i++,k+=228){play[i] = new JLabel(in);play[i].setBounds(k,569,55,55);play[i].setName("象2");}//士in = new ImageIcon("image\\红士.GIF"); for (i=14,k=195;i<16;i++,k+=114){play[i] = new JLabel(in);play[i].setBounds(k,569,55,55);play[i].setName("士2");}//兵in = new ImageIcon("image\\红卒.GIF"); for (i=21,k=24;i<26;i++,k+=114){play[i] = new JLabel(in);play[i].setBounds(k,398,55,55);play[i].setName("卒2" + i);}//炮in = new ImageIcon("image\\红炮.GIF"); for (i=28,k=81;i<30;i++,k+=342){play[i] = new JLabel(in);play[i].setBounds(k,455,55,55);play[i].setName("炮2" + i);}//帅in = new ImageIcon("image\\红将.GIF"); play[31] = new JLabel(in);play[31].setBounds(252,569,55,55); play[31].setName("帅2");}/**** 线程方法控制棋子闪烁*/public void run(){while (true){//单击棋子第一下开始闪烁if (chessManClick){play[Man].setVisible(false);//时间控制try{tmain.sleep(200);}catch(Exception e){}play[Man].setVisible(true);}//闪烁当前提示信息以免用户看不见else {text.setVisible(false);//时间控制try{tmain.sleep(250);}catch(Exception e){}text.setVisible(true);}try{tmain.sleep(350);}catch (Exception e){}}}/**** 单击棋子方法*/public void mouseClicked(MouseEvent me){System.out.println("Mouse");//当前坐标int Ex=0,Ey=0;//启动线程if (tmain == null){tmain = new Thread(this);tmain.start();}//单击棋盘(移动棋子)if (me.getSource().equals(image)){//该红棋走棋的时候if (chessPlayClick == 2 && play[Man].getName().charAt(1) == '2'){ Ex = play[Man].getX();Ey = play[Man].getY();//移动卒、兵if (Man > 15 && Man < 26){rule.armsRule(Man,play[Man],me);}//移动炮else if (Man > 25 && Man < 30){rule.cannonRule(play[Man],play,me);}//移动车else if (Man >=0 && Man < 4){rule.cannonRule(play[Man],play,me);}//移动马else if (Man > 3 && Man < 8){rule.horseRule(play[Man],play,me);}//移动相、象else if (Man > 7 && Man < 12){rule.elephantRule(Man,play[Man],play,me);}//移动仕、士else if (Man > 11 && Man < 16){rule.chapRule(Man,play[Man],play,me);}//移动将、帅else if (Man == 30 || Man == 31){rule.willRule(Man,play[Man],play,me);}//是否走棋错误(是否在原地没有动)if (Ex == play[Man].getX() && Ey == play[Man].getY()){text.setText(" 红棋走棋");chessPlayClick=2;}else {text.setText(" 黑棋走棋");chessPlayClick=1;}}//if//该黑棋走棋的时候else if (chessPlayClick == 1 && play[Man].getName().charAt(1) == '1'){ Ex = play[Man].getX();Ey = play[Man].getY();//移动卒、兵if (Man > 15 && Man < 26){rule.armsRule(Man,play[Man],me);}//移动炮else if (Man > 25 && Man < 30){rule.cannonRule(play[Man],play,me);}//移动车else if (Man >=0 && Man < 4){rule.cannonRule(play[Man],play,me);}//移动马else if (Man > 3 && Man < 8){rule.horseRule(play[Man],play,me);}//移动相、象else if (Man > 7 && Man < 12){rule.elephantRule(Man,play[Man],play,me);}//移动仕、士else if (Man > 11 && Man < 16){rule.chapRule(Man,play[Man],play,me);}//移动将、帅else if (Man == 30 || Man == 31){rule.willRule(Man,play[Man],play,me);}//是否走棋错误(是否在原地没有动)if (Ex == play[Man].getX() && Ey == play[Man].getY()){ text.setText(" 黑棋走棋");chessPlayClick=1;}else {text.setText(" 红棋走棋");chessPlayClick=2;}}//else if//当前没有操作(停止闪烁)chessManClick=false;}//if//单击棋子else{//第一次单击棋子(闪烁棋子)if (!chessManClick){for (int i=0;i<32;i++){//被单击的棋子if (me.getSource().equals(play[i])){//告诉线程让该棋子闪烁Man=i;//开始闪烁chessManClick=true;break;}}//for}//if//第二次单击棋子(吃棋子)else if (chessManClick){//当前没有操作(停止闪烁)chessManClick=false;for (i=0;i<32;i++){//找到被吃的棋子if (me.getSource().equals(play[i])){//该红棋吃棋的时候if (chessPlayClick == 2 && play[Man].getName().charAt(1) == '2'){ Ex = play[Man].getX();Ey = play[Man].getY();//卒、兵吃规则if (Man > 15 && Man < 26){rule.armsRule(play[Man],play[i]);}//炮吃规则else if (Man > 25 && Man < 30){rule.cannonRule(0,play[Man],play[i],play,me);}//车吃规则else if (Man >=0 && Man < 4){rule.cannonRule(1,play[Man],play[i],play,me);}//马吃规则else if (Man > 3 && Man < 8){rule.horseRule(play[Man],play[i],play,me);}//相、象吃规则else if (Man > 7 && Man < 12){rule.elephantRule(play[Man],play[i],play);}//士、仕吃棋规则else if (Man > 11 && Man < 16){rule.chapRule(Man,play[Man],play[i],play);}//将、帅吃棋规则else if (Man == 30 || Man == 31){rule.willRule(Man,play[Man],play[i],play);play[Man].setVisible(true);}//是否走棋错误(是否在原地没有动)if (Ex == play[Man].getX() && Ey == play[Man].getY()){text.setText(" 红棋走棋");chessPlayClick=2;break;}else{text.setText(" 黑棋走棋");chessPlayClick=1;break;}}//if//该黑棋吃棋的时候else if (chessPlayClick == 1 && play[Man].getName().charAt(1) == '1'){Ex = play[Man].getX();Ey = play[Man].getY();//卒吃规则if (Man > 15 && Man < 26){rule.armsRule(play[Man],play[i]);}//炮吃规则else if (Man > 25 && Man < 30){rule.cannonRule(0,play[Man],play[i],play,me);}//车吃规则else if (Man >=0 && Man < 4){rule.cannonRule(1,play[Man],play[i],play,me);}//马吃规则else if (Man > 3 && Man < 8){rule.horseRule(play[Man],play[i],play,me);}//相、象吃规则else if (Man > 7 && Man < 12){rule.elephantRule(play[Man],play[i],play);}//士、仕吃棋规则else if (Man > 11 && Man < 16){rule.chapRule(Man,play[Man],play[i],play);}//将、帅吃棋规则else if (Man == 30 || Man == 31){rule.willRule(Man,play[Man],play[i],play);play[Man].setVisible(true);}//是否走棋错误(是否在原地没有动)if (Ex == play[Man].getX() && Ey == play[Man].getY()){ text.setText(" 黑棋走棋");chessPlayClick=1;break;}else {text.setText(" 红棋走棋");chessPlayClick=2;break;}}//else if}//if}//for//是否胜利if (!play[31].isVisible()){JOptionPane.showConfirmDialog(this,"黑棋胜利","玩家一胜利",JOptionPane.DEFAULT_OPTION,JOptionPane.WARNING_MESSAGE);//双方都不可以在走棋了chessPlayClick=3;text.setText(" 黑棋胜利");}//ifelse if (!play[30].isVisible()){JOptionPane.showConfirmDialog(this,"红棋胜利","玩家二胜利",JOptionPane.DEFAULT_OPTION,JOptionPane.WARNING_MESSAGE);chessPlayClick=3;text.setText(" 红棋胜利");}//else if}//else}//else}public void mousePressed(MouseEvent me){}public void mouseReleased(MouseEvent me){}public void mouseEntered(MouseEvent me){}public void mouseExited(MouseEvent me){}/**** 定义按钮的事件响应*/public void actionPerformed(ActionEvent ae) {//重新开始按钮if (ae.getSource().equals(anew)){int i,k;//重新排列每个棋子的位置//黑色棋子//车for (i=0,k=24;i<2;i++,k+=456){play[i].setBounds(k,56,55,55);}//马for (i=4,k=81;i<6;i++,k+=342){play[i].setBounds(k,56,55,55);}//相for (i=8,k=138;i<10;i++,k+=228){play[i].setBounds(k,56,55,55);}//士for (i=12,k=195;i<14;i++,k+=114){play[i].setBounds(k,56,55,55);}//卒for (i=16,k=24;i<21;i++,k+=114){play[i].setBounds(k,227,55,55);}//炮for (i=26,k=81;i<28;i++,k+=342){play[i].setBounds(k,170,55,55);}//将play[30].setBounds(252,56,55,55);//红色棋子//车for (i=2,k=24;i<4;i++,k+=456){play[i].setBounds(k,569,55,55);}//马for (i=6,k=81;i<8;i++,k+=342){play[i].setBounds(k,569,55,55);}//相for (i=10,k=138;i<12;i++,k+=228){play[i].setBounds(k,569,55,55);}//士for (i=14,k=195;i<16;i++,k+=114){play[i].setBounds(k,569,55,55);}//兵for (i=21,k=24;i<26;i++,k+=114){play[i].setBounds(k,398,55,55);}//炮for (i=28,k=81;i<30;i++,k+=342){play[i].setBounds(k,455,55,55);}//帅play[31].setBounds(252,569,55,55);chessPlayClick = 2;text.setText(" 红棋走棋");for (i=0;i<32;i++){play[i].setVisible(true);}//清除Vector中的内容Var.clear();}//悔棋按钮else if (ae.getSource().equals(repent)){try{//获得setVisible属性值String S = (String)Var.get(Var.size()-4);//获得X坐标int x = Integer.parseInt((String)Var.get(Var.size()-3));//获得Y坐标int y = Integer.parseInt((String)Var.get(Var.size()-2));//获得索引int M = Integer.parseInt((String)Var.get(Var.size()-1));//赋给棋子play[M].setVisible(true);play[M].setBounds(x,y,55,55);if (play[M].getName().charAt(1) == '1'){text.setText(" 黑棋走棋");chessPlayClick = 1;}else{text.setText(" 红棋走棋");chessPlayClick = 2;}//删除用过的坐标Var.remove(Var.size()-4);Var.remove(Var.size()-3);Var.remove(Var.size()-2);Var.remove(Var.size()-1);//停止旗子闪烁chessManClick=false;}catch(Exception e){}}//退出else if (ae.getSource().equals(exit)){int j=JOptionPane.showConfirmDialog(this,"真的要退出吗?","退出",JOptionPane.YES_OPTION,JOptionPane.QUESTION_MESSAGE);if (j == JOptionPane.YES_OPTION){System.exit(0);}}}/*定义中国象棋规则的类*/class ChessRule {/**卒子的移动规则*/public void armsRule(int Man,JLabel play,MouseEvent me){//黑卒向下if (Man < 21){//向下移动、得到终点的坐标模糊成合法的坐标if ((me.getY()-play.getY()) > 27 && (me.getY()-play.getY()) < 86 && (me.getX()-play.getX()) < 55 && (me.getX()-play.getX()) > 0){//当前记录添加到集合(用于悔棋)Var.add(String.valueOf(play.isVisible()));Var.add(String.valueOf(play.getX()));Var.add(String.valueOf(play.getY()));Var.add(String.valueOf(Man));play.setBounds(play.getX(),play.getY()+57,55,55);}//向右移动、得到终点的坐标模糊成合法的坐标、必须过河else if (play.getY() > 284 && (me.getX() - play.getX()) >= 57 && (me.getX() - play.getX()) <= 112){play.setBounds(play.getX()+57,play.getY(),55,55);}//向左移动、得到终点的坐标模糊成合法的坐标、必须过河else if (play.getY() > 284 && (play.getX() - me.getX()) >= 2 && (play.getX() - me.getX()) <=58){//模糊坐标play.setBounds(play.getX()-57,play.getY(),55,55);}}//红卒向上else{//当前记录添加到集合(用于悔棋)Var.add(String.valueOf(play.isVisible()));Var.add(String.valueOf(play.getX()));Var.add(String.valueOf(play.getY()));Var.add(String.valueOf(Man));//向上移动、得到终点的坐标模糊成合法的坐标if ((me.getX()-play.getX()) >= 0 && (me.getX()-play.getX()) <= 55 && (play.getY()-me.getY()) >27 && play.getY()-me.getY() < 86){play.setBounds(play.getX(),play.getY()-57,55,55);}//向右移动、得到终点的坐标模糊成合法的坐标、必须过河else if (play.getY() <= 341 && (me.getX() - play.getX()) >= 57 && (me.getX() - play.getX()) <= 112){play.setBounds(play.getX()+57,play.getY(),55,55);}//向左移动、得到终点的坐标模糊成合法的坐标、必须过河else if (play.getY() <= 341 && (play.getX() - me.getX()) >= 3 && (play.getX() - me.getX()) <=58){play.setBounds(play.getX()-57,play.getY(),55,55);}}}//卒移动结束/**卒吃棋规则*/public void armsRule(JLabel play1,JLabel play2){//向右走if ((play2.getX() - play1.getX()) <= 112 && (play2.getX() - play1.getX()) >= 57 && (play1.getY() - play2.getY()) < 22 && (play1.getY() - play2.getY()) > -22 && play2.isVisible() && play1.getName().charAt(1)!=play2.getName().charAt(1)){//黑棋要过河才能右吃棋if (play1.getName().charAt(1) == '1' && play1.getY() > 284 && play1.getName().charAt(1) != play2.getName().charAt(1)){play2.setVisible(false);//把对方的位置给自己play1.setBounds(play2.getX(),play2.getY(),55,55);}//红棋要过河才左能吃棋else if (play1.getName().charAt(1) == '2' && play1.getY() < 341 && play1.getName().charAt(1) != play2.getName().charAt(1)){play2.setVisible(false);//把对方的位置给自己play1.setBounds(play2.getX(),play2.getY(),55,55);}}//向左走else if ((play1.getX() - play2.getX()) <= 112 && (play1.getX() - play2.getX()) >= 57 && (play1.getY() - play2.getY()) < 22 && (play1.getY() - play2.getY()) > -22 && play2.isVisible() && play1.getName().charAt(1)!=play2.getName().charAt(1)){//黑棋要过河才能左吃棋if (play1.getName().charAt(1) == '1' && play1.getY() > 284 && play1.getName().charAt(1) != play2.getName().charAt(1)){play2.setVisible(false);//把对方的位置给自己play1.setBounds(play2.getX(),play2.getY(),55,55);}//红棋要过河才能右吃棋else if (play1.getName().charAt(1) == '2' && play1.getY() < 341 && play1.getName().charAt(1) != play2.getName().charAt(1)){play2.setVisible(false);//把对方的位置给自己play1.setBounds(play2.getX(),play2.getY(),55,55);}}//向上走else if (play1.getX() - play2.getX() >= -22 && play1.getX() - play2.getX() <= 22 && play1.getY() - play2.getY() >= -112 && play1.getY() - play2.getY() <= 112){//黑棋不能向上吃棋if (play1.getName().charAt(1) == '1' && play1.getY() < play2.getY() && play1.getName().charAt(1) != play2.getName().charAt(1)){play2.setVisible(false);//把对方的位置给自己play1.setBounds(play2.getX(),play2.getY(),55,55);}//红棋不能向下吃棋else if (play1.getName().charAt(1) == '2' && play1.getY() > play2.getY() && play1.getName().charAt(1) != play2.getName().charAt(1)){play2.setVisible(false);//把对方的位置给自己play1.setBounds(play2.getX(),play2.getY(),55,55);}}//当前记录添加到集合(用于悔棋)Var.add(String.valueOf(play1.isVisible()));Var.add(String.valueOf(play1.getX()));Var.add(String.valueOf(play1.getY()));Var.add(String.valueOf(Man));//当前记录添加到集合(用于悔棋)Var.add(String.valueOf(play2.isVisible()));Var.add(String.valueOf(play2.getX()));Var.add(String.valueOf(play2.getY()));Var.add(String.valueOf(i));}//卒吃结束/**炮、车移动规则*/public void cannonRule(JLabel play,JLabel playQ[],MouseEvent me){//起点和终点之间是否有棋子int Count = 0;//上、下移动if (play.getX() - me.getX() <= 0 && play.getX() - me.getX() >= -55){//指定所有模糊Y坐标for (int i=56;i<=571;i+=57){//移动的Y坐标是否有指定坐标相近的if (i - me.getY() >= -27 && i - me.getY() <= 27){//所有的棋子for (int j=0;j<32;j++){//找出在同一条竖线的所有棋子、并不包括自己if (playQ[j].getX() - play.getX() >= -27 && playQ[j].getX() - play.getX() <= 27 && playQ[j].getName()!=play.getName() && playQ[j].isVisible()){//从起点到终点(从左到右)for (int k=play.getY()+57;k<i;k+=57){//大于起点、小于终点的坐标就可以知道中间是否有棋子if (playQ[j].getY() < i && playQ[j].getY() > play.getY()){//中间有一个棋子就不可以从这条竖线过去Count++;break;}}//for//从起点到终点(从右到左)for (int k=i+57;k<play.getY();k+=57){//找起点和终点的棋子if (playQ[j].getY() < play.getY() && playQ[j].getY() > i){Count++;break;}}//for}//if}//for//起点和终点没有棋子就可以移动了if (Count == 0){//当前记录添加到集合(用于悔棋)Var.add(String.valueOf(play.isVisible()));Var.add(String.valueOf(play.getX()));Var.add(String.valueOf(play.getY()));Var.add(String.valueOf(Man));play.setBounds(play.getX(),i,55,55);break;}}//if}//for}//if//左、右移动else if (play.getY() - me.getY() >=-27 && play.getY() - me.getY() <= 27){//指定所有模糊X坐标for (int i=24;i<=480;i+=57){//移动的X坐标是否有指定坐标相近的if (i - me.getX() >= -55 && i-me.getX() <= 0){//所有的棋子for (int j=0;j<32;j++){//找出在同一条横线的所有棋子、并不包括自己if (playQ[j].getY() - play.getY() >= -27 && playQ[j].getY() - play.getY() <= 27 && playQ[j].getName()!=play.getName() && playQ[j].isVisible()){//从起点到终点(从上到下)for (int k=play.getX()+57;k<i;k+=57){//大于起点、小于终点的坐标就可以知道中间是否有棋子if (playQ[j].getX() < i && playQ[j].getX() > play.getX()){//中间有一个棋子就不可以从这条横线过去Count++;break;}}//for//从起点到终点(从下到上)for (int k=i+57;k<play.getX();k+=57){//找起点和终点的棋子if (playQ[j].getX() < play.getX() && playQ[j].getX() > i){Count++;break;}}//for}//if}//for//起点和终点没有棋子if (Count == 0){//当前记录添加到集合(用于悔棋)Var.add(String.valueOf(play.isVisible()));Var.add(String.valueOf(play.getX()));Var.add(String.valueOf(play.getY()));Var.add(String.valueOf(Man));play.setBounds(i,play.getY(),55,55);break;}}//if}//for}//else}//炮、车移动方法结束/**炮、车吃棋规则*/public void cannonRule(int Chess,JLabel play,JLabel playTake,JLabel playQ[],MouseEvent me){//起点和终点之间是否有棋子int Count = 0;//所有的棋子for (int j=0;j<32;j++){//找出在同一条竖线的所有棋子、并不包括自己if (playQ[j].getX() - play.getX() >= -27 && playQ[j].getX() - play.getX() <= 27 && playQ[j].getName()!=play.getName() && playQ[j].isVisible()){//自己是起点被吃的是终点(从上到下)for (int k=play.getY()+57;k<playTake.getY();k+=57){//大于起点、小于终点的坐标就可以知道中间是否有棋子if (playQ[j].getY() < playTake.getY() && playQ[j].getY() > play.getY()){//计算起点和终点的棋子个数Count++;break;}}//for//自己是起点被吃的是终点(从下到上)for (int k=playTake.getY();k<play.getY();k+=57){//找起点和终点的棋子if (playQ[j].getY() < play.getY() && playQ[j].getY() > playTake.getY()){Count++;break;}}//for}//if//找出在同一条竖线的所有棋子、并不包括自己else if (playQ[j].getY() - play.getY() >= -10 && playQ[j].getY() - play.getY() <= 10 && playQ[j].getName()!=play.getName() && playQ[j].isVisible()){//自己是起点被吃的是终点(从左到右)for (int k=play.getX()+50;k<playTake.getX();k+=57){//大于起点、小于终点的坐标就可以知道中间是否有棋子if (playQ[j].getX() < playTake.getX() && playQ[j].getX() > play.getX()){Count++;break;}}//for//自己是起点被吃的是终点(从右到左)for (int k=playTake.getX();k<play.getX();k+=57){//找起点和终点的棋子if (playQ[j].getX() < play.getX() && playQ[j].getX() > playTake.getX()){Count++;break;}}//for}//if}//for//起点和终点之间要一个棋子是炮的规则、并不能吃自己的棋子if (Count == 1 && Chess == 0 && playTake.getName().charAt(1) != play.getName().charAt(1)){//当前记录添加到集合(用于悔棋)Var.add(String.valueOf(play.isVisible()));Var.add(String.valueOf(play.getX()));Var.add(String.valueOf(play.getY()));Var.add(String.valueOf(Man));//当前记录添加到集合(用于悔棋)Var.add(String.valueOf(playTake.isVisible()));Var.add(String.valueOf(playTake.getX()));Var.add(String.valueOf(playTake.getY()));Var.add(String.valueOf(i));playTake.setVisible(false);play.setBounds(playTake.getX(),playTake.getY(),55,55);}//起点和终点之间没有棋子是车的规则、并不能吃自己的棋子else if (Count ==0 && Chess == 1 && playTake.getName().charAt(1) != play.getName().charAt(1)){//当前记录添加到集合(用于悔棋)Var.add(String.valueOf(play.isVisible()));Var.add(String.valueOf(play.getX()));Var.add(String.valueOf(play.getY()));Var.add(String.valueOf(Man));//当前记录添加到集合(用于悔棋)Var.add(String.valueOf(playTake.isVisible()));Var.add(String.valueOf(playTake.getX()));Var.add(String.valueOf(playTake.getY()));Var.add(String.valueOf(i));playTake.setVisible(false);play.setBounds(playTake.getX(),playTake.getY(),55,55);}}//炮、车吃棋方法结束/**马移动规则*/public void horseRule(JLabel play,JLabel playQ[],MouseEvent me){//保存坐标和障碍int Ex=0,Ey=0,Move=0;//上移、左边if (play.getX() - me.getX() >= 2 && play.getX() - me.getX() <= 57 && play.getY() - me.getY() >= 87 && play.getY() - me.getY() <= 141){//合法的Y坐标for (int i=56;i<=571;i+=57){//移动的Y坐标是否有指定坐标相近的if (i - me.getY() >= -27 && i - me.getY() <= 27){Ey = i;break;}}//合法的X坐标for (int i=24;i<=480;i+=57){//移动的X坐标是否有指定坐标相近的if (i - me.getX() >= -55 && i-me.getX() <= 0){Ex = i;break;}}//正前方是否有别的棋子for (int i=0;i<32;i++){if (playQ[i].isVisible() && play.getX() - playQ[i].getX() == 0 && play.getY() - playQ[i].getY() == 57 ){Move = 1;break;}}//可以移动该棋子if (Move == 0){//当前记录添加到集合(用于悔棋)Var.add(String.valueOf(play.isVisible()));Var.add(String.valueOf(play.getX()));Var.add(String.valueOf(play.getY()));Var.add(String.valueOf(Man));play.setBounds(Ex,Ey,55,55);}}//if//左移、上边else if (play.getY() - me.getY() >= 27 && play.getY() - me.getY() <= 86 && play.getX() - me.getX() >= 70 && play.getX() - me.getX() <= 130){//Yfor (int i=56;i<=571;i+=57){if (i - me.getY() >= -27 && i - me.getY() <= 27){Ey = i;}}//Xfor (int i=24;i<=480;i+=57){if (i - me.getX() >= -55 && i-me.getX() <= 0){Ex = i;}}//正左方是否有别的棋子for (int i=0;i<32;i++){if (playQ[i].isVisible() && play.getY() - playQ[i].getY() == 0 && play.getX() - playQ[i].getX() == 57 ){Move = 1;break;}}if (Move == 0){//当前记录添加到集合(用于悔棋)Var.add(String.valueOf(play.isVisible()));Var.add(String.valueOf(play.getX()));Var.add(String.valueOf(play.getY()));Var.add(String.valueOf(Man));play.setBounds(Ex,Ey,55,55);}}//else//下移、右边else if (me.getY() - play.getY() >= 87 && me.getY() - play.getY() <= 141 && me.getX()- play.getX() <= 87 && me.getX() - play.getX() >= 2 ){//Yfor (int i=56;i<=571;i+=57){if (i - me.getY() >= -27 && i - me.getY() <= 27){Ey = i;}}//Xfor (int i=24;i<=480;i+=57){if (i - me.getX() >= -55 && i-me.getX() <= 0){Ex = i;}}//正下方是否有别的棋子for (int i=0;i<32;i++){if (playQ[i].isVisible() && play.getX() - playQ[i].getX() == 0 && playQ[i].getY() - play.getY() == 57 ){Move = 1;break;}}if (Move == 0){//当前记录添加到集合(用于悔棋)Var.add(String.valueOf(play.isVisible()));Var.add(String.valueOf(play.getX()));Var.add(String.valueOf(play.getY()));Var.add(String.valueOf(Man));play.setBounds(Ex,Ey,55,55);}}//else//上移、右边else if (play.getY() - me.getY() >= 87 && play.getY() - me.getY() <= 141 && me.getX() - play.getX() <= 87 && me.getX() - play.getX() >= 30 ){//合法的Y坐标for (int i=56;i<=571;i+=57){if (i - me.getY() >= -27 && i - me.getY() <= 27){Ey = i;break;}。

中国象棋源代码Java程序

中国象棋源代码Java程序

import java.awt.*;import java.awt.event.*;import javax.swing.*;import java.util.*;import java.io.*;public class Chess{public static void main(String args[]){new ChessMainFrame("中国象棋:观棋不语真君子,棋死无悔大丈夫");}}class ChessMainFrame extends JFrame implements ActionListener,MouseListener,Runnable{//玩家JLabel play[] = new JLabel[32];//棋盘JLabel image;//窗格Container con;//工具栏JToolBar jmain;//重新开始JButton anew;//悔棋JButton repent;//退出JButton exit;//当前信息JLabel text;//保存当前操作Vector Var;//规则类对象(使于调用方法)ChessRule rule;/**** 单击棋子** chessManClick = true 闪烁棋子并给线程响应** chessManClick = false 吃棋子停止闪烁并给线程响应*/boolean chessManClick;/**** 控制玩家走棋** chessPlayClick=1 黑棋走棋** chessPlayClick=2 红棋走棋默认红棋** chessPlayClick=3 双方都不能走棋*/int chessPlayClick=2;//控制棋子闪烁的线程Thread tmain;//把第一次的单击棋子给线程响应static int Man,i;ChessMainFrame(){new ChessMainFrame("中国象棋");}/**** 构造函数** 初始化图形用户界面*/ChessMainFrame(String Title){//获行客格引用con = this.getContentPane();con.setLayout(null);//实例化规则类rule = new ChessRule();Var = new Vector();//创建工具栏jmain = new JToolBar();text = new JLabel("欢迎使用象棋对弈系统");//当鼠标放上显示信息text.setToolTipText("信息提示");anew = new JButton(" 新游戏 ");anew.setToolTipText("重新开始新的一局");exit = new JButton(" 退出 ");exit.setToolTipText("退出象棋程序程序");repent = new JButton(" 悔棋 ");repent.setToolTipText("返回到上次走棋的位置");//把组件添加到工具栏jmain.setLayout(new GridLayout(0,4));jmain.add(anew);jmain.add(repent);jmain.add(exit);jmain.add(text);jmain.setBounds(0,0,558,30);con.add(jmain);//添加棋子标签drawChessMan();//注册按扭监听anew.addActionListener(this);repent.addActionListener(this);exit.addActionListener(this);//注册棋子移动监听for (int i=0;i<32;i++){con.add(play[i]);play[i].addMouseListener(this);}//添加棋盘标签con.add(image = new JLabel(new ImageIcon("image\\Main.GIF")));image.setBounds(0,30,558,620);image.addMouseListener(this);//注册窗体关闭监听this.addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent we){System.exit(0);}});//窗体居中Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();Dimension frameSize = this.getSize();if (frameSize.height > screenSize.height){frameSize.height = screenSize.height;}if (frameSize.width > screenSize.width){frameSize.width = screenSize.width;}this.setLocation((screenSize.width - frameSize.width) / 2 - 280 ,(screenSize.height - frameSize.height ) / 2 - 350);//设置this.setIconImage(new ImageIcon("image\\红将.GIF").getImage());this.setResizable(false);this.setTitle(Title);this.setSize(558,670);this.show();}/**** 添加棋子方法*/public void drawChessMan(){//流程控制int i,k;//图标Icon in;//黑色棋子//车in = new ImageIcon("image\\黑车.GIF");for (i=0,k=24;i<2;i++,k+=456){play[i] = new JLabel(in);play[i].setBounds(k,56,55,55);play[i].setName("车1");}//马in = new ImageIcon("image\\黑马.GIF");for (i=4,k=81;i<6;i++,k+=342){play[i] = new JLabel(in);play[i].setBounds(k,56,55,55);play[i].setName("马1");}//相in = new ImageIcon("image\\黑象.GIF");for (i=8,k=138;i<10;i++,k+=228){play[i] = new JLabel(in);play[i].setBounds(k,56,55,55);play[i].setName("象1");}//士in = new ImageIcon("image\\黑士.GIF"); for (i=12,k=195;i<14;i++,k+=114){ play[i] = new JLabel(in);play[i].setBounds(k,56,55,55);play[i].setName("士1");}//卒in = new ImageIcon("image\\黑卒.GIF"); for (i=16,k=24;i<21;i++,k+=114){ play[i] = new JLabel(in);play[i].setBounds(k,227,55,55);play[i].setName("卒1" + i);}//炮in = new ImageIcon("image\\黑炮.GIF"); for (i=26,k=81;i<28;i++,k+=342){ play[i] = new JLabel(in);play[i].setBounds(k,170,55,55);play[i].setName("炮1" + i);}//将in = new ImageIcon("image\\黑将.GIF"); play[30] = new JLabel(in);play[30].setBounds(252,56,55,55);play[30].setName("将1");//红色棋子//车in = new ImageIcon("image\\红车.GIF"); for (i=2,k=24;i<4;i++,k+=456){play[i] = new JLabel(in);play[i].setBounds(k,569,55,55);play[i].setName("车2");}//马in = new ImageIcon("image\\红马.GIF"); for (i=6,k=81;i<8;i++,k+=342){play[i] = new JLabel(in);play[i].setBounds(k,569,55,55);play[i].setName("马2");}//相in = new ImageIcon("image\\红象.GIF"); for (i=10,k=138;i<12;i++,k+=228){ play[i] = new JLabel(in);play[i].setBounds(k,569,55,55);play[i].setName("象2");}//士in = new ImageIcon("image\\红士.GIF"); for (i=14,k=195;i<16;i++,k+=114){ play[i] = new JLabel(in);play[i].setBounds(k,569,55,55);play[i].setName("士2");}//兵in = new ImageIcon("image\\红卒.GIF"); for (i=21,k=24;i<26;i++,k+=114){ play[i] = new JLabel(in);play[i].setBounds(k,398,55,55);play[i].setName("卒2" + i);}//炮in = new ImageIcon("image\\红炮.GIF"); for (i=28,k=81;i<30;i++,k+=342){ play[i] = new JLabel(in);play[i].setBounds(k,455,55,55);play[i].setName("炮2" + i);}//帅in = new ImageIcon("image\\红将.GIF"); play[31] = new JLabel(in);play[31].setBounds(252,569,55,55);play[31].setName("帅2");}/**** 线程方法控制棋子闪烁*/public void run(){while (true){//单击棋子第一下开始闪烁if (chessManClick){play[Man].setVisible(false);//时间控制try{tmain.sleep(200);}catch(Exception e){}play[Man].setVisible(true);}//闪烁当前提示信息以免用户看不见else {text.setVisible(false);//时间控制try{tmain.sleep(250);}catch(Exception e){}text.setVisible(true);}try{tmain.sleep(350);}catch (Exception e){}}}/**** 单击棋子方法*/public void mouseClicked(MouseEvent me){System.out.println("Mouse");//当前坐标int Ex=0,Ey=0;//启动线程if (tmain == null){tmain = new Thread(this);tmain.start();}//单击棋盘(移动棋子)if (me.getSource().equals(image)){//该红棋走棋的时候if (chessPlayClick == 2 && play[Man].getName().charAt(1) == '2'){Ex = play[Man].getX();Ey = play[Man].getY();//移动卒、兵if (Man > 15 && Man < 26){rule.armsRule(Man,play[Man],me);}//移动炮else if (Man > 25 && Man < 30){rule.cannonRule(play[Man],play,me);}//移动车else if (Man >=0 && Man < 4){rule.cannonRule(play[Man],play,me);}//移动马else if (Man > 3 && Man < 8){rule.horseRule(play[Man],play,me);}//移动相、象else if (Man > 7 && Man < 12){rule.elephantRule(Man,play[Man],play,me);}//移动仕、士else if (Man > 11 && Man < 16){rule.chapRule(Man,play[Man],play,me);}//移动将、帅else if (Man == 30 || Man == 31){rule.willRule(Man,play[Man],play,me);}//是否走棋错误(是否在原地没有动)if (Ex == play[Man].getX() && Ey == play[Man].getY()){text.setText(" 红棋走棋");chessPlayClick=2;}else {text.setText(" 黑棋走棋");chessPlayClick=1;}}//if//该黑棋走棋的时候else if (chessPlayClick == 1 && play[Man].getName().charAt(1) == '1'){Ex = play[Man].getX();Ey = play[Man].getY();//移动卒、兵if (Man > 15 && Man < 26){rule.armsRule(Man,play[Man],me);}//移动炮else if (Man > 25 && Man < 30){rule.cannonRule(play[Man],play,me);}//移动车else if (Man >=0 && Man < 4){rule.cannonRule(play[Man],play,me);}//移动马else if (Man > 3 && Man < 8){rule.horseRule(play[Man],play,me);}//移动相、象else if (Man > 7 && Man < 12){rule.elephantRule(Man,play[Man],play,me);}//移动仕、士else if (Man > 11 && Man < 16){rule.chapRule(Man,play[Man],play,me);}//移动将、帅else if (Man == 30 || Man == 31){rule.willRule(Man,play[Man],play,me);}//是否走棋错误(是否在原地没有动)if (Ex == play[Man].getX() && Ey == play[Man].getY()){ text.setText(" 黑棋走棋");chessPlayClick=1;}else {text.setText(" 红棋走棋");chessPlayClick=2;}}//else if//当前没有操作(停止闪烁)chessManClick=false;}//if//单击棋子else{//第一次单击棋子(闪烁棋子)if (!chessManClick){for (int i=0;i<32;i++){//被单击的棋子if (me.getSource().equals(play[i])){//告诉线程让该棋子闪烁Man=i;//开始闪烁chessManClick=true;break;}}//for}//if//第二次单击棋子(吃棋子)else if (chessManClick){//当前没有操作(停止闪烁)chessManClick=false;for (i=0;i<32;i++){//找到被吃的棋子if (me.getSource().equals(play[i])){//该红棋吃棋的时候if (chessPlayClick == 2 && play[Man].getName().charAt(1) == '2'){Ex = play[Man].getX();Ey = play[Man].getY();//卒、兵吃规则if (Man > 15 && Man < 26){rule.armsRule(play[Man],play[i]);}//炮吃规则else if (Man > 25 && Man < 30){rule.cannonRule(0,play[Man],play[i],play,me);}//车吃规则else if (Man >=0 && Man < 4){rule.cannonRule(1,play[Man],play[i],play,me);}//马吃规则else if (Man > 3 && Man < 8){rule.horseRule(play[Man],play[i],play,me);}//相、象吃规则else if (Man > 7 && Man < 12){rule.elephantRule(play[Man],play[i],play);}//士、仕吃棋规则else if (Man > 11 && Man < 16){rule.chapRule(Man,play[Man],play[i],play);}//将、帅吃棋规则else if (Man == 30 || Man == 31){rule.willRule(Man,play[Man],play[i],play);play[Man].setVisible(true);}//是否走棋错误(是否在原地没有动)if (Ex == play[Man].getX() && Ey == play[Man].getY()){text.setText(" 红棋走棋");chessPlayClick=2;break;}else{text.setText(" 黑棋走棋");chessPlayClick=1;break;}}//if//该黑棋吃棋的时候else if (chessPlayClick == 1 &&play[Man].getName().charAt(1) == '1'){Ex = play[Man].getX();Ey = play[Man].getY();//卒吃规则if (Man > 15 && Man < 26){rule.armsRule(play[Man],play[i]);}//炮吃规则else if (Man > 25 && Man < 30){rule.cannonRule(0,play[Man],play[i],play,me);}//车吃规则else if (Man >=0 && Man < 4){rule.cannonRule(1,play[Man],play[i],play,me);}//马吃规则else if (Man > 3 && Man < 8){rule.horseRule(play[Man],play[i],play,me);}//相、象吃规则else if (Man > 7 && Man < 12){rule.elephantRule(play[Man],play[i],play);}//士、仕吃棋规则else if (Man > 11 && Man < 16){rule.chapRule(Man,play[Man],play[i],play);}//将、帅吃棋规则else if (Man == 30 || Man == 31){rule.willRule(Man,play[Man],play[i],play);play[Man].setVisible(true);}//是否走棋错误(是否在原地没有动)if (Ex == play[Man].getX() && Ey == play[Man].getY()){text.setText(" 黑棋走棋");chessPlayClick=1;break;}else {text.setText(" 红棋走棋");chessPlayClick=2;break;}}//else if}//if}//for//是否胜利if (!play[31].isVisible()){JOptionPane.showConfirmDialog(this,"黑棋胜利","玩家一胜利",JOptionPane.DEFAULT_OPTION,JOptionPane.WARNING_MESSAGE);//双方都不可以在走棋了chessPlayClick=3;text.setText(" 黑棋胜利");}//ifelse if (!play[30].isVisible()){JOptionPane.showConfirmDialog(this,"红棋胜利","玩家二胜利",JOptionPane.DEFAULT_OPTION,JOptionPane.WARNING_MESSAGE);chessPlayClick=3;text.setText(" 红棋胜利");}//else if}//else}//else}public void mousePressed(MouseEvent me){}public void mouseReleased(MouseEvent me){}public void mouseEntered(MouseEvent me){}public void mouseExited(MouseEvent me){}/**** 定义按钮的事件响应*/public void actionPerformed(ActionEvent ae) { //重新开始按钮if (ae.getSource().equals(anew)){int i,k;//重新排列每个棋子的位置//黑色棋子//车for (i=0,k=24;i<2;i++,k+=456){play[i].setBounds(k,56,55,55);}//马for (i=4,k=81;i<6;i++,k+=342){play[i].setBounds(k,56,55,55);}//相for (i=8,k=138;i<10;i++,k+=228){play[i].setBounds(k,56,55,55);}//士for (i=12,k=195;i<14;i++,k+=114){play[i].setBounds(k,56,55,55);}//卒for (i=16,k=24;i<21;i++,k+=114){ play[i].setBounds(k,227,55,55); }//炮for (i=26,k=81;i<28;i++,k+=342){ play[i].setBounds(k,170,55,55); }//将play[30].setBounds(252,56,55,55);//红色棋子//车for (i=2,k=24;i<4;i++,k+=456){ play[i].setBounds(k,569,55,55); }//马for (i=6,k=81;i<8;i++,k+=342){ play[i].setBounds(k,569,55,55); }//相for (i=10,k=138;i<12;i++,k+=228){ play[i].setBounds(k,569,55,55); }//士for (i=14,k=195;i<16;i++,k+=114){ play[i].setBounds(k,569,55,55); }//兵for (i=21,k=24;i<26;i++,k+=114){ play[i].setBounds(k,398,55,55); }//炮for (i=28,k=81;i<30;i++,k+=342){ play[i].setBounds(k,455,55,55); }//帅play[31].setBounds(252,569,55,55);chessPlayClick = 2;text.setText(" 红棋走棋");for (i=0;i<32;i++){play[i].setVisible(true);}//清除Vector中的容Var.clear();}//悔棋按钮else if (ae.getSource().equals(repent)){try{//获得setVisible属性值String S = (String)Var.get(Var.size()-4);//获得X坐标int x = Integer.parseInt((String)Var.get(Var.size()-3));//获得Y坐标int y = Integer.parseInt((String)Var.get(Var.size()-2));//获得索引int M = Integer.parseInt((String)Var.get(Var.size()-1));//赋给棋子play[M].setVisible(true);play[M].setBounds(x,y,55,55);if (play[M].getName().charAt(1) == '1'){text.setText(" 黑棋走棋");chessPlayClick = 1;}else{text.setText(" 红棋走棋");chessPlayClick = 2;}//删除用过的坐标Var.remove(Var.size()-4);Var.remove(Var.size()-3);Var.remove(Var.size()-2);Var.remove(Var.size()-1);//停止旗子闪烁chessManClick=false;}catch(Exception e){}}//退出else if (ae.getSource().equals(exit)){int j=JOptionPane.showConfirmDialog(this,"真的要退出吗?","退出",JOptionPane.YES_OPTION,JOptionPane.QUESTION_MESSAGE);if (j == JOptionPane.YES_OPTION){System.exit(0);}}}/*定义中国象棋规则的类*/class ChessRule {/**卒子的移动规则*/public void armsRule(int Man,JLabel play,MouseEvent me){ //黑卒向下if (Man < 21){//向下移动、得到终点的坐标模糊成合法的坐标if ((me.getY()-play.getY()) > 27 && (me.getY()-play.getY()) < 86 && (me.getX()-play.getX()) < 55 && (me.getX()-play.getX()) > 0){//当前记录添加到集合(用于悔棋)Var.add(String.valueOf(play.isVisible()));Var.add(String.valueOf(play.getX()));Var.add(String.valueOf(play.getY()));Var.add(String.valueOf(Man));play.setBounds(play.getX(),play.getY()+57,55,55);}//向右移动、得到终点的坐标模糊成合法的坐标、必须过河else if (play.getY() > 284 && (me.getX() - play.getX()) >= 57 && (me.getX() - play.getX()) <= 112){play.setBounds(play.getX()+57,play.getY(),55,55);}//向左移动、得到终点的坐标模糊成合法的坐标、必须过河else if (play.getY() > 284 && (play.getX() - me.getX()) >= 2 && (play.getX() - me.getX()) <=58){//模糊坐标play.setBounds(play.getX()-57,play.getY(),55,55);}}//红卒向上else{//当前记录添加到集合(用于悔棋)Var.add(String.valueOf(play.isVisible()));Var.add(String.valueOf(play.getX()));Var.add(String.valueOf(play.getY()));Var.add(String.valueOf(Man));//向上移动、得到终点的坐标模糊成合法的坐标if ((me.getX()-play.getX()) >= 0 && (me.getX()-play.getX()) <= 55 && (play.getY()-me.getY()) >27 && play.getY()-me.getY() < 86){play.setBounds(play.getX(),play.getY()-57,55,55);}//向右移动、得到终点的坐标模糊成合法的坐标、必须过河else if (play.getY() <= 341 && (me.getX() - play.getX()) >= 57 && (me.getX() - play.getX()) <= 112){play.setBounds(play.getX()+57,play.getY(),55,55);}//向左移动、得到终点的坐标模糊成合法的坐标、必须过河else if (play.getY() <= 341 && (play.getX() - me.getX()) >= 3 && (play.getX() - me.getX()) <=58){play.setBounds(play.getX()-57,play.getY(),55,55);}}}//卒移动结束/**卒吃棋规则*/public void armsRule(JLabel play1,JLabel play2){//向右走if ((play2.getX() - play1.getX()) <= 112 && (play2.getX() - play1.getX()) >= 57 && (play1.getY() - play2.getY()) < 22 && (play1.getY() - play2.getY()) > -22 && play2.isVisible() && play1.getName().charAt(1)!=play2.getName().charAt(1)){//黑棋要过河才能右吃棋if (play1.getName().charAt(1) == '1' && play1.getY() > 284 && play1.getName().charAt(1) != play2.getName().charAt(1)){play2.setVisible(false);//把对方的位置给自己play1.setBounds(play2.getX(),play2.getY(),55,55);}//红棋要过河才左能吃棋else if (play1.getName().charAt(1) == '2' && play1.getY() < 341 && play1.getName().charAt(1) != play2.getName().charAt(1)){play2.setVisible(false);//把对方的位置给自己play1.setBounds(play2.getX(),play2.getY(),55,55);}}//向左走else if ((play1.getX() - play2.getX()) <= 112 && (play1.getX() - play2.getX()) >= 57 && (play1.getY() - play2.getY()) < 22 && (play1.getY() - play2.getY()) > -22 && play2.isVisible() && play1.getName().charAt(1)!=play2.getName().charAt(1)){//黑棋要过河才能左吃棋if (play1.getName().charAt(1) == '1' && play1.getY() > 284 && play1.getName().charAt(1) != play2.getName().charAt(1)){play2.setVisible(false);//把对方的位置给自己play1.setBounds(play2.getX(),play2.getY(),55,55);}//红棋要过河才能右吃棋else if (play1.getName().charAt(1) == '2' && play1.getY() < 341 && play1.getName().charAt(1) != play2.getName().charAt(1)){play2.setVisible(false);//把对方的位置给自己play1.setBounds(play2.getX(),play2.getY(),55,55);}}//向上走else if (play1.getX() - play2.getX() >= -22 && play1.getX() - play2.getX() <= 22 && play1.getY() - play2.getY() >= -112 && play1.getY() - play2.getY() <= 112){//黑棋不能向上吃棋if (play1.getName().charAt(1) == '1' && play1.getY() < play2.getY() && play1.getName().charAt(1) != play2.getName().charAt(1)){play2.setVisible(false);//把对方的位置给自己play1.setBounds(play2.getX(),play2.getY(),55,55);}//红棋不能向下吃棋else if (play1.getName().charAt(1) == '2' && play1.getY() > play2.getY() && play1.getName().charAt(1) != play2.getName().charAt(1)){play2.setVisible(false);//把对方的位置给自己play1.setBounds(play2.getX(),play2.getY(),55,55);}}//当前记录添加到集合(用于悔棋)Var.add(String.valueOf(play1.isVisible()));Var.add(String.valueOf(play1.getX()));Var.add(String.valueOf(play1.getY()));Var.add(String.valueOf(Man));//当前记录添加到集合(用于悔棋)Var.add(String.valueOf(play2.isVisible()));Var.add(String.valueOf(play2.getX()));Var.add(String.valueOf(play2.getY()));Var.add(String.valueOf(i));}//卒吃结束/**炮、车移动规则*/public void cannonRule(JLabel play,JLabel playQ[],MouseEventme){//起点和终点之间是否有棋子int Count = 0;//上、下移动if (play.getX() - me.getX() <= 0 && play.getX() - me.getX() >= -55){//指定所有模糊Y坐标for (int i=56;i<=571;i+=57){//移动的Y坐标是否有指定坐标相近的if (i - me.getY() >= -27 && i - me.getY() <= 27){//所有的棋子for (int j=0;j<32;j++){//找出在同一条竖线的所有棋子、并不包括自己if (playQ[j].getX() - play.getX() >= -27 && playQ[j].getX() - play.getX() <= 27 && playQ[j].getName()!=play.getName() && playQ[j].isVisible()){//从起点到终点(从左到右)for (int k=play.getY()+57;k<i;k+=57){//大于起点、小于终点的坐标就可以知道中间是否有棋子if (playQ[j].getY() < i && playQ[j].getY() > play.getY()){//中间有一个棋子就不可以从这条竖线过去Count++;break;}}//for//从起点到终点(从右到左)for (int k=i+57;k<play.getY();k+=57){//找起点和终点的棋子if (playQ[j].getY() < play.getY() && playQ[j].getY() > i){Count++;break;}}//for}//if}//for//起点和终点没有棋子就可以移动了if (Count == 0){//当前记录添加到集合(用于悔棋)Var.add(String.valueOf(play.isVisible()));Var.add(String.valueOf(play.getX()));Var.add(String.valueOf(play.getY()));Var.add(String.valueOf(Man));play.setBounds(play.getX(),i,55,55);break;}}//if}//for}//if//左、右移动else if (play.getY() - me.getY() >=-27 && play.getY() - me.getY() <= 27){//指定所有模糊X坐标for (int i=24;i<=480;i+=57){//移动的X坐标是否有指定坐标相近的if (i - me.getX() >= -55 && i-me.getX() <= 0){//所有的棋子for (int j=0;j<32;j++){//找出在同一条横线的所有棋子、并不包括自己if (playQ[j].getY() - play.getY() >= -27 && playQ[j].getY() - play.getY() <= 27 && playQ[j].getName()!=play.getName() && playQ[j].isVisible()){//从起点到终点(从上到下)for (int k=play.getX()+57;k<i;k+=57){//大于起点、小于终点的坐标就可以知道中间是否有棋子if (playQ[j].getX() < i && playQ[j].getX() > play.getX()){//中间有一个棋子就不可以从这条横线过去Count++;break;}}//for//从起点到终点(从下到上)for (int k=i+57;k<play.getX();k+=57){//找起点和终点的棋子if (playQ[j].getX() < play.getX() && playQ[j].getX() > i){Count++;break;}}//for}//if}//for//起点和终点没有棋子if (Count == 0){//当前记录添加到集合(用于悔棋)Var.add(String.valueOf(play.isVisible()));Var.add(String.valueOf(play.getX()));Var.add(String.valueOf(play.getY()));Var.add(String.valueOf(Man));play.setBounds(i,play.getY(),55,55);break;}}//if}//for}//else}//炮、车移动方法结束/**炮、车吃棋规则*/public void cannonRule(int Chess,JLabel play,JLabel playTake,JLabel playQ[],MouseEvent me){//起点和终点之间是否有棋子int Count = 0;//所有的棋子for (int j=0;j<32;j++){//找出在同一条竖线的所有棋子、并不包括自己if (playQ[j].getX() - play.getX() >= -27 && playQ[j].getX() - play.getX() <= 27 && playQ[j].getName()!=play.getName() && playQ[j].isVisible()){//自己是起点被吃的是终点(从上到下)for (int k=play.getY()+57;k<playTake.getY();k+=57){//大于起点、小于终点的坐标就可以知道中间是否有棋子if (playQ[j].getY() < playTake.getY() && playQ[j].getY() > play.getY()){//计算起点和终点的棋子个数Count++;break;}}//for//自己是起点被吃的是终点(从下到上)for (int k=playTake.getY();k<play.getY();k+=57){//找起点和终点的棋子if (playQ[j].getY() < play.getY() && playQ[j].getY() > playTake.getY()){Count++;break;}}//for}//if//找出在同一条竖线的所有棋子、并不包括自己else if (playQ[j].getY() - play.getY() >= -10 && playQ[j].getY() - play.getY() <= 10 && playQ[j].getName()!=play.getName() && playQ[j].isVisible()){//自己是起点被吃的是终点(从左到右)for (int k=play.getX()+50;k<playTake.getX();k+=57){//大于起点、小于终点的坐标就可以知道中间是否有棋子if (playQ[j].getX() < playTake.getX() && playQ[j].getX() > play.getX()){Count++;break;}}//for//自己是起点被吃的是终点(从右到左)for (int k=playTake.getX();k<play.getX();k+=57){//找起点和终点的棋子if (playQ[j].getX() < play.getX() && playQ[j].getX() > playTake.getX()){Count++;break;}}//for}//if}//for//起点和终点之间要一个棋子是炮的规则、并不能吃自己的棋子if (Count == 1 && Chess == 0 && playTake.getName().charAt(1) != play.getName().charAt(1)){//当前记录添加到集合(用于悔棋)Var.add(String.valueOf(play.isVisible()));Var.add(String.valueOf(play.getX()));Var.add(String.valueOf(play.getY()));Var.add(String.valueOf(Man));//当前记录添加到集合(用于悔棋)Var.add(String.valueOf(playTake.isVisible()));Var.add(String.valueOf(playTake.getX()));Var.add(String.valueOf(playTake.getY()));Var.add(String.valueOf(i));playTake.setVisible(false);play.setBounds(playTake.getX(),playTake.getY(),55,55);}//起点和终点之间没有棋子是车的规则、并不能吃自己的棋子else if (Count ==0 && Chess == 1 && playTake.getName().charAt(1) != play.getName().charAt(1)){//当前记录添加到集合(用于悔棋)Var.add(String.valueOf(play.isVisible()));Var.add(String.valueOf(play.getX()));Var.add(String.valueOf(play.getY()));Var.add(String.valueOf(Man));//当前记录添加到集合(用于悔棋)Var.add(String.valueOf(playTake.isVisible()));Var.add(String.valueOf(playTake.getX()));Var.add(String.valueOf(playTake.getY()));Var.add(String.valueOf(i));playTake.setVisible(false);play.setBounds(playTake.getX(),playTake.getY(),55,55);}}//炮、车吃棋方法结束/**马移动规则*/public void horseRule(JLabel play,JLabel playQ[],MouseEvent me){ //保存坐标和障碍int Ex=0,Ey=0,Move=0;//上移、左边if (play.getX() - me.getX() >= 2 && play.getX() - me.getX() <= 57 && play.getY() - me.getY() >= 87 && play.getY() - me.getY() <= 141){ //合法的Y坐标for (int i=56;i<=571;i+=57){//移动的Y坐标是否有指定坐标相近的if (i - me.getY() >= -27 && i - me.getY() <= 27){Ey = i;break;}}//合法的X坐标for (int i=24;i<=480;i+=57){//移动的X坐标是否有指定坐标相近的if (i - me.getX() >= -55 && i-me.getX() <= 0){Ex = i;break;}}//正前方是否有别的棋子for (int i=0;i<32;i++){if (playQ[i].isVisible() && play.getX() - playQ[i].getX() == 0 && play.getY() - playQ[i].getY() == 57 ){Move = 1;break;}}//可以移动该棋子if (Move == 0){//当前记录添加到集合(用于悔棋)Var.add(String.valueOf(play.isVisible()));Var.add(String.valueOf(play.getX()));Var.add(String.valueOf(play.getY()));Var.add(String.valueOf(Man));play.setBounds(Ex,Ey,55,55);}}//if//左移、上边else if (play.getY() - me.getY() >= 27 && play.getY() - me.getY() <= 86 && play.getX() - me.getX() >= 70 && play.getX() - me.getX() <= 130){//Yfor (int i=56;i<=571;i+=57){if (i - me.getY() >= -27 && i - me.getY() <= 27){Ey = i;}}//Xfor (int i=24;i<=480;i+=57){if (i - me.getX() >= -55 && i-me.getX() <= 0){Ex = i;}}//正左方是否有别的棋子for (int i=0;i<32;i++){if (playQ[i].isVisible() && play.getY() - playQ[i].getY() == 0 && play.getX() - playQ[i].getX() == 57 ){Move = 1;break;}}if (Move == 0){//当前记录添加到集合(用于悔棋)Var.add(String.valueOf(play.isVisible()));Var.add(String.valueOf(play.getX()));Var.add(String.valueOf(play.getY()));Var.add(String.valueOf(Man));play.setBounds(Ex,Ey,55,55);}}//else//下移、右边else if (me.getY() - play.getY() >= 87 && me.getY() - play.getY() <= 141 && me.getX() - play.getX() <= 87 && me.getX() - play.getX() >= 2 ){//Yfor (int i=56;i<=571;i+=57){if (i - me.getY() >= -27 && i - me.getY() <= 27){Ey = i;}}//Xfor (int i=24;i<=480;i+=57){if (i - me.getX() >= -55 && i-me.getX() <= 0){Ex = i;}}//正下方是否有别的棋子for (int i=0;i<32;i++){if (playQ[i].isVisible() && play.getX() - playQ[i].getX() == 0 && playQ[i].getY() - play.getY() == 57 ){Move = 1;break;}}if (Move == 0){//当前记录添加到集合(用于悔棋)Var.add(String.valueOf(play.isVisible()));Var.add(String.valueOf(play.getX()));Var.add(String.valueOf(play.getY()));Var.add(String.valueOf(Man));play.setBounds(Ex,Ey,55,55);}}//else//上移、右边else if (play.getY() - me.getY() >= 87 && play.getY() - me.getY() <= 141 && me.getX() - play.getX() <= 87 && me.getX() - play.getX() >= 30 ){//合法的Y坐标for (int i=56;i<=571;i+=57){if (i - me.getY() >= -27 && i - me.getY() <= 27){。

JAVA课程设计围棋对弈(含代码)

JAVA课程设计围棋对弈(含代码)

Java程序课程设计任务书一、主要任务与目标创建一个围棋对弈平台。

基于Panel类定义一个面板子类,在其中利用Graphics类的drawLine()方法绘制棋盘格线,利用fillOval()方法绘制棋盘四角的星位。

为面板注册MouseEvent监听器,为一个按钮注册ActionEvent事件监听器,实现单击鼠标布子、单机一个重新开局等操作。

黑白棋子基于Canvas类的子类,其中,paint()方法用来绘制棋子,通过为棋子注册MouseEvent事件监听器实现双击棋子吃子、右击棋子悔棋操作。

Canvas组件表示屏幕上一个空白矩形区域,应用程序可以在该区域内绘图,或者从该区域捕获用户的输入事件。

必须重写paint方法,以便在Canvas上执行自定义图形。

主类为Frame的子类,前面创建的棋盘被置入其中。

二、主要内容与基本要求系统的功能要求:1.要求有黑白两色棋子,保存所有已下的棋子,包括在棋盘上的所有棋子和被踢掉的,若某一次落子没有造成踢子,包括所有被这个棋子提掉的棋子及这个棋子本身。

如果踢子,则保存所有被踢掉的棋子。

保证实现下棋的基本操作如:可以允许悔棋,落子,提示信息,重新开始游戏等功能。

2.熟悉JAVA中swing的组件运用,基本工具的熟练掌握。

学习并掌握以下技术:Java;熟练使用以下开发工具:JCreator 等三、计划进度1.12月28日--12月29日:搜集资料、查阅文献,确定选题2.12月29日--01月02日:需求分析,系统设计,系统功能模块完善3.01月02日-- 01月06 日:编程实现系统、系统测试与修改4.01月05日-- 01月07日:课程设计报告撰写5.01月07日--01月07日:课程设计报告答辩四、主要参考文献:[1].陈轶.姚晓昆编著.Java程序设计实验指导.北京:清华大学出版社,2006[2].[3].赵文靖编著.Java程序设计基础与上机指导.北京:清华大学出版社,2006[4].[5].吴其庆编著.Java程序设计实例教程.北京:冶金工业出版社,2006[6].[7].陈国君等编著.Java2程序设计基础.北京:清华大学出版社,2006[8].[5].Java网络编程实例教程,清华大学出版社,冯博等,2005.1摘要围棋作为一个棋类竞技运动,在民间十分流行,为了熟悉五子棋规则及技巧,以及研究简单的人工智能,决定用Java开发五子棋游戏。

java编程-棋盘棋子

java编程-棋盘棋子

要制作一个棋子在期盼上面随意移动首先我们先来画一个棋盘//画棋盘程序import java.awt.*;import java.awt.event.*;public class text {public text() {}private static void pa(Robot r) {r.mousePress(16);r.delay(10);}private static void pb(Robot r) {r.mouseRelease(16);}public static void main(String[] args) throws Exception { final Robot rb = new Robot();rb.keyPress(KeyEvent.VK_ALT);rb.keyPress(KeyEvent.VK_TAB);rb.delay(10);rb.keyRelease(KeyEvent.VK_TAB);rb.keyRelease(KeyEvent.VK_ALT);rb.delay(20);for (int i = 0; i < 7; i++) {rb.mouseMove(200, 100+i*50);pa(rb);rb.mouseMove(500, 100+i*50);pb(rb);rb.mouseMove(200+i*50, 100);pa(rb);rb.mouseMove(200+i*50, 400);pb(rb);}}}程序写完后我们打开开始——程序——附件——画图然后运行花棋盘程序确保画棋盘程序按下ALT+TAB可以切换到画图程序)*(注意花好后把图片保存在F盘根目录下//棋盘棋子移动程序import java.awt.*;import java.awt.event.KeyEvent;import java.awt.event.KeyListener;import javax.swing.*;public class text2 extends JFrame implements KeyListener {ImageIcon im1 = new ImageIcon("F://未命名.jpg");JPanel jp;JLabel jb;int x = 1, y = 1;public void paint(Graphics g) {jb.paint(g);g.setColor(Color.red);g.fillOval(x, y, 48, 48);}public text2() {jp = new JPanel();add(jp);jb = new JLabel(im1);jp.add(jb);setBounds(100, 50, 301, 301);setUndecorated(true);JPanel jp = new JPanel();add(jp);addKeyListener(this);setVisible(true);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}public static void main(String[] args) {text2 t2 = new text2();}@Overridepublic void keyPressed(KeyEvent e) {int ch = e.getKeyCode();if ( (int)ch == 37 && x > 1) {x -= 50;repaint();} else if ((int)ch == 38 && y > 1) {y -= 50;repaint();} else if ((int)ch == 39 && x < 251) {x += 50;repaint();} else if ((int)ch == 40 && y < 251) {y += 50;repaint();}else if((int)ch == 27){System.exit(0);}}private Object text2() {// TODO Auto-generated method stubreturn null;}@Overridepublic void keyReleased(KeyEvent arg0) {// TODO Auto-generated method stub}@Override public void keyTyped(KeyEvent arg0) {// TODO Auto-generated method stub}}运行此程序完成。

JAVA课程设计围棋对弈(含代码)

JAVA课程设计围棋对弈(含代码)

Java程序课程设计任务书一、主要任务与目标创建一个围棋对弈平台。

基于Panel类定义一个面板子类,在其中利用Graphics类的drawLine()方法绘制棋盘格线,利用fillOval()方法绘制棋盘四角的星位。

为面板注册MouseEvent监听器,为一个按钮注册ActionEvent事件监听器,实现单击鼠标布子、单机一个重新开局等操作。

黑白棋子基于Canvas类的子类,其中,paint()方法用来绘制棋子,通过为棋子注册MouseEvent事件监听器实现双击棋子吃子、右击棋子悔棋操作。

Canvas组件表示屏幕上一个空白矩形区域,应用程序可以在该区域内绘图,或者从该区域捕获用户的输入事件。

必须重写paint方法,以便在Canvas上执行自定义图形。

主类为Frame的子类,前面创建的棋盘被置入其中。

二、主要内容与基本要求系统的功能要求:1.要求有黑白两色棋子,保存所有已下的棋子,包括在棋盘上的所有棋子和被踢掉的,若某一次落子没有造成踢子,包括所有被这个棋子提掉的棋子及这个棋子本身。

如果踢子,则保存所有被踢掉的棋子。

保证实现下棋的基本操作如:可以允许悔棋,落子,提示信息,重新开始游戏等功能。

2.熟悉JAVA中swing的组件运用,基本工具的熟练掌握。

学习并掌握以下技术:Java;熟练使用以下开发工具:JCreator 等三、计划进度1.12月28日--12月29日:搜集资料、查阅文献,确定选题2.12月29日--01月02日:需求分析,系统设计,系统功能模块完善3.01月02日-- 01月06 日:编程实现系统、系统测试与修改4.01月05日-- 01月07日:课程设计报告撰写5.01月07日--01月07日:课程设计报告答辩四、主要参考文献:[1].陈轶.姚晓昆编著.Java程序设计实验指导.北京:清华大学出版社,2006[2].[3].赵文靖编著.Java程序设计基础与上机指导.北京:清华大学出版社,2006[4].[5].吴其庆编著.Java程序设计实例教程.北京:冶金工业出版社,2006[6].[7].陈国君等编著.Java2程序设计基础.北京:清华大学出版社,2006[8].[5].Java网络编程实例教程,清华大学出版社,冯博等,2005.1摘要围棋作为一个棋类竞技运动,在民间十分流行,为了熟悉五子棋规则及技巧,以及研究简单的人工智能,决定用Java开发五子棋游戏。

纯Java写的中国象棋

纯Java写的中国象棋
play[i] = new JLabel(in);
play[i].setBounds(k,398,55,55);
play[i].setName("卒2" + i);
}
//炮
in = new ImageIcon("image\\红炮.GIF");
for (i=28,k=81;i<30;i++,k+=342){
new WindowAdapter() {
public void windowClosing(WindowEvent we){
System.exit(0);
}
}
);
//窗体居中
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
}
catch(Exception e){
}
play[Man].setVisible(true);
}
//闪烁当前提示信息以免用户看不见
else {
text.setVisible(false);
//时间控制
try{
tmain.sleep(250);
}
catch(Exception e){
}
text.setVisible(true);
play[i] = new JLabel(in);
play[i].setBounds(k,569,55,55);
play[i].setName("象2");
}
//士
in = new ImageIcon("image\\红士.GIF");

Java写的围棋游戏的源代码

Java写的围棋游戏的源代码

import java.awt.*;import java.awt.event.*;import javax.swing.JOptionPane;public class Chess extends Frame{ChessPad chesspad= new ChessPad();Chess(){add(chesspad);chesspad.setBounds(70,90,440,440);Label label=new Label("click to point,doubled_click to remove,right click to back",Label.CENTER);add(label);label.setBounds(70,55,440,24);label.setBackground(Color.orange);addWindowListener(new WindowAdapter(){public void windowClosing(WindowEvent e){System.exit(0);}});setLayout(null);setVisible(true);setSize(600,550);}public static void main(String args[]){Chess chess=new Chess();}}class ChessPad extends Panel implements MouseListener, ActionListener,FocusListener {int x = -1, y = -1, chessColor = 1;String blackname="",whitename="";Button button=new Button("start");Button inputButton=new Button("input");TextField text_1=new TextField("black please"), text_2=new TextField(""),//white pleasetext_3=new TextField("black'name"),text_4=new TextField("white'name");ChessPad(){add(inputButton);inputButton.setBounds(35,5,60,26);inputButton.addActionListener(this);inputButton.addFocusListener(this);add(text_3);text_3.setBounds(115,5,90,24);text_3.addFocusListener(this);text_3.setEditable(true);add(text_4);text_4.setBounds(315,5,90,24);text_4.addFocusListener(this);text_4.setEditable(true);add(button);button.setBounds(35,36,60,26);button.setEnabled(false);button.addActionListener(this);add(text_1);text_1.setBounds(115,36,90,24);text_1.setEnabled(false);text_1.setEditable(false);add(text_2);text_2.setBounds(315,36,90,24);text_2.setEnabled(false);text_2.setEditable(false);setSize(440,440);setLayout(null);setBackground(Color.orange);addMouseListener(this);}public void paint(Graphics g){for(int i=80;i<=400;i=i+20){g.drawLine(40,i,400,i);}g.drawLine(40,420,400,420);for(int j=40;j<=380;j=j+20){g.drawLine(j,80,j,420);}g.drawLine(400,80,400,420);g.fillOval(97,137,6,6);g.fillOval(337,137,6,6);g.fillOval(97,377,6,6);g.fillOval(337,377,6,6);g.fillOval(217,257,6,6);}public void focusGained(FocusEvent e){Component com=(Component)e.getSource(); if(com==text_3){text_3.setText("");}else if(com==text_4){text_4.setText("");}}public void focusLost(FocusEvent e){}public void mousePressed(MouseEvent e)if(blackname.length()==0||whitename.length()==0){JOptionPane.showMessageDialog(this,"please input the player's name,and click input button before you start chess!","reminder",JOptionPane.WARNING_MESSAGE); }else if(blackname.equals("black'name")){JOptionPane.showMessageDialog(this,"please input the black player's name,and click input button","reminder",JOptionPane.WARNING_MESSAGE);}else if(whitename.equals("white'name")){JOptionPane.showMessageDialog(this,"please input the white player's name,and click input button","reminder",JOptionPane.WARNING_MESSAGE);}else if(e.getModifiers()==InputEvent.BUTTON1_MASK){x = (int)e.getX();y = (int)e.getY();int a=(x+10)/20,b=(y+10)/20;ChessPoint_black chesspoint_black=new ChessPoint_black(this);ChessPoint_white chesspoint_white=new ChessPoint_white(this);if(x/20<2||y/20<4||x/20>19||y/20>20){}else{if(chessColor==1){this.add(chesspoint_black);chesspoint_black.setBounds(a*20-10,b*20-10,20,20);chessColor=chessColor*(-1);text_2.setText(this.whitename+" please");text_1.setText("");else if(chessColor==-1){this.add(chesspoint_white);chesspoint_white.setBounds(a*20-10,b*20-10,20,20);chessColor=chessColor*(-1);text_1.setText(this.blackname+" please");text_2.setText("");}}}}public void mouseReleased(MouseEvent e){}public void mouseEntered(MouseEvent e){}public void mouseExited(MouseEvent e){}public void mouseClicked(MouseEvent e){}public void actionPerformed(ActionEvent e){if(e.getSource()==inputButton){blackname=text_3.getText();whitename=text_4.getText();if(blackname.length()==0||whitename.length()==0){JOptionPane.showMessageDialog(this,"you did not complete theinformation!","reminder",JOptionPane.WARNING_MESSAGE);}else if(blackname.equals("black'name")){JOptionPane.showMessageDialog(this,"please input the black player's name","reminder",JOptionPane.WARNING_MESSAGE);}else if(whitename.equals("white'name")){JOptionPane.showMessageDialog(this,"please input the white player's name","reminder",JOptionPane.WARNING_MESSAGE);}else{inputButton.setEnabled(false);text_3.removeFocusListener(this);text_3.setEnabled(false);text_4.setEnabled(false);button.setEnabled(true);text_1.setEnabled(true);text_1.setText(blackname+" please");text_2.setEnabled(true);}}else if(e.getSource()==button){inputButton.setEnabled(true);text_3.setEnabled(true);text_4.setEnabled(true);button.setEnabled(false);text_1.setEnabled(false);text_2.setEnabled(false);this.removeAll();chessColor=1;add(button);button.setBounds(35,36,60,26);add(text_1);text_1.setBounds(115,36,90,24);text_1.setText("black please");add(text_2);text_2.setBounds(315,36,90,24);text_2.setText("");add(inputButton);inputButton.setBounds(35,5,60,26);add(text_3);text_3.setText("black'name");text_3.addFocusListener(this);text_3.setBounds(115,5,90,24);add(text_4);text_4.setText("white'name");text_4.setBounds(315,5,90,24);blackname="";whitename="";}}}class ChessPoint_black extends Canvas implements MouseListener {ChessPad chesspad=null;ChessPoint_black(ChessPad p){setSize(20,20);chesspad=p;addMouseListener(this);}public void paint(Graphics g){g.setColor(Color.black);g.fillOval(0,0,20,20);}public void mousePressed(MouseEvent e){if(e.getModifiers()==InputEvent.BUTTON3_MASK){chesspad.remove(this);chesspad.chessColor=1;chesspad.text_2.setText("");chesspad.text_1.setText(chesspad.blackname+" please");}}public void mouseReleased(MouseEvent e){}public void mouseEntered(MouseEvent e){}public void mouseExited(MouseEvent e){}public void mouseClicked(MouseEvent e){if(e.getClickCount()>=2){chesspad.remove(this);}}}class ChessPoint_white extends Canvas implements MouseListener {ChessPad chesspad=null;ChessPoint_white(ChessPad p){setSize(20,20);chesspad=p;addMouseListener(this);}public void paint(Graphics g){g.setColor(Color.white);g.fillOval(0,0,20,20);}public void mousePressed(MouseEvent e){if(e.getModifiers()==InputEvent.BUTTON3_MASK){chesspad.remove(this);chesspad.chessColor=-1;chesspad.text_1.setText("");chesspad.text_2.setText(chesspad.whitename+" please"); }}public void mouseReleased(MouseEvent e){}public void mouseEntered(MouseEvent e){}public void mouseExited(MouseEvent e){}public void mouseClicked(MouseEvent e){if(e.getClickCount()>=2){chesspad.remove(this);}}}。

Java中国象棋程序源代码

Java中国象棋程序源代码

import java.io.*;import java.applet.Applet;import java.applet.AudioClip;import javax.swing.*;import java.awt.*;import java.awt.event.*;import javax.swing.*;import java.util.*;import java.io.*;//主类//主框架类public class ChineseChess{public static void main(String args[]){new ChessMainFrame("中国象棋");}}class ChessMainFrame extends JFrame implements ActionListener,MouseListener,Runnable{MusicDemo t = new MusicDemo();//玩家JLabel play[] = new JLabel[32];//棋盘JLabel image;//窗格Container con;//工具栏JToolBar jmain;//重新开始JButton anew;//悔棋JButton repent;//打开JButton showOpen;//保存JButton showSave;//退出JButton exit;//当前信息JLabel text;//保存当前操作Vector FileVar;Vector Var;//规则类对象(使于调用方法) ChessRule rule;/*单击棋子**********************************//*chessManClick = true 闪烁棋子并给线程响应*//*chessManClick = false 吃棋子停止闪烁并给线程响应*/ boolean chessManClick;/*控制玩家走棋****************************//*chessPlayClick=1 黑棋走棋*//*chessPlayClick=2 红棋走棋默认红棋*//*chessPlayClick=3 双方都不能走棋*/int chessPlayClick=2;//控制棋子闪烁的线程Thread tmain;//把第一次的单击棋子给线程响应static int Man,i;ChessMainFrame(){}ChessMainFrame(String Title){//获行客格引用con = this.getContentPane();con.setLayout(null);//实例化规则类rule = new ChessRule();FileVar = new Vector();Var = new Vector();//创建工具栏jmain = new JToolBar();text = new JLabel(" 热烈欢迎");text.setToolTipText("提示信息");anew = new JButton(" 新游戏" );anew.setToolTipText("重新开始新的一局");exit = new JButton(" 退出");exit.setToolTipText("退出本程序");repent = new JButton(" 悔棋");repent.setToolTipText("返回到上次走棋的位置"); showOpen = new JButton("打开"); showOpen.setToolTipText("打开以前棋局"); showSave = new JButton("保存"); showSave.setToolTipText("保存当前棋局");//把组件添加到工具栏jmain.setLayout(new GridLayout(0,6));jmain.add(anew);jmain.add(repent);jmain.add(showOpen);jmain.add(showSave);jmain.add(exit);jmain.add(text);jmain.setBounds(0,500,450,30);con.add(jmain);//添加棋子标签drawChessMan();/*注册监听者*///注册按扭监听anew.addActionListener(this);repent.addActionListener(this);exit.addActionListener(this);showOpen.addActionListener(this);showSave.addActionListener(this);//注册棋子移动监听for (int i=0;i<32;i++){con.add(play[i]);play[i].addMouseListener(this);}//添加棋盘标签con.add(image = new JLabel(new ImageIcon("CChess.GIF"))); image.setBounds(0,0,446,497);image.addMouseListener(this);//注册窗体关闭监听this.addWindowListener(new WindowAdapter(){public void windowClosing(WindowEvent we){System.exit(0);}});//窗体居中Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();Dimension frameSize = this.getSize();if (frameSize.height > screenSize.height){frameSize.height = screenSize.height;}if (frameSize.width > screenSize.width){frameSize.width = screenSize.width;}this.setLocation((screenSize.width - frameSize.width) / 2 - 200 ,(screenSize.height - frameSize.height ) / 2 - 290);this.setIconImage(new ImageIcon("车1.gif").getImage());this.setResizable(false);this.setTitle(Title);this.setSize(450,550);this.show();}/*添加棋子方法************/public void drawChessMan(){//流程控制int i,k;//图标Icon in;//黑色棋子//车in = new ImageIcon("车1.GIF"); for (i=0,k=10;i<2;i++,k+=385) {play[i] = new JLabel(in);play[i].setBounds(k,10,40,40);play[i].setName("车1");}//马in = new ImageIcon("马1.GIF"); for (i=4,k=60;i<6;i++,k+=285) {play[i] = new JLabel(in);play[i].setBounds(k,10,40,40);play[i].setName("马1");}//相in = new ImageIcon("相1.GIF"); for (i=8,k=105;i<10;i++,k+=195) {play[i] = new JLabel(in);play[i].setBounds(k,10,40,40);play[i].setName("相1");}//士in = new ImageIcon("士1.GIF"); for (i=12,k=155;i<14;i++,k+=95) {play[i] = new JLabel(in);play[i].setBounds(k,10,40,40);play[i].setName("士1");}//卒in = new ImageIcon("卒1.GIF"); for (i=16,k=10;i<21;i++,k+=96.5) {play[i] = new JLabel(in);play[i].setBounds(k,160,40,40);play[i].setName("卒1" + i);}//炮in = new ImageIcon("炮1.GIF"); for (i=26,k=60;i<28;i++,k+=289) {play[i] = new JLabel(in);play[i].setBounds(k,110,40,40);play[i].setName("炮1" + i);}//将in = new ImageIcon("将1.GIF"); play[30] = new JLabel(in);play[30].setBounds(205,10,40,40); play[30].setName("将1");//红色棋子//车in = new ImageIcon("车2.GIF"); for (i=2,k=10;i<4;i++,k+=385) {play[i] = new JLabel(in);play[i].setBounds(k,450,40,40);play[i].setName("车2");}//马in = new ImageIcon("马2.GIF"); for (i=6,k=60;i<8;i++,k+=285) {play[i] = new JLabel(in);play[i].setBounds(k,450,40,40);play[i].setName("马2");}//相in = new ImageIcon("相2.GIF"); for (i=10,k=105;i<12;i++,k+=195) {play[i] = new JLabel(in);play[i].setBounds(k,450,40,40);play[i].setName("相2");}//士in = new ImageIcon("士2.GIF"); for (i=14,k=155;i<16;i++,k+=95) {play[i] = new JLabel(in);play[i].setBounds(k,450,40,40);play[i].setName("士2");}//兵in = new ImageIcon("兵2.GIF"); for (i=21,k=10;i<26;i++,k+=96.5) {play[i] = new JLabel(in);play[i].setBounds(k,300,40,40);play[i].setName("兵2" + i);}//炮in = new ImageIcon("炮2.GIF"); for (i=28,k=60;i<30;i++,k+=289) {play[i] = new JLabel(in);play[i].setBounds(k,350,40,40);play[i].setName("炮2" + i);}//帅in = new ImageIcon("帅2.GIF");play[31] = new JLabel(in);play[31].setBounds(205,450,40,40);play[31].setName("帅2");}/*线程方法控制棋子闪烁*/public void run(){while (true){//单击棋子第一下开始闪烁if (chessManClick){play[Man].setVisible(false);//时间控制try{tmain.sleep(500);}catch(Exception e){}play[Man].setVisible(true);}//闪烁当前提示信息以免用户看不见else{text.setVisible(false);//时间控制try{tmain.sleep(500);}catch(Exception e){}text.setVisible(true);}try{tmain.sleep(500);}catch (Exception e){}}}/*单击棋子方法************************/ public void mouseClicked(MouseEvent me) {MusicDemo1 t = new MusicDemo1();//当前坐标int Ex=0,Ey=0;//启动线程if (tmain == null){tmain = new Thread(this);tmain.start();}//单击棋盘(移动棋子)if (me.getSource().equals(image)){//该红棋走棋的时候if (chessPlayClick == 2 && play[Man].getName().charAt(1) == '2') {Ex = play[Man].getX();Ey = play[Man].getY();//移动卒、兵if (Man > 15 && Man < 26){rule.armsRule(Man,play[Man],me);}//移动炮else if (Man > 25 && Man < 30){rule.cannonRule(play[Man],play,me);}//移动车else if (Man >=0 && Man < 4){rule.cannonRule(play[Man],play,me);}//移动马else if (Man > 3 && Man < 8){rule.horseRule(play[Man],play,me);}//移动相、象else if (Man > 7 && Man < 12){rule.elephantRule(Man,play[Man],play,me);}//移动仕、士else if (Man > 11 && Man < 16){rule.chapRule(Man,play[Man],play,me);}//移动将、帅else if (Man == 30 || Man == 31){rule.willRule(Man,play[Man],play,me);}//是否走棋错误(是否在原地没有动)if (Ex == play[Man].getX() && Ey == play[Man].getY()) {text.setText(" 红棋走棋");chessPlayClick=2;else{text.setText(" 黑棋走棋");chessPlayClick=1;}}//if//该黑棋走棋的时候else if (chessPlayClick == 1 && play[Man].getName().charAt(1) == '1'){Ex = play[Man].getX();Ey = play[Man].getY();//移动卒、兵if (Man > 15 && Man < 26){rule.armsRule(Man,play[Man],me);}//移动炮else if (Man > 25 && Man < 30){rule.cannonRule(play[Man],play,me);}//移动车else if (Man >=0 && Man < 4){rule.cannonRule(play[Man],play,me);}//移动马else if (Man > 3 && Man < 8){rule.horseRule(play[Man],play,me);}//移动相、象else if (Man > 7 && Man < 12){rule.elephantRule(Man,play[Man],play,me); }//移动仕、士else if (Man > 11 && Man < 16){rule.chapRule(Man,play[Man],play,me);}//移动将、帅else if (Man == 30 || Man == 31){rule.willRule(Man,play[Man],play,me);}//是否走棋错误(是否在原地没有动)if (Ex == play[Man].getX() && Ey == play[Man].getY()){text.setText(" 黑棋走棋");chessPlayClick=1;}else{text.setText(" 红棋走棋");chessPlayClick=2;}}//else if//当前没有操作(停止闪烁)chessManClick=false;}//if//单击棋子else{//第一次单击棋子(闪烁棋子)if (!chessManClick){for (int i=0;i<32;i++){//被单击的棋子if (me.getSource().equals(play[i])){//告诉线程让该棋子闪烁Man=i;//开始闪烁chessManClick=true;break;}}//for}//if//第二次单击棋子(吃棋子)else if (chessManClick){//当前没有操作(停止闪烁)chessManClick=false;for (i=0;i<32;i++){//找到被吃的棋子if (me.getSource().equals(play[i])){//该红棋吃棋的时候if (chessPlayClick == 2 && play[Man].getName().charAt(1) == '2'){Ex = play[Man].getX();Ey = play[Man].getY();//卒、兵吃规则if (Man > 15 && Man < 26){rule.armsRule(play[Man],play[i]);}//炮吃规则else if (Man > 25 && Man < 30){rule.cannonRule(0,play[Man],play[i],play,me);}//车吃规则else if (Man >=0 && Man < 4){rule.cannonRule(1,play[Man],play[i],play,me); }//马吃规则else if (Man > 3 && Man < 8){rule.horseRule(play[Man],play[i],play,me);}//相、象吃规则else if (Man > 7 && Man < 12){rule.elephantRule(play[Man],play[i],play);}//士、仕吃棋规则else if (Man > 11 && Man < 16){rule.chapRule(Man,play[Man],play[i],play);}//将、帅吃棋规则else if (Man == 30 || Man == 31){rule.willRule(Man,play[Man],play[i],play);play[Man].setVisible(true);}//是否走棋错误(是否在原地没有动)if (Ex == play[Man].getX() && Ey == play[Man].getY()){text.setText(" 红棋走棋");chessPlayClick=2;break;}else{text.setText(" 黑棋走棋");chessPlayClick=1;break;}}//if//该黑棋吃棋的时候else if (chessPlayClick == 1 && play[Man].getName().charAt(1) == '1'){Ex = play[Man].getX();Ey = play[Man].getY();//卒、兵吃规则if (Man > 15 && Man < 26){rule.armsRule(play[Man],play[i]);}//炮吃规则else if (Man > 25 && Man < 30){rule.cannonRule(0,play[Man],play[i],play,me);}//车吃规则else if (Man >=0 && Man < 4){rule.cannonRule(1,play[Man],play[i],play,me);}//马吃规则else if (Man > 3 && Man < 8){rule.horseRule(play[Man],play[i],play,me);}//相、象吃规则else if (Man > 7 && Man < 12){rule.elephantRule(play[Man],play[i],play);}//士、仕吃棋规则else if (Man > 11 && Man < 16){rule.chapRule(Man,play[Man],play[i],play);}//将、帅吃棋规则else if (Man == 30 || Man == 31){rule.willRule(Man,play[Man],play[i],play);play[Man].setVisible(true);}//是否走棋错误(是否在原地没有动)if (Ex == play[Man].getX() && Ey == play[Man].getY()){text.setText(" 黑棋走棋");chessPlayClick=1;break;}else{text.setText(" 红棋走棋");chessPlayClick=2;break;}}//else if}//if}//for//是否胜利if (!play[31].isVisible()){JOptionPane.showConfirmDialog(this,"恭喜黑方获胜","玩家一胜利",JOptionPane.DEFAULT_OPTION,JOptionPane.WARNING_MESSAGE);//双方都不可以在走棋了chessPlayClick=3;text.setText(" 恭喜黑方获胜");}//ifelse if (!play[30].isVisible()){JOptionPane.showConfirmDialog(this,"恭喜红方获胜","玩家二胜利",JOptionPane.DEFAULT_OPTION,JOptionPane.WARNING_MESSAGE);chessPlayClick=3;text.setText(" 恭喜红方获胜");}//else if}//else}//else}public void mousePressed(MouseEvent me){}public void mouseReleased(MouseEvent me){}public void mouseEntered(MouseEvent me){}public void mouseExited(MouseEvent me){}/*单击按扭*********************************/public void actionPerformed(ActionEvent ae){//重新开始if (ae.getSource().equals(anew)){int i,k;//重新排列每个棋子的位置//车for (i=0,k=10;i<2;i++,k+=385) {play[i].setBounds(k,10,40,40); }//马for (i=4,k=60;i<6;i++,k+=285) {play[i].setBounds(k,10,40,40); }//相for (i=8,k=105;i<10;i++,k+=195) {play[i].setBounds(k,10,40,40); }//士for (i=12,k=155;i<14;i++,k+=95) {play[i].setBounds(k,10,40,40); }//卒for (i=16,k=10;i<21;i++,k+=96.5) {play[i].setBounds(k,160,40,40);//炮for (i=26,k=60;i<28;i++,k+=289) {play[i].setBounds(k,110,40,40); }//将play[30].setBounds(205,10,40,40);//红色棋子//车for (i=2,k=10;i<4;i++,k+=385) {play[i].setBounds(k,450,40,40); }//马for (i=6,k=60;i<8;i++,k+=285) {play[i].setBounds(k,450,40,40); }//相for (i=10,k=105;i<12;i++,k+=195) {play[i].setBounds(k,450,40,40);//士for (i=14,k=155;i<16;i++,k+=95) {play[i].setBounds(k,450,40,40); }//兵for (i=21,k=10;i<26;i++,k+=96.5) {play[i].setBounds(k,300,40,40); }//炮for (i=28,k=60;i<30;i++,k+=289) {play[i].setBounds(k,350,40,40); }//帅play[31].setBounds(205,450,40,40);chessPlayClick = 2;text.setText(" 红棋走棋");for (i=0;i<32;i++){play[i].setVisible(true);}for (i=0;i<Var.size();i++){Var.remove(i);}}//悔棋else if (ae.getSource().equals(repent)){try{//获得setVisible属性值String S = (String)Var.get(Var.size()-4);//获得X坐标int x = Integer.parseInt((String)Var.get(Var.size()-3));//获得Y坐标int y = Integer.parseInt((String)Var.get(Var.size()-2));//获得索引int M = Integer.parseInt((String)Var.get(Var.size()-1));//赋给棋子play[M].setVisible(true);play[M].setBounds(x,y,40,40);if (play[M].getName().charAt(1) == '1'){text.setText(" 黑棋走棋");chessPlayClick = 1;else{text.setText(" 红棋走棋");chessPlayClick = 2;}//删除用过的坐标Var.remove(Var.size()-4);Var.remove(Var.size()-3);Var.remove(Var.size()-2);Var.remove(Var.size()-1);//停止旗子闪烁chessManClick=false;}catch(Exception e){}}//打开棋局else if (ae.getSource().equals(showOpen)){try{//打开对话框JFileChooser jfcOpen = new JFileChooser("打开棋局");int v=jfcOpen.showOpenDialog(this);if (v != JFileChooser.CANCEL_OPTION)//删除集合所有信息Var.removeAllElements();FileVar.removeAllElements();//打开文件获得所有数据FileInputStream fileIn = new FileInputStream(jfcOpen.getSelectedFile());ObjectInputStream objIn = new ObjectInputStream(fileIn);FileVar = (Vector)objIn.readObject();fileIn.close();objIn.close();//集合内容对应棋子坐标int k=0;for (int i=0;i<32;i++){play[i].setBounds(((Integer)FileVar.get(k)).intValue(),((Integer)FileVar.get(k+1)). intValue(),40,40);//被吃掉的棋子不显示if(!((Boolean)FileVar.elementAt(k+2)).booleanValue()){play[i].setVisible(false);}k+=3;}//当前该哪方棋子走棋if (((String)stElement()).toString().equals(" 红棋走棋")){text.setText(((String)stElement()).toString());chessPlayClick = 2;}else if (((String)stElement()).toString().equals(" 黑棋走棋")){text.setText(((String)stElement()).toString());chessPlayClick = 1;}else if (((String)stElement()).toString().substring(5).equals("利")){text.setText(((String)stElement()).toString());chessPlayClick = 3;}}}catch(Exception e){System.out.println("ERROR ShowOpen");}}//保存当前棋局else if (ae.getSource().equals(showSave)){try{//保存对话框JFileChooser jfcSave = new JFileChooser("保存当前棋局");int v=jfcSave.showSaveDialog(this);if (v != JFileChooser.CANCEL_OPTION){FileVar.removeAllElements();//保存所有棋子的坐标和是否可见for (int i=0;i<32;i++){FileVar.addElement(new Integer(play[i].getX()));FileVar.addElement(new Integer(play[i].getY()));FileVar.addElement(new Boolean(play[i].isVisible()));}//保存当前该哪方吃棋FileVar.add(text.getText());//保存到文件FileOutputStream fileOut = new FileOutputStream(jfcSave.getSelectedFile());ObjectOutputStream objOut = new ObjectOutputStream(fileOut);objOut.writeObject(FileVar);objOut.close();fileOut.close();}}catch(Exception e){System.out.println("ERROR ShowSave");}}//退出else if (ae.getSource().equals(exit)){int j=JOptionPane.showConfirmDialog(this,"真的要退出吗?","退出",JOptionPane.YES_OPTION,JOptionPane.QUESTION_MESSAGE);if (j == JOptionPane.YES_OPTION){System.exit(0);}}}/*规则类*/class ChessRule{/*卒移动规则******************************************/public void armsRule(int Man,JLabel play,MouseEvent me){//黑卒向下if (Man < 21){//向下移动、得到终点的坐标模糊成合法的坐标if ((me.getY()-play.getY()) > 40 && (me.getY()-play.getY()) < 80 && (me.getX()-play.getX()) < 30 && (me.getX()-play.getX()) > 0){//当前记录添加到集合(用于悔棋)Var.add(String.valueOf(play.isVisible()));Var.add(String.valueOf(play.getX()));Var.add(String.valueOf(play.getY()));Var.add(String.valueOf(Man));play.setBounds(play.getX(),play.getY()+45,40,40);}//向右移动、得到终点的坐标模糊成合法的坐标、必须过河else if (play.getY() >= 250 && (me.getX() - play.getX()) >= 30 && (me.getX() - play.getX()) <= 90){play.setBounds(play.getX()+48,play.getY(),40,40);}//向左移动、得到终点的坐标模糊成合法的坐标、必须过河else if (play.getY() >= 250 && (play.getX() - me.getX()) >= 20 && (play.getX() - me.getX()) <=90){//模糊坐标play.setBounds(play.getX()-48,play.getY(),40,40);}}//红卒向上else{//当前记录添加到集合(用于悔棋)Var.add(String.valueOf(play.isVisible()));Var.add(String.valueOf(play.getX()));Var.add(String.valueOf(play.getY()));Var.add(String.valueOf(Man));//向上移动、得到终点的坐标模糊成合法的坐标if ((me.getX()-play.getX()) > 0 && (me.getX()-play.getX()) < 30 && (play.getY()-me.getY()) >20 && play.getY()-me.getY() < 70){play.setBounds(play.getX(),play.getY()-48,40,40);}//向右移动、得到终点的坐标模糊成合法的坐标、必须过河else if (play.getY() <= 210 && (me.getX() - play.getX()) >= 30 && (me.getX() - play.getX()) <= 90){play.setBounds(play.getX()+50,play.getY(),40,40);}//向左移动、得到终点的坐标模糊成合法的坐标、必须过河else if (play.getY() <= 210 && (play.getX() - me.getX()) >= 20 && (play.getX() - me.getX()) <=60){play.setBounds(play.getX()-52,play.getY(),40,40);}}}//卒移动结束/*卒吃棋规则**********************************/public void armsRule(JLabel play1,JLabel play2){//向右走if ((play2.getX() - play1.getX()) <= 60 && (play2.getX() - play1.getX()) >= 40 && (play1.getY() - play2.getY()) < 10 && (play1.getY() - play2.getY()) > -10 && play2.isVisible() && play1.getName().charAt(1)!=play2.getName().charAt(1)){//黑棋要过河才能右吃棋if (play1.getName().charAt(1) == '1' && play1.getY() >= 250 && play1.getName().charAt(1) != play2.getName().charAt(1)){play2.setVisible(false);//把对方的位置给自己play1.setBounds(play2.getX(),play2.getY(),40,40);}//红棋要过河才左能吃棋else if (play1.getName().charAt(1) == '2' && play1.getY() <=210 && play1.getName().charAt(1) != play2.getName().charAt(1)){play2.setVisible(false);//把对方的位置给自己play1.setBounds(play2.getX(),play2.getY(),40,40);}}//向左走else if ((play1.getX() - play2.getX()) <= 60 && (play1.getX() - play2.getX()) >= 40 && (play1.getY() - play2.getY()) < 10 && (play1.getY() - play2.getY()) > -10 && play2.isVisible() && play1.getName().charAt(1)!=play2.getName().charAt(1)){//黑棋要过河才能左吃棋if (play1.getName().charAt(1) == '1' && play1.getY() >= 250 && play1.getName().charAt(1) != play2.getName().charAt(1)){play2.setVisible(false);//把对方的位置给自己play1.setBounds(play2.getX(),play2.getY(),40,40);}//红棋要过河才能右吃棋else if (play1.getName().charAt(1) == '2' && play1.getY() <= 210 && play1.getName().charAt(1) != play2.getName().charAt(1)){play2.setVisible(false);//把对方的位置给自己play1.setBounds(play2.getX(),play2.getY(),40,40);}}//向上走else if (play1.getX() - play2.getX() >= -10 && play1.getX() - play2.getX() <= 10 && play1.getY() - play2.getY() >= -70 && play1.getY() - play2.getY() <= 70){//黑棋不能向上吃棋if (play1.getName().charAt(1) == '1' && play1.getY() < play2.getY() && play1.getName().charAt(1) != play2.getName().charAt(1)){play2.setVisible(false);//把对方的位置给自己play1.setBounds(play2.getX(),play2.getY(),40,40);}//红棋不能向下吃棋else if (play1.getName().charAt(1) == '2' && play1.getY() > play2.getY() && play1.getName().charAt(1) != play2.getName().charAt(1)){play2.setVisible(false);//把对方的位置给自己play1.setBounds(play2.getX(),play2.getY(),40,40);}}//当前记录添加到集合(用于悔棋)Var.add(String.valueOf(play1.isVisible()));Var.add(String.valueOf(play1.getX()));Var.add(String.valueOf(play1.getY()));Var.add(String.valueOf(Man));//当前记录添加到集合(用于悔棋)Var.add(String.valueOf(play2.isVisible()));Var.add(String.valueOf(play2.getX()));Var.add(String.valueOf(play2.getY()));Var.add(String.valueOf(i));}//卒吃结束/*炮、车移动规则************************************************/public void cannonRule(JLabel play,JLabel playQ[],MouseEvent me){//起点和终点之间是否有棋子int Count = 0;//上、下移动if (play.getX() - me.getX() <= 10 && play.getX() - me.getX() >= -30){//指定所有模糊Y坐标for (int i=30;i<=462;i+=48){//移动的Y坐标是否有指定坐标相近的if (i - me.getY() >= -10 && i - me.getY() <= 30){//所有的棋子for (int j=0;j<32;j++){//找出在同一条竖线的所有棋子、并不包括自己if (playQ[j].getX() - play.getX() >= -10 && playQ[j].getX() - play.getX() <= 10 && playQ[j].getName()!=play.getName() && playQ[j].isVisible()){//从起点到终点(从左到右)for (int k=play.getY()+50;k<i;k+=50){//大于起点、小于终点的坐标就可以知道中间是否有棋子if (playQ[j].getY() < i && playQ[j].getY() > play.getY()){//中间有一个棋子就不可以从这条竖线过去Count++;break;}}//for//从起点到终点(从右到左)for (int k=i+50;k<play.getY();k+=50){//找起点和终点的棋子if (playQ[j].getY() < play.getY() && playQ[j].getY() > i){Count++;break;}}//for}//if}//for//起点和终点没有棋子就可以移动了if (Count == 0){//当前记录添加到集合(用于悔棋)Var.add(String.valueOf(play.isVisible()));Var.add(String.valueOf(play.getX()));Var.add(String.valueOf(play.getY()));Var.add(String.valueOf(Man));play.setBounds(play.getX(),i-17,40,40);break;}}//if}//for}//if//左、右移动else if (play.getY() - me.getY() >=-35 && play.getY() - me.getY() <= 10){//指定所有模糊X坐标for (int i=30;i<=420;i+=48){//移动的X坐标是否有指定坐标相近的if (i - me.getX() >= -35 && i-me.getX() <= 10){//所有的棋子for (int j=0;j<32;j++){//找出在同一条横线的所有棋子、并不包括自己if (playQ[j].getY() - play.getY() >= -10 && playQ[j].getY() - play.getY() <= 10 && playQ[j].getName()!=play.getName() && playQ[j].isVisible()){//从起点到终点(从上到下)for (int k=play.getX()+50;k<i;k+=50){//大于起点、小于终点的坐标就可以知道中间是否有棋子if (playQ[j].getX() < i && playQ[j].getX() > play.getX()){//中间有一个棋子就不可以从这条横线过去Count++;break;}}//for//从起点到终点(从下到上)for (int k=i+50;k<play.getX();k+=50){//找起点和终点的棋子if (playQ[j].getX() < play.getX() && playQ[j].getX() > i){Count++;break;}}//for}//if}//for//起点和终点没有棋子if (Count == 0){//当前记录添加到集合(用于悔棋)Var.add(String.valueOf(play.isVisible()));Var.add(String.valueOf(play.getX()));Var.add(String.valueOf(play.getY()));Var.add(String.valueOf(Man));play.setBounds(i-20,play.getY(),40,40);break;}}//if}//for}//else}//炮、车移动方法结束/*炮、车吃棋规则********************************************************************* *****/public void cannonRule(int Chess,JLabel play,JLabel playTake,JLabel playQ[],MouseEvent me){//起点和终点之间是否有棋子int Count = 0;//所有的棋子for (int j=0;j<32;j++){//找出在同一条竖线的所有棋子、并不包括自己if (playQ[j].getX() - play.getX() >= -10 && playQ[j].getX() - play.getX() <= 10 && playQ[j].getName()!=play.getName() && playQ[j].isVisible()){//自己是起点被吃的是终点(从上到下)for (int k=play.getY()+50;k<playTake.getY();k+=50){//大于起点、小于终点的坐标就可以知道中间是否有棋子if (playQ[j].getY() < playTake.getY() && playQ[j].getY() > play.getY()){//计算起点和终点的棋子个数Count++;break;}}//for//自己是起点被吃的是终点(从下到上)for (int k=playTake.getY();k<play.getY();k+=50){//找起点和终点的棋子if (playQ[j].getY() < play.getY() && playQ[j].getY() > playTake.getY()){Count++;break;}}//for}//if//找出在同一条竖线的所有棋子、并不包括自己else if (playQ[j].getY() - play.getY() >= -10 && playQ[j].getY() - play.getY() <= 10 && playQ[j].getName()!=play.getName() && playQ[j].isVisible()){//自己是起点被吃的是终点(从左到右)for (int k=play.getX()+50;k<playTake.getX();k+=50){//大于起点、小于终点的坐标就可以知道中间是否有棋子if (playQ[j].getX() < playTake.getX() && playQ[j].getX() > play.getX()){Count++;break;}}//for//自己是起点被吃的是终点(从右到左)for (int k=playTake.getX();k<play.getX();k+=50){//找起点和终点的棋子if (playQ[j].getX() < play.getX() && playQ[j].getX() > playTake.getX()){Count++;break;}}//for}//if}//for//起点和终点之间要一个棋子是炮的规则、并不能吃自己的棋子if (Count == 1 && Chess == 0 && playTake.getName().charAt(1) != play.getName().charAt(1)){//当前记录添加到集合(用于悔棋)Var.add(String.valueOf(play.isVisible()));Var.add(String.valueOf(play.getX()));Var.add(String.valueOf(play.getY()));Var.add(String.valueOf(Man));//当前记录添加到集合(用于悔棋)Var.add(String.valueOf(playTake.isVisible()));Var.add(String.valueOf(playTake.getX()));Var.add(String.valueOf(playTake.getY()));Var.add(String.valueOf(i));playTake.setVisible(false);play.setBounds(playTake.getX(),playTake.getY(),40,40);}//起点和终点之间没有棋子是车的规则、并不能吃自己的棋子else if (Count ==0 && Chess == 1 && playTake.getName().charAt(1) != play.getName().charAt(1)){//当前记录添加到集合(用于悔棋)Var.add(String.valueOf(play.isVisible()));Var.add(String.valueOf(play.getX()));Var.add(String.valueOf(play.getY()));Var.add(String.valueOf(Man));。

java版四子棋

java版四子棋

Java版四子棋---作者:pole import java.util.Scanner;public class FourChess{private static char[][] chess = new char[11][11];//定义棋盘数组private static boolean fit = true;//标识玩家出棋是否合规,是否有一方获胜private static Scanner sc;private static String str;//构建棋盘public static void structure()//构建structure{//构建棋盘坐标char[] ches = {' ','0','1','2','3','4','5','6','7','8','9'};for(int i=0;i<ches.length;i++){chess[0][i] = chess[i][0] = ches[i];}//构建棋盘for(int i=1;i<chess.length;i++){for(int j=1;j<chess[i].length;j++){chess[i][j] = '*';}}}//打印棋盘public static void printChess(){for(int i=0;i<chess.length;i++){for(int j=0;j<chess[i].length;j++){System.out.print(chess[i][j] + " ");}System.out.println();}}//判断出棋是否符合规定public static boolean isRule(char a, char b){int x = 0, y = 0;//为出棋位置设置的坐标for(int i=1;i<chess.length;i++){if(chess[i][0] == a)//出棋横坐标x = i;if(chess[0][i] == b)//出棋纵坐标y = i;}if(x<10){if(chess[x+1][y] == '*' || chess[x][y] == 'o' || chess[x][y] == 'x')return false;elsereturn true;}else{if(chess[x][y] == 'o' || chess[x][y] == 'x')return false;elsereturn true;}}//判断是否一方获胜public static boolean isWin(char a){for(int i=chess.length-1;i>3;i--){for(int j=1;j<chess[0].length;j++){if(j>3){if((chess[i][j] == a) && (chess[i][j] ==chess[i-1][j-1])&&(chess[i-1][j-1] ==chess[i-2][j-2])&&(chess[i-2][j-2] == chess[i-3][j-3]))//左上{return true;}}if(j<chess[i].length-3){if(((chess[i][j] == a) && (chess[i][j] == chess[i-1][j])&&(chess[i-1][j] == chess[i-2][j])&&(chess[i-2][j] == chess[i-3][j]))||//上((chess[i][j] == a) && (chess[i][j] == chess[i-1][j+1])&&(chess[i-1][j+1] ==chess[i-2][j+2])&&(chess[i-2][j+2] == chess[i-3][j+3]))||//右上((chess[i][j] == a) && (chess[i][j] == chess[i][j+1])&&(chess[i][j+1] == chess[i][j+2])&&(chess[i][j+2] == chess[i][j+3])))//右{return true;}}else{if((chess[i][j] == a) && (chess[i][j] ==chess[i-1][j])&&(chess[i-1][j] == chess[i-2][j])&&(chess[i-2][j] == chess[i-3][j]))//上{return true;}}}}return false;}//玩家A出棋opublic static void playerA(char a, char b){int x = 0, y = 0;//为出棋位置设置的坐标for(int i=1;i<chess.length;i++){if(chess[i][0] == a)//出棋横坐标x = i;if(chess[0][i] == b)//出棋纵坐标y = i;}chess[x][y] = 'o';//落子}//玩家B出棋xpublic static void playerB(char a, char b){int x = 0, y = 0;//为出棋位置设置的坐标for(int i=1;i<chess.length;i++){if(chess[i][0] == a)//出棋横坐标x = i;if(chess[0][i] == b)//出棋纵坐标y = i;}chess[x][y] = 'x';//落子}public static void main(String[] args){char pa = 'o', pb = 'x';//标识是那个玩家出棋char a, b;//横纵坐标structure();//构建棋盘printChess();//打印棋盘while(true){if(isWin(pb))//判断玩家B是否取胜{System.out.println("玩家B取胜,游戏结束。

JAVA课程设计围棋对弈(含代码)

JAVA课程设计围棋对弈(含代码)

Java程序课程设计任务书一、主要任务与目标创建一个围棋对弈平台。

基于Panel类定义一个面板子类,在其中利用Graphics类的drawLine()方法绘制棋盘格线,利用fillOval()方法绘制棋盘四角的星位。

为面板注册MouseEvent监听器,为一个按钮注册ActionEvent事件监听器,实现单击鼠标布子、单机一个重新开局等操作。

黑白棋子基于Canvas类的子类,其中,paint()方法用来绘制棋子,通过为棋子注册MouseEvent事件监听器实现双击棋子吃子、右击棋子悔棋操作。

Canvas组件表示屏幕上一个空白矩形区域,应用程序可以在该区域内绘图,或者从该区域捕获用户的输入事件。

必须重写paint方法,以便在Canvas上执行自定义图形。

主类为Frame的子类,前面创建的棋盘被置入其中。

二、主要内容与基本要求系统的功能要求:1.要求有黑白两色棋子,保存所有已下的棋子,包括在棋盘上的所有棋子和被踢掉的,若某一次落子没有造成踢子,包括所有被这个棋子提掉的棋子及这个棋子本身。

如果踢子,则保存所有被踢掉的棋子。

保证实现下棋的基本操作如:可以允许悔棋,落子,提示信息,重新开始游戏等功能。

2.熟悉JAVA中swing的组件运用,基本工具的熟练掌握。

学习并掌握以下技术:Java;熟练使用以下开发工具:JCreator 等三、计划进度1.12月28日--12月29日:搜集资料、查阅文献,确定选题2.12月29日--01月02日:需求分析,系统设计,系统功能模块完善3.01月02日-- 01月06 日:编程实现系统、系统测试与修改4.01月05日-- 01月07日:课程设计报告撰写5.01月07日--01月07日:课程设计报告答辩四、主要参考文献:[1].陈轶.姚晓昆编著.Java程序设计实验指导.北京:清华大学出版社,2006[2].[3].赵文靖编著.Java程序设计基础与上机指导.北京:清华大学出版社,2006[4].[5].吴其庆编著.Java程序设计实例教程.北京:冶金工业出版社,2006[6].[7].陈国君等编著.Java2程序设计基础.北京:清华大学出版社,2006[8].[5].Java网络编程实例教程,清华大学出版社,冯博等,2005.1摘要围棋作为一个棋类竞技运动,在民间十分流行,为了熟悉五子棋规则及技巧,以及研究简单的人工智能,决定用Java开发五子棋游戏。

纯Java写的中国象棋

纯Java写的中国象棋
Dimension frameSize = this.getSize();
if (frameSize.height > screenSize.height){
frameSize.height = screenSize.height;
}
if (frameSize.width > screenSize.width){
运行效果如下图所示:
源代码如下(可以直接运行出结果):
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
import java.io.*;
//主类
public class Chess{
public static void main(String args[]){
play[i] = new JLabel(in);
play[i].setBounds(k,398,55,55);
play[i].setName("卒2" + i);
}
//炮
in = new ImageIcon("image\\红炮.GIF");
for (i=28,k=81;i<30;i++,k+=342){
jmain.add(anew);
jmain.add(repent);
jmain.add(exit);
jmain.add(text);
jmain.setBounds(0,0,558,30);
con.add(jmain);
//添加棋子标签
drawChessMan();

JAVA课程设计围棋对弈(含代码)

JAVA课程设计围棋对弈(含代码)

Java程序课程设计任务书一、主要任务与目标创建一个围棋对弈平台。

基于Panel类定义一个面板子类,在其中利用Graphics类的drawLine()方法绘制棋盘格线,利用fillOval()方法绘制棋盘四角的星位。

为面板注册MouseEvent监听器,为一个按钮注册ActionEvent事件监听器,实现单击鼠标布子、单机一个重新开局等操作。

黑白棋子基于Canvas类的子类,其中,paint()方法用来绘制棋子,通过为棋子注册MouseEvent事件监听器实现双击棋子吃子、右击棋子悔棋操作。

Canvas组件表示屏幕上一个空白矩形区域,应用程序可以在该区域内绘图,或者从该区域捕获用户的输入事件。

必须重写paint方法,以便在Canvas上执行自定义图形。

主类为Frame的子类,前面创建的棋盘被置入其中。

二、主要内容与基本要求系统的功能要求:1.要求有黑白两色棋子,保存所有已下的棋子,包括在棋盘上的所有棋子和被踢掉的,若某一次落子没有造成踢子,包括所有被这个棋子提掉的棋子及这个棋子本身。

如果踢子,则保存所有被踢掉的棋子。

保证实现下棋的基本操作如:可以允许悔棋,落子,提示信息,重新开始游戏等功能。

2.熟悉JAVA中swing的组件运用,基本工具的熟练掌握。

学习并掌握以下技术:Java;熟练使用以下开发工具:JCreator 等三、计划进度1.12月28日--12月29日:搜集资料、查阅文献,确定选题2.12月29日--01月02日:需求分析,系统设计,系统功能模块完善3.01月02日-- 01月06 日:编程实现系统、系统测试与修改4.01月05日-- 01月07日:课程设计报告撰写5.01月07日--01月07日:课程设计报告答辩四、主要参考文献:[1].陈轶.姚晓昆编著.Java程序设计实验指导.北京:清华大学出版社,2006[2].[3].赵文靖编著.Java程序设计基础与上机指导.北京:清华大学出版社,2006[4].[5].吴其庆编著.Java程序设计实例教程.北京:冶金工业出版社,2006[6].[7].陈国君等编著.Java2程序设计基础.北京:清华大学出版社,2006[8].[5].Java网络编程实例教程,清华大学出版社,冯博等,2005.1摘要围棋作为一个棋类竞技运动,在民间十分流行,为了熟悉五子棋规则及技巧,以及研究简单的人工智能,决定用Java开发五子棋游戏。

四子棋的JAVA实现源代码

四子棋的JAVA实现源代码

四子棋的JAVA实现源代码package package01;import java.util.Scanner;public class class03 {static String DiskColour[]=new String[]{"Null","Red","Yellow"};static String SimpleColour[]=new String[]{" ","R","Y"};//the two array strings are used to represent colours.public static void main(String[] args){Scanner input=new Scanner(System.in);//define a method that can read data from keyboard.int Grid[][]=new int[6][7];int x=0,y=0;//x, y represent the coordinate of the disks.int judge=0;//0 means the game is not over and the game is to be continued;1 means the game is drawn;2 means there is a winner.int colour=1;//0 means Null; 1 means Red; 2 means Yellow.while(judge==0)//if the game is not over, this while-loop statement will be continued.{ System.out.println("Please place a "+DiskColour[colour]+" disk at column(0-6)");y=input.nextInt();for(int i=5;i>=0;i--)if(Grid[i][y]==0){x=i;Grid[x][y]=colour;if(colour==1)colour=2;elsecolour=1;break;}DrawGrid(Grid);judge=Decide(Grid,x,y);if(judge==2)System.out.println("The "+DiskColour[Grid[x][y]]+" Wins!");else if(judge==1)System.out.println("The game is drawn!\nPlease tryagain!");}}public static void DrawGrid(int Grid[][]){for(int i=0;i<=5;i++){for(int j=0;j<=6;j++){System.out.print("|"+SimpleColour[Grid[i][j]]);}System.out.println("|");}}public static int Decide(int Grid[][],int x,int y){int m=0;for(int i=0;i<=5;i++)for(int j=0;j<=6;j++)if(Grid[i][j]==0)m++;int n1=1;for(int i=y-1;i>=0;i--){if(Grid[x][y]==Grid[x][i])n1++;elsebreak;}for(int i=y+1;i<=6;i++){if(Grid[x][y]==Grid[x][i])n1++;elsebreak;}int n2=1;for(int i=x+1;i<=5;i++){if(Grid[x][y]==Grid[i][y])n2++;elsebreak;}int n3=1;for(int i=1;x+i<=5&&y+i<=6;i++){if(Grid[x][y]==Grid[x+i][y+i])n3++;elsebreak;}for(int i=-1;x+i>=0&&y+i>=0;i--){if(Grid[x][y]==Grid[x+i][y+i])n3++;elsebreak;}int n4=1;for(int i=1;x-i>=0&&y+i<=6;i++){if(Grid[x][y]==Grid[x-i][y+i])n4++;elsebreak;}for(int i=-1;x-i<=5&&y+i>=0;i--){if(Grid[x][y]==Grid[x-i][y+i])n4++;elsebreak;}if(n1>=4||n2>=4||n3>=4||n4>=4)return 2;elseif(m==0){return 1;}elsereturn 0;}}。

JAVA8.20游戏:四子连(JavaC++)

JAVA8.20游戏:四子连(JavaC++)

JAVA8.20游戏:四⼦连(JavaC++)(游戏:四⼦连)四⼦连是⼀个两个⼈玩的棋盘游戏,在游戏中,玩家轮流将有颜⾊的棋⼦放在⼀个六⾏七列的垂直悬挂的⽹格中:这个游戏的⽬的是在对⼿实现⼀⾏、⼀列或者⼀条对⾓线上有四个相同颜⾊的棋⼦之前,你能先做到。

程序提⽰两个玩家交替的下红⼦Red或黄⼦Yellow。

当放下⼀⼦时,程序在控制台重新显⽰这个棋盘,然后确定游戏状态(赢、平局还是继续),下⾯是⼀个运⾏⽰例:。

-----此题源⾃《java语⾔程序设计》习题8.20⽬录对象分析:属性:棋盘:Graph、top——⼆维字符(串)组模拟栈组;棋⼦:C(颜⾊)——奇偶交替变换棋盘剩余空格:empty——⽤于判断平局⽅法:下棋:input()——修改⼆维组判断输赢:judge()——判断胜出显⽰棋盘:show()——展⽰棋盘胜出条件:四⼦连珠代码思路:每次下棋之后都要进⾏判断,是否有⼈胜出,怎么判断呢?可以在下棋之后,以此棋为中⼼,向四个⽅向(⽔平,垂直,两条对⾓线:通过坐标的加减)判断是否出现了四⼦连珠(注意边界,易出现bug ),具体实现,请看代码。

当然也可以在整个棋盘搜索,代码容易写,但降低了效率。

注意:边界要判断仔细双向检测连珠,有可能你最后⼀次是下3个棋⼦中间胜出Java(最终代码):Java(最终代码):java 作业,可参考,别抄.judge (递归实现):单向探测求和,(也可双向,但效率没提⾼多少,且可读性不⾼)import java.util.Scanner;public class JavaGame {int row,column; //⾏列char Graph[][]; //⼆维棋盘int top[]; //模拟栈尾指针String C[]={"red","yellow"}; //棋⼦颜⾊int empty; //棋盘剩余空格public JavaGame(int r,int c){ //初始化棋盘数据empty=r*c;row=r;column=c;Graph=new char[r][c];top=new int[c];for(int i=0;i<c;i++) //初始化数组栈top[i]=-1;for(int i=0;i<r;i++)for(int j=0;j<c;j++)Graph[i][j]=' ';}public void show(){ //展⽰棋盘for(int i=row-1;i>=0;i--){System.out.print("|");for(int j=0;j<column;j++)System.out.print(Graph[i][j]+"|");System.out.println();}}public int Input(int y,int key){ //下棋if(y>=column||y<0||top[y]==row-1){System.out.println("out of range");return 1;}Graph[++top[y]][y]=C[key%2].toUpperCase().charAt(0);empty--;return 0;}public int judge(int x,int y) { //判断是否有⼈胜出if (search(Graph[x][y], x, y, 1, 0) + search(Graph[x][y], x, y, -1, 0) == 3|| //⽔平探测 search(Graph[x][y], x, y, 1, 1) + search(Graph[x][y], x, y, -1, -1) == 3|| //对⾓探测 search(Graph[x][y], x, y, 0, 1) + search(Graph[x][y], x, y, 0, -1) == 3|| //垂直探测 search(Graph[x][y], x, y, 1, -1) + search(Graph[x][y], x, y, -1, 1) == 3) //对⾓探测 return 1;return 0; //未有⼈获胜}public int search(char k, int a, int b, int z, int f) { //单向探测函数a += z;b += f;if (b >= column || a >= row || a < 0 || b < 0||Graph[a][b] != k)return 0;return search(k, a , b , z, f)+1;}public static void main(String[] args) {JavaGame My=new JavaGame(6,7);Scanner input=new Scanner(System.in);int tmp,key;My.show();for(int i=0;;){System.out.print("Drop a "+My.C[i%2]+" disk at column(0-6) : ");tmp=input.nextInt();if(My.Input(tmp,i)!=0) //出错后 执⾏下⼀循环(i 没有++)continue;My.show();if(My.judge(My.top[tmp],tmp)==1){ //判断是否有⼈胜出System.out.println("The "+My.C[i%2]+" player won");break;}if(My.empty==0){ //平局System.out.println("Chess draw");break;}i++;}}}C++(第1版,有点乱):C++(第1版,有点乱):judge :⾮递归(java 也可⽤):双向探测#include<iostream>#include<string>using namespace std;public:Chess(); //初始化成员数据void show(); //显⽰棋盘int input(int y,int key); //下棋int judge(int y); //判断结果string C[2] = { "red","yellow" };private:string Graph[6][7];int top[7]; //模拟栈};Chess::Chess(){memset(top, -1, sizeof(top)); //数组top初始化为-1for (int i = 0; i < 6; i++) { //初始化Graphfor (int j = 0; j < 7; j++) {Graph[i][j] = " ";}}}void Chess::show(){for (int i = 5; i >= 0; i--) {cout << "|";for (int j = 0; j < 7; j++)cout << Graph[i][j] << "|";cout << endl;}}int Chess::input(int y,int key) {if (y > 6 || y < 0){ //越界检测cout << "y is out of range[0,6]" << endl;return 1;}if (top[y] == 5) {cout << "x is out of range" << endl;return 1;}Graph[++top[y]][y] = toupper(C[key % 2][0]); //赋值操作return 0;}int Chess::judge(int y) {int kx[4] = { 0, 1, 1, 1 }, //⼋个⽅向(4个正⽅向,另外4个负⽅向取反) ky[4] = { 1, 1, 0,-1 };int a, b, count = 0;int x = top[y];for (int i = 0; i < 4; i++) { //⼋个⽅向检测a = x; //数据初始化b = y;count = 0;for (int j = 0; j < 3; j++) { //检测四个正⽅向a += kx[i];b += ky[i];if (b > 6 || a > 5 || a < 0 || b < 0 || Graph[a][b] == " ") //边界检测 break;if (Graph[a][b] == Graph[x][y] )count++;}a = x;b = y;for (int j = 0; j < 3; j++) { //检测四个负⽅向a -= kx[i];b -= ky[i];if (b > 6 || a > 5 || a < 0 || b < 0 || Graph[a][b] == " ") //边界检测 break;if (Graph[a][b] == Graph[x][y]) //逻辑判断count++;}if (count == 3) //四⼦相连,此⼈胜出return 1;}for (int i = 0; i < 7; i++) { //只要有⼀列未满,返回0if (top[i] != 5)return 0;}return -1; //全满,返回-1(平局)}int main() {Chess myChess;myChess.show();int tmp,key;for (int i = 0;;) { //i奇偶决定颜⾊cout << "Drop a "<< myChess.C[i % 2] <<" disk at column(0-6): ";cin >> tmp;if (myChess.input(tmp, i)) //bug检测system("cls"); //清屏myChess.show();key = myChess.judge(tmp); //key 判断输赢,平局if (key==1) {cout << "The " << myChess.C[i % 2] << " player won" << endl; break;}else if (key == -1) {cout << "Chess draw" << endl;break;}i++;}return 0;}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

四子棋的JAVA实现源代码
package package01;
import java.util.Scanner;
public class class03 {
static String DiskColour[]=new String[]{"Null","Red","Yellow"};
static String SimpleColour[]=new String[]{" ","R","Y"};//the two array strings are used to represent colours.
public static void main(String[] args)
{
Scanner input=new Scanner(System.in);//define a method that can read data from keyboard.
int Grid[][]=new int[6][7];
int x=0,y=0;//x, y represent the coordinate of the disks.
int judge=0;//0 means the game is not over and the game is to be continued;
1 means the game is drawn;
2 means there is a winner.
int colour=1;//0 means Null; 1 means Red; 2 means Yellow.
while(judge==0)//if the game is not over, this while-loop statement will be continued.
{ System.out.println("Please place a "+DiskColour[colour]+" disk at column(0-6)");
y=input.nextInt();
for(int i=5;i>=0;i--)
if(Grid[i][y]==0)
{
x=i;
Grid[x][y]=colour;
if(colour==1)
colour=2;
else
colour=1;break;
}
DrawGrid(Grid);
judge=Decide(Grid,x,y);
if(judge==2)
System.out.println("The "+DiskColour[Grid[x][y]]+" Wins!");
else if(judge==1)
System.out.println("The game is drawn!\nPlease try
again!");}
}
public static void DrawGrid(int Grid[][])
{
for(int i=0;i<=5;i++)
{
for(int j=0;j<=6;j++)
{
System.out.print("|"+SimpleColour[Grid[i][j]]);
}
System.out.println("|");
}
}
public static int Decide(int Grid[][],int x,int y)
{
int m=0;
for(int i=0;i<=5;i++)
for(int j=0;j<=6;j++)
if(Grid[i][j]==0)
m++;
int n1=1;
for(int i=y-1;i>=0;i--)
{
if(Grid[x][y]==Grid[x][i])
n1++;
else
break;}
for(int i=y+1;i<=6;i++)
{
if(Grid[x][y]==Grid[x][i])
n1++;
else
break;}
int n2=1;
for(int i=x+1;i<=5;i++)
{
if(Grid[x][y]==Grid[i][y])
n2++;
else
break;
}
int n3=1;
for(int i=1;x+i<=5&&y+i<=6;i++)
{
if(Grid[x][y]==Grid[x+i][y+i])
n3++;
else
break;
}
for(int i=-1;x+i>=0&&y+i>=0;i--)
{
if(Grid[x][y]==Grid[x+i][y+i])
n3++;
else
break;}
int n4=1;
for(int i=1;x-i>=0&&y+i<=6;i++)
{
if(Grid[x][y]==Grid[x-i][y+i])
n4++;
else
break;}
for(int i=-1;x-i<=5&&y+i>=0;i--)
{
if(Grid[x][y]==Grid[x-i][y+i])
n4++;
else
break;}
if(n1>=4||n2>=4||n3>=4||n4>=4)
return 2;
else
if(m==0)
{
return 1;
}
else
return 0;
}
}。

相关文档
最新文档