java推箱子课程设计
java推箱子

//代码如下,图片在最下面,已添加注释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();}}。
推箱子游戏课程设计c

推箱子游戏课程设计c一、课程目标知识目标:1. 学生能够理解推箱子游戏中的程序设计基本概念,掌握游戏规则逻辑表达方法。
2. 学生能够运用所学编程知识,设计并实现具有基本功能的推箱子游戏。
3. 学生理解并掌握游戏中坐标系统、角色移动算法和碰撞检测的相关知识。
技能目标:1. 学生通过实践操作,提高逻辑思维和问题解决能力,能够将复杂问题分解为简单步骤。
2. 学生培养独立编程能力,学会使用合适的编程语句和结构来实现游戏逻辑。
3. 学生通过小组合作,锻炼团队协作和沟通技巧,共同完成游戏设计任务。
情感态度价值观目标:1. 学生培养对计算机编程的兴趣,激发创造力和探究精神,形成积极的学习态度。
2. 学生在游戏设计过程中,学会面对挑战,培养坚持不懈和解决问题的耐心。
3. 学生通过推箱子游戏,理解编程在生活中的应用,认识到科技与日常生活紧密相关,增强社会责任感。
课程性质:本课程为信息技术课程,以实践操作为主,理论讲解为辅,注重培养学生的动手能力和实际应用能力。
学生特点:考虑到学生所在年级,课程内容设计将结合学生好奇心强、动手欲望高、团队协作意识逐步形成等特点。
教学要求:课程要求学生在掌握编程基础知识上,通过实践加深理解,鼓励创新思维和团队合作,实现游戏设计的目标。
教学过程将目标分解,确保每个学生都能达到具体的学习成果,为后续学习奠定基础。
二、教学内容1. 理论知识:- 游戏设计基本概念:游戏规则、游戏流程、角色与道具。
- 编程语言基础:变量、数据类型、运算符、控制结构(条件语句、循环语句)。
- 坐标系统与图形用户界面:理解坐标系在游戏中的应用,掌握简单图形界面的构建。
2. 实践操作:- 推箱子游戏规则设计:学习如何将游戏规则转化为程序逻辑。
- 角色移动算法:掌握角色在不同方向上的移动算法实现。
- 碰撞检测:学习如何检测角色与箱子、墙壁之间的碰撞。
3. 教学大纲:- 第一阶段:游戏设计基本概念学习,介绍推箱子游戏,引导学生分析游戏规则。
java实现推箱子游戏学士学位论文

Ja va实现推箱子游戏摘要社会在进步,人们生活质量也在日益提高。
高强度的压力也接踵而来。
社会中急需出现新的有效方式来缓解人们的压力。
此次设计符合了社会需求,java推箱子游戏可以让人们在闲暇之余,体验游戏的乐趣。
具有操作简单,易于上手的特点。
推箱子游戏的玩法十分简单——控制人物绕过障碍物,到达目的地。
此次试验基于java语言。
将游戏地图做成通用的关卡设计,关卡用文本实现在文本文件里设置好关卡, 游戏核心模块中图片随机生成采用了数字和图片绑定,运用随机函数以及数组交换的算法,实现了游戏图片初始化状态,有效的解决了图片排布问题,方案简单易行。
充分运用堆栈的存储特点实现悔棋功能。
用迭代计算小人和箱子的移动,一个计算人是否能到达某一个格子一个是计算箱子是否能到达相邻的某一个格子。
舒缓的音乐配合有趣的步骤,相信能引起很多人的兴趣。
作为一个具有悠久历史的游戏,也能够引起人的怀念和共鸣。
关键词压力;游戏;java;多功能iJava implementation of the Sokoban gameAbstractSocial progress, quality of life is also increasing. High-intensity pressure also follow. The emergence of new social urgently needed an effective way to relieve people's stress. This is designed to meet the needs of the community, java Sokoban game allows people in her spare time, experience the fun of the game. With simple operation, easy to use features.Sokoban game play is very simple - control the character around obstacles to reach the destination. The test is based on java language. The game map made generic level design, checkpoints set up checkpoints to achieve with a text in a text file, the game core module uses a randomly generated digital images and pictures binding, using a random array of functions and algorithms exchange to achieve a game pictures initialization state, effectively solve the problem of picture arrangement, the program is simple. Make full use of the storage characteristics of the stack to achieve undo function. Mobile computing and boxes of iterative villain, a calculation whether one can reach a certain grid is to calculate whether a case can reach a neighboring lattice. Soothing music with interesting step, which will hopefully lead to a lot of people's interest. As a game with a long history, but also can cause people to miss and resonance.Key Words Pressure; games; java; multifunctionii目录摘要 (i)Abstract............................................................................................................................. i i 引言. (1)1 系统分析 (2)1.1 技术可行性分析 (2)1.1.1 可行性目的 (2)1.1.2 可行性研究前提 (2)1.1.3 算法可行性分析 (2)1.1.4 平台选择 (4)1.2 需求分析 (8)1.2.1 引言 (8)1.2.2 游戏需求 (8)1.2.3 软硬件需求 (8)1.2.4 接口控制 (9)1.3 方案论证 (9)1.3.1 C++语言的优点 (9)1.3.2 Java语言的优点 (10)1.3.3 C语言的优点 (11)1.3.4 方案选择 (12)2 概要设计 (14)2.1 游戏设计分析 (14)2.1.1 地图文件的引用 (14)2.1.2 程序运逻辑 (15)2.1.3 绘图 (15)2.1.4 显示平台 (15)2.2 注意事项 (15)2.3 游戏流程图 (15)2.4 函数模型 (16)3 详细设计 (19)3.1 游戏总体结构与代码 (19)3.2 选关模块 (20)3.3 地图的绘制形成 (21)3.4 小人与箱子移动的算法 (23)3.5 小人上下移动模块 (24)3.6 悔棋模块 (26)3.7 音乐控制 (27)4 游戏测试 (29)4.1 软件测试 (29)4.1.1 软件测试简介 (29)4.1.2 测试方法 (29)4.1.3 测试步骤 (30)4.2 游戏系统性能分析 (30)结论 (31)参考文献 (32)致谢 (33)原文 (34)翻译 (40)引言策略性游戏可以锻炼人的思维能力还能缓解人的压力,使人们暂时忘却生活当中的烦恼,增强人们的逻辑思维能力,游戏的艺术美也吸引着越来越多的玩家和厂商,寓教于乐,在放松人们心情的同时还可以活跃双手,在节奏越来越快的生活中,游戏如清风般扑来,丰富了人们的生活,随着时代的进步,游戏产业逐渐壮大,成为人们生活中不可或缺的一部分。
j2me设计论文-推箱子

《面向对象程序设计II》 -—J2ME 课程设计论文题目:推箱子学院:计算机与信息工程学院专业:计算机科学与技术班级:计算机06-7班姓名:安清雨学号:08起止时间:2008.12.21--2008.12.31成绩:课程设计任务书一、设计题目:《推箱子》二、设计内容:当大多数的人还将眼神停留在短信和彩铃上的时候,手机遇上游戏的际遇也在演绎它的精彩。
“推箱子”就是其中之一,本设计针对推箱子实现了新游戏,选关,恭喜过关,继续或重玩等过程。
可以清楚的演示各个画面的切换和一些游戏开发的类库。
三、设计要求:1、开始显示初始化游戏界面,主界面显示各种键的功能以及菜单-新游戏和选关。
2、开始玩游戏,如果赢了可进入下一关或重来。
采用确定和取消来实现以上功能。
3、如果选关,则出现选关界面,按确定开始选关,取消则返回初始化界面。
指导教师:王艳涛教研室主任:2008 年12月31 日本科课程设计论文摘要J2ME平台被认为是最杰出的手机游戏平台,它为开发者、设备制造商、网络通信公司和消费者广泛接受。
它有一些非常重要的特征对所有组织都有益。
因为J2ME应用在不同设备上都是便携式的,他们常常可在网络上下载和执行。
本设计通过Canvas或gameCanvas才能画到屏幕上,通过他们以及各种类库来进行设计推箱子游戏,最后编程实现了全过程。
关键词:J2ME 面向对象Canvas gameCanvas推箱子本科课程设计论文目录课程设计成绩评定表............................................................................. 错误!未定义书签。
课程设计任务书. (II)摘要 (II)目录..................................................................................................................................... I II1 设计内容 (1)2 设计过程 (1)2.1设计方案的论证 (1)2.2概要设计 (3)2.3界面设计图 (4)2.4代码实现 (6)3 设计总结 (7)参考文献 (7)附录:程序源代码 (8)本科课程设计论文1 设计内容当大多数的人还将眼神停留在短信和彩铃上的时候,手机遇上游戏的际遇也在演绎它的精彩。
基于java的推箱子游戏解析

基于JAVA的推箱子游戏前言在这个充满竞争的社会里,随着生活节奏的不断加快,人们的生活水平越来越繁忙,因此,越来越多人感到无比的烦躁与巨大的压力,这些压力也带给人们诸多烦恼。
所以如何解除现代人的生活压力,释放心中苦闷已经成为现代人的共同心愿。
而本次的这个基于JAVA的推箱子小游戏正是使用JAVA语言并且结合于EditPlus编译器,为大家开发了一款适合的、休闲娱乐的游戏,在娱乐的同时也给忙碌的上班族们开拓了另一个思考问题的空间。
基于JAVA的推箱子小游戏主要分为初始化模块,画图模块,移动小人模块,移动箱子模块以及功能控制模块。
玩家是通过控制小人的移动来推动箱子,需要避过障碍物与死角才能将其推放到指定位置从而达到过关的目的。
每关的难易程度各异,不仅适合人们休闲娱乐,还有助于开发智力,提高人们思考问题能力与想象能力,改善思考方式,拓展思维。
关键词:JAVA;解压;推箱子;休闲娱乐AbstractIn this competitive society, along with the accelerating pace of life, people's living standard more and busier, therefore, more and more people feel very upset and enormous pressure, the pressure also gives people a lot of trouble. So how to relieve the pressure of modern life, release the pain has become the common aspiration of the people. But this time based on the JAVA Push Box Game is the use of JAVA language and the combination of EditPlus compiler; we developed a suitable, recreational game, in the entertainment but also for busy office workers to develop another thinking space.Based on the JAVA Push Box Game consists of initialization module, drawing module, mobile SIM module, mobile box module and control module. Game player is controlled through a small mobile drive box, need to avoid obstacles and dead angle can be pushed into the specified location so as to achieve the purpose of clearance. Each level of difficulty degree is different, not only for recreation, also contribute to the development of intelligence, improve people's thinking ability and imagination ability, improve the way of thinking, the development of thinking.Key Words:JAVA; Relieve pressure; Push box; Recreation and entertainment目录前言 (I)Abstract (II)1.可行性研究 (2)1.1设计目的 (2)1.2可行性研究前提 (2)1.3可行性分析 (2)1.4结论意见 (3)2.需求分析 (3)2.1引言 (3)2.2游戏需求 (3)2.3软硬件需求 (4)硬件环境需求: (4)软件环境: (4)2.4接口控制 (4)2.5方案论证 (4)2.5.1.C++语言的优点 (4)2.5.2.Java语言的优点 (5)2.5.3.方案选择 (6)3.概要设计 (7)3.1游戏设计分析 (7)3.3.1.地图文件的引用 (7)3.3.2.程序运逻辑 (7)3.3.3.绘图 (7)3.3.4.显示平台 (7)3.2 注意事项 (8)3.3 游戏流程图 (8)4.详细设计 (9)4.1游戏总体结构与代码 (9)结论 (21)参考文献 (22)致谢 (23)引言在人类的社会生活当中,游戏占有很大的比重,并且随着社会的发展而不断发展。
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;}}。
推箱子游戏设计与实现
方案选择
3.概要设计
3.1游戏设计分析
地图注意事项
3.3游戏流程图
4.详细设计
4.1游戏总体结构与代码
结论
参考文献
致谢
1.可行性研究
1.1设计目的
灵活运用自己在学校学习期间所学到的理论知识和实际动手技能,并结合自
己于课外查找到的资料, 该推箱子游戏设计并幵发基于JAVA使自己能够熟悉和 熟练应用开发过程及相关技能,培养独立思考能力,测试学习结果,实践和提高 编程能力,并为今后的工作打下坚实基础的实际能力。
子主要分为初始化、画图、移动小人、移动箱子以及功能控制共五个模块。 玩家可以通过控制游戏中的小人的移动来实现推动箱子,同时需要避开障碍 物和死角方能将箱子推放到正确位置从而过关。每关的难易程度各不相同, 不仅可以供人们用以娱乐,还有助于开发智力,提高人们思考问题与想象的
能力,改善人们的思维方式,拓展思维。
关键词:JAVA解压 推箱子 游戏
Abstract
In today's competitive era of fast-paced, people 's living level is becoming more and more busy, because of this, an increasing number of people have felt irritability of emptiness and pressure, these also bring people many psychological and physical puzzles. So how to alleviate the pressure of contemporary life, has become the common aspiration of the people. This time the based on Java Sokoban gameis using the Java language and the combination of the eclipses of the compiler developed such a suitable for leisure game, in a relaxed but also to the busy people to open another thinking space. This is based on the JAVAdevelopment of the push box is divided into initialization, drawing, moving people, moving boxes and a total of five functional control module. Players can control the gamethrough the villain's mobile to achieve the promotion of the box, while the need to avoid obstacles and dead side to push the box to the correct position so that. Each level of difficulty is different, not only can be used for people to entertain, but also helps to develop intelligence, improve people's ability to think about problems and imagination, improve people's way of thinking, expand thinking.
Java游戏编程原理与实践教程课件 第5章--陈锐 夏敏捷主编
3.前方P1是箱子 在前面2种情况中,只要根据前方P1处的物体就可以判断出工人是否可以移 动,而在第3种情况中,需要判断箱子前方P2处的物体才能判断出工人是否 可以移动。此时有以下可能: (1)P1处为箱子(Box)或者放到目的地的箱子(BOXONEND),P2处为 通道(GRASS); 工人可以进到P1方格;P2方格状态为箱子。修改相关位置格子的状态值。 (2)P1处为箱子(Box)或者放到目的地的箱子(BOXONEND),P2处为 目的地(END); 工人可以进到P1方格;P2方格状态为放置好的箱子。修改相关位置格子的 状态值。 (3)P1处为箱子(Box),P2处为墙(WALL); 退出规则判断,布局不做任何改变。 综合前面的分析,可以设计出整个游戏的实现流程
人民邮电出版社
第5章 推箱子游戏
经典的推箱子是一个来自日本的古老游戏,目的是在训练你 的逻辑思考能力。在一个狭小的仓库中,要求把木箱放到指 定的位置,稍不小心就会出现箱子无法移动或者通道被堵住 的情况,所以需要巧妙的利用有限的空间和通道,合理安排 移动的次序和位置,才能顺利的完成任务。
游戏规则 可以假设工人移动趋势方向向右,其他方向原理是一致的。P1,P2分别代表工 人移动趋势方向前两个方格。
1.前方P1是围墙 如果工人前方是围墙(即阻挡工人的路线) { 退出规则判断,布局不做任何改变; } 2.前方P1是通道(GRASS)或目的地(END) 如果工人前方是通道或目的地 { 工人可以进到P1方格;修改相关位置格子的状态值。 }
每个格子状态值分别用枚举类型值: // 定义一些常量,对应地图的元素 final byte WALL = 1, BOX = 2, BOXONEND = 3, END = 4, MANDOWN = 5, MANLEFT = 6, MANRIGHT = 7, MANUP = 8, GRASS = 9, MANDOWNONEND = 10,MANLEFTONEND = 11, MANRIGHTONEND = 12, MANUPONEND = 13; Wall(1)代表墙,Box(2)代表箱子,BOXONEND(3)代表放到目的地的箱子, END(4)代表目的地; MANDOWN(5)向下的人,MANLEFT(6)向左的人MANRIGHT(7)向右的人, MANUP(8)向上的人;GRASS(9)代表通道。 MANDOWNONEND(10)站在目的地向下的人,MANLEFTONEND(11)站在目的地向 左的人,MANRIGHTONEND(12)站在目的地向右的人,MANUPONEND(13)站在目 的地向上的人。 存储的原始地图中格子的状态值数组采用相应的整数形式存放。
Java实现2.5D游戏
Java实现2.5D推箱子游戏1. 引言通常的概念中,2D也就是所谓的二维,也就是平面图形——即由X与Y坐标构成的图形,其内容由水平的X轴向与垂直的Y轴描绘确定,也就是由长和高的形成所谓的二维平面。
而所谓3D,也称之为三维。
其图形内容除了有水平的X轴向与垂直的Y轴向外还有进深的Z轴,故称三维(XYZ),也就是由长、宽、高三项要素形成所谓的三维立体。
2D与3D的主要区别在于,3D可以包含360度的信息,能从各个角度去表现,构成近似于现实空间的有质感视角;而2D通常只能表现如表格、棋盘版的平面数据。
3D的立体感、光景效果要比二维平面图形要好的多,因为它的立体、光线、阴影都是相对真实存在的,而2D显然不具备这些优势。
高拟真度、高自由度使得3D图形大受欢迎。
所谓的2.5D,介乎于模真的3D与完全平面的2D之间。
利用斜45度的2D图片来得到3D效果,即模拟了3D的空间感,也兼具2D的灵动简单,是一种“优势”的综合体。
因此2.5D在现在乃至未来的一段较长时间里还会和3D并存,直到3D图形的开发效率及表现形式能彻底取代2.5D为止。
本游戏采用2.5D技术开发立体效果的推箱子游戏,效果如图1所示,玩家可以通过方向键控制人物移动箱子到目的地(蓝色方块)。
图1 游戏开始后的界面2. 2.5D游戏设计思路在2.5D推箱子游戏中利用斜45度视角,所以假如产生如图2所示14×14的网格,则需要绘制地图中多边形,而不是矩形,其代码如下:图2 2.5D游戏的网格界面public void myDrawRect(Graphics g, int x ,int y){//绘制多边形Graphics2D g2D=(Graphics2D)g;if(g2D==null){return;}GeneralPath path = new GeneralPath();path.moveTo(x+14, y);path.lineTo(x+53, y+10);path.lineTo(x+37, y+37);path.lineTo(x-2, y+26);path.lineTo(x+14, y);g2D.fill(path); //g.draw(myPath);}对于图2所示网格采用map1数组存储,列号向右逐次增加,行序号向左逐次增加。
使用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();}}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(8)音乐关(开) :默认为开,点击自动关闭音乐和开启音乐.
(9)更换音乐:从不同的音乐中选取适合玩家的音乐.
程序中主要方法说明
)
(1)界面框架与按钮设计
界面设计中包括了,所有你所直观见到的图形界面,窗体的大小,下拉菜单 中的功能菜单,使得玩家能够很直观的见到所有游戏中的功能.界面中有菜单, 包括:"选项""设置音乐""帮助", , .按钮包括:"重来""悔一步""第一关", , ,"上一关""下一关""最终关""选关""音乐", , , , . 详细代码:
⑥"5"代表"小人面部朝下";
⑦"6"代表"小人面部朝左";
⑧"7"代表"小人面部朝右";
⑨"8"代表"小人面部朝上";
⑩"9"代表"箱子已经到达点位。
(3)推箱子游戏的游戏性
其主要功能是给用户一个友好的游戏界面,游戏中包括 50 关的地图,推箱 子这个游戏的 50 个地图是事先完成的,将所有地图上面的信息以数字的形式储 存在一个 20*20 的二维数组当中;然后,每一关都按照数组重新绘制地图,这样 就拥有了 50 张地图
!
btnlast=new JButton("上一关");
btnnext=new JButton("下一关");
btnchoose=new JButton("选关");
btnfirst=new JButton("第1关");
btnover=new JButton("最终关");
btnmuc=new JButton("音乐关");
(5)移动的代码
在本游戏系统中,给人的视觉感受应该是能感受都动作的变化,逼真的人物 动作会使系统更有效.通过控制人物,箱子,空地,障碍物在数组中的位置的改 变来控制移动动作.
(6)栈的应用
推箱子中的数据存储是很重要的,不然无法进行"悔一步"的操作.本系统 采用栈的存储方式来存储并控制人物,箱子的移动和地图的变换.悔一步操作让 玩家有了反悔的一步,这节省玩家的时间,避免因错位导致重新开始
(renew);
(last);
(next);
…
(choose);
(back);
();
(exit);
(this);
(this);
(this);
(this);
~
(this);
(this);
Menu setmuc=new Menu(" 设置音乐");
(nor);
(qin);
(po);
(guang);
(eye);
(1)音乐调用代码如下:
class Sound
¥
{
String path=new String("musics\\");
String file=new String("");
Sequence seq;
Sequencer midi;
boolean sign;
void loadSound()
{
】
try {
推箱子趣味游戏
1. 课程设计的目的
随着科学技术的发展,人们的生活水平越来越繁忙,在充满竞争的社会条件下,压力往往带给人们很多烦恼,所以合理的解压方式称为现代人的共同心愿. 为了给大家提供一个合理的解压平台, 我们在本次课程设计中为大家开发了一款适合休闲娱乐的小游戏, 本次课程设计是配合 JAVA 程序设计课程,深入学习掌握 JAVA 语言,熟练 运用 Java 工具对系统的编写.通过课程设计各个项目的综合训练,培养学生实 际分析问题,编程和动手能力,提高学生的综合素质.
、
(this);
(this);
(this);
(this);
(this);
Menu help=new Menu(" 帮助");
(about);
(this);
,
MenuBar bar=new MenuBar();
(choice);
(setmuc);
(help);
setMenuBar(bar);
(false);
MenuItem nor=new MenuItem(" 默认");
MenuItem eye=new MenuItem(" eyes on me");
》
MenuItem about=new MenuItem(" 关于推箱子...");
mainFrame()
{
super("推箱子");
setSize(720,700);
》
3. 设计结果与分析
程序运行结果
程序的运行结果如下图所示:
图二 推箱子游戏第一关界面
图三 推箱子游戏第一关界面
)
尚需解决的问题
游戏的背景音乐比较单一,可以通过在“选项”模式中添加“背景音乐导入”模块,导入玩家自己喜欢的音乐
程序部分代码
(1)界面框架与按钮设计
class mainFrame extends JFrame implements ActionListener,ItemListener
{
file=e;
}
}
(2)物移动代码:
void moveup()
{
|
if(map[manY-1][manX]==2||map[manY-1][manX]==4)
{
if(maptmp[manY][manX]==4||maptmp[manY][manX]==9)
map[manY][manX]=4;
else
:
5. 参考文献
[1] 马朝晖(译).JAVA教程(第4版).北京:人民邮电出版社,2007
[2] 王国辉等.JAVA程序设计自学手册.北京:人民邮电出版社,2008
[3]耿祥义.JAVA2实用教程.北京:清华大学出版社,2006
[4]朱仲杰.JAVA2全方位学习.北京:机械工业出版社,2006
[5]张思民.JAVA程序设计实践教程.北京:清华大学出版社,2006
setVisible(true);
setResizable(false);
setLocation(150,10);
"
setDefaultCloseOperation;
Container cont=getContentPane();
(null);
;
Menu choice=new Menu(" 选项");
add(btnrenew);
add(btnlast);
:
add(btnnext);
add(btnchoose);
add(btnfirst);
add(btnover);
add(btnmuc);
add(btnback);
(625,100,80,30);
(this);
'
(625,150,80,30);
(this);
Sound sound;
JComboBox jc=new JComboBox();
MenuItem renew=new MenuItem(" 重新开始");
MenuItem back=new MenuItem(" 悔一步");
MenuItem last=new MenuItem(" 上一关");
。
MenuItem next=new MenuItem(" 下一关");
(2)地图的绘制形成
地图以二维数组的形式进行存储的,不同的数字有着不同的含义.在地图当中不同的数字代表不同的含义我当时是将 0~9 解读成为不同的图形与图像.
①"0"代表"地图以内的空位";
②"1"代表"地图中的边缘";
③"2"代表"地图以内的空位非点位;
④"3"代表"地图中的箱子";
&
⑤"4"代表"点位";
MenuItem choose=new MenuItem(" 选关");
MenuItem exit=new MenuItem(" 退出");
MenuItem qin=new MenuItem(" 琴萧合奏");
MenuItem po=new MenuItem(" 泡泡堂");
MenuItem guang=new MenuItem(" 灌篮高手");
[6]汤一平.Java语言程序设计.北京:科学出版社,2006
[7]刘艺.Java程序设计大学教程.北京:机械工业出版社,2006
,
[8]耿祥义.Java课程设计.北京:清华大学出版社,2003
[9] Sharon Zakhour. Java教程.北京:人民邮电出版社,2007
6. 附录
程序具体代码:
seq=(new File(path+file));
midi=();
();
(seq);
();
;}Βιβλιοθήκη %catch (Exception ex)