JAVA课设,象棋打谱
JAVA语言课程
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
指导教师:
姓 名:
学 号:
班 级:
日 期:
一、中国象棋打谱系统
1.1 设计内容
中国象棋打谱系统使用户能够将对弈过程保存成文件,并能够重新演示对弈过程,即复盘。 1.2 设计要求
1( 中国象棋是双方在由9条和10条横线分割而成的棋盘对弈。竖线与横线的交叉点称做棋点,每个棋子都放置在棋点上 ,而不是方格中。河界将棋盘分为两个等分=份,没一边都有一个由9个点组成的区域“将”,“帅”,“士”只能在“九宫”内移动,并且“将”,“帅”,的每一步只可以水平或垂直移动一个棋点。士:“士”只能在“九宫”内移动,并且每一步只可以沿对角线方向移动一个棋点。象;一步必须沿对角线方向走两个棋点。但它既不能过河,也不能跳过或穿越障碍,即象征走的过程不能被“别眼”。马:每一步只可以水平或垂直移动一个棋点。但它必须沿对角线方向,向左或向右移动,中国象棋的马不能跳过障碍,即在走的过程不能被“别腿”。车:可以沿水平或垂直方向移动任意个无障碍的点。炮:行走规则和车很类似,但它必须跳过一个棋子来吃掉对方的一个棋子。被跳过的棋子被称为桥或者屏风。兵:过河前每步只能向前移动一个棋点。过河后,它便增加了向左右移动的能力。并不允许向后移动。
2(单击“中国象棋”菜单可以选择“制作棋谱”,“保存棋谱 ”和“演示棋谱”菜单项。
3(选择“制作棋谱”,将出现相应的棋盘,该棋盘可进行实战对弈,可以随时选择“保存棋谱”,将对弈过程保存成一个棋谱文件。选择“演示棋谱”将显示打开文件对话框供用户选择以保存的棋谱文件。选择棋谱文件后,将显示用来演示棋谱的棋盘,用户可以选择自动或者手动来演示对弈过程。
1.3 总体设计
类之间的组合关系如下:
2 具体设计
2.1运行效果
单击确定后点击“选择制作棋谱的方式”出现如下:
选择所要制作的棋谱是实战的还是残局:
棋谱制作完成后可以对其进行保存:
选择棋谱并进行演示:
2.2详细程序设计
(1)ChinaChess主类的设计
首先设计棋谱主界面:
public class ChinaChess extends JFrame implements ActionListener{
ChessBoard board;
DemoManulDialog demoManul;
JMenuBar bar;
JMenu makeMenu,showMenu;
JMenuItem makeShiZhanManul,makeCanJuManul,openManulAndShow;
JButton startMakeManul,saveManul;
JTextField hintMessage;
public ChinaChess(){
setTitle("中国象棋棋谱制作系统");
board=new ChessBoard();
add(board,BorderLayout.CENTER);
bar=new JMenuBar();
makeMenu=new JMenu("选择制作棋谱的方式");
showMenu=new JMenu("棋谱");
makeShiZhanManul=new JMenuItem("制作实战棋谱");
makeCanJuManul=new JMenuItem("制作残局棋谱");
openManulAndShow=new JMenuItem("打开一个棋谱并演示");
makeMenu.add(makeShiZhanManul);
makeMenu.add(makeCanJuManul);
showMenu.add(openManulAndShow);
bar.add(makeMenu);
bar.add(showMenu);
setJMenuBar(bar);
makeShiZhanManul.addActionListener(this);
makeCanJuManul.addActionListener(this);
openManulAndShow.addActionListener(this);
startMakeManul=new JButton("开始制作棋谱");
startMakeManul.setVisible(false);
startMakeManul.addActionListener(this);
saveManul=new JButton("保存棋谱");
saveManul.setVisible(false);
saveManul.addActionListener(this);
hintMessage=new JTextField(30);
hintMessage.setHorizontalAlignment(JTextField.CENTER);
hintMessage.setFont(new Font("细黑",Font.PLAIN,15));
hintMessage.setEditable(false);
hintMessage.setText("请单击菜单,选择制作棋谱的方式或演示已有的棋谱");
hintMessage.setBackground(Color.green);
JPanel north=new JPanel();
north.add(hintMessage);
north.add(startMakeManul);
north.add(saveManul);
add(north,BorderLayout.NORTH);
setVisible(true);
setBounds(120,10,710,580);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
validate();
JOptionPane.showMessageDialog(this,
"请单击菜单,选择制作棋谱的方式或演示已有的棋谱","提示对话框",
JOptionPane.WARNING_MESSAGE);
}
public void actionPerformed(ActionEvent e){
String message="单击\"开始制作棋谱\",然后拖动棋子走棋";
if(e.getSource()==makeShiZhanManul) {
board.setShizhanPlay();
hintMessage.setText(message);
startMakeManul.setVisible(true);
saveManul.setVisible(false);
JOptionPane.showMessageDialog(this,message,"提示对话框",
JOptionPane.WARNING_MESSAGE);
}
if(e.getSource()==makeCanJuManul){
message="将棋盒中棋子拖入棋盘摆好残局,然后单击\"开始制作棋谱\"";
hintMessage.setText(message);
board.setCanjuPlay();
startMakeManul.setVisible(true);
saveManul.setVisible(false);
JOptionPane.showMessageDialog(this,message,"提示对话框",
JOptionPane.WARNING_MESSAGE);
}
if(e.getSource()==startMakeManul){
board.startMakeManul();
hintMessage.setText("单击\"保存棋谱\"按钮可以保存棋谱");
saveManul.setVisible(true);
startMakeManul.setVisible(false);
}
if(e.getSource()==saveManul){
startMakeManul.setVisible(false);
JFileChooser chooser=new JFileChooser();
int state=chooser.showSaveDialog(null);
File file=chooser.getSelectedFile();
if(file!=null&&state==JFileChooser.APPROVE_OPTION){
try{
FileOutputStream out=new FileOutputStream(file);
ObjectOutputStream objectOut=new ObjectOutputStream(out);
objectOut.writeObject(board);
out.close();
objectOut.close();
}
catch(Exception event){}
}
}
if(e.getSource()==openManulAndShow){
JFileChooser chooser=new JFileChooser();
int state=chooser.showOpenDialog(null);
File file=chooser.getSelectedFile();
if(file!=null&&state==JFileChooser.APPROVE_OPTION){
demoManul=new DemoManulDialog(file);
demoManul.setVisible(true);
}
}
}
(2)ChinaBoard类的设计
主要是设计实战棋盘以及残局棋盘
绘制整个棋盘的布局
public ChessBoard(){
setLayout(null);
step=new ArrayList
();
initPointAndPiece();
redChessBox=new ChessBox(distance,11,7);
blackChessBox=new ChessBox(distance,11,1);
for(int i=0;istartI){
if(point[startI+1][startJ].isHaveChessPiece())
isMove=false;
else
isMove=true;
}
if(endIstartJ){
if(point[startI][startJ+1].isHaveChessPiece())
isMove=false;
else
isMove=true;
}
if(endJ=0;i--){
stackStep.push(step.get(i));
}
demoOne.remove(demoOne.cancel);
restoreChessBoard(step);
split.setRightComponent(new JScrollPane(demoOne));
}
catch(Exception exp){
add(new JButton("不是棋谱文件"),BorderLayout.CENTER);
}
}
3、 运行程序
运行程序后,得出了正确的结果,实验结果截图见具体设计的运行效果部分。
4、 设计
总结
初级经济法重点总结下载党员个人总结TXt高中句型全总结.doc高中句型全总结.doc理论力学知识点总结pdf
实验得出的结果粘贴在了前面具体设计部分。
通过对java的了解与掌握,可以把java与游戏灵活的结合在一起,编程jar形式,可以进行运行,要了解其中的主类与方法,明白函数的调用和一些简单的构造方法。中国象棋打谱系统,含有10个java程序,主要是通过构造与创建对象来完成的,里面有许多变量设置,并且把我们学的线程联系到了一起,整体显得很自然,结构得当,内容丰富。
老实说,在上java课的时候没怎么认真听过,因为以后并不打算做这一行。所以在做这个课程设计时遇到了不小的困难。虽然所有源代码课本上都有,老师也要求我们把程序看懂就可以了,但是这对于我来说还是有难度的。在阅读代码时遇到了一些不懂的,才知道自己的不足,很多问题是问了同学才明白。
做完这个课程设计,尤其是最后运行结果后得到的象棋棋谱,而且还可以下象棋博弈,明白了java确实是一种很强大的语言。虽然我以后不一定从事java这一行,但是我觉得还是要好好学习下java,尽量弥补以前学习时没学好的东西。多一种知识,多一种手段,以后不管做什么多多少少能有点用。
4、 参考文献:
《Java课程设计》(第二版) 主编:耿祥义 张跃平
二、数据库通用查询系统
1.1 设计要求
当仅仅查询数据库表中的
记录
混凝土 养护记录下载土方回填监理旁站记录免费下载集备记录下载集备记录下载集备记录下载
时,我们可以不必知道表中字段的属性,因为无论字段是何种属性,总可以使用getString(int columnIndex)或getString(String columnName)方法返回字段值的字符串表示。另外,无论字段是何种属性,SQL语句的LIKE子语句允许字符段以字符串形式与其他字符串进行匹配比较。
基于以上所述,要求设计一个B/S模式的数据库通用查询系统,具体要求如下:
1) 客户端Java Applet程序从加载该Java Applet程序的html文件中获取数据库中的表
的名字、表的字段名字以及表中字段的个数。这样一来,当需要更换所查询的表时,
只要修改html文件,而不需要修改Java Applet程序,使Java Applet在查询数据时
具有了通用性。
2)Java Applet通过套接字连接和服务器的Java应用程序实现通信。Java Applet将表的
名字、表中字段的个数以及查询条件提交给服务器,服务器的Java应用程序进行查
询操作,并将查询结果返回给Java Applet程序。
1.2 总体设计
在设计数据库查询系统时,需要编写3个Java源文件:DatabaseServer.java、ServerThread.java和DatabaseClient.java。其中DatabaseServer.java和ServerThread.java为服务器端Java程序编译产生所需的类;DatabaseClient.java为Java Applet程序编译产生所需要的类。数据库通用查询系统除了需要编写的3个Java源文件所编译所产生的类外,还需要Java系统提供的一些重要的类。如下:
DatabaseClient
Choice Checkbox TextArea Socket
DatabaseServer
ServerSocket Socket ServerThrea
d
另外,为了调试代码的需要,我们用Microsoft Access设计了名为book.mdb的数据库。 2具体设计
2.1总体设计
1( 数据库
设计数据库的名字为book.mdb,在库中所创建的表为bookform.。
2( DatabaseServer.java(服务器端)
DatabaseServer类创建的对象负责响应客户请求,该类含有main方法,服务器端从该类
开始执行。DatabaseServer类的成员变量中有3种重要类型的对象:ServerSocket、Socket
和ServerThread对象。DatabaseServer类运行效果如下:
3( ServerThread.java(服务器端)
ServerThread类是Thread类的子类,在Server类中负责为请求连接的用户启动一个线程
对象。
4(DatabaseClient.java(客户端)
DatabaseClient.java中有两个类,分别是Client和DatabaseClient。Client是Frame类的子类,Client类的成员变量中有4种重要类型的对象:Choice、Checkbox、TextArea和Socket对象。DatabaseClient是客户端主类。效果如下图:
2.2详细设计
(1)、DatebaseServer类的设计
DatebaseServer类是数据库通用查询系统服务器端的主类,负责响应客户的连接请求、建立和客户的套接字
连接,并负责在服务端查询数据库。
a) 成员变量
?server是ServerSocket对象,负责等待接受客户的套接字请求,当有客户请求套接字连接时,server将接
受用户的请求,并调用accept()方法返回服务器端所建立的Socket对象you,即建立服务器端套接字和
客户端套接字的连接。
?you是Socket对象,该对象是驻留在服务器端的套接字对象,由server调用accept()方法所返回。
?yourAddress是InetAddress对象,负责存放客户端的IP。
b) 方法
?DatebaseServer()是构造方法。
?DatebaseServer对象调用startServer(int port)方法响应客户的请求。 ?main方法是程序运行的入口方法。
代码设计:
import java.net.*;
import java.util.*;
import java.io.*;
public class DatabaseServer{
ServerSocket server;
Socket you;
InetAddress yourAddress;
public DatabaseServer(){
try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
}
catch(ClassNotFoundException e){
System.out.println(e);
}
System.out.println("我是服务器端程序,负责处理用户的连接请求");
}
public void startServer(int port){
while(true){
try{
server=new ServerSocket(port);
}
catch(IOException e1){
System.out.println("正在监听:");
}
try{ System.out.println("等待用户呼叫.");
you=server.accept();
yourAddress=you.getInetAddress();
System.out.println("客户的IP:"+yourAddress);
}
catch (IOException e){}
if(you!=null) {
new ServerThread(you).start();
}
else
continue;
}
}
public static void main(String args[]){
DatabaseServer server=new DatabaseServer();
server.startServer(6666);
}
}
(2)、ServerThread类的设计
ServerThread类是Thread类的子类,当Server对象调用starServer()方法和一个请求套接字连接的用户建
立套接字连接后,就使用ServerThread创建一个专门为该用户服务的线程。 a) 成员变量
?con是Connection对象,负责和数据库建立连接。
?stmt是Statement对象,负责向数据库发送SQL语句。
?rs是ResultSet对象,负责存储从数据库查询到的记录。
?socket是Socket对象。
?yourAddress是IntAddress对象,负责存放客户端的IP. b) 方法
?ServerThread(Socket)是构造方法,当使用该构造方法创建线程时,通过该方法的参数将Server类中的
对象传递给ServerThread类中的socket。
?run()方法是ServerThread类重写父类Thread类中的方法,给出了怎样响应用户请求的具体内容。
代码设计:
import java.io.*;
import java.net.*;
import java.util.*;
import java.sql.*;
public class ServerThread extends Thread{
InetAddress yourAddress;
Socket socket=null;
DataOutputStream out=null;
DataInputStream in=null;
Connection con=null;
Statement stmt=null;
ResultSet rs;
int number;
ServerThread(Socket t){
socket=t;
try{ con=DriverManager.getConnection("jdbc:odbc:myDataSouce","","");
stmt=con.createStatement();
}
catch(SQLException e){
System.out.println(e);
}
try{ in=new DataInputStream(socket.getInputStream());
out=new DataOutputStream(socket.getOutputStream());
}
catch (IOException e){}
}
public void run(){
String s="";
int N=0;
while(true){
try{
s=in.readUTF();
System.out.println(s);
if(s.startsWith("字段个数:")){
String number=s.substring(s.lastIndexOf(":")+1);
N=Integer.parseInt(number);
}
else{
String sqlCondition=null;
String 表名="",查询内容="",字段="",查询方式="";
StringTokenizer fenxi=new StringTokenizer(s,":");
if(fenxi.hasMoreTokens())
表名=fenxi.nextToken();
if(fenxi.hasMoreTokens())
查询内容=fenxi.nextToken();
if(fenxi.hasMoreTokens())
字段=fenxi.nextToken();
if(fenxi.hasMoreTokens())
查询方式=fenxi.nextToken();
if(查询方式.equals("完全一致")){
sqlCondition=
"SELECT * FROM "+表名+" WHERE "+字段+" LIKE "+"'"+查询内容+"' ";
}
else if(查询方式.equals("前方一致")){
sqlCondition=
"SELECT * FROM "+表名+" WHERE "+字段+" LIKE "+"'"+查询内容+"%' ";
}
else if(查询方式.equals("后方一致")){
sqlCondition=
"SELECT * FROM "+表名+ " WHERE "+字段+" LIKE "+"'%"+查询内容+"'
";
}
else if(查询方式.equals("中间包含")){
sqlCondition=
"SELECT * FROM "+表名+" WHERE "+字段+" LIKE "+"'%"+查询内容+"%' ";
}
try{ rs=stmt.executeQuery(sqlCondition);
number=0;
while(rs.next()){
number++;
StringBuffer buff=new StringBuffer();
for(int k=1;k<=N;k++){
buff.append(rs.getString(k)+" ");
}
out.writeUTF("\n"+new String(buff));
}
if(number==0)
out.writeUTF("\n没有查询到任何记录\n");
}
catch(SQLException ee) {
out.writeUTF(""+ee);
}
}
}
catch (IOException e){
try{ socket.close();
con.close();
}
catch(Exception eee){}
System.out.println("客户离开了");
break;
}
}
}
}
(3)、DatebaseClient类的设计
Java Applet属于客户端程序,尽管DatabaseClient类驻留在服务器端,但它需要下载到客户端的浏览器中来运行,即浏览器通过运行一个HTML文件来加载执行DatabaseClient类。DatabaseClient是java.applet包中Applet的一个子类,并实现了Runnable接口。
a) 成员变量
, Choice是Choice创建的下拉列表,负责存放数据库表的字段的文本解释。
, “完全一致”、“前方一致”、“后方一致”和“中间包含”是checkbox创建的单选框,为用户提
供选择查询方式。
, “显示查询结果”是TextArea类创建的文本区,负责显示查询的记录。
, socket是Socket套接字对象,负责呼叫服务器并建立套接字连接。
b) 方法
, 浏览器内置的JVM用DatabaseClient创建applet后,立刻
通知
关于发布提成方案的通知关于xx通知关于成立公司筹建组的通知关于红头文件的使用公开通知关于计发全勤奖的通知
这个applet调用init()方法完成
必要的初始化工作,其主要工作时从加载applet的html中获取表的名字以及字段的名字个数量。
, Applet调用init()方法后,调用start()方法,其主要操作是呼叫服务器建立套子连接。Applet
所在的web页面转到其他页面然后又返回时,start()将再次被调用。
, 当applet所在的页面转到其他页面时,applet将调用stop()方法,其主要是中断和服务器的套
接字连接。
, Run()方法是DatabaseClient类实现的Runnable接口中的方法,负责读取从服务器查询到的记
录。
代码设计:
public void start(){
ok=true;
if(socket!=null&&in!=null&&out!=null){
try{ socket.close();
in.close();
out.close();
}
catch(Exception ee){}
}
try{ socket=new Socket(this.getCodeBase().getHost(), 6666);
in=new DataInputStream(socket.getInputStream());
out=new DataOutputStream(socket.getOutputStream());
}
catch (IOException ee){
提示条.setText("连接失败");
}
if(socket!=null){
InetAddress address=socket.getInetAddress();
提示条.setText("连接:"+address+"成功");
}
if(!(thread.isAlive())){
thread=new Thread(this);
thread.start();
}
}
public void stop(){
ok=false;
try{
socket.close();
}
catch(IOException e){
this.showStatus(e.toString());
}
}
public void run(){
String s=null;
while(true){
try{ s=in.readUTF();
}
catch (IOException e){
提示条.setText("与服务器已断开");
break;
}
显示查询结果.append(s);
if(ok==false)
break;
}
}
public void actionPerformed(ActionEvent e){
if(e.getSource()==查询){
显示查询结果.setText(null);
String 查询内容="";
查询内容=输入查询内容.getText();
int index=choice.getSelectedIndex();
String 字段=ziduanName[index];
String 查询方式=group.getSelectedCheckbox().getLabel();
if(查询内容.length()>0){
try{ out.writeUTF("字段个数:"+N);
out.writeUTF(formName+":"+查询内容+":"+字段+":"+查询方式);
}
catch(IOException e1){
提示条.setText("与服务器已断开");
}
}
else
输入查询内容.setText("请输入内容");
}
}
3、运行程序及测试
运行程序,得到如具体设计第四步DatabaseClient.java(客户端)中的结果,输入要查询的内容,
以及查询的属性可以得到如下结果:
4、设计总结
阅读完这个数据库通用查询系统,我发现自己有很多的不足,我想如果让我自己单独来编写这个程序,我会感觉很吃力,还有需要查找很多的资料。而且由于前面花了比较多的时间来完成象棋打谱系统,所以做这个设计的时间比较紧,完成的也不是很好。在运行这个程序时需要连接ODBC,这花费了我比较多的时间,主要是对于连接数据库的一些操作不是很熟悉。
正如上一个总结里所说的一样,以后得花点时间在java上,不求能很完整
地实现一些功能,但是至少要能读懂一般的代码。
5、 参考文献:
《Java课程设计》(第二版) 主编:耿祥义 张跃平