java课程设计-拼图游戏代码

合集下载

java拼图小游戏课程设计

java拼图小游戏课程设计

java拼图小游戏课程设计一、课程目标知识目标:1. 学生能理解Java基本语法和面向对象编程的概念;2. 学生能掌握使用Java编写图形用户界面(GUI)的方法;3. 学生能了解数组的使用以及二维数组在拼图游戏中的应用;4. 学生能掌握基本的事件处理和逻辑判断方法。

技能目标:1. 学生能运用所学知识,设计并编写出一个简单的Java拼图小游戏;2. 学生能通过调试和优化代码,提高程序的稳定性和用户体验;3. 学生能在团队协作中发挥个人优势,共同完成项目任务。

情感态度价值观目标:1. 学生培养对编程的兴趣和热情,激发探究精神;2. 学生在项目实践中,树立自信心,勇于面对挑战;3. 学生通过团队协作,学会沟通、分享和承担责任;4. 学生在编程实践中,遵循道德规范,尊重他人成果。

本课程针对初中年级学生,结合Java编程语言的教学要求,注重培养学生的编程兴趣和实际动手能力。

课程以拼图小游戏为载体,让学生在实践过程中掌握Java编程基础和面向对象编程思想,提高解决问题的能力和团队协作精神。

通过本课程的学习,期望学生能够达到上述具体、可衡量的学习成果。

二、教学内容1. Java基本语法与面向对象编程:- 数据类型、变量、运算符- 控制结构:条件语句、循环语句- 面向对象:类、对象、构造方法、封装、继承、多态2. Java图形用户界面(GUI)设计:- Swing组件:窗口、标签、按钮、面板- 布局管理器:边界布局、流布局、网格布局- 事件处理:事件监听器、事件适配器3. 数组与二维数组:- 数组的声明、初始化、遍历- 二维数组的操作与应用4. 拼图游戏原理与实现:- 游戏逻辑设计- 图片切割与显示- 拼图移动与验证5. 程序调试与优化:- 代码调试技巧- 性能优化方法6. 团队协作与项目管理:- 项目任务分配- 团队沟通与协作- 项目进度管理本教学内容根据课程目标,结合教材相关章节,以科学性和系统性为原则进行组织。

java课程设计拼图csdn

java课程设计拼图csdn

java课程设计拼图csdn一、教学目标本章节的教学目标旨在让学生掌握Java编程基础,学会使用Java编写简单的拼图游戏。

通过本章节的学习,学生将能够:1.理解Java编程的基本概念和语法;2.掌握Java中面向对象编程的思想和方法;3.学会使用Java编写图形用户界面(GUI)程序;4.掌握拼图游戏的基本逻辑和实现方法。

二、教学内容本章节的教学内容主要包括以下几个部分:1.Java编程基础:介绍Java编程的基本概念和语法,包括数据类型、运算符、控制结构、数组等;2.面向对象编程:讲解Java中的类、对象、继承、多态等面向对象编程的基本概念和方法;3.GUI编程:介绍Java中的Swing库,讲解如何使用Swing编写图形用户界面程序;4.拼图游戏实现:讲解拼图游戏的基本逻辑,包括图块的生成、拼图规则的实现等,并引导学生动手编写拼图游戏程序。

三、教学方法为了达到本章节的教学目标,我们将采用以下几种教学方法:1.讲授法:讲解Java编程基础、面向对象编程和GUI编程的基本概念和方法;2.案例分析法:分析拼图游戏的实现案例,引导学生理解和掌握游戏逻辑的实现方法;3.实验法:安排实验课,让学生动手编写拼图游戏程序,巩固所学知识。

四、教学资源为了支持本章节的教学,我们将提供以下教学资源:1.教材:《Java编程思想》或《Java核心技术》;2.参考书:提供一些关于Java编程、面向对象编程和GUI编程的参考书籍;3.多媒体资料:提供一些关于Java编程和GUI编程的教学视频和演示文稿;4.实验设备:提供计算机实验室,让学生在实验课上进行编程实践。

五、教学评估本章节的教学评估将采用以下几种方式:1.平时表现:评估学生在课堂上的参与程度、提问和回答问题的表现等,占总评的20%;2.作业:布置相关的编程作业,评估学生的编程能力和理解程度,占总评的30%;3.考试:安排一次期末考试,测试学生对Java编程基础和拼图游戏实现的掌握程度,占总评的50%。

拼图游戏java课程设计

拼图游戏java课程设计

拼图游戏java 课程设计一、教学目标本课程的目标是让学生了解和掌握Java编程语言的基本知识,通过拼图游戏的项目实践,培养学生的编程能力、逻辑思维能力和问题解决能力。

知识目标包括Java语言的基本语法、数据结构、控制流程、文件操作等;技能目标包括使用Java开发工具进行代码编写、调试和运行;情感态度价值观目标包括培养学生的团队合作意识、创新精神和对计算机科学的兴趣。

二、教学内容教学内容主要包括Java语言的基本语法、数据结构、控制流程、文件操作等。

具体安排如下:1.第一章:Java语言概述,介绍Java语言的发展历程、特点和应用领域;2.第二章:基本语法,学习Java语言的基本数据类型、运算符、表达式和语句;3.第三章:面向对象编程,学习类的定义、创建对象、继承、多态和封装;4.第四章:数据结构,学习数组、链表、栈和队列的基本概念和应用;5.第五章:控制流程,学习条件语句、循环语句和异常处理;6.第六章:文件操作,学习文件的读写、目录的操作和文件过滤器。

三、教学方法本课程采用讲授法、案例分析法和实验法相结合的教学方法。

在讲授基本语法和概念时,通过生动的案例进行讲解,让学生更好地理解和掌握;在实践环节,引导学生动手编写代码,通过实验法培养学生的实际操作能力。

同时,鼓励学生进行小组讨论,共同解决问题,培养团队合作意识。

四、教学资源教学资源包括教材、多媒体资料和实验设备。

教材选用《Java编程思想》作为主教材,辅助以《Java核心技术》等参考书;多媒体资料包括教学PPT、视频教程等,通过图文并茂的方式帮助学生理解;实验设备包括计算机、网络和编程工具,为学生提供实践操作的环境。

五、教学评估教学评估主要包括平时表现、作业和考试三个部分。

平时表现占30%,主要评估学生的课堂参与度、提问和回答问题的积极性等;作业占30%,主要评估学生的代码编写能力、问题解决能力和团队合作精神;考试占40%,主要评估学生对Java语言基本概念和编程技能的掌握程度。

java拼图游戏的课程设计

java拼图游戏的课程设计

java拼图游戏的课程设计一、课程目标知识目标:1. 学生能理解Java编程语言中面向对象的基本概念,包括类、对象、继承和封装。

2. 学生能够掌握Java中事件处理、图形用户界面(GUI)设计和数组的使用,以实现拼图游戏功能。

3. 学生能够运用算法思维,实现拼图游戏的逻辑和图像的随机打乱、移动和复原。

技能目标:4. 学生能够运用Eclipse或其它IDE创建Java项目,编写、调试和运行拼图游戏的代码。

5. 学生通过实践,提高问题解决能力,能够独立完成类似规模的小型程序开发。

6. 学生能够进行基本的代码重构,提升代码的可读性和可维护性。

情感态度价值观目标:7. 学生通过团队合作开发拼图游戏,培养团队协作能力和沟通技巧。

8. 学生在游戏编程中体会编程的乐趣,增强对计算机编程和信息技术学科的兴趣和热情。

9. 学生通过编程实践,培养创新意识和动手能力,增强自信心和成就感。

本课程针对高中年级学生设计,他们已经具备了一定的编程基础和逻辑思维能力。

课程性质为实践性较强的信息技术课程,旨在通过拼图游戏的开发,使学生将理论知识与实践操作相结合,提升实际编程能力。

教学要求注重培养学生的自主学习和问题解决能力,鼓励学生在实践中创新,形成积极的情感态度和价值观。

通过具体学习成果的分解,后续教学设计和评估将更有针对性和有效性。

二、教学内容1. 面向对象基础:- 类的定义与使用- 对象的创建与操作- 继承与多态的概念及应用- 封装原则及实现方法2. Java图形用户界面(GUI)设计:- Swing库的简介与使用- JFrame、JPanel等容器组件的应用- 常用组件如按钮、标签、文本框等的添加与布局3. 事件处理机制:- 事件监听器与适配器的使用- 鼠标事件、键盘事件的处理- 事件响应与拼图游戏逻辑的结合4. 数组与算法:- 数组的声明、创建与操作- 图像数组的使用与拼图布局- 算法思维训练,实现拼图打乱、移动与复原5. 编程实践:- 使用Eclipse或其它IDE创建Java项目- 分步骤编写拼图游戏代码,实现游戏功能- 代码调试与优化,提高程序性能与可读性6. 团队合作与沟通:- 分组进行项目开发,明确分工与协作- 交流编程思路与问题解决方案- 提交项目报告,分享开发经验教学内容依据课程目标,结合课本知识体系进行组织,确保科学性和系统性。

拼图java课程设计

拼图java课程设计

拼图java课程设计一、课程目标知识目标:1. 掌握Java基本语法和编程结构,如变量、数据类型、运算符、控制语句等。

2. 学会使用Java中的面向对象编程思想,包括类、对象、继承、封装、多态等概念。

3. 理解Java异常处理机制,能够编写具有良好错误处理能力的程序。

4. 掌握Java图形用户界面编程,能够设计和实现简单的拼图游戏界面。

技能目标:1. 培养学生运用Java编程解决问题的能力,能够独立完成拼图游戏的代码编写和调试。

2. 提高学生的逻辑思维能力,通过设计拼图游戏的算法,锻炼学生的算法设计和实现技巧。

3. 培养学生团队合作能力,分组完成拼图游戏项目,学会与他人协作、沟通和解决问题。

情感态度价值观目标:1. 培养学生对编程的兴趣和热情,激发学生学习Java及相关计算机技术的积极性。

2. 培养学生面对困难时的坚持和毅力,鼓励学生在编程过程中不断尝试、克服困难。

3. 培养学生的创新意识,鼓励学生在拼图游戏中发挥创意,设计出独特的游戏玩法和界面。

课程性质:本课程为实践性较强的Java编程课程,以项目为导向,注重培养学生的编程能力和团队合作精神。

学生特点:学生具备一定的计算机基础和编程能力,对Java编程有一定了解,具有较强的学习兴趣和动手能力。

教学要求:教师应注重理论与实践相结合,引导学生通过实际操作掌握Java编程知识,关注学生个体差异,提供有针对性的指导。

同时,鼓励学生积极参与团队协作,提高沟通与表达能力。

通过本课程的学习,使学生能够独立完成拼图游戏项目,达到预期学习成果。

二、教学内容1. Java基本语法和数据类型- 变量和常量的定义与使用- 基本数据类型及类型转换- 运算符与表达式- 控制语句(条件语句、循环语句)2. 面向对象编程基础- 类与对象的概念- 构造方法与成员方法- 封装、继承和多态- 抽象类与接口3. 异常处理- 异常的概念与分类- try-catch语句- 异常的抛出与自定义异常4. Java图形用户界面编程- Swing组件及布局管理器- 事件处理机制- 图形绘制与图像处理5. 拼图游戏设计与实现- 游戏规则与界面设计- 游戏逻辑实现(数据存储、移动判断、胜利条件等)- 图像切割与重组- 游戏测试与优化教学内容安排和进度:1. Java基本语法和数据类型(2课时)2. 面向对象编程基础(4课时)3. 异常处理(2课时)4. Java图形用户界面编程(4课时)5. 拼图游戏设计与实现(6课时)教材章节关联:1. Java基本语法和数据类型(教材第1、2章)2. 面向对象编程基础(教材第3、4章)3. 异常处理(教材第5章)4. Java图形用户界面编程(教材第6章)5. 拼图游戏设计与实现(教材第7章)三、教学方法1. 讲授法:- 对于Java基本语法、数据类型、面向对象编程基础等理论知识,采用讲授法进行教学,结合教材内容,系统讲解相关概念、原理和编程技巧。

java语言实现拼图游戏源代码

java语言实现拼图游戏源代码

java语言实现拼图游戏源代码Java语言实现拼图游戏源代码 /** JAVA小游戏,拼图我做的第一个小游戏* Cell类是继承的按钮类,并加上相应图形,形成方格*MyCanvas是一个面板,加载Cell类的对象(方格),是这三个类中的核心 */ import java.awt.Rectangle; import java.awt.event.MouseEvent; import java.awt.event.MouseListener;import javax.swing.Icon;import javax.swing.ImageIcon; import javax.swing.JOptionPane; import javax.swing.JPanel; import java.awt.BorderLayout; import java.awt.Button;import java.awt.Choice;import java.awt.Color;import java.awt.Container; import java.awt.event.ActionEvent; import java.awt.event.ActionListener;import javax.swing.Icon;import javax.swing.ImageIcon; import javax.swing.JFrame; importjavax.swing.JLabel; import javax.swing.JOptionPane; importjavax.swing.JPanel; import javax.swing.Icon;import javax.swing.JButton;public class MyMainFrame extends JFrame implements ActionListener { MyCanvas myCanvas;JPanel panelNorth,panelPreview;//定义上方的面板,及预览所需的面板Button start,preview,set;//定义开始,预览,设定按钮Container container;//容器,得到内容面板public MyMainFrame() {//初使化container=this.getContentPane(); start=new Button("开始");start.addActionListener(this); preview=new Button("预览");preview.addActionListener(this); set = new Button("设置");set.addActionListener(this); panelPreview=new JPanel();panelPreview.setLayout(null); Icon icon=newImageIcon("pic_"+MyCanvas.pictureID+".jpg");JLabel label=new JLabel(icon); label.setBounds(0,0,300,300); panelPreview.add(label);panelNorth=new JPanel();panelNorth.setBackground(Color.red); panelNorth.add(start);panelNorth.add(preview);panelNorth.add(set);myCanvas=new MyCanvas();container.add(myCanvas,BorderLayout.CENTER);container.add(panelNorth,BorderLayout.NORTH);this.setTitle("拼图小游戏-明");this.setLocation(300,200);this.setSize(308,365);this.setResizable(false);this.setVisible(true);this.setDefaultCloseOperation(3); }public static void main(String[] args) {// TODO 自动生成方法存根new MyMainFrame();}public void actionPerformed(ActionEvent arg0) {//对三个按钮事件的处理 // TODO 自动生成方法存根Button button=(Button)arg0.getSource(); if(button==start){myCanvas.Start();}else if(button==preview){if(button.getLabel()=="预览"){container.remove(myCanvas); container.add(panelPreview); panelPreview.updateUI();container.repaint();button.setLabel("返回");}else{container.remove(panelPreview); container.add(myCanvas); container.repaint();button.setLabel("预览");}}else if(button==set){//修改所选图片Choice pic = new Choice(); pic.add("小猫");pic.add("小猪");pic.add("云");pic.add("QQ");pic.add("卡通");pic.add("花");int i=JOptionPane.showConfirmDialog(this, pic, "选择图片",JOptionPane.OK_CANCEL_OPTION);if(i==JOptionPane.YES_OPTION){ MyCanvas.pictureID=pic.getSelectedIndex() +1;myCanvas.reLoadPictrue(); Icon icon=newImageIcon("pic_"+MyCanvas.pictureID+".jpg");JLabel label=new JLabel(icon); label.setBounds(0,0,300,300); panelPreview.removeAll(); panelPreview.add(label);panelPreview.repaint();}}}}class MyCanvas extends JPanel implements MouseListener {boolean hasAddActionListener=false;//设置方格的动作监听器的标志位,TRUE为已经添加上动作事件,FALSE是尚未添加动作事件Cell cell[];//定义方格Rectangle cellNull;//定义空方格区域public static int pictureID=1;//当前选择的图片代号public MyCanvas() {this.setLayout(null);this.setSize(400,400);cellNull=new Rectangle(200,200,100,100);//空方格区域在第三行每三列cell=new Cell[9];Icon icon;for (int i = 0; i < 3; i++) {//为9个方格加载图片,并初使化坐标,形成三行三列 for(int j=0;j<3;j++){icon=new ImageIcon("pic_"+pictureID+"_"+(i*3+j+1)+".jpg");cell[i*3+j]=new Cell(icon); cell[i*3+j].setLocation(j*100,i*100); this.add(cell[i*3+j]);}}this.remove(cell[8]);//移除最后一个多余的方格}文章转自上海青大实训:谣言:吃太咸了会得病,导语:“人体每日摄入食盐不应过多,否则易患多种疾病。

Java语言实现拼图游戏源代码

Java语言实现拼图游戏源代码

Java语言实现拼图游戏源代码/** JA V A小游戏-拼图我做的第一个小游戏* Cell类是继承的按钮类,并加上相应图形,形成方格*MyCanvas是一个面板,加载Cell类的对象〔方格〕,是这三个类中的核心*/import java.awt.Rectangle;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;import javax.swing.Icon;import javax.swing.ImageIcon;import javax.swing.JOptionPane;import javax.swing.JPanel;import java.awt.BorderLayout;import java.awt.Button;import java.awt.Choice;import java.awt.Color;import java.awt.Container;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.Icon;import javax.swing.ImageIcon;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JOptionPane;import javax.swing.JPanel;import javax.swing.Icon;import javax.swing.JButton;public class MyMainFrame extends JFrame implements ActionListener { MyCanvas myCanvas;JPanel panelNorth,panelPreview;//定义上方的面板,及预览所需的面板Button start,preview,set;//定义开始,预览,设定按钮Container container;//容器,得到内容面板public MyMainFrame() {//初使化container=this.getContentPane();start=new Button("开始");start.addActionListener(this);preview=new Button("预览");preview.addActionListener(this);set = new Button("设置");set.addActionListener(this);panelPreview=new JPanel();panelPreview.setLayout(null);Icon icon=new ImageIcon("pic_"+MyCanvas.pictureID+".jpg");JLabel label=new JLabel(icon);label.setBounds(0,0,300,300);panelPreview.add(label);panelNorth=new JPanel();panelNorth.setBackground(Color.red);panelNorth.add(start);panelNorth.add(preview);panelNorth.add(set);myCanvas=new MyCanvas();container.add(myCanvas,BorderLayout.CENTER);container.add(panelNorth,BorderLayout.NORTH);this.setTitle("拼图小游戏-明");this.setLocation(300,200);this.setSize(308,365);this.setResizable(false);this.setVisible(true);this.setDefaultCloseOperation(3);}public static void main(String[] args) {// TODO 自动生成方法存根new MyMainFrame();}public void actionPerformed(ActionEvent arg0) {//对三个按钮事件的处理// TODO 自动生成方法存根Button button=(Button)arg0.getSource();if(button==start){myCanvas.Start();}else if(button==preview){if(button.getLabel()=="预览"){container.remove(myCanvas);container.add(panelPreview);panelPreview.updateUI();container.repaint();button.setLabel("返回");}else{container.remove(panelPreview);container.add(myCanvas);container.repaint();button.setLabel("预览");}}else if(button==set){//修改所选图片Choice pic = new Choice();pic.add("小猫");pic.add("小猪");pic.add("云");pic.add("QQ");pic.add("卡通");pic.add("花");int i=JOptionPane.showConfirmDialog(this, pic, "选择图片", JOptionPane.OK_CANCEL_OPTION);if(i==JOptionPane.YES_OPTION){MyCanvas.pictureID=pic.getSelectedIndex()+1;myCanvas.reLoadPictrue();Icon icon=new ImageIcon("pic_"+MyCanvas.pictureID+".jpg");JLabel label=new JLabel(icon);label.setBounds(0,0,300,300);panelPreview.removeAll();panelPreview.add(label);panelPreview.repaint();}}}}class MyCanvas extends JPanel implements MouseListener {boolean hasAddActionListener=false;//设置方格的动作监听器的标志位,TRUE为已经添加上动作事件,FALSE是尚未添加动作事件Cell cell[];//定义方格Rectangle cellNull;//定义空方格区域public static int pictureID=1;//当前选择的图片代号public MyCanvas() {this.setLayout(null);this.setSize(400,400);cellNull=new Rectangle(200,200,100,100);//空方格区域在第三行每三列cell=new Cell[9];Icon icon;for (int i = 0; i < 3; i++) {//为9个方格加载图片,并初使化坐标,形成三行三列for(int j=0;j<3;j++){icon=new ImageIcon("pic_"+pictureID+"_"+(i*3+j+1)+".jpg");cell[i*3+j]=new Cell(icon);cell[i*3+j].setLocation(j*100,i*100);this.add(cell[i*3+j]);}}this.remove(cell[8]);//移除最后一个多余的方格}文章转自上海青大实训:。

java拼图课程设计

java拼图课程设计

java拼图课程设计一、课程目标知识目标:1. 让学生掌握Java语言的基本语法和编程逻辑,能运用面向对象的方法进行简单的程序设计。

2. 让学生了解并掌握Java中图形用户界面(GUI)设计的相关知识,尤其是布局管理器和事件处理。

3. 使学生理解拼图游戏的逻辑结构和实现原理。

技能目标:1. 培养学生运用Java语言解决实际问题的能力,能够独立设计和编写简单的拼图游戏。

2. 培养学生的逻辑思维和问题分析能力,通过编程解决拼图过程中的难题。

3. 提高学生团队协作和沟通能力,能够在小组合作中发挥个人优势,共同完成拼图游戏项目。

情感态度价值观目标:1. 激发学生对计算机编程的兴趣和热情,培养其主动探索新知识的习惯。

2. 培养学生积极面对挑战和困难,勇于尝试和解决问题的精神。

3. 引导学生认识到编程在生活中的应用价值,激发其创新意识和实践能力。

课程性质:本课程为实践性较强的学科,注重培养学生的实际操作能力和编程思维。

学生特点:学生具备一定的Java基础,对编程有一定兴趣,但可能对图形用户界面设计和游戏开发较为陌生。

教学要求:结合学生特点,课程设计应注重理论与实践相结合,充分调动学生的积极性,提高其动手实践能力。

通过小组合作、讨论和分享,促进学生的团队协作和沟通能力。

同时,注重培养学生面对挑战的勇气和解决问题的能力,使学生在完成课程任务的过程中,不断提升自身编程水平和综合素质。

二、教学内容1. Java基本语法和面向对象编程:- 复习Java基本数据类型、运算符、控制结构等基础语法。

- 强化面向对象编程思想,重点讲解类、对象、继承、多态等概念。

2. 图形用户界面(GUI)设计:- 介绍Swing库的基本组件和布局管理器。

- 讲解事件处理机制,包括事件监听器和事件适配器。

3. 拼图游戏设计:- 分析拼图游戏的逻辑结构,讲解游戏实现的原理。

- 引导学生设计拼图游戏的类和对象,以及游戏界面布局。

4. 教学内容的安排与进度:- 第一周:复习Java基本语法,面向对象编程思想。

JAVA拼图游戏完整代码

JAVA拼图游戏完整代码

cell[num].setText("");
}
}
}
//start 对小方格重新排序 public void start() {
//如果没有给小方格添加监听,则添加监听 if(!hasAddActionListener){
for(int i=0;i<11;i++){ cell[i].addMouseListener(this);
"); }
//判断若完成,则提示完成 if(isFinish()){
JOptionPane.showMessageDialog(this, "恭喜你完成了,共用"+stepNum+"步。
//撤销小方格的监听 for(int i=0;i<11;i++){
cell[i].removeMouseListener(this); } hasAddActionListener=false; }
private Cell[] cell; private boolean hasAddActionListener = false;//表示是否为小方格添加了点击监听, 有为 true private Rectangle nullCell;
//构造方法 public PictureCanvas() {
}
}
}
private void cellMove(int nullX, int nullY, String direction) { for(int i=0;i<11;i++){ if(cell[i].getBounds().x == nullX && cell[i].getBounds().y == nullY){ //当前方格移动 cell[i].move(direction); //空方格移动(nullX,nullY) nullCell.setLocation(nullX,nullY); break; } }

java拼图课程设计

java拼图课程设计

java拼图课程设计一、课程目标知识目标:1. 学生能理解Java语言中面向对象编程的基本概念,掌握类与对象的关系及其应用。

2. 学生能运用Java编程实现拼图游戏的基本逻辑,理解二维数组的使用。

3. 学生能够掌握Java中事件处理机制,实现对用户操作的响应。

技能目标:1. 学生通过编写拼图游戏代码,提高问题分析能力和编程实践技能。

2. 学生能够运用所学知识解决实际问题,培养创新意识和逻辑思维能力。

3. 学生通过小组合作完成项目,提升团队协作和沟通能力。

情感态度价值观目标:1. 学生在探索拼图游戏的编程过程中,培养对计算机编程的兴趣和热情。

2. 学生在项目实施中,学会面对挑战,培养坚持不懈、勇于尝试的精神。

3. 学生通过课程学习,认识到编程在生活中的应用,提升信息素养和社会责任感。

二、教学内容本课程以《Java编程思想》教材中面向对象编程为基础,结合拼图游戏的实际案例,组织以下教学内容:1. 面向对象编程基础:复习类与对象的概念,重点讲解封装、继承和多态性。

- 教材章节:第3章《面向对象的基本概念》,第4章《类与对象》。

2. 二维数组的使用:介绍二维数组的定义、初始化和使用,通过案例展示二维数组在拼图游戏中的应用。

- 教材章节:第6章《数组与字符串》,重点讲解二维数组部分。

3. 事件处理机制:讲解Java中事件处理的基本原理,以及如何在拼图游戏中实现鼠标和键盘事件处理。

- 教材章节:第11章《事件处理》。

4. 图形用户界面(GUI)设计:介绍Swing库中常用组件的使用,设计拼图游戏的界面。

- 教材章节:第10章《图形用户界面》。

5. 拼图游戏编程实践:将所学知识应用于实际项目中,分组完成拼图游戏的编程与实现。

- 教材章节:综合应用前面所学内容。

教学内容按照以上安排,逐步引导学生从理论到实践,掌握Java编程的基本技能,并在项目实践中培养解决问题的能力。

三、教学方法本课程采用以下多样化的教学方法,旨在激发学生的学习兴趣,提高教学效果:1. 讲授法:教师通过PPT和板书,系统地讲解面向对象编程的基本概念、二维数组的使用和事件处理机制等理论知识。

基于JAVA的拼图游戏毕业设计

基于JAVA的拼图游戏毕业设计

基于JAVA的拼图游戏基于JAVA的拼图游戏摘要JAVA语言是由美国sun公司开发的一种完全面向对象的程序设计语言,它由c++语言发展而来,但比c++语言简单。

JAVA语言具有简单、与平台无关、高效、健壮、安全、多线程等特点,是当前网络编程中的首选语言。

本文主要通过JAVA语言来开发一个小游戏,以实现其相关功能。

随着社会的发展,计算机已经成为人么日常生活,学习办公中不可缺少的一部分,并在各个领域发挥着重要的作用。

在计算机迅猛发展的影响下,计算机游戏也随之兴盛起来。

拼图游戏就是其中一中,它适用范围广,老少皆宜。

该游戏不仅可锻炼动手能力,观察能力,而且还能培养人与人之间的协作能力。

它是一个应用程序,它的游戏规则和win7的拼图游戏是一样的。

将一张图片分割成16张小图,将除去左上角的其余15张图片放入一个4*4的网格内,通过鼠标的点击图片来切换空白处对换位置,让其复原成原来的顺序,游戏就完成了。

可以选择下一张来切换另一张图片,或者按开局重新开始游戏。

关键词:JAVA 2平台标准版,JAVA语言,小应用程序Jigsaw puzzle based on JavaabstractJA V A language is developed by the sun a fully object-oriented programming language, it is developed by c + + language, but simpler than c + + language.The JA V A language has a simple, platform-independent, efficient, robust and security, multithreading, is the preferred language in the current network programming.This paper mainly through the JA V A language to develop a small game, in order to realize its related functions.With the development of the society, the computer has become the people daily life, an indispensable part of learning in the office, and play an important role in all fields.Under the influence of the rapid development of computer, computer games has been thriving.Jigsaw puzzle is among them one, its applicability is wide and for young and old.The game is not only can exercise ability, observation ability, but also can cultivate interpersonal cooperation ability.This puzzle game is based on the J2SE platform development, it is an application, it is the rules of the game and win7 puzzle game is the same.Picture will be divided into 16 images, will remove the upper left corner of the rest of the 15 images in a 4 * 4 mesh, the blank space with the mouse click on the image to switch switch position, make its recovery as the original sequence, the game is finished.Can choose the next to switch the other picture, or press start to start the game.Keywords: Java 2 Platform, Standard Edition, JAVA language, application.目录摘要 (Ⅰ)ABSTRACT (Ⅱ)第一章概述 (1)1.1项目开发的背景与国内外研究现状 (1)1.2项目开发的目的与意义 (1)1.3系统开发方法介绍 (2)第二章项目开发语言及开发环境 (5)2.1JAVA语言 (5)2.2ECLIPSE简介 (6)第三章可行性分析及总体设计原则 (8)3.1可行性分析所采用的方法和步骤 (8)3.2评价尺度 (8)3.3可行性分析 (8)3.3.1 技术可行性 (8)3.3.2 经济可行性 (8)3.3.3 社会可行性 (8)3.4总体设计原则 (9)第四章需求分析 (10)4.1OOA方法介绍 (10)4.2功能需求 (10)4.3环境需求 (10)4.4可靠性需求 (11)4.5用户界面需求 (11)4.6软件成本消耗与开发进度需求 (11)4.7条件假定和限制 (11)第五章系统分析 (12)5.1业务流程分析 (12)5.2总体设计方案 (12)5.3游戏功能分析 (13)第六章系统设计 (14)6.1系统功能设计 (14)6.2系统重点设计 (14)6.2.1 开局载入图片 (15)6.2.4 随机排列图片 (16)6.2.3 游戏时排列图片 (18)6.2.4 换下一张图片 (18)6.2.5 判断拼图是否成功 (19)6.3拼图游戏界面的设计与实现 (20)第七章设计小结 (21)参考文献 (24)致谢 (25)附录 (26)太原科技大学华科学院毕业设计(论文)第一章概述1.1项目开发的背景与国内外研究现状随着信息技术的飞速发展、蓬勃进步,同时随着国际互连网与相关系统的迅速普及,不同国家、行业被Internet连接在一起,互相通信,共享全世界的计算机资源和信息。

java课程设计-拼图游戏代码

java课程设计-拼图游戏代码

package love;import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.util.Random;import javax.swing.*;public class Games extends JFrame implements ActionListener {private JButton buttons[][];//存储按键的数组private Container container;//一个容器private GridLayout layout;//布局方式为GridLayoutprivate int count =0,is[]=new int[8];//count的作用是计算按键移动的次数,is[]储存一个随机产生的1到8数字数组public Games() {super("拼图游戏");//设置标题layout = new GridLayout(3, 3);// 3行3列container = getContentPane();//该容器的布局方式,及其重要,否则产生空引用异常container.setLayout(layout);//将该布局方式作用于容器buttons = new JButton[3][3];//给按键数组分配储存空间int locate1,locate2;//locate1用来指示当前产生的元素locate2用来指示locate1之前的元素for (locate1 = 0; locate1 < 8; locate1++) {//该方法作用是产生1到8这8个数,随机分配给数组,即无序排列int g = new Random().nextInt(8) + 1;//随机产生一个空白按键,即不显示的那个is[locate1] = g;for (locate2 = locate1 - 1; 0 <= locate2; locate2--) {if (is[locate1] == is[locate2])break;}if (locate2 != -1)locate1--;}int temp = 0;int r = new Random().nextInt(3);//随机产生一个0到3的数,代表空白按键的行int l = newRandom().nextInt(3);//随机产生一个0到3的数,代表空白按键的列for (int i = 0; i < 3; i++) {for (int j = 0; j < 3; j++) {if (r == i && l == j) {//空白按键设置为9,不显示buttons[i][j] = new JButton("9");container.add(buttons[i][j]);buttons[i][j].setVisible(false);} else {buttons[i][j] = new JButton("" + is[temp++]);//将数组的值作为显示的8个按键的名字container.add(buttons[i][j]);}buttons[i][j].addActionListener(this);//注册监听事件}}setSize(300, 300);//设置显示容器区域大小setVisible(true);}public void actionPerformed(ActionEvent event) {//事件处理,由于计算量小该处将所有按键单独分析JButton b = (JButton) event.getSource();if (b == buttons[0][0]) {if (buttons[0][1].getText().equals("9")) {buttons[0][1].setText("" + buttons[0][0].getText());buttons[0][1].setVisible(true);buttons[0][0].setText("9");buttons[0][0].setVisible(false);count++;} else if (buttons[1][0].getText().equals("9")) {buttons[1][0].setText("" + buttons[0][0].getText());buttons[1][0].setVisible(true);buttons[0][0].setText("9");buttons[0][0].setVisible(false);count++;}}else if (b == buttons[0][1]) {if (buttons[0][0].getText().equals("9")) {buttons[0][0].setText("" + buttons[0][1].getText());buttons[0][0].setVisible(true);buttons[0][1].setText("9");buttons[0][1].setVisible(false);count++;} else if (buttons[0][2].getText().equals("9")) { buttons[0][2].setText("" + buttons[0][1].getText()); buttons[0][2].setVisible(true);buttons[0][1].setText("9");buttons[0][1].setVisible(false);count++;} else if (buttons[1][1].getText().equals("9")) { buttons[1][1].setText("" + buttons[0][1].getText()); buttons[1][1].setVisible(true);buttons[0][1].setText("9");buttons[0][1].setVisible(false);count++;}} else if (b == buttons[0][2]) {if (buttons[0][1].getText().equals("9")) {buttons[0][1].setText("" + buttons[0][2].getText()); buttons[0][1].setVisible(true);buttons[0][2].setText("9");buttons[0][2].setVisible(false);count++;} else if (buttons[1][2].getText().equals("9")) {buttons[1][2].setText("" + buttons[0][2].getText()); buttons[1][2].setVisible(true);buttons[0][2].setText("9");buttons[0][2].setVisible(false);count++;}} else if (b == buttons[1][0]) {if (buttons[0][0].getText().equals("9")) {buttons[0][0].setText("" + buttons[1][0].getText()); buttons[0][0].setVisible(true);buttons[1][0].setText("9");buttons[1][0].setVisible(false);count++;} else if (buttons[1][1].getText().equals("9")) { buttons[1][1].setText("" + buttons[1][0].getText()); buttons[1][1].setVisible(true);buttons[1][0].setText("9");buttons[1][0].setVisible(false);count++;} else if (buttons[2][0].getText().equals("9")) { buttons[2][0].setText("" + buttons[1][0].getText()); buttons[2][0].setVisible(true);buttons[1][0].setText("9");buttons[1][0].setVisible(false);count++;}} else if (b == buttons[1][1]) {if (buttons[0][1].getText().equals("9")) {buttons[0][1].setText("" + buttons[1][1].getText()); buttons[0][1].setVisible(true);buttons[1][1].setText("9");buttons[1][1].setVisible(false);count++;} else if (buttons[1][0].getText().equals("9")) { buttons[1][0].setText("" + buttons[1][1].getText()); buttons[1][0].setVisible(true);buttons[1][1].setText("9");buttons[1][1].setVisible(false);count++;} else if (buttons[1][2].getText().equals("9")) { buttons[1][2].setText("" + buttons[1][1].getText()); buttons[1][2].setVisible(true);buttons[1][1].setText("9");buttons[1][1].setVisible(false);count++;} else if (buttons[2][1].getText().equals("9")) {buttons[2][1].setText("" + buttons[1][1].getText()); buttons[2][1].setVisible(true);buttons[1][1].setText("9");buttons[1][1].setVisible(false);count++;}} else if (b == buttons[1][2]) {if (buttons[0][2].getText().equals("9")) {buttons[0][2].setText("" + buttons[1][2].getText()); buttons[0][2].setVisible(true);buttons[1][2].setText("9");buttons[1][2].setVisible(false);count++;} else if (buttons[2][2].getText().equals("9")) { buttons[2][2].setText("" + buttons[1][2].getText()); buttons[2][2].setVisible(true);buttons[1][2].setText("9");buttons[1][2].setVisible(false);count++;} else if (buttons[1][1].getText().equals("9")) { buttons[1][1].setText("" + buttons[1][2].getText()); buttons[1][1].setVisible(true);buttons[1][2].setText("9");buttons[1][2].setVisible(false);count++;}} else if (b == buttons[2][0]) {if (buttons[1][0].getText().equals("9")) {buttons[1][0].setText("" + buttons[2][0].getText()); buttons[1][0].setVisible(true);buttons[2][0].setText("9");buttons[2][0].setVisible(false);count++;} else if (buttons[2][1].getText().equals("9")) { buttons[2][1].setText("" + buttons[2][0].getText()); buttons[2][1].setVisible(true);buttons[2][0].setText("9");buttons[2][0].setVisible(false);count++;}}else if (b == buttons[2][1]) {if (buttons[2][0].getText().equals("9")) {buttons[2][0].setText("" + buttons[2][1].getText()); buttons[2][0].setVisible(true);buttons[2][1].setText("9");buttons[2][1].setVisible(false);count++;} else if (buttons[2][2].getText().equals("9")) { buttons[2][2].setText("" + buttons[2][1].getText()); buttons[2][2].setVisible(true);buttons[2][1].setText("9");buttons[2][1].setVisible(false);count++;} else if (buttons[1][1].getText().equals("9")) { buttons[1][1].setText("" + buttons[2][1].getText()); buttons[1][1].setVisible(true);buttons[2][1].setText("9");buttons[2][1].setVisible(false);count++;}} else if (b == buttons[2][2]) {if (buttons[2][1].getText().equals("9")) {buttons[2][1].setText("" + buttons[2][2].getText()); buttons[2][1].setVisible(true);buttons[2][2].setText("9");buttons[2][2].setVisible(false);count++;} else if (buttons[1][2].getText().equals("9")) { buttons[1][2].setText("" + buttons[2][2].getText()); buttons[1][2].setVisible(true);buttons[2][2].setText("9");buttons[2][2].setVisible(false);count++;}}if (buttons[0][0].getText().equals("1")//假如1到8已经排列完成,则执行该语句&& buttons[0][1].getText().equals("2")&& buttons[0][2].getText().equals("3")&& buttons[1][0].getText().equals("4")&& buttons[1][1].getText().equals("5")&& buttons[1][2].getText().equals("6")&& buttons[2][0].getText().equals("7")&& buttons[2][1].getText().equals("8")) {JOptionPane.showMessageDialog(null, "您一共花费了" + count + "步完成了游戏!");//弹出对话框,显示共移动步数System.exit(0);//退出程序}}public static void main(String[] args) {Games game = new Games();game.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}}。

拼图游戏代码

拼图游戏代码

import java.awt.*;import java.applet.*;import java.awt.event.* ;public class pintu extends Applet implements MouseListener,MouseMotionListener {private Image picture;private Graphics buffer;private Image pic[];private Image off_pic[];private Graphics off_buf[];private Image off_screen;private Graphics off_buffer;private Image off_drag;private Graphics off_drag_buf;private int map[][];private int ran[];private int width=0;private int height=0;private int lastx;private int lasty;private int last_downx;private int last_downy;private int stepx;private int stepy;private boolean choose;private boolean click[][];private boolean m_down;private boolean m_drag;private boolean not_redraw;private boolean able;Font font1,font2;//程序的初始化public void init(){resize(640,480);pic = new Image [3];off_pic = new Image[16];off_buf = new Graphics [16];map = new int [4][4];ran = new int [15];for(int a=0;a<16;a++)map[a/4][a%4] = a;for(int a=0;a<15;a++)ran[a]=a;click=new boolean [4][4];MediaTracker tracker= new MediaTracker (this);//要载入的图片pic[0]=getImage(getCodeBase(),"PICTURE0.JPG"); pic[1]=getImage(getCodeBase(),"PICTURE1.JPG"); pic[2]=getImage(getCodeBase(),"PICTURE2.GIF"); tracker.addImage (pic[0],0);tracker.addImage (pic[1],0);tracker.addImage (pic[2],0);try{tracker.waitForID (0);}catch(InterruptedException e){}//设置字体font1= new Font ("TimesRoman", Font.BOLD, 48); font2= new Font ("TimesRoman", Font.BOLD, 32); width=640;height=480;//初始化主界面initForm();//添加鼠标监听事件addMouseListener(this);addMouseMotionListener(this);}//面板初始化void initForm(){this.setBackground (Color.orange);if(off_drag==null){off_drag = createImage(width/4,height/4);off_drag_buf = off_drag.getGraphics ();}}public void paint(Graphics g){if(off_screen==null){off_screen = createImage(width,height);off_buffer=off_screen.getGraphics ();}if(able){off_buffer.setColor (Color.black );for(int a=0;a<4;a++)for(int b=0;b<4;b++){if(map[a][b]!=15)off_buffer.drawImage (off_pic[map[a][b]],b*width/4,a*height/4,this); if(map[a][b]==15)off_buffer.fillRect (b*width/4,a*height/4,width/4,height/4);for(int c=0;c<2;c++)off_buffer.drawRect (b*width/4+c,a*height/4+c,width/4-c,height/4-c); if(click[a][b]){off_buffer.setColor(Color.red);for(int d=0;d<2;d++)off_buffer.drawOval (b*width/4-d,a*height/4-d,width/4+d,height/4+d); off_buffer.setColor (Color.black );}}}else{off_buffer.setColor (Color.orange );off_buffer.fillRect (0,0,640,480);off_buffer.setFont (font1);off_buffer.setColor(Color.red );off_buffer.drawImage (pic[2],30,50,250,180,this);off_buffer.drawImage (pic[0],370,160,250,180,this);off_buffer.drawImage (pic[1],60,270,250,180,this);off_buffer.drawString ("Choose One!",320,100);}g.drawImage (off_screen,0,0,this);}public void repaint(){paint(this.getGraphics ());}//单击鼠标时产生的事件public void mouseClicked(MouseEvent evt){}//鼠标进入某个区域时产生的事件public void mouseEntered(MouseEvent evt){}//鼠标退出某个区域时产生的事件public void mouseExited(MouseEvent evt){}//移动鼠标时产生的事件public void mouseMoved(MouseEvent evt){if(!able){Point point;point=evt.getPoint();if(point.x >30 && point.x<280 && point.y>50 && point.y<230) {off_buffer.setColor (Color.orange );off_buffer.fillRect (0,0,640,480);off_buffer.setFont (font1);off_buffer.drawImage (pic[2],25,45,250,180,this);off_buffer.drawImage (pic[0],370,160,250,180,this);off_buffer.drawImage (pic[1],60,270,250,180,this);off_buffer.setColor(Color.black );off_buffer.fillRect (30,225,250,5);off_buffer.fillRect (275,50,5,176);off_buffer.setColor(Color.red );off_buffer.drawString ("picture 2!",320,100);this.getGraphics ().drawImage (off_screen,0,0,this); }else if(point.x >370 && point.x<620 && point.y>160 && point.y<340) {off_buffer.setColor (Color.orange );off_buffer.fillRect (0,0,640,480);off_buffer.setFont (font1);off_buffer.drawImage (pic[2],30,50,250,180,this);off_buffer.drawImage (pic[0],365,155,250,180,this);off_buffer.drawImage (pic[1],60,270,250,180,this);off_buffer.setColor(Color.black );off_buffer.fillRect (370,335,250,5);off_buffer.fillRect (615,160,5,175);off_buffer.setColor(Color.red );off_buffer.drawString ("picture 0!",320,100);this.getGraphics ().drawImage (off_screen,0,0,this);}else if(point.x >60 && point.x<310 && point.y>270 && point.y<450) {off_buffer.setColor (Color.orange );off_buffer.fillRect (0,0,640,480);off_buffer.setFont (font1);off_buffer.drawImage (pic[2],30,50,250,180,this);off_buffer.drawImage (pic[0],370,160,250,180,this);off_buffer.drawImage (pic[1],55,265,250,180,this);off_buffer.setColor(Color.black );off_buffer.fillRect (60,445,250,5);off_buffer.fillRect (305,270,5,175);off_buffer.setColor(Color.red );off_buffer.drawString ("picture 1!",320,100);this.getGraphics ().drawImage (off_screen,0,0,this); }else{repaint();}}}//拖动鼠标时产生的事件public void mouseDragged(MouseEvent evt){if(!able)return;if(m_down){Point point;Point temp;point=evt.getPoint();m_drag=true;repaint();Graphics david = this.getGraphics ();if(!not_redraw)off_drag_buf.drawImage (off_pic[map[last_downy][last_downx]],0,0,this); david.drawImage (off_drag,point.x+stepx,point.y+stepy,this);not_redraw=true;}}//按下鼠标时产生的事件public void mousePressed(MouseEvent evt){if(!able)return;Point point;Point temp;point=evt.getPoint();if(getarea(point) == point)return;else {temp=getarea(point);if(!m_down){if(map[temp.y][temp.x]==15)return;else{m_down=true;last_downx=temp.x;last_downy=temp.y;stepx=temp.x*160-point.x;stepy=temp.y*120-point.y;}}else if(m_down){m_down=false;}}}//放开鼠标时产生的事件public void mouseReleased(MouseEvent evt){if(able){if(m_drag){m_down=false;m_drag=false;not_redraw=false;Point point;Point temp;point=evt.getPoint();if(getarea(point) == point){ repaint();return;}else {temp=getarea(point);if(map[temp.y][temp.x]!=15){repaint();return;}else{if(Math.abs (last_downx-temp.x)==1 && last_downy-temp.y==0) {int david;david=map[last_downy][last_downx];map[last_downy][last_downx] =15;map[temp.y][temp.x]=david;if(wingame())able=false;repaint();return;}else if(last_downx-temp.x==0 && Math.abs (last_downy-temp.y)==1) {int david;david=map[last_downy][last_downx];map[last_downy][last_downx] =15;map[temp.y][temp.x]=david;if(wingame())able=false;repaint();return;}else{repaint(); return;}}}}}else{Point point;point=evt.getPoint();if(point.x >30 && point.x<280 && point.y>50 && point.y<230){able=true; initmap(2);}if(point.x >370 && point.x<620 && point.y>160 && point.y<340){able=true;initmap(0);}if(point.x >60 && point.x<310 && point.y>270 && point.y<450){able=true;initmap(1);}else return;}}//转换坐标public Point getarea(Point point){if(point.x>640 || point.y>480)return point;else return point = new Point (point.x/160,point.y/120);}//图片初始化void initmap(int stage){picture = createImage(width,height);buffer = picture.getGraphics ();buffer.drawImage (pic[stage],0,0,640,480,this);for(int a=0;a<15;a++){off_pic[a] = createImage(width/4,height/4);off_buf[a] = off_pic[a].getGraphics ();off_buf[a].drawImage (picture,0,0,width/4,height/4,(a%4)*width/4,(a/4)*height/4,(a%4+1)*width/4,(a/4+1)*height/4,this); }initgame();repaint();}//程序是否结束boolean wingame(){for(int a=0;a<4;a++)for(int b=0;b<4;b++){if(map[a][b]==a*4+b);else return false;}return true;}//游戏初始化void initgame(){for(int a=0;a<4;a++)for(int b=0;b<4;b++){if(!(a==3 && b==3)){map[a][b] = (int)(Math.random()*14); if(ran[map[a][b]]==-1){int temp=map[a][b];while(ran[temp]==-1){temp++;if(temp>14)temp=0;}map[a][b]=ran[temp];ran[temp]=-1;}else{ran[map[a][b]]=-1;}}else map[3][3] = 15;}}}//July/整理/05.23/。

拼图游戏_java课设_含可运行程序

拼图游戏_java课设_含可运行程序

沈阳大学
沈阳大学
沈阳大学
沈阳大学
沈阳大学
图3 游戏初始界面
单击start按钮开始游戏,界面自动加载并切割图片,玩家此时就可以通过鼠标来完成游戏了,单击空白区域旁边的图快就会移动,移动方向是向着空缺块移动,也就是说孔雀块四周都是可移动的块,而不是紧邻空缺块的图快则不能移动,结果如图4所示。

沈阳大学
图4 开始后的界面
当玩家想有提示信息时可单击数字提示,单击后会在图块上出现带有顺序的数字,玩家可以通过数字更加容易的完成拼图游戏,如图5所示。

沈阳大学
如果不想显示数字提示则可单击清除提示,结果则如同上图4所示。

图5 数字提示界面图
在游戏中,玩家每移动一块图快,状态栏中的步数就会自动加1,并在游戏状态中显示出来,游戏完成时会弹出一个对话框,提示玩家完成拼图游戏并显示所用步数,完成游戏结果图如图6所示。

图6 完成游戏对话框
玩家若想换一个图片进行游戏,则可通过image下拉框实现,玩家可以根据自己的
沈阳大学
兴趣爱好进行选择,如图7所示
图7 image下拉框
例如可以选择下拉框中的唯美,运行界面则如图8所示
图8 唯美拼图界面
沈阳大学
沈阳大学
沈阳大学
沈阳大学
沈阳大学
沈阳大学
沈阳大学
沈阳大学
沈阳大学
沈阳大学
沈阳大学
沈阳大学
沈阳大学。

java拼图游戏代码(完整版)

java拼图游戏代码(完整版)

Pintu.java(class)import java.awt.Color;import java.awt.FileDialog;import java.awt.Graphics;import java.awt.Image;import java.awt.Rectangle;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.ImageIcon;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JMenu;import javax.swing.JMenuBar;import javax.swing.JMenuItem;import javax.swing.JOptionPane;import javax.swing.JRadioButtonMenuItem;public class Pintu extends JFrame implements ActionListener{JMenuBar menubar=new JMenuBar(); //菜单条JMenu menu1=new JMenu("操作"); //菜单JMenu menu2=new JMenu("设置");JMenu menu3=new JMenu("帮助");//菜单选项JMenuItem jitem1=new JMenuItem("开始游戏");JMenuItem jitem2=new JMenuItem("退出游戏");JMenuItem jitem3=new JMenuItem("游戏图片");JMenu jitem4=new JMenu("难度设置");JMenuItem jitem5=new JMenuItem("关于我们");JRadioButtonMenuItem nandu1=new JRadioButtonMenuItem("3*3");//单选菜单JRadioButtonMenuItem nandu2=new JRadioButtonMenuItem("4*4");String filename="a.jpg"; //默认图片路径ImageIcon preimage=null; //预览图对象JButton prebtn=null; //预览图片放置控件int m=3,n=3; //默认设置为3*3的阵列int w=80,h=80; //默认小方格的高度与宽度int step=0; //拼图步数JLabel lstep=new JLabel("步数:0步");JLabel isover=new JLabel("状态:未开始");ImageIcon[] pic=null; //存放小方格图片JButton btn[][]=null; //小方格控件Rectangle p[][]=null; //小方格的位置与大小public void init(){this.setTitle("拼图游戏");this.setLayout(null);this.setBounds(400,100,300,480);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);isover.setBounds(100,50,100,30);lstep.setBounds(100,10,100,30);this.add(isover);this.add(lstep);//菜单显示this.setJMenuBar(menubar);menubar.add(menu1);menubar.add(menu2);menubar.add(menu3);menu1.add(jitem1);menu1.add(jitem2);menu2.add(jitem3);menu2.add(jitem4);menu3.add(jitem5);jitem4.add(nandu1);jitem4.add(nandu2);nandu1.setSelected(true);//设置单选默认值为3*3jitem2.addActionListener(this); //注册监听事件jitem3.addActionListener(this); //注册监听事件nandu1.addActionListener(this); //注册监听事件nandu2.addActionListener(this); //注册监听事件jitem1.addActionListener(this); //注册监听事件jitem5.addActionListener(this); //注册监听事件this.setVisible(true);this.setResizable(false);//不能更改窗体大小setpic();//图片分割必须放置窗体显示以后}//判断我们的图片是否拼图完整如果完成返回true 未完成返回false public boolean check(){boolean b=true;for(int i=n;i<(m+1)*n;i++){int x1=i/n,y1=i%n;if(btn[x1][y1].getIcon()!=null&&btn[x1][y1].getIcon()==pic[i-n]){}else{b=false;}}return b;}//图片的放置public void setpic(){isover.setText("状态:未开始");step=0;lstep.setText("步数:"+step+"步");w=280/m;h=280/n;Image[] a=splitImage(filename,1,1,100,100); //缩放预览图preimage=new ImageIcon(a[0]); //图片转换image=》IMageIconif(prebtn==null) //*如果存在,就不需要重新分配控件只需要更新图标prebtn=new JButton(preimage);//把图片设置为JButton的图标elseprebtn.setIcon(preimage);prebtn.setBounds(200,5,100,100);this.add(prebtn);//图片分割pic=new ImageIcon[m*n];//分配空间大小if(btn==null) //*如果存在,就不需要重新分配控件只需要更新图标btn=new JButton[m+1][n]; //分配控件实例化p=new Rectangle[m+1][n]; //坐标Image[] t=splitImage(filename,m,n,w,h);//图片分割m*n个每个高度与宽度为w,hfor(int i=0;i<(m+1)*n;i++){int x1=i/n,y1=i%n;//下标转换if(btn[x1][y1]==null) //*如果存在,就不需要重新实例化控件btn[x1][y1]=new JButton();//实例化每个控件btn[x1][y1].setBounds(y1*w+5,x1*h+50,w,h);//控件坐标btn[x1][y1].addActionListener(this);//添加事件this.add(btn[x1][y1]);}for(int i=1;i<n;i++){btn[0][i].removeActionListener(this);//第一行除了第一个以外,其他都不注册事件btn[0][i].setVisible(false); //第一行除了第一个以外,其他都不显示}int temp[]=randarray(m*n);for(int i=0;i<m*n;i++) //把图片放到方格内{pic[i]=new ImageIcon(t[i]); //图片转换image=》ImageIcon }for(int i=0;i<m*n;i++) //把图片放到方格内{btn[(i+n)/n][(i+n)%n].setIcon(pic[temp[i]]);//设置图标}btn[0][0].setBackground(Color.BLUE); //设置背景btn[0][0].setIcon(null);this.repaint(); //图片及时刷新}//图片方格随机产生一组随机序列数组,不能重复public int[] randarray(int n){int re[]=new int[n];for(int i=0;i<n;i++)re[i]=i;for(int i=1;i<n;i++){int t;int a=(int)(Math.random()*(n-1)+1);//-1 +1是为了第一个数不使用随机数t=re[i];re[i]=re[a];re[a]=t;}return re;}@Overridepublic void actionPerformed(ActionEvent e) {if(e.getSource()==jitem5)//关于{JOptionPane.showMessageDialog(this,"四川师范大学成都学院开发实验室\n2010年12月12日");return;}if(e.getSource()==nandu1)//难度选择{nandu1.setSelected(true);//更改单选菜单nandu2.setSelected(false);for(int i=0;i<(m+1)*n;i++){int x1=i/n,y1=i%n;//下标转换this.remove(btn[x1][y1]);//清除所有button控件}m=n=3;//重新设置难度btn=null;//释放btn对象setpic();return;}if(e.getSource()==nandu2){nandu2.setSelected(true);nandu1.setSelected(false);for(int i=0;i<(m+1)*n;i++){int x1=i/n,y1=i%n;//下标转换this.remove(btn[x1][y1]);//实例化每个控件}m=n=4;btn=null;setpic();return;}if(e.getSource()==jitem1)//重新开始{for(int j=0;j<(m+1)*n;j++){int x2=j/n,y2=j%n;//下标转换btn[x2][y2].removeActionListener(this);//实例化每个控件}setpic();return;}if(e.getSource()==jitem2){System.exit(0);}if(e.getSource()==jitem3){FileDialog df=new FileDialog(this,"图片选择",FileDialog.LOAD);df.setVisible(true);if(df.getFile()==null)return;filename=df.getDirectory()+df.getFile();//文件路径+文件名for(int j=0;j<(m+1)*n;j++){int x2=j/n,y2=j%n;//下标转换btn[x2][y2].removeActionListener(this);//实例化每个控件}setpic();return;}for(int i=0;i<(m+1)*n;i++)//循环所有控件{int x1=i/n,y1=i%n;//下标转换if(e.getSource()==btn[x1][y1])//如果点击了小方格{step++;lstep.setText("步数:"+step+"步");isover.setText("状态:已开始");//向上移动if(x1>0&&btn[x1-1][y1].isVisible()&&btn[x1-1][y1].getIcon()==null){btn[x1-1][y1].setIcon(btn[x1][y1].getIcon());//获取当前图标给上一个控件为图标btn[x1][y1].setIcon(null);//当前图标设置为空}//向下移动if(x1<m&&btn[x1+1][y1].isVisible()&&btn[x1+1][y1].getIcon()==null){btn[x1+1][y1].setIcon(btn[x1][y1].getIcon());//获取当前图标给下一个控件为图标btn[x1][y1].setIcon(null);//当前图标设置为空}//向左移动if(y1>0&&btn[x1][y1-1].isVisible()&&btn[x1][y1-1].getIcon()==null){btn[x1][y1-1].setIcon(btn[x1][y1].getIcon());//获取当前图标给左一个控件为图标btn[x1][y1].setIcon(null);//当前图标设置为空}//向右移动if(y1<n-1&&btn[x1][y1+1].isVisible()&&btn[x1][y1+1].getIcon()==null){btn[x1][y1+1].setIcon(btn[x1][y1].getIcon());//获取当前图标给右一个控件为图标btn[x1][y1].setIcon(null);//当前图标设置为空}btn[x1][y1].setBackground(Color.BLUE);if(check()){isover.setText("状态:已完成");for(int j=0;j<(m+1)*n;j++){int x2=j/n,y2=j%n;//下标转换btn[x2][y2].removeActionListener(this);//完成以后清除所有的监听}}}}}// 图片分割方法public Image[] splitImage(String file, int rows, int cols) {Image t = new ImageIcon(file).getImage();int w = t.getWidth(this) / cols;int h = t.getHeight(this) / rows;return splitImage(t, rows, cols, w, h);}public Image[] splitImage(String file, int rows, int cols, int w, int h) {Image t = new ImageIcon(file).getImage();return splitImage(t, rows, cols, w, h);}public Image[] splitImage(Image t, int rows, int cols, int w, int h) {Image[] result = new Image[rows * cols];try {for (int i = 0; i < result.length; i++) {result[i] = createImage(w, h);Graphics g = result[i].getGraphics();g.translate((-i % cols) * w, (-i / cols) * h);g.drawImage(t, 0, 0, w * cols, rows * h, 0, 0,t.getWidth(this), t.getHeight(this), this);}} catch (Exception e) {}return result;}}Play.java(class)public class Play {/*** @param args*/public static void main(String[] args) {Pintu p= new Pintu();p.init();}}。

java课程设计拼图游戏

java课程设计拼图游戏

java课程设计拼图游戏一、教学目标本节课的教学目标是让学生掌握Java编程的基本语法和逻辑思维能力,通过编写Java程序实现一个简单的拼图游戏。

具体目标如下:1.知识目标:–掌握Java的基本数据类型、运算符、控制结构。

–了解面向对象编程的基本概念,如类、对象、封装、继承。

–学习Java的图形用户界面编程,如Swing组件、事件处理等。

2.技能目标:–能够运用Java编程语言编写简单的程序。

–能够运用面向对象的思想设计程序。

–能够使用Java图形用户界面库编写用户友好的界面。

3.情感态度价值观目标:–培养学生的编程兴趣,提高学生解决问题的能力。

–培养学生团队合作的精神,学会分享和交流。

–培养学生对技术的热爱,提高学生对计算机科学的认知。

二、教学内容本节课的教学内容主要包括以下几个部分:1.Java基本语法和逻辑思维能力的培养。

2.面向对象编程的基本概念和应用。

3.Java图形用户界面编程,包括Swing组件的使用和事件处理。

具体的教学大纲如下:1.第一课时:Java基本语法和逻辑思维能力的培养。

–数据类型、运算符、控制结构。

–简单的数学计算程序编写。

2.第二课时:面向对象编程的基本概念和应用。

–类和对象的概念。

–封装、继承的应用。

–简单的图形界面程序编写。

3.第三课时:Java图形用户界面编程。

–Swing组件的使用。

–事件处理机制。

–拼图游戏的实现。

三、教学方法为了激发学生的学习兴趣和主动性,本节课将采用多种教学方法,如讲授法、讨论法、案例分析法、实验法等。

1.讲授法:用于讲解Java基本语法、面向对象编程概念和图形用户界面编程的基础知识。

2.讨论法:通过小组讨论,让学生深入理解面向对象编程的优势和应用。

3.案例分析法:分析实际的拼图游戏案例,让学生了解图形用户界面编程的实现方法。

4.实验法:让学生动手编写拼图游戏程序,巩固所学知识。

四、教学资源本节课的教学资源包括教材、参考书、多媒体资料和实验设备。

JAVA拼图游戏的核心代码

JAVA拼图游戏的核心代码

public void paint(Graphics g){ g.drawImage(im,0,0,BW-3,BH-3,BW*(ncol-1),BH*(nrow-1),BW*ncol,BH*nrow,this); } public void reSet(){ this.setLocation(BW*(col-1),BH*(row-1)); } class Mouse extends MouseAdapter{ @Override public void mousePressed(MouseEvent e) { Block b=(Block)e.getSource(); // b.setLocation(BW*(col-1),BH*(row)); if( p.map[row+1][col]==0){ b.setLocation(BW*(col-1),BH*row); p.map[row+1][col]=1; p.map[row][col]=0; row=row+1; } else if( p.map[row-1][col]==0){ b.setLocation(BW*(col-1),BH*(row-2)); p.map[row-1][col]=1; p.map[row][col]=0; row=row-1; } else if( p.map[row][col+1]==0){ b.setLocation(BW*col,BH*(row-1)); p.map[row][col+1]=1; p.map[row][col]=0; col=col+1; } else
一、PTFrame 类 public class PFrame extends Frame { Image im; PFrame(){ //im=Toolkit.getDefaultToolkit().getImage(this.getClass().getResource("11.jpg")); GamePanel panel=new GamePanel(); this.setLocation(400,100); this.setSize(540,750); //this.add(b); this.add(panel); this.setVisible(true); this.addWindowListener(new WindowAdapter(){ @Override public void windowClosing(WindowEvent e) { System.exit(0); } }); } public static void main(String[] args) { new PFrame(); } } 二、GamePanel 类的实现 public class GamePanel extends Panel { Block block[]=new Block[9]; //public int s=0; boolean win=false; public static final int HEIGHT=750; public static final int WIDTH=540; Random r=new Random(); int map[][]=new int [][]{ {1,1,1,1,1}, {1,1,1,1,1}, {1,1,1,1,1}, {1,1,1,1,1}, {1,1,1,1,1} }; GamePanel(){

基于Java的拼图游戏设计

基于Java的拼图游戏设计

Java课程设计——拼图游戏信101 孙杰2010314126Java课程设计——拼图游戏班级:信101学号:2010414126姓名:孙杰指导老师:李红强基于Java的拼图游戏设计游戏实现功能解析及界面游戏规则介绍1)本游戏是一个Java语言的拼图游戏,有一个格子是空的,其他格子内随机放置由要拿来拼图的图片切割成的若干个小图片,图片的切割按照一定的公式计算,因为,该通过单击任意一个与空格子相邻的方块可以把该方游戏中设有拼图游戏的等级,根据不同的等级,按照公式会切割成不同的小图片块数。

2)在开始游戏之前,可以选择游戏等级后再点击“开始”菜单里的“新游戏”,进行拼图游戏,通过将空格旁边的小图片移入空格子内(不断的移动方块),来实现拼图,直到方块一行一行的按图片的原始样子拼好即可完成该游戏。

3)游戏拼完后,会弹出一个“信息”框,显示你玩游戏所用的步数与时间,点击“确定”后,会弹出一个“输入”框,可以在里面输入游戏者的姓名,单击“确定”后会弹出游戏的记录框。

4)游戏的简单规则在游戏界面的“关于”菜单内的“帮助”信息框内已经简单介绍了。

游戏前可以先预览看看。

游戏实现功能主窗口界面1)游戏初始状态当游戏刚运行时,会出现如下界面,本游戏中已经存在了三张图片,如过游戏者想拼自己感兴趣的图片的话,可以将自己的图片放入到“background”(背景图片)文件夹中,再进行“选择”->“背景图片”中选择你自己的图片,然后选择“等级”->“困难”或“普通”或“简单”,进行等级选择,最后选择“开始”->“新游戏”就可以拼自己想拼的图了。

初始窗口如图1所示:图1 游戏初始窗口2)游戏进行状态当游戏者选择好图片与等级后,就可以进行拼图游戏了及进入游戏的进行状态。

3)游戏暂停状态当游戏者,在游戏过程中半途暂停游戏的话,将出现如图3所示的游戏暂停状态的界面。

当游戏者又想继续游戏时,直接单击界面上的“继续”字样,就可以继续游戏了。

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

package love;import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.util.Random;import javax.swing.*;public class Games extends JFrame implements ActionListener {private JButton buttons[][];// 存储按键的数组private Container container;// 一个容器private GridLayout layout;// 布局方式为GridLayoutprivate int count = 0, is[] = new int[8];// count的作用是计算按键移动的次数,is[]储存一个随机产生的1到8数字数组public Games() {super("拼图游戏");// 设置标题layout = new GridLayout(3, 3);// 3行3列container = getContentPane();// 该容器的布局方式,及其重要,否则产生空引用异常container.setLayout(layout);// 将该布局方式作用于容器buttons = new JButton[3][3];// 给按键数组分配储存空间int locate1, locate2;// locate1用来指示当前产生的元素 locate2用来指示locate1之前的元素for (locate1 = 0; locate1 < 8; locate1++) {// 该方法作用是产生1到8这8个数,随机分配给数组,即无序排列int g = new Random().nextInt(8) + 1;// 随机产生一个空白按键,即不显示的那个 is[locate1] = g;for (locate2 = locate1 - 1; 0 <= locate2; locate2--) {if (is[locate1] == is[locate2])break;}if (locate2 != -1)locate1--;}int temp = 0;int r = new Random().nextInt(3);// 随机产生一个0到3的数,代表空白按键的行 int l = new Random().nextInt(3);// 随机产生一个0到3的数,代表空白按键的列 for (int i = 0; i < 3; i++) {for (int j = 0; j < 3; j++) {if (r == i && l == j) {// 空白按键设置为9,不显示buttons[i][j] = new JButton("9");container.add(buttons[i][j]);buttons[i][j].setVisible(false);} else {buttons[i][j] = new JButton("" + is[temp++]);// 将数组数组的值作为显示的8个按键的名字container.add(buttons[i][j]);}buttons[i][j].addActionListener(this);// 注册监听事件}}setSize(300, 300);// 设置显示容器区域大小setVisible(true);}public void actionPerformed(ActionEvent event) {// 事件处理,由于计算量小该处将所有按键单独分析JButton b = (JButton) event.getSource();if (b == buttons[0][0]) {if (buttons[0][1].getText().equals("9")) {buttons[0][1].setText("" + buttons[0][0].getText());buttons[0][1].setVisible(true);buttons[0][0].setText("9");buttons[0][0].setVisible(false);count++;} else if (buttons[1][0].getText().equals("9")) {buttons[1][0].setText("" + buttons[0][0].getText());buttons[1][0].setVisible(true);buttons[0][0].setText("9");buttons[0][0].setVisible(false);count++;}}else if (b == buttons[0][1]) {if (buttons[0][0].getText().equals("9")) {buttons[0][0].setText("" + buttons[0][1].getText());buttons[0][0].setVisible(true);buttons[0][1].setText("9");buttons[0][1].setVisible(false);count++;} else if (buttons[0][2].getText().equals("9")) {buttons[0][2].setText("" + buttons[0][1].getText()); buttons[0][2].setVisible(true);buttons[0][1].setText("9");buttons[0][1].setVisible(false);count++;} else if (buttons[1][1].getText().equals("9")) {buttons[1][1].setText("" + buttons[0][1].getText()); buttons[1][1].setVisible(true);buttons[0][1].setText("9");buttons[0][1].setVisible(false);count++;}} else if (b == buttons[0][2]) {if (buttons[0][1].getText().equals("9")) {buttons[0][1].setText("" + buttons[0][2].getText()); buttons[0][1].setVisible(true);buttons[0][2].setText("9");buttons[0][2].setVisible(false);count++;} else if (buttons[1][2].getText().equals("9")) {buttons[1][2].setText("" + buttons[0][2].getText()); buttons[1][2].setVisible(true);buttons[0][2].setText("9");buttons[0][2].setVisible(false);count++;}} else if (b == buttons[1][0]) {if (buttons[0][0].getText().equals("9")) {buttons[0][0].setText("" + buttons[1][0].getText()); buttons[0][0].setVisible(true);buttons[1][0].setText("9");buttons[1][0].setVisible(false);count++;} else if (buttons[1][1].getText().equals("9")) {buttons[1][1].setText("" + buttons[1][0].getText()); buttons[1][1].setVisible(true);buttons[1][0].setText("9");buttons[1][0].setVisible(false);count++;} else if (buttons[2][0].getText().equals("9")) {buttons[2][0].setText("" + buttons[1][0].getText()); buttons[2][0].setVisible(true);buttons[1][0].setText("9");buttons[1][0].setVisible(false);count++;}} else if (b == buttons[1][1]) {if (buttons[0][1].getText().equals("9")) {buttons[0][1].setText("" + buttons[1][1].getText()); buttons[0][1].setVisible(true);buttons[1][1].setText("9");buttons[1][1].setVisible(false);count++;} else if (buttons[1][0].getText().equals("9")) {buttons[1][0].setText("" + buttons[1][1].getText()); buttons[1][0].setVisible(true);buttons[1][1].setText("9");buttons[1][1].setVisible(false);count++;} else if (buttons[1][2].getText().equals("9")) {buttons[1][2].setText("" + buttons[1][1].getText()); buttons[1][2].setVisible(true);buttons[1][1].setText("9");buttons[1][1].setVisible(false);count++;} else if (buttons[2][1].getText().equals("9")) {buttons[2][1].setText("" + buttons[1][1].getText()); buttons[2][1].setVisible(true);buttons[1][1].setText("9");buttons[1][1].setVisible(false);count++;}} else if (b == buttons[1][2]) {if (buttons[0][2].getText().equals("9")) {buttons[0][2].setText("" + buttons[1][2].getText()); buttons[0][2].setVisible(true);buttons[1][2].setText("9");buttons[1][2].setVisible(false);count++;} else if (buttons[2][2].getText().equals("9")) {buttons[2][2].setText("" + buttons[1][2].getText()); buttons[2][2].setVisible(true);buttons[1][2].setText("9");buttons[1][2].setVisible(false);count++;} else if (buttons[1][1].getText().equals("9")) {buttons[1][1].setText("" + buttons[1][2].getText()); buttons[1][1].setVisible(true);buttons[1][2].setText("9");buttons[1][2].setVisible(false);count++;}} else if (b == buttons[2][0]) {if (buttons[1][0].getText().equals("9")) {buttons[1][0].setText("" + buttons[2][0].getText()); buttons[1][0].setVisible(true);buttons[2][0].setText("9");buttons[2][0].setVisible(false);count++;} else if (buttons[2][1].getText().equals("9")) {buttons[2][1].setText("" + buttons[2][0].getText()); buttons[2][1].setVisible(true);buttons[2][0].setText("9");buttons[2][0].setVisible(false);count++;}}else if (b == buttons[2][1]) {if (buttons[2][0].getText().equals("9")) {buttons[2][0].setText("" + buttons[2][1].getText()); buttons[2][0].setVisible(true);buttons[2][1].setText("9");buttons[2][1].setVisible(false);count++;} else if (buttons[2][2].getText().equals("9")) {buttons[2][2].setText("" + buttons[2][1].getText()); buttons[2][2].setVisible(true);buttons[2][1].setText("9");buttons[2][1].setVisible(false);count++;} else if (buttons[1][1].getText().equals("9")) {buttons[1][1].setText("" + buttons[2][1].getText()); buttons[1][1].setVisible(true);buttons[2][1].setText("9");buttons[2][1].setVisible(false);count++;}} else if (b == buttons[2][2]) {if (buttons[2][1].getText().equals("9")) {buttons[2][1].setText("" + buttons[2][2].getText());buttons[2][1].setVisible(true);buttons[2][2].setText("9");buttons[2][2].setVisible(false);count++;} else if (buttons[1][2].getText().equals("9")) {buttons[1][2].setText("" + buttons[2][2].getText());buttons[1][2].setVisible(true);buttons[2][2].setText("9");buttons[2][2].setVisible(false);count++;}}if (buttons[0][0].getText().equals("1")// 假如1到8已经排列完成,则执行该语句&& buttons[0][1].getText().equals("2")&& buttons[0][2].getText().equals("3")&& buttons[1][0].getText().equals("4")&& buttons[1][1].getText().equals("5")&& buttons[1][2].getText().equals("6")&& buttons[2][0].getText().equals("7")&& buttons[2][1].getText().equals("8")) {JOptionPane.showMessageDialog(null, "您一共花费了" + count + "步完成了游戏!");// 弹出对话框,显示共移动步数System.exit(0);// 退出程序}}public static void main(String[] args) {Games game = new Games();game.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}}。

相关文档
最新文档