java推箱子
Java实现经典游戏推箱子的示例代码
Java实现经典游戏推箱⼦的⽰例代码⽬录前⾔主要设计功能截图代码实现核⼼类声⾳播放类总结前⾔《推箱⼦》推箱⼦是⼀个古⽼的游戏,⽬的是在训练你的逻辑思考能⼒。
在⼀个狭⼩的仓库中,要求把⽊箱放到指定的位置,稍不⼩⼼就会出现箱⼦⽆法移动或者通道被堵住的情况,所以需要巧妙的利⽤有限的空间和通道,合理安排移动的次序和位置,才能顺利的完成任务。
游戏是⽤java语⾔实现,采⽤了swing技术进⾏了界⾯化处理,设计思路⽤了⾯向对象思想。
主要需求控制搬运⼯上下左右移动,来将箱⼦推到指定地点主要设计1、游戏⾯板⽣成显⽰2、地图⽣成算法3、⼈物移动算法4、播放背景⾳乐5、箱⼦移动算法6、全部箱⼦移动到指定位置,才算游戏过关功能截图游戏开始移动效果游戏过关代码实现核⼼类public class GameFrame extends JFrame implementsActionListener, MouseListener, KeyListener {// 实现动作事件监听器、⿏标事件监听器、键盘事件监听器// 当前的关卡数,默认为第⼀关,从1开始计数private int grade = 1;// row,column记载⼈的位置,分别表⽰⼆维数组中的⾏号和列号,即map[row][column]确定⼈的位置private int row = 7, column = 7;// leftX,leftY记载左上⾓图⽚的位置,避免图⽚从(0,0)坐标开始,因为是图⽚填充,从(0,0)开始不⾏private int leftX = 50, leftY = 50;// 记载地图的总共有多少⾏、多少列private int mapRow = 0, mapColumn = 0;// 记载屏幕窗⼝的宽度和⾼度private int width = 0, height = 0;private boolean acceptKey = true;// 程序所需要⽤到的图⽚private Image pics[] = null;// 图⽚数据private byte[][] map = null;// 地图数据private ArrayList list = new ArrayList();private SoundPlayerUtil soundPlayer;// 播放声⾳⼯具类/* 常量,即游戏中的资源 */private final static int WALL = 1;// 墙private final static int BOX = 2;// 箱⼦private final static int BOX_ON_END = 3;// 放到⽬的地的箱⼦private final static int END = 4;// ⽬的地private final static int MAN_DOWN = 5;// 向下的⼈private final static int MAN_LEFT = 6;// 向左的⼈private final static int MAN_RIGHT = 7;// 向右的⼈private final static int MAN_UP = 8;// 向上的⼈private final static int GRASS = 9;// 通道private final static int MAN_DOWN_ON_END = 10;// 站在⽬的地向下的⼈private final static int MAN_LEFT_ON_END = 11;// 站在⽬的地向左的⼈private final static int MAN_RIGHT_ON_END = 12;// 站在⽬的地向右的⼈private final static int MAN_UP_ON_END = 13;// 站在⽬的地向上的⼈private final static int MOVE_PIXEL = 30;// 表⽰每次移动30像素/*** 在构造⽅法GameFrame0中,调⽤initMap()法来初始化本关grade游戏地图,清空悔棋信* 息列表list,同时播放MIDI背景⾳乐。
推箱子项目实训报告
一、项目背景推箱子游戏是一款经典的益智游戏,起源于日本。
玩家需要在狭小的仓库中,通过移动人物,将箱子推到指定的位置。
这款游戏不仅考验玩家的逻辑思维和空间想象力,还锻炼玩家的耐心和策略。
为了提高自身的编程能力,我们选择推箱子游戏作为实训项目。
二、实训目的1. 学习和掌握Java编程语言的基本语法和常用库;2. 熟悉图形用户界面(GUI)编程;3. 提高逻辑思维和编程能力;4. 实现一个具有良好用户体验的推箱子游戏。
三、项目设计1. 系统架构推箱子游戏采用MVC(模型-视图-控制器)架构,将游戏逻辑、界面展示和用户交互分离,提高代码的可读性和可维护性。
2. 关卡设计游戏共包含10个关卡,每个关卡都有不同的地图和目标。
关卡难度逐渐增加,以满足不同玩家的需求。
3. 游戏功能(1)基本功能1)地图展示:游戏开始时,展示当前关卡的地图,包括人物、箱子、目的地和墙壁;2)人物移动:玩家可以通过键盘或鼠标控制人物上下左右移动;3)箱子移动:当人物站在箱子旁边时,按空格键将箱子推到目标位置;4)胜利判断:所有箱子都推到目标位置,游戏胜利;5)失败判断:人物无法移动或通道被堵住,游戏失败。
(2)扩展功能1)悔棋功能:玩家可以撤销上一步操作,回到之前的状态;2)重置关卡:玩家可以重新开始当前关卡;3)关卡选择:玩家可以选择不同的关卡进行游戏;4)音乐和音效:游戏过程中,播放背景音乐和音效,增强游戏氛围。
四、关键技术1. Java编程语言:使用Java编程语言实现游戏逻辑、界面展示和用户交互;2. Swing库:使用Swing库实现图形用户界面;3. 图像处理:使用ImageIO类加载和显示游戏地图、人物、箱子等图片;4. 事件监听:使用ActionListener、KeyListener等监听器处理用户操作。
五、项目实现1. 创建项目:使用Eclipse创建Java项目,导入Swing库和ImageIO类;2. 设计界面:创建JFrame作为主窗口,添加JPanel作为游戏区域,添加JButton作为按钮控件;3. 游戏逻辑:定义游戏地图、人物、箱子等数据结构,实现人物移动、箱子移动、胜利判断和失败判断等功能;4. 图像处理:加载游戏地图、人物、箱子等图片,使用ImageIO类进行显示;5. 事件监听:为按钮控件添加ActionListener和KeyListener,处理用户操作。
推箱子java课程设计
采用栈的存储方式来存储并控制人物,箱子的移动和地图的变换,悔一步操作让玩家有了反悔的一步,这节省玩家的时间,避免因错位导致重新开始。
4. 设计结果与分析4.1 程序运行结果程序编译无错误,单击运行按钮,运行通过,开始时弹出该游戏的页面,然后开始游戏。
一般的会显示出第一关的游戏,玩家可以根据自己的实际水平去操作,而后选择适于自己水平的关卡来玩。
一开始运行程序,显示该页面时,会在页面的正中央显示出该关为第一关,以提醒玩家。
第一关如下图3所示。
图3. 推箱子游戏第一关界面当玩家想选关时,可以根据自己的意愿去选关闯。
选第50关,如下图4所示。
图4. 推箱子游戏第50关页面4.2 尚需解决的问题游戏的背景音乐比较单一,可以通过在“选项”模式中添加“背景音乐导入”模块,导入玩家自己喜欢的音乐。
在此次课程设计中,我遇到了一些问题,如:对于面向对象的方法了解不够透彻,运用到实际的软件开发中存在着困难;对于Java语言,只学习到了一些最基本的知识,这导致编写程序时经常出现一些语法错误,而且要在短时间内用Java语言来设计一个具体的系统是一个较大的挑战;还有对于正规开发一个系统的流程不熟悉,适应起来比较慢,编写各个模块相对应的操作时,自己感觉难以动手,这表明所学的知识不能灵活运用到实际中。
对于以上的问题,自己有清楚的认识,解决办法是需要大量阅读相关的书籍,对于书上以及网站上下载的资料中的Java实例必须有清楚的理解,还有就是多跟精通此方面的老师和同学交流,取其精华。
对于实际动手能力与系统开发的流程的适应,必须多进行实际的练习与操作,才能有大的进步。
5. 设计体会通过这次课程设计我充分了解了理论与课程设计相结合的重要性,理论基础上必须有实际上的应用,在实际的应用中才能发现个种问题,再灵活的应用理论知。
java推箱子课程设计
不足与改进方向
课程设计存在一定的难度,需 要进一步简化和优化
课程内容需要更加丰富,增加 更多的实践案例和项目
课程评价体系需要进一步完善, 增加更多的评价维度和指标
课程需要更加注重培养学生的 创新能力和实践能力,增加更 多的创新实践环节
对未来发展的展望
技术发展趋势:Java推箱子游戏将继续发展,可能会出现更多新的玩法和功能。
教育应用:Java推箱子游戏可以作为一种教学工具,帮助学生更好地理解和掌握Java编程知 识。
创新与挑战:未来可能会出现更多类似的游戏,需要不断创新和挑战,以保持竞争力。
社区建设:可以建立一个Java推箱子游戏的社区,让玩家和开发者共同交流和分享经验。
THANKS
汇报人:
线程:程序的执行单元,可以同时执行多个任务 线程同步:确保多个线程对共享资源的访问不会产生冲突 线程通信:线程之间传递信息,如使用wait()、notify()等方法 线程调度:操作系统决定哪个线程执行,如使用优先级、时间片等策略
Java数据结构与算法的应用
数组:用于存储游戏地图 和箱子的位置
链表:用于实现箱子的移 动和碰撞检测
箱子角色:控制箱 子的移动和操作
障碍物角色:控制 障碍物的移动和操 作
游戏界面:控制游 戏界面的显示和操 作
箱子移动逻辑
箱子移动规则:只能向四个方向移 动,不能穿过墙壁或障碍物
箱子移动方式:通过键盘或鼠标控 制,按下相应的方向键或点击相应 的方向按钮
添加标题
添加标题
添加标题
添加标题
箱子移动条件:箱子周围有空间, 且没有其他箱子或障碍物阻挡
游戏状态管理
游戏状态:开始、进行、结束、暂停等 状态转换:根据玩家操作和游戏条件进行状态转换 状态存储:保存游戏进度和玩家信息 状态恢复:根据存储的状态信息恢复游戏进度和玩家信息
推箱子游戏代码,非界面版
import java.util.Random;import java.util.Scanner;public class 推箱子 {public static void main(String[] args) {//推箱子int map[][]=new int[10][10]; //固定箱子,人,目的地的位置// int rx=0;// int ry=0;// map[rx][ry]=1;// int xx=5;// int xy=1;// map[xx][xy]=2;// int mx=6;// int my=4;// map[mx][my]=3;//随机生成人,箱子,目的地的位置Random r=new Random();int rx=r.nextInt(10);int ry=r.nextInt(10);map[rx][ry]=1;int xx=r.nextInt(10);int xy=r.nextInt(10);map[xx][xy]=2;int mx=r.nextInt(10);int my=r.nextInt(10);map[mx][my]=3;while(true){for(int i=0;i<map.length;i++){for(int j=0;j<map[i].length;j++){if(map[i][j]==1){System.out.print(" 人 ");}if(map[i][j]==2){//△代表箱子System.out.print(" △ ");}if(map[i][j]==3){//★代表箱子System.out.print(" ★ ");}if(map[i][j]==0){//◇代表箱子System.out.print(" ◇ ");}}System.out.println();}if(xx==mx&&xy==my){break;}if(xx==0&&mx!=0||xy==0&&my!=0||xx==9&&mx!=9||xy==9&&my!=9){// 判断箱子到边上而目的地不在边上的情况System.out.println("永远也到不了了~~~~(>_<)~~~~ ");}Scanner s = new Scanner(System.in);System.out.println("请输入要操作的动作:");System.out.println("w↑,s↓,a←,d→");String t=s.next();if(t.equals("d")){if(ry==9){System.out.println("此路不通!!~~~~(>_<)~~~~ ");}else if(t.equals("d")){ry++;if(map[rx][ry]==0){map[rx][ry]=1;map[rx][ry-1]=0;}else if(map[rx][ry]==2){xy++;map[xx][xy]=2;map[rx][ry]=1;map[rx][ry-1]=0;}}}if(t.equals("a")){if(ry==0){System.out.println("此路不通!!~~~~(>_<)~~~~ ");}else {ry--;if(map[rx][ry]==0){map[rx][ry]=1;map[rx][ry+1]=0;}else if(map[rx][ry]==2){xy--;map[xx][xy]=2;map[rx][ry+1]=0;map[rx][ry]=1;}}}if(t.equals("s")){if(rx==9){System.out.println("此路不通!!~~~~(>_<)~~~~ ");}else {rx++;if(map[rx][ry]==0){map[rx][ry]=1;map[rx-1][ry]=0;}else if(map[rx][ry]==2){xx++;map[xx][xy]=2;map[rx-1][ry]=0;map[rx][ry]=1;}}}if(t.equals("w")){if(rx==0){System.out.println("此路不通!!~~~~(>_<)~~~~ ");}else{rx--;if(map[rx][ry]==0){map[rx][ry]=1;map[rx+1][ry]=0;}else if(map[rx][ry]==2){xx--;map[xx][xy]=2;map[rx+1][ry]=0;map[rx][ry]=1;}}}}System.out.println("游戏结束!");}}。
使用java实现简单推箱子游戏
使⽤java实现简单推箱⼦游戏题⽬:编写⼀个简单的推箱⼦游戏,H表⽰墙壁;&表⽰玩家;O表⽰箱⼦,*表⽰⽬的地。
玩家输⼊W、A、S、D控制⾓⾊移动游戏结束画⾯:实现代码如下:import java.util.Scanner;public class Sokoban {public static void main(String[] args) {char map[][] = new char[8][10];// 地图Scanner sc = new Scanner(System.in);// 控制台输⼊扫描器int x = 1, y = 1;// 玩家⾓⾊坐标boolean finish = false;// 游戏是否结束for (int i = 0; i < map.length; i++) {// 地图外边墙壁if (i == 0 || i == 7) {for (int j = 0; j < map[i].length; j++) {map[i][j] = 'H';}} else {map[i][0] = 'H';map[i][9] = 'H';}}map[1][3] = 'H';// 地图内墙壁map[2][3] = 'H';map[3][3] = 'H';map[2][5] = 'H';map[3][5] = 'H';map[3][6] = 'H';map[3][8] = 'H';map[4][8] = 'H';map[6][4] = 'H';map[5][4] = 'H';map[5][5] = 'H';map[5][6] = 'H';map[x][y] = '&';// 玩家⾓⾊map[2][2] = 'o';// 箱⼦map[6][5] = '*';// ⽬的地while (true) {// 循环游戏/* 打印游戏画⾯ *//* 打印游戏画⾯ */System.out.println("--------------------");for (char row[] : map) {for (char column : row) {System.out.print(column + " ");}System.out.println();}System.out.println("--------------------");if (finish) {// 如果游戏结束则停⽌循环break;}System.out.println("A左移,D右移,W上移,S下移,请输⼊你的指令:"); String code = sc.nextLine();// 获取玩家输⼊的指令switch (code.toLowerCase()) {// 将执⾏转为⼩写并判断case "a" :// 如果输⼊的是aif (map[x][y - 1] == 0) {// 如果玩家左边是空区map[x][y] = 0;// 原位置变为空区map[x][y - 1] = '&';// 玩家移动到新位置y--;// 玩家坐标左移} else if (map[x][y - 1] == 'o') {// 如果玩家左边是箱⼦if (map[x][y - 2] != 'H') {// 如果箱⼦左边不是墙if (map[x][y - 2] == '*') {// 如果箱⼦左边是⽬的地finish = true;// 游戏结束}map[x][y] = 0;// 原位置变为空区map[x][y - 1] = '&';// 玩家移动到新位置map[x][y - 2] = 'o';// 箱⼦移动到新位置y--;// 玩家位置左移}}break;// 结束判断case "d" :// 如果输⼊的是dif (map[x][y + 1] == 0) {// 如果玩家右边是空区map[x][y] = 0;// 原位置变为空区map[x][y + 1] = '&';// 玩家移动到新位置y++;// 玩家坐标右移} else if (map[x][y + 1] == 'o') {// 如果玩家右边是箱⼦if (map[x][y + 2] != 'H') {// 如果箱⼦右边不是墙if (map[x][y + 2] == '*') {// 如果箱⼦右边是⽬的地finish = true;// 游戏结束}map[x][y] = 0;// 原位置变为空区map[x][y + 1] = '&';// 玩家移动到新位置map[x][y + 2] = 'o';// 箱⼦移动到新位置y++;// 玩家坐标右移}}break;// 结束判断case "w" :// 如果输⼊的是wif (map[x - 1][y] == 0) {// 如果玩家上⽅是空区map[x][y] = 0;// 原位置变为空区map[x - 1][y] = '&';// 玩家移动到新位置x--;// 玩家坐标上移} else if (map[x - 1][y] == 'o') {// 如果玩家上⽅是箱⼦if (map[x - 2][y] != 'H') {// 如果箱⼦上⽅不是墙if (map[x - 2][y] == '*') {// 如果箱⼦上⽅是⽬的地finish = true;// 游戏结束}map[x][y] = 0;// 原位置变为空区map[x - 1][y] = '&';// 玩家移动到新位置map[x - 2][y] = 'o';// 箱⼦移动到新位置x--;// 玩家坐标上移x--;// 玩家坐标上移}}break;// 结束判断case "s" :// 如果输⼊的是sif (map[x + 1][y] == 0) {// 如果玩家下⽅是空区map[x][y] = 0;// 原位置变为空区map[x + 1][y] = '&';// 玩家移动到新位置x++;// 玩家坐标下移} else if (map[x + 1][y] == 'o') {// 如果玩家下⽅是箱⼦ if (map[x + 2][y] != 'H') {// 如果箱⼦下⽅不是墙if (map[x + 2][y] == '*') {// 如果箱⼦下⽅是⽬的地 finish = true;// 游戏结束}map[x][y] = 0;// 原位置变为空区map[x + 1][y] = '&';// 玩家移动到新位置map[x + 2][y] = 'o';// 箱⼦移动到新位置x++;// 玩家坐标下移}}break;// 结束判断default :// 如果输⼊的是其他指令System.out.println("您输⼊的指令有误!");}}System.out.println("游戏结束");sc.close();}}。
推箱子java课程设计摘要
推箱子java课程设计摘要一、课程目标知识目标:1. 学生能掌握Java基础语法,包括变量、数据类型、运算符、控制结构等;2. 学生能理解面向对象编程的基本概念,如类、对象、封装、继承、多态;3. 学生能运用Java语言实现推箱子游戏的核心逻辑和界面展示;4. 学生了解基本的算法设计,如路径搜索、递归等。
技能目标:1. 学生具备运用Java语言编写程序解决问题的能力;2. 学生能够独立设计简单的游戏逻辑,具备一定的游戏开发能力;3. 学生通过课程实践,提高编程实践能力,具备良好的代码编写习惯;4. 学生能够运用所学知识,进行团队协作,共同完成项目。
情感态度价值观目标:1. 培养学生热爱编程,对计算机科学产生浓厚的兴趣;2. 培养学生主动探索、勇于创新的精神,提高解决问题的能力;3. 培养学生具备团队协作精神,学会与他人沟通、交流、分享;4. 培养学生具备良好的学习态度,养成勤奋学习、持续进步的习惯。
本课程针对高年级学生,充分考虑学生的认知水平和学习特点,以实践为导向,注重培养学生的动手能力和创新精神。
通过推箱子游戏的课程设计,使学生将所学知识应用于实际项目中,提高编程技能,激发学习兴趣,培养团队合作意识,为今后进一步学习计算机科学奠定坚实基础。
二、教学内容1. Java基础语法:变量、数据类型、运算符、控制结构(条件语句、循环语句);2. 面向对象编程:类与对象、封装、继承、多态;3. Java图形用户界面:Swing组件、事件处理;4. 游戏核心逻辑:地图设计、角色移动、箱子推动、胜利条件判定;5. 算法设计:路径搜索、递归算法;6. 团队协作与项目实践:项目分工、进度控制、代码整合与调试。
教学内容按照以下进度安排:第一周:Java基础语法复习,面向对象编程基本概念介绍;第二周:Swing图形用户界面设计与事件处理;第三周:推箱子游戏核心逻辑分析与设计;第四周:算法设计,实现角色移动、箱子推动等功能;第五周:团队协作,完成项目开发,进行测试与调试;第六周:项目展示,总结与评价。
推箱子java课程设计难点
推箱子java课程设计难点一、课程目标知识目标:1. 理解Java基本语法和面向对象编程思想;2. 学会使用Java编写推箱子游戏的逻辑和界面;3. 掌握数组的使用,解决二维空间内的物体移动问题;4. 了解游戏循环和事件处理机制。
技能目标:1. 能够运用Java编写简单的推箱子游戏程序;2. 培养逻辑思维和问题解决能力,通过编程解决游戏中的难题;3. 提高团队协作和沟通能力,共同分析并解决编程过程中的问题;4. 学会调试和优化代码,提高程序的性能。
情感态度价值观目标:1. 培养学生对编程的兴趣和热情,激发主动学习的动力;2. 培养学生的耐心和毅力,面对编程难题不轻言放弃;3. 培养学生的创新意识和探索精神,敢于尝试新的编程方法和思路;4. 培养学生团队协作精神,学会与他人共同完成任务。
课程性质:本课程为实践性较强的Java编程课程,旨在通过推箱子游戏的设计与实现,让学生在实际项目中掌握编程技能,提高解决问题的能力。
学生特点:学生处于高年级阶段,已具备一定的Java编程基础,具有一定的逻辑思维和问题解决能力。
教学要求:结合课程性质和学生特点,注重实践操作,引导学生通过实际项目掌握Java编程技能。
将课程目标分解为具体的学习成果,以便于教学设计和评估。
在教学过程中,关注学生的个体差异,提供个性化的指导和帮助。
二、教学内容1. Java基本语法回顾:变量、数据类型、运算符、控制语句(条件语句、循环语句);2. 面向对象编程:类与对象、构造方法、封装、继承、多态;3. 数组的使用:一维数组、二维数组;4. 简单的图形用户界面(GUI):Swing图形用户界面编程;5. 事件处理机制:事件监听、事件处理;6. 游戏循环设计:游戏状态管理、游戏逻辑更新、画面重绘;7. 推箱子游戏设计:- 游戏地图:地图数据结构、地图加载与显示;- 箱子与人物:物体移动逻辑、碰撞检测;- 游戏控制:键盘控制、触摸控制;- 游戏胜利条件:箱子到达目标位置。
用java实现推箱子(sokoban)游戏
推箱子游戏一、功能描述:➢可以通过面板上的按钮或是键盘上的pageup,pagedown键选择上下关➢可以通过面板上按钮或是键盘上的Backspace键后退,一直后退自己想要的位置,知道游戏开始时的位置。
➢可以通过面板上的按钮或是键盘上的字母r重新开始当前关卡游戏。
➢可以在复选框选择想要玩的关卡。
二、界面及运行截图三、源代码(三部分)1、地图类package box;import java.io.BufferedReader;import java.io.File;import java.io.FileNotFoundException;import java.io.FileReader;//读取字符文件类FileReader import java.io.IOException;public class map {int[][] map=new int[20][20];int manX,manY;public map(int level){String filepath="mapc/"+level+".txt";File file = new File(filepath);FileReader fr = null;//利用FileReader流来读取一个文件中的数据BufferedReader br = null;//字符读到缓存里try {fr = new FileReader(file);br = new BufferedReader(fr);for (int i = 0; i < 15; i++){String line = br.readLine();//以行为单位,一次读一行利用BufferedReader 的readLine,读取分行文本byte[] point = line.getBytes();//将字符串转换为字节数组for (int j = 0; j < 15; j++) {map[i][j] = point[j] - 48;// 根据ASCall码表要减掉30H(十进制的48)if (map[i][j] == 5 || map[i][j] == 6 || map[i][j] == 7|| map[i][j] == 8){manX = i;manY = j;}}}}catch (FileNotFoundException e){e.printStackTrace();//深层次的输出异常调用的流程}catch (IOException e){e.printStackTrace();//深层次的输出异常调用的流程}catch(NullPointerException e){e.printStackTrace();//深层次的输出异常调用的流程}finally {if (br == null){try{br.close();}catch (IOException e){e.printStackTrace();}br = null;}if (fr == null){try {fr.close();} catch (IOException e){e.printStackTrace();}fr = null;}}}public int[][] getMap() {return map;}public int getManX() {return manX;}public int getManY() {return manY;}}2、游戏运行类package box;import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.ItemEvent;import java.awt.event.ItemListener;import java.awt.event.KeyEvent;import java.awt.event.KeyListener;import java.util.*;import javax.swing.*;public class pushbox extends JFrame implements KeyListener,ActionListener{ map map_level=new map(1); //首次获取地图int[][] map=new int[15][15]; //地图上每个位置所对应的图片int[][] map_restart=new int[15][15]; //备用图片static int manX,manY; //人所处的位置static int level=1; //所处关卡static int step=0;Image[] picture; //地图上的所有图片ImageIcon[] image=new ImageIcon[10];Stack<Integer> back_stack = new Stack<Integer>(); //存储所前行的路径JButton next,previous,back,restart,exit; //按钮:下一关,上一关,重新开始,退出String current_level="第"+level+"关"; //当前所处关卡(右上角显示文本)String[] level_button=new String[13]; //复选框的容JComboBox selectBox; //选关复选框final int Up = 0;final int Down = 1;final int Left = 2;final int Right = 3;int[] dir_x = {-1, 1, 0, 0};int[] dir_y = {0, 0, -1, 1};public pushbox(){super("推箱子");getmap(map);previous=new JButton("上一关");next=new JButton("下一关");restart=new JButton("重新开始");back=new JButton("后退");exit=new JButton("退出游戏");for(int i=0;i<13;i++)level_button[i]="第"+Integer.toString(i+1)+"关";selectBox=new JComboBox(level_button);FlowLayout layout=new FlowLayout(); //布局模式Container c=getContentPane();c.setLayout(layout);layout.setAlignment(FlowLayout.CENTER); //控件在布局中的位置c.setBackground(Color.CYAN); //背景色c.add(previous);c.add(next);c.add(back);c.add(restart);c.add(selectBox);c.add(exit);previous.addActionListener((ActionListener) this);previous.addKeyListener(this);next.addActionListener((ActionListener) this);next.addKeyListener(this);back.addActionListener(this);back.addKeyListener(this);restart.addActionListener((ActionListener) this);restart.addKeyListener(this);exit.addActionListener((ActionListener) this);exit.addKeyListener(this);selectBox.addItemListener( //监听复选框点击事件new ItemListener(){public void itemStateChanged(ItemEvent e){if(e.getStateChange()==e.SELECTED){step=0;back_stack.clear(); //每次重新选关后都要清空路径栈level=selectBox.getSelectedIndex()+1; //获取所选的关卡map_level=new map(level); //重新获取对应关卡的地图getmap(map);current_level="第"+level+"关"; //右上角提示所处关卡文本的更新repaint(); //重画地图requestFocus(); //重新获取焦点(因为按钮事件后键盘事件不起作用)}}});for(int k=0;k<10;k++){image[k]=new ImageIcon("picture/"+k+".png"); //获取图片}picture=new Image[]{image[0].getImage(),image[1].getImage(),image[2].getImage(),image[3].getImage(),image[4].getImage(),image[5].getImage(),image[6].getImage(),image[7].getImage(),image[8].getImage(),image[9].getImage()};this.setFocusable(true);this.addKeyListener((KeyListener)this);setSize(640,640);setVisible(true);}//判断是否通关(方法是,检查地图中是否还有箱子编号4)public Boolean pass(){int p=0;for(int i=0;i<15;i++)for(int j=0;j<15;j++){if(map[i][j]==4) p++;}if(p==0) return true;else return false;}//获取地图上每个位置所对应的图片编号public void getmap(int[][] map){for(int i=0;i<15;i++)for(int j=0;j<15;j++)map[i][j]=map_level.map[i][j];manX=map_level.manX;manY=map_level.manY;}public void paint(Graphics g){super.paint(g);//提示信息back_stack.push(Down + 5); //这里是一个细节,先将“DOWN”存入栈g.drawString(current_level,500,90);g.drawString("第"+step+"步",400,90);g.drawString("用键盘上的R重新开始,Q退出游戏",200,565);g.drawString("用键盘pageup,pagedown切换关卡",200,580);g.drawString("用键盘上的上下左右键控制人的移动",200,600);g.drawString("用键盘上的Backspace键后退",200,620);//在面板上画地图for (int i = 0; i < 15; i++)for (int j = 0; j < 15; j++)g.drawImage(picture[map[i][j]],100+30*j,100+30*i, this);}public void Step(Graphics g){g.setColor(Color.cyan);g.drawString("第"+step+"步",400,90);step++;g.setColor(Color.BLACK);g.drawString("第"+step+"步",400,90);}public void move(int dir, Graphics g){int man = dir + 5;int dx = dir_x[dir];int dy = dir_y[dir];int x = manX;int y = manY;manX += dx;manY += dy;int origin_picture = map[manX][manY];int next_picture = map[manX + dx][manY + dy];if((map[manX][manY]==4||map[manX][manY]==3)&&(map[manX+dx][manY+dy]==2||map[ manX+dx][manY+dy]==4||map[manX+dx][manY+dy]==3)) //上面是箱子,箱子上面是墙或箱子{manX -= dx;manY -= dy;return ;}if(map[manX][manY]==2) //上面是墙{manX -= dx;manY -= dy;return ;}if(map[manX][manY]==1||map[manX][manY]==9){ //人上面是草地或是目的地g.drawImage(picture[man],100+30*manY,manX*30+100,this); //人的朝向变化if(map[x][y]==9) //原来位置是目的地g.drawImage(picture[9],100+30*y,100+30*x,this);else{ //原来位置是草地g.drawImage(picture[1],100+30*y,x*30+100,this);map[x][y]=1;}Step(g);}if((map[manX][manY]==4||map[manX][manY]==3)&&map[manX+dx][manY+dy]==1){//上面是箱子,箱子上面是草地g.drawImage(picture[man],100+30*manY,manX*30+100,this); //人的朝向变化if(map[manX][manY]==3) //若是移动一大目的地的箱子,原箱子位置值为9map[manX][manY]=9;if(map[x][y]==9) //原来位置是目的地g.drawImage(picture[9],100+30*y,100+30*x,this);else{ //原来位置是草地g.drawImage(picture[1],100+30*y,x*30+100,this);map[x][y]=1;}g.drawImage(picture[4],100+30*(manY+dy),(manX+dx)*30+100,this); //草地位置变箱子map[manX+dx][manY+dy]=4;Step(g);}if((map[manX][manY]==4||map[manX][manY]==3)&&map[manX+dx][manY+dy]==9){ //上面是箱子,箱子上面是目的地g.drawImage(picture[man],100+30*manY,manX*30+100,this); //人的朝向变化if(map[manX][manY]==3) //若是移动一大目的地的箱子,原箱子位置值为9map[manX][manY]=9;else map[manX][manY]=0;if(map[x][y]==9) //原来位置是目的地g.drawImage(picture[9],100+30*y,100+30*x,this);else { //原来位置是草地g.drawImage(picture[1],100+30*y,x*30+100,this);map[x][y]=1;}g.drawImage(picture[3],100+30*(manY+dy),(manX+dx)*30+100,this); //目的地位置变箱子map[manX+dx][manY+dy]=3;Step(g);}back_stack.push(next_picture);back_stack.push(origin_picture);back_stack.push(manY);back_stack.push(manX);back_stack.push(man);if(pass())JOptionPane.showMessageDialog(null, "恭喜你过关了!"); }//键盘事件public void keyPressed(KeyEvent e) {Graphics g=getGraphics();int dir ;switch(e.getKeyCode()){case KeyEvent.VK_UP:dir = Up;move(dir, g);break;case KeyEvent.VK_DOWN :dir = Down;move(dir, g);break;case KeyEvent.VK_LEFT:dir = Left;move(dir, g);break;case KeyEvent.VK_RIGHT:dir = Right;move(dir, g);break;case KeyEvent.VK_BACK_SPACE:back.doClick();break;case KeyEvent.VK_PAGE_DOWN :next.doClick();break;case KeyEvent.VK_PAGE_UP:previous.doClick();break;case KeyEvent.VK_R:restart.doClick();break;case KeyEvent.VK_Q :exit.doClick();break;}}public void keyReleased(KeyEvent e) {}public void keyTyped(KeyEvent e) {}//悔步后退public void step_back(Graphics g){g.setColor(Color.cyan);g.drawString("第"+step+"步",400,90);step--;g.setColor(Color.BLACK);g.drawString("第"+step+"步",400,90);}public void Back(){if(back_stack.size()==2)return;int dir=back_stack.pop() - 5; //获取上一步的方向int s = back_stack.pop();int t = back_stack.pop();int origin_picture = back_stack.pop();int netx_picture = back_stack.pop();int pre_dir = back_stElement();Graphics g=getGraphics();int dx = dir_x[dir];int dy = dir_y[dir];g.drawImage(picture[origin_picture],100+30*t,100+30*s,this);g.drawImage(picture[netx_picture],100+30*(t+dy),100+30*(s+dx),this);g.drawImage(picture[pre_dir],100+30*(t-dy),100+30*(s-dx),this);manX = s - dx;manY = t - dy;map[s][t] = origin_picture;map[s+dx][t+dy] = netx_picture;map[s-dx][t-dy] = pre_dir;step_back(g);}//按钮事件监听public void actionPerformed(ActionEvent e) {if(e.getSource()==restart){ //重新开始back_stack.clear(); //清空路径栈step=0;getmap(map);repaint();}else if(e.getSource()==exit) //退出游戏this.setVisible(false);else if(e.getSource()==next){ //下一关back_stack.clear();step=0;level++;if(level!=14){map_level=new map(level);getmap(map);current_level="第"+level+"关";repaint();}}else if(e.getSource()==previous){ //上一关back_stack.clear();step=0;level--;if(level!=0){map_level=new map(level);getmap(map);current_level="第"+level+"关";repaint();}}else if(e.getSource()==back)Back();requestFocus();}}3、开始界面package box;import java.awt.*;import java.awt.event.*;import javax.swing.*;public class Game extends JFrame implements ActionListener{ Image image[];ImageIcon icon;JButton start,tip,exit;Container c;public Game(){super("推箱子");c=getContentPane();FlowLayout layout=new FlowLayout();c.setLayout(layout);layout.setAlignment(FlowLayout.CENTER);icon=new ImageIcon("picture/game.png");image=new Image[]{icon.getImage()};start=new JButton("开始游戏");exit=new JButton("退出游戏");tip=new JButton("游戏说明");c.add(start);c.add(tip);c.add(exit);start.addActionListener(this);tip.addActionListener(this);exit.addActionListener(this);setSize(640,480);setVisible(true);}public void paint(Graphics g){super.paint(g);g.drawImage(image[0],10,65,this);}public static void main(String args[]){Game g=new Game();g.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}Overridepublic void actionPerformed(ActionEvent e) {if(e.getSource()==exit)this.setVisible(false);if(e.getSource()==start){this.setVisible(false);pushbox c=new pushbox();}if(e.getSource()==tip){String t="本游戏分为13关,难度逐关递增,可以自己选关";JOptionPane.showMessageDialog(null, t);}}}。
java推箱子游戏源代码(含推箱子的判断)
第一个Java文件:package xiaoA;import java.awt.Color;import java.awt.HeadlessException;import java.awt.event.KeyEvent;import java.awt.event.KeyListener;import javax.swing.ImageIcon;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JOptionPane;import javax.swing.JPanel;public class GameFrame extends JFrame {JPanel zhuobu = new JPanel();//工人JLabel worker = null;//箱子JLabel box = null;//目的地JLabel goal = null;JLabel[] walls = null;public static final int SPEED = 12;//设置图片大小int imgSize = 48;public void setImgSize(int imgSize){this.imgSize = imgSize;}public GameFrame(String title) throws HeadlessException { super(title);//构造方法中调用本类的其它方法this.initContentPane();this.addKeyListener(new KeyListener() {//键盘按下事件public void keyPressed(KeyEvent e) {//[2.5] 使工人可以移动int xSpeed = 0, ySpeed = 0;switch (e.getKeyCode()) {case KeyEvent.VK_LEFT :xSpeed = -SPEED;worker.setIcon(new ImageIcon("image/workerUp.gif"));break;case KeyEvent.VK_RIGHT :xSpeed = SPEED;worker.setIcon(new ImageIcon("image/workerUp.gif"));break;case KeyEvent.VK_UP :ySpeed = -SPEED;worker.setIcon(new ImageIcon("image/workerUp.gif"));break;case KeyEvent.VK_DOWN :ySpeed = SPEED;worker.setIcon(new ImageIcon("image/workerUp.gif"));break;default:return;}worker.setBounds(worker.getX() + xSpeed, worker.getY() + ySpeed, worker.getWidth(), worker.getHeight());//[2.7] 判断工人是否撞到墙壁for (int i = 0; i < walls.length; i++) {if(worker.getBounds().intersects(walls[i].getBounds())) {worker.setBounds(worker.getX() - xSpeed, worker.getY() - ySpeed, worker.getWidth(), worker.getHeight());}}//[3.2] 使工人可以推动箱子if (worker.getBounds().intersects(box.getBounds())) {box.setBounds(box.getX() + xSpeed, box.getY() + ySpeed, box.getWidth(), box.getHeight());//[3.3] 判断箱子是否撞到墙壁for (int i = 0; i < walls.length; i++) {if (box.getBounds().intersects(walls[i].getBounds())) {worker.setBounds(worker.getX() - xSpeed, worker.getY() - ySpeed, worker.getWidth(), worker.getHeight());box.setBounds(box.getX() - xSpeed, box.getY() - ySpeed, box.getWidth(), box.getHeight());}}//[3.4] 判断是否胜利if (box.getX()==goal.getX() && box.getY()==goal.getY()) { JOptionPane.showMessageDialog(null, "您赢啦!");}}}public void keyReleased(KeyEvent e) {}public void keyTyped(KeyEvent e) {}});}/***设置内容面板*/public void initContentPane() {zhuobu.setBackground(Color.red);zhuobu.setLayout(null);//调用父类的属性和方法super.setContentPane(zhuobu);}/***把某个图片以组件的方式加入窗体*@param imgPath图片路径*@param x x*@param y y*@param width宽度*@param height高度*@return添加完的组件*/public void addComponent(int tag, String imgPath, int x, int y) { ImageIcon img = new ImageIcon(imgPath);//创建JLabel并把ImageIcon通过构造方法传参传入//把食物放到盘子里JLabel componet = new JLabel(img);//设置盘子在桌布上的位置和大小componet.setBounds(x, y, imgSize, imgSize);//把盘子放到桌布上zhuobu.add(componet);switch (tag) {case 1:box = componet;break;case 2:goal = componet;break;case 3:worker = componet;break;}}public void addWall(String imgPath, int[][] loactions) { ImageIcon wallImg = new ImageIcon(imgPath);walls = new JLabel[66 + loactions.length];for (int i = 0; i < walls.length; i++) {//创建没每一个围墙,他们使用的是同一个图片walls[i] = new JLabel(wallImg);}for (int i = 0; i < walls.length; i++) {//创建没每一个围墙,他们使用的是同一个图片walls[i] = new JLabel(wallImg);}int index = 0;/*分别设置各个图片位置*/for (int i = 0; i < 14; i++) {//左边墙walls[index].setBounds(0, i * imgSize, imgSize, imgSize);zhuobu.add(walls[index]);index++;//右边墙walls[index].setBounds(20 * imgSize, i * imgSize, imgSize, imgSize);zhuobu.add(walls[index]);index++;}for (int i = 0; i < 19; i++) {//上边墙walls[index].setBounds((i + 1) * imgSize, 0, imgSize, imgSize);zhuobu.add(walls[index]);index++;//下边墙walls[index].setBounds((i + 1) * imgSize, 13 * imgSize, imgSize, imgSize);zhuobu.add(walls[index]);index++;}//添加中间障碍耦合解耦for (int i = 0; i < loactions.length; i++) {walls[index].setBounds(loactions[i][0]* imgSize, loactions[i][1]* imgSize, imgSize, imgSize);zhuobu.add(walls[index]);index++;}}}第二个Java文件:public class Run {public static void main(String[] args) {GameFrame gameFrame = new GameFrame("推箱子游戏…");//设置大小gameFrame.setBounds(100, 50, 21 * 48 + 5, 14 * 48 + 25);//窗体大小不可变gameFrame.setResizable(false);gameFrame.setImgSize(48);gameFrame.addComponent(3, "workerUp.png", 400, 100);gameFrame.addComponent(1, "box.png", 160, 60);gameFrame.addComponent(2, "goal.png", 80, 520);int[][] wallLocations ={{4, 5},{5, 5},{6, 5},{7, 5},{8, 5},{9, 5},{10, 5},{6, 8},{7, 8},{8, 8},{9, 8},{10, 8},{11, 5}};gameFrame.addWall("wall.png", wallLocations);gameFrame.setVisible(true);}}。
Java面向对象推箱子源代码(可扩展)
Java面向对象实现推箱子的源代码目录一、首先: (1)二、以下为工程中各个类的源代码: (1)1、Box (1)2、GameMainTest (3)3、Man (4)4、Map (6)5、MovingException (7)6、Out (8)一、首先:在eclipse中新建一个工程,包名和类名(工程结构)如下:二、以下为工程中各个类的源代码:源代码按对应的类名复制粘贴进去即可。
1、Boxpackage tuixiangzi;import java.util.Random;public class Box {private static Random ran = new Random();private static int x = ran.nextInt(10); //箱子所在的位置(随机) private static int y = ran.nextInt(10); //箱子所在的位置(随机) private int [][]map = Map.getArray();private int h = map.length - 1;private int l = map[h].length - 1;/*** 箱子左移*/public void boxLMove()throws MovingException{if(y-1 < 0) {throw new MovingException("You Can't Moving Left!");}if(Man.getX() == x && Man.getY() == y) {y=(y-1);}/*** 箱子右移*/public void boxRMove()throws MovingException{if(y+1 > l) {throw new MovingException("You Can't Moving Right!");}if(Man.getX() == x && Man.getY() == y) {y=(y+1);}}/*** 箱子上移*/public void boxUMove()throws MovingException{if(x-1 < 0) {throw new MovingException("You Can't Moving Up!");}if(Man.getX() == x && Man.getY() == y) {x=(x-1);}}/*** 箱子下移*/public void boxDMove()throws MovingException{if(x+1 > h) {throw new MovingException("You Can't Moving Down!");}if(Man.getX() == x && Man.getY() == y) {x=(x+1);}}/*** 判断箱子是否能移动(死亡)或者是否通关* @return*/public String judgOver() {String msg = null;if(x == Out.getX() && y == Out.getY()) {msg = "You Win!";return msg;if(x == 0 && y == 0 || x == h && y == l || x == 0 && y == l || x == h && y == 0) { msg = "Game Over!";return msg;}else {msg = " ";return msg;}}public static int getX() {return x;}public static void setX(int x) {Box.x = x;}public static int getY() {return y;}public static void setY(int y) {Box.y = y;}}2、GameMainTestpackage tuixiangzi;import java.util.Scanner;public class GameMainTest {private static Scanner sc;public static void main(String[] args){Map map = new Map();Man man = new Man();Box box = new Box();sc = new Scanner(System.in);map.printMap();//游戏开始,打印地图System.out.println("推箱子游戏开始!");do {System.out.println("w:↑ s:↓ a:← d:→ 回车确认移动");String key = sc.next();switch (key){case"a": //左移try {man.leftMove(key);box.boxLMove();} catch (MovingException e) {System.out.println("走不下去啦!");}map.cleanManAfter(Man.getX(), Man.getY()+1);break;case"d": //右移try {man.rightMove(key);box.boxRMove();} catch (MovingException e) {System.out.println("走不下去啦!");}map.cleanManAfter(Man.getX(), Man.getY()-1);break;case"s": //下移try {man.downMove(key);box.boxDMove();} catch (MovingException e) {System.out.println("走不下去啦!");}map.cleanManAfter(Man.getX()-1, Man.getY());break;case"w": //上移try {man.upMove(key);box.boxUMove();} catch (MovingException e) {System.out.println("走不下去啦!");}map.cleanManAfter(Man.getX()+1, Man.getY());break;}System.out.println("\n\n\n\n");System.out.println(box.judgOver());map.printMap();}while(true);}}3、Manpackage tuixiangzi;public class Man {private static int x = 0; //人所在的行位置private static int y = 0; //人所在的列位置private int [][]map = Map.getArray();private int h = map.length-1;private int l = map[h].length-1;/*** 向左移动* @param key 移动按键* @throws MovingException 无法移动异常*/public void leftMove(String key)throws MovingException{if(y-1 < 0) {throw new MovingException("You Can't Moving Left!");}if(key.equals("a")) {y=(y-1);}}/*** 向右移动* @param key 移动按键* @throws MovingException 无法移动异常*/public void rightMove(String key)throws MovingException{ if(y+1 > l) {throw new MovingException("You Can't Moving Right!");}if(key.equals("d")) {y=(y+1);}}/*** 向上移动* @param key 移动按键* @throws MovingException 无法移动异常*/public void upMove(String key)throws MovingException{if(x-1 < 0) {throw new MovingException("You Can't Moving Up!");}if(key.equals("w")) {x=(x-1);}}/*** 向下移动* @param key 移动按键* @throws MovingException 无法移动异常*/public void downMove(String key)throws MovingException{ if(x+1 > h) {throw new MovingException("You Can't Moving Down!");}if(key.equals("s")) {x=(x+1);}}public static int getX() {return x;}public static void setX(int x) {Man.x = x;}public static int getY() {return y;}public static void setY(int y) {Man.y = y;}}4、Mappackage tuixiangzi;public class Map {private static int array[][] = new int[10][10];/*** 打印地图布局*/public void printMap() {array[Man.getX()][Man.getY()] = 1; //初始化人array[Box.getX()][Box.getY()] = 3; //初始化箱子array[Out.getX()][Out.getY()] = 2; //初始化出口for(int i = 0; i < array.length; i++) {for(int j = 0; j < array[i].length;j++) {if(array[i][j] == array[Man.getX()][Man.getY()]) {System.out.print("♀ ");} else if(array[i][j] == 0) {System.out.print("□ ");} else if(array[i][j] == array[Box.getX()][Box.getY()]) {System.out.print("■ ");} else if(array[i][j] == array[Out.getX()][Out.getY()]) {System.out.print("→ ");}}System.out.println();}}/*** 清除人和箱子移动后上一步的位置* @param x* @param y* @return*/public int cleanManAfter(int x,int y) {return array[x][y]=0;}public static int[][] getArray() {return array;}public static void setArray(int[][] array) {Map.array = array;}}5、MovingExceptionpackage tuixiangzi;public class MovingException extends Exception{private static final long serialVersionUID = 1L;public MovingException() {super();}public MovingException(String message) {super(message);}public MovingException(String message, Throwable cause) {super(message, cause);}public MovingException(Throwable cause) {super(cause);}}6、Outpackage tuixiangzi;public class Out {//后期可扩展为出口出现的位置随机private static int x = 9; //初始化出口的位置private static int y = 9; //初始化出口的位置public static int getX() {return x;}public static void setX(int x) {Out.x = x;}public static int getY() {return y;}public static void setY(int y) {Out.y = y;}}。
Java课程设计推箱子游戏
图3 游戏主界面
图4 游戏成功界面
(2)打开推箱子游戏,点击“选项“按钮,选中选关,输入你想要玩的关数,例如第
3关,点击确定,游戏界面如图4所示:
图5开始选关界面
图6选关成功界面
(3)游戏的帮助功能也很强大,点击帮助按钮,选中“使用说明”,或是“关于”。
游戏界面如图6和图7所示:
图7使用说明界面
4.设计体会
为期两周的课程设计很快就结束了,回顾这两周,累并快乐着。
从老师开始给布置课程设计的题目、内容及要求到自己广泛借助互联网查阅资料并独立完成Java推箱子小应用程序;从两周前刚接到任务时的茫然与无助到两周后的清晰与明了;从对Java 的编辑器EditPlus和eclipse初步了解到熟练运用,历经了太多的困难。
对于环境变量的配置,我做到了知其然,知其所以然,对EditPlus的了解也完全上升了一个层次,从课堂上老师教给的在dos 界面中输入Javac 文件名.java编译、Java 文件名运行到在EditPlus中选中“工具”、“配置用户组“,设置编译和执行相关参数,按快捷键Ctrl+1编译、Ctrl+2运行,节省了大量时间,使编程效率有了很大的提高。
对于推箱子游戏,更是有了进一步的了解,其中用到了9张图片,用户可以通过改变图片来改变游戏的显示界面,当然,这个是不被允许的,因为每个程序的代码都有版权,但对于设计者而言,却可以更加清楚的了解代码的内部构造,达到熟能生巧的效果。
推箱子--java课程设计
推箱子--java课程设计一、课程目标知识目标:1. 理解并掌握Java基本语法结构,包括变量声明、数据类型、运算符和流程控制语句;2. 学会使用二维数组表示游戏地图,掌握数组的基本操作;3. 掌握面向对象编程的基本概念,包括类与对象、方法定义与调用;4. 理解“推箱子”游戏的逻辑规则,并能用Java语言实现。
技能目标:1. 能够独立设计并编写简单的“推箱子”游戏程序,实现游戏的基本功能;2. 培养学生运用计算机编程解决问题的能力,提高逻辑思维和算法设计能力;3. 学会使用调试工具,能对程序进行调试和优化,提高程序的可读性和效率。
情感态度价值观目标:1. 培养学生对编程的兴趣,激发学习计算机科学的热情;2. 培养学生良好的编程习惯,注重团队协作,学会分享与交流;3. 培养学生面对挑战的积极态度,敢于尝试,勇于克服困难。
分析课程性质、学生特点和教学要求,本课程目标旨在使学生在掌握Java编程基础知识的基础上,通过设计“推箱子”游戏,提高编程实践能力,培养创新思维和团队协作精神。
课程目标具体、可衡量,便于后续教学设计和评估。
二、教学内容1. Java基本语法- 变量声明与数据类型- 运算符与表达式- 流程控制语句(条件语句、循环语句)2. 二维数组与数组操作- 二维数组的定义与初始化- 数组的基本操作(遍历、赋值、查找)3. 面向对象编程基础- 类与对象- 方法定义与调用- 封装、继承、多态4. “推箱子”游戏逻辑设计- 游戏规则与需求分析- 地图表示与用户交互- 算法设计与实现5. 编程实践- 设计“推箱子”游戏界面- 编写游戏逻辑代码- 调试与优化程序6. 教学进度安排- 第1-2课时:复习Java基本语法- 第3-4课时:学习二维数组与数组操作- 第5-6课时:面向对象编程基础- 第7-8课时:“推箱子”游戏逻辑设计- 第9-10课时:编程实践与调试优化教学内容依据课程目标,结合课本章节,确保科学性和系统性。
java推箱子游戏的课程设计
java推箱子游戏的课程设计一、课程目标知识目标:1. 掌握Java基础语法,包括数据类型、运算符、控制结构等;2. 学会使用Java面向对象编程,包括类的定义、对象的创建、封装、继承和多态;3. 了解二维数组的使用,能通过数组实现游戏地图的表示;4. 掌握推箱子游戏的逻辑设计和实现。
技能目标:1. 培养学生的编程思维和逻辑思维能力;2. 提高学生解决实际问题的能力,学会分析问题、设计解决方案;3. 学会使用Java编写简单的图形用户界面程序,实现游戏交互;4. 学会运用调试工具进行程序调试,找出并修复程序中的错误。
情感态度价值观目标:1. 激发学生对编程的兴趣,培养学习计算机科学的热情;2. 培养学生的团队协作精神,学会与他人共同解决问题;3. 培养学生的创新意识和实践能力,鼓励学生尝试不同的解决方案;4. 培养学生面对困难时坚持不懈、勇于挑战的精神。
本课程针对高年级学生,结合学科特点和教学要求,旨在通过推箱子游戏的开发,帮助学生巩固Java编程知识,提高编程技能,培养良好的编程习惯和团队协作能力。
课程目标具体、可衡量,为教学设计和评估提供了明确的指导。
1. Java基础语法复习:数据类型、变量、运算符、控制结构(条件语句、循环语句);2. 面向对象编程:类的定义、构造方法、成员变量、成员方法、封装、继承、多态;3. 二维数组:数组的概念、声明、初始化、遍历、应用场景;4. 图形用户界面(GUI):Swing库简介、窗口、面板、按钮、事件处理;5. 游戏逻辑设计:游戏规则、地图表示、角色移动、箱子推动、胜利条件;6. 程序调试与优化:调试工具使用、常见错误分析、性能优化;7. 项目实践:分组进行推箱子游戏的开发,包括需求分析、设计、编码、测试和调试。
教学内容依据课程目标进行选择和组织,保证科学性和系统性。
教学大纲明确以下安排和进度:- 第一章:Java基础语法复习(1课时)- 第二章:面向对象编程(2课时)- 第三章:二维数组(1课时)- 第四章:图形用户界面(GUI)(2课时)- 第五章:游戏逻辑设计(2课时)- 第六章:程序调试与优化(1课时)- 第七章:项目实践(4课时)教学内容与课本紧密关联,确保学生能够将所学知识应用于实际项目中,提高编程实践能力。
java语言课程设计推箱子
java语言课程设计推箱子一、教学目标本章节的教学目标旨在让学生掌握Java语言基础,学会使用Java编写简单的推箱子游戏。
具体包括以下三个方面的目标:1.知识目标:使学生了解Java语言的基本语法、数据结构、控制流程和面向对象编程思想。
2.技能目标:培养学生具备使用Java语言编写程序的能力,能够独立完成推箱子游戏的设计与实现。
3.情感态度价值观目标:培养学生对编程的兴趣,提高学生解决问题的能力,培养学生的创新精神和团队合作意识。
二、教学内容本章节的教学内容主要包括以下几个部分:1.Java语言基本语法:变量、数据类型、运算符、控制流程(循环、分支)。
2.数据结构:数组、链表、栈和队列。
3.面向对象编程:类和对象、封装、继承、多态。
4.推箱子游戏设计与实现:游戏规则、地图表示、角色控制、碰撞检测、算法。
三、教学方法为了达到本章节的教学目标,我们将采用以下几种教学方法:1.讲授法:讲解Java语言的基本语法、数据结构和面向对象编程思想。
2.案例分析法:分析推箱子游戏的实现案例,让学生了解游戏设计的思路和方法。
3.实验法:让学生动手编写推箱子游戏代码,提高学生的实际操作能力。
4.讨论法:分组讨论游戏设计中遇到的问题,培养学生的团队合作和解决问题的能力。
四、教学资源为了支持本章节的教学,我们将准备以下教学资源:1.教材:《Java语言程序设计》。
2.参考书:《Java核心技术》、《游戏编程模式》。
3.多媒体资料:PPT课件、推箱子游戏教学视频。
4.实验设备:计算机、网络环境。
5.在线编程平台:LeetCode、牛客网等,供学生练习和提交作业。
五、教学评估本章节的教学评估将采用多元化的评价方式,全面客观地评估学生的学习成果。
评估方式包括:1.平时表现:考察学生在课堂上的参与程度、提问回答、小组讨论等,占总评的20%。
2.作业:布置与推箱子游戏相关的编程作业,检查学生的编程能力和理解程度,占总评的30%。
java项目报告
《Java应用开发》课程设计报告题目:推箱子小游戏指导老师:姓名:专业:计算机科学与技术班级:日期:目录一、系统总体设计 (1)(一)设计目标及完成功能 (1)(二)系统结构设计 (1)二、数据库设计 (2)三、详细设计 (3)(一)界面设计 (3)(二)系统设计 (3)(三)关键技术及算法 (4)四、测试 (4)五、安装使用说明 (5)参考文献: (5)一、系统总体设计(一)设计目标及完成功能设计一个经典的推箱子小游戏,在窗体里有墙,箱子,胜利的标志,和工人,工人具有推箱子的功能,箱子会根据工人的运动而运动,墙起到阻碍的用,箱子碰到墙会停下来,工人碰到墙也会停下来,当所有箱子都停在胜利的标志的位置时,游戏便胜利。
1.窗口功能说明:设计了一个窗口,窗口的布局和背景是根据我手机上的推箱子小游戏来设计的,窗口里有墙,箱子,工人,和胜利的标志。
2.菜单栏或工具栏说明:如果设计了菜单或工具栏,分别说明包括哪些项及其各自实现什么操作.图1-2二、数据库设计系统流程E-R 图:图2否三、详细设计(一) 界面设计这些是程序需要用到的图片。
墙的设计用数组添加图片,其他图片添加需要SETBOUNS来设定它的位置和大小。
重新开始游戏按钮需要布局到南面。
(二) 系统设计本程序只定义了一个GameFrame类:方法继承关系作用实现的功能GameFrame extends JFrame 定义所有成员,箱子,工人等等。
主类,包含了所有的功能。
keyPressed 没有响应工人和箱子的移动以及工人、箱子、墙之间的碰撞检测。
响应工人和箱子的移动以及工人、箱子、墙之间的碰撞检测。
keyReleased 没有完成定义没有表3-2(三) 关键技术及算法本程序主要利用窗体来加载游戏,用面板来装入所有成员,墙用数组来设定它的位置,箱子、工人、墙和胜利的标志的图片均用JLabel来装载,在主类里添加键盘监听器,监听器里添加了keyPressed、keyReleased、keyTyped方法,其中keyPressed方法里实现了工人的移动,箱子的移动,箱子与工人、墙之间的碰撞检测,游戏的胜利,keyReleased、keyTyped均设置为空。
基于java推箱子课程设计
基于java推箱子课程设计一、课程目标知识目标:1. 让学生掌握Java语言基础,包括变量、控制结构、数组等;2. 让学生了解面向对象编程的基本概念,如类、对象、封装、继承和多态;3. 使学生能够运用Java编写简单的推箱子游戏,理解游戏逻辑和算法。
技能目标:1. 培养学生运用Java语言解决问题的能力,特别是逻辑思维和编程技巧;2. 培养学生独立设计和实现小型游戏的能力,提高创新意识和实践操作能力;3. 培养学生团队协作和沟通能力,共同完成推箱子游戏的开发和优化。
情感态度价值观目标:1. 激发学生对计算机编程的兴趣,培养持续学习和探究精神;2. 培养学生面对困难和挑战时保持积极的态度,勇于尝试和解决问题;3. 培养学生遵守编程规范,养成良好的编程习惯,注重代码质量和效率。
分析课程性质、学生特点和教学要求,本课程将目标分解为以下具体学习成果:1. 知识掌握:学生能够熟练运用Java语言编写基本程序,了解面向对象编程的基本概念;2. 技能培养:学生能够独立设计并实现推箱子游戏,掌握游戏逻辑和算法,提高编程能力;3. 情感态度价值观:学生热爱编程,积极参与团队协作,面对挑战保持积极心态,注重编程规范和代码质量。
二、教学内容1. Java语言基础:- 变量、数据类型和运算符;- 控制结构(顺序、分支、循环);- 数组及其应用;- 方法及其重载。
2. 面向对象编程基础:- 类和对象;- 封装、继承和多态;- 抽象类和接口;- 常用类库。
3. 推箱子游戏设计与实现:- 游戏规则和逻辑分析;- 游戏场景绘制和用户交互;- 算法设计(如深度优先搜索、广度优先搜索);- 面向对象设计思路及实现。
教学大纲安排:第一周:Java语言基础学习,包括变量、数据类型、运算符和控制结构;第二周:数组和方法的学习,以及面向对象编程基础;第三周:深入学习面向对象编程,包括封装、继承和多态;第四周:游戏逻辑分析和场景绘制,学习算法设计;第五周:推箱子游戏功能实现,面向对象设计思路实践;第六周:项目优化和团队协作,进行作品展示和点评。
推箱子_Java课程设计报告书
《面向对象程序设计》课程设计报告题目:经典推箱子趣味游戏设计与实现院(系):信息科学与工程学院专业班级:计算机科学与技术1201班学生:程伟学号: 20121183011指导教师:吴奕20 14 年 12 月 29 日至20 15 年 1 月 9 日华中科技大学武昌分校制面向对象程序设计课程设计任务书目录1需求与总体设计 (1)1.1需求分析 (1)1.2总体设计 (2)2详细设计 (4)2.1 mainFrame类 (4)2.2 mainpanel类 (5)2.3S o u n d类 (7)2.4 Readmap类 (7)3 编码实现 (9)3.1游戏源码 (9)4系统测试 (42)总结 (45)1需求与总体设计1.1需求分析1.1.1功能结构图推箱子游戏的功能结构图如图1.1所示。
在系统中,编写4个Java类:mainFrame,mainpanel,Sound,Readmap;分别对应初始化游戏界面,游戏操作,背景音乐,绘制地图。
图1.11.1.2 UML类图推箱子系统除了上述4个Java类外,还需要Java系统提供的一些重要的类。
这些类之间的UML图如图1.2所示。
图1.21.2总体设计1.2.1 mainFrame类mainFrame类负责创建系统的主窗口。
mainFrame类有多种重要类型的对象,这些对象构成了游戏界面的简明与美观,并且通过监听实现方法赋予了这些组件的相应功能。
MainFrame类通过调用Readmap类来实现将地图绘制在游戏主界面,通过调用Sound 类来实现对背景音乐的管理,实现音乐开关以及选择上一曲下一曲的操作。
设计中包括了所有你所能直观见到的图形界面,窗体的大小,下拉菜单中的功能菜单,使得玩家能够很直观的见到所有游戏中的功能.界面中有菜单, 包括:"选项""设置音乐""帮助"。
按钮包括:"重来""悔一步""第一关""上一关""下一关""最终关""选关""音乐"等。
推箱子--java课程设计
推箱子–java课程设计一、教学目标本课程的学习目标包括知识目标、技能目标和情感态度价值观目标。
知识目标要求学生掌握Java编程的基本语法和结构,了解面向对象编程的思想。
技能目标要求学生能够运用Java语言编写简单的应用程序,具备解决问题的能力。
情感态度价值观目标要求学生培养对编程的兴趣和热情,增强自我学习和探索的精神。
二、教学内容教学内容将根据课程目标进行选择和,确保内容的科学性和系统性。
教学大纲将明确教学内容的安排和进度,指出教材的章节和列举内容。
本课程将重点讲解Java编程的基本语法和结构,包括数据类型、控制结构、函数、数组、字符串等。
同时,将引导学生了解面向对象编程的思想,学习类和对象的概念,掌握封装、继承、多态等特性。
三、教学方法为了激发学生的学习兴趣和主动性,将采用多种教学方法。
讲授法将用于讲解基本概念和语法,使学生掌握基础知识。
讨论法将用于引导学生进行思考和交流,培养学生的问题解决能力。
案例分析法将用于分析实际编程案例,使学生能够将理论知识应用于实际问题中。
实验法将用于让学生亲自动手编写代码,培养学生的实践能力。
四、教学资源为了支持教学内容和教学方法的实施,将选择和准备适当的教学资源。
教材将是主要的教学资源,将提供系统的理论知识和学习指导。
参考书将提供额外的学习材料和案例分析,以丰富学生的学习体验。
多媒体资料将用于辅助讲解和展示,使学生更加直观地理解编程概念。
实验设备将用于进行编程实践,提供学生实际操作的机会。
五、教学评估为了全面反映学生的学习成果,将设计合理的评估方式。
评估方式包括平时表现、作业和考试等。
平时表现将根据学生在课堂上的参与程度、提问和回答问题的积极态度进行评估。
作业将布置相关的编程练习,要求学生在规定时间内完成,并根据完成的质量和创新性进行评估。
考试将包括选择题、填空题和编程题,以测试学生对Java编程知识的掌握程度。
评估方式将客观、公正,能够全面反映学生的学习成果。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//代码如下,图片在最下面,已添加注释package boxend;import java.awt.Color;import java.awt.Menu;import java.awt.MenuBar;import java.awt.MenuItem;import java.awt.event.KeyEvent;import java.awt.event.KeyListener;import javax.swing.*;public class Boxend extends JFrame {public static final int SPEED = 12;//加入菜单条MenuBar menubar;Menu menu;MenuItem itemExit, itemBack;JPanel panel = new JPanel();JLabel worker = new JLabel(new ImageIcon("workerLeft.png"));int[] pos = new int[]{0, 0, 1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6, 0, 7, 0, 8, 0, 9, 0, 10, 0, 11, 0, 12, 0, 0, 1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6, 0, 7, 0, 8, 0, 9, 0, 10, 0, 11, 0, 12,1, 12, 2, 12, 3, 12, 4, 12, 5, 12, 6, 12, 7, 12, 8, 12, 9, 12, 10, 12, 11, 12, 12, 12,12, 1, 12, 2, 12, 3, 12, 4, 12, 5, 12, 6, 12, 7, 12, 8, 12, 9, 12, 10, 12, 11, 12, 12,1, 4, 2, 4, 3, 4, 4, 4, 5, 4, 4, 8, 4, 9, 4, 10, 4, 11, 7, 6, 8, 6, 9, 6, 10, 6, 11, 6, 9, 1, 9, 2, 9, 3 };JLabel walls[] = new JLabel[pos.length / 2];JLabel box = new JLabel(new ImageIcon("box.png"));JLabel box1 = new JLabel(new ImageIcon("box.png"));JLabel box2 = new JLabel(new ImageIcon("box.png"));JLabel goal = new JLabel(new ImageIcon("goal.png"));JLabel goal1 = new JLabel(new ImageIcon("goal.png"));JLabel goal2 = new JLabel(new ImageIcon("goal.png"));public Boxend() {menubar = new MenuBar();menu = new Menu("file");itemExit = new MenuItem("exit");menu.add(itemExit);itemBack = new MenuItem("back");menu.add(itemBack);menubar.add(menu);setMenuBar(menubar);this.setTitle("推箱子");this.setBounds(200, 60, 640, 675);this.setContentPane(panel);panel.setLayout(null);panel.setBackground(Color.black);//加入工人panel.add(worker);worker.setBounds(48, 48, 48, 48);//itemExit.addActionListener(this);//加入围墙for (int i = 0; i < walls.length; i++) {walls[i] = new JLabel(new ImageIcon("wall.png"));panel.add(walls[i]);walls[i].setBounds(pos[i * 2] * 48, pos[i * 2 + 1] * 48, 48, 48);}//加入箱子和胜利标志panel.add(box);box.setBounds(96, 144, 48, 48);panel.add(goal);goal.setBounds(6 * 48, 3 * 48, 48, 48);panel.add(box1);box1.setBounds(8 * 48, 9 * 48, 48, 48);panel.add(goal1);goal1.setBounds(9 * 48, 10 * 48, 48, 48);panel.add(box2);box2.setBounds(2 * 48, 6 * 48, 48, 48);panel.add(goal2);goal2.setBounds(2 * 48, 7 * 48, 48, 48);this.setV isible(true);//工人可以移动this.addKeyListener(new KeyListener() {public void keyPressed(KeyEvent e) {int xSpeed = 0, ySpeed = 0;switch (e.getKeyCode()) {case KeyEvent.VK_LEFT:xSpeed = -SPEED;worker.setIcon(new ImageIcon("workerLeft.png"));break;case KeyEvent.VK_RIGHT:xSpeed = SPEED;worker.setIcon(new ImageIcon("workerRight.png"));break;case KeyEvent.VK_UP:ySpeed = -SPEED;worker.setIcon(new ImageIcon("workerUp.png"));break;case KeyEvent.VK_DOWN:ySpeed = SPEED;worker.setIcon(new ImageIcon("workerDown.png"));break;}worker.setBounds(worker.getX() + xSpeed, worker.getY() + ySpeed, worker.getWidth(), worker.getHeight());//工人是否碰到墙壁for (int i = 0; i < walls.length; i++) {if (worker.getBounds().intersects(walls[i].getBounds())) {worker.setBounds(worker.getX() - xSpeed, worker.getY() - ySpeed, worker.getWidth(), worker.getHeight());}}//工人推动箱子if (worker.getBounds().intersects(box.getBounds())) {box.setBounds(box.getX() + xSpeed, box.getY() + ySpeed, box.getWidth(), box.getHeight());//箱子是否碰到墙壁for (int i = 0; i < walls.length; i++) {if (box.getBounds().intersects(walls[i].getBounds())) {box.setBounds(box.getX() - xSpeed, box.getY() - ySpeed, box.getWidth(), box.getHeight());}}//箱子是否碰到箱子if ((box.getBounds().intersects(box1.getBounds())) || (box.getBounds().intersects(box1.getBounds()))) {box.setBounds(box.getX() - xSpeed, box.getY() - ySpeed, box.getWidth(), box.getHeight());}}//工人推动箱子if (worker.getBounds().intersects(box1.getBounds())) {box1.setBounds(box1.getX() + xSpeed, box1.getY() + ySpeed, box1.getWidth(), box1.getHeight());//箱子是否碰到墙壁for (int i = 0; i < walls.length; i++) {if (box1.getBounds().intersects(walls[i].getBounds())) {box1.setBounds(box1.getX() - xSpeed, box1.getY() - ySpeed,box1.getWidth(), box1.getHeight());}}//箱子是否碰到箱子if ((box1.getBounds().intersects(box.getBounds())) || (box1.getBounds().intersects(box2.getBounds()))) {box1.setBounds(box1.getX() - xSpeed, box1.getY() - ySpeed, box1.getWidth(), box1.getHeight());}}//工人推动箱子if (worker.getBounds().intersects(box2.getBounds())) {box2.setBounds(box2.getX() + xSpeed, box2.getY() + ySpeed, box2.getWidth(), box2.getHeight());//箱子是否碰到墙壁for (int i = 0; i < walls.length; i++) {if (box2.getBounds().intersects(walls[i].getBounds())) {box2.setBounds(box2.getX() - xSpeed, box2.getY() - ySpeed, box2.getWidth(), box2.getHeight());}}//箱子是否碰到箱子if ((box2.getBounds().intersects(box.getBounds())) || (box2.getBounds().intersects(box1.getBounds()))) {box2.setBounds(box2.getX() - xSpeed, box2.getY() - ySpeed, box2.getWidth(), box2.getHeight());}}//游戏胜利if ((box.getX() == goal.getX() && box.getY() == goal.getY()) && (box1.getX() == goal1.getX() && box1.getY() == goal1.getY())&& (box2.getX() == goal2.getX() && box2.getY() == goal2.getY())) {JOptionPane.showMessageDialog(null, "您赢啦!");System.exit(0);}}@Overridepublic void keyTyped(KeyEvent e) {throw new UnsupportedOperationException("Not supported yet.");}@Overridepublic void keyReleased(KeyEvent e) {throw new UnsupportedOperationException("Not supported yet.");}});}public static void main(String[] args) {new Boxend();}}。