西安邮电学院
通信与信息工程学院
生产实习报告
专业班级:
学生姓名:
学号(班内序号):
20## 年 3 月 23 日
西安邮电学院通信与信息工程学院院(系)
生产实习过程考核表
西安邮电学院通信与信息工程学院生产实习考核表
一实验目的
(1)熟悉Java编程语言与开发环境的搭建
(2)熟悉Android的特性、开发环境的搭建及Android基本控件的学习。
(3)尝试Android系统的开发,在平台上开发一些小程序
(4)尽力掌握程序的调试。
二 实验内容
1. 程序简介:
贪吃蛇游戏:(1)主界面显示
(2)具有开始、暂停、退出的功能。
2. 项目简介
Android简介
Android是Google于20##年11月5口宣布的基于Linux平台的开源手机操作系统的名称,该平台由操作系统、中间件、用户界面和应用软件组成,号称是首个为移动终端打造的真正开放和完整的移动软件。可以把它简单理解成Linux上套了一个TAVA的壳。
Android的平台基本上是免费的,虽然有部份原生链接库会要求费用,但大部份是免权利金。Android的程序可以采用JAVA开发,因为它的虚拟机(Virtual Machine) Dalvik,只是它将JAVA的byte code转成自己的格式,回避掉需要付给SUN有关JAVA的授权费用。因此,Android开发环境是需要JDK的。
Java简介
它最初被命名为Oak,目标设定在家用电器等小型系统的编程语言,来解决诸如电视机、电话、闹钟、烤面包机等家用电器的控制和通讯问题。由于这些智能化家电的市场需求没有预期的高,Sun放弃了该项计划。就在Oak几近失败之时,随着互联网的发展,Sun看到了Oak在计算机网络上的广阔应用前景,于是改造了Oak,以“Java”的名称正式发布。
Java 编程语言的风格十分接近C、C++语言。Java是一个纯的面向对象的程序设计语言,它继承了 C++ 语言面向对象技术的核心,Java舍弃了C ++语言中容易引起错误的指针(以引用取代)、运算符重载(operator overloading)、多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java SE 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。
Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码,从而实现了“一次编译、到处执行”的跨平台特性。不过,每次的编译执行需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。但在 J2SE 1.4.2 发布后,Java 的执行速度有了大幅提升。与传统程序不同,Sun 公司在推出 Java 之际就将其作为一种开放的技术。全球数以万计的 Java 开发公司被要求所设计的 Java 软件必须相互兼容。“Java 语言靠群体的力量而非公司的力量”是 Sun 公司的口号之一,并获得了广大软件开发商的认同。这与微软公司所倡导的注重精英和封闭式的模式完全不同。Sun 公司对 Java 编程语言的解释是:Java 编程语言是个简单、面向对象、分布式、解释性、健壮、安全与系统无关、可移植、高性能、多线程和动态的语言。
3 Android开发环境搭建
3.1 Windows下Java编程环境的配置
1.在甲骨文官方网站(http://www.oracle.com/technetwork/java/javase/downloads/index.html)下载Java Platform(JDK)后,安装JDK,安装过程中可以自定义安装目录等信息,例如我们选择安装目录为D:\Program Files\Java\jdk1.7.0_03;
2.安装完成后,右击“我的电脑”,点击“属性”;
3.选择“高级”选项卡,点击“环境变量”;
4.在“系统变量”中,设置3项属性,JAVA_HOME,PATH,CLASSPATH(大小写无所谓),若已存在则点击“编辑”,不存在则点击“新建”;
5.JAVA_HOME指明JDK安装路径,就是刚才安装时所选择的路径D:\Program Files\Java\jdk1.7.0_03,此路径下包括lib,bin,jre等文件夹;
Path使得系统可以在任何路径下识别java命令,设为:
%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;
CLASSPATH为java加载类(classorlib)路径,只有类在classpath中,java命令才能识别,设为:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;
%JAVA_HOME%就是引用前面指定的JAVA_HOME;
6.“开始”->;“运行”,键入“cmd”;
7.键入命令“java-version”,“java”,“javac”几个命令,出现如下画面,说明环境变量配置成功;
8.至此,环境配置完成。
3.2 Eclipse开发软件的安装
1.可以在Eclipse官网(http://www.eclipse.org/downloads/)下载Eclipse软件,选择Eclipse IDE for Java Developers并注意32bit或者64bit,根据自己Windows系统下载即可。
2.下载后直接解压即可,不用安装,双击eclipse.exe即可运行。
3.3 Android SDK安装
1.在 http://developer.android.com/sdk/index.html可以下载最新的Android SDK,如下图:
2.直接默认安装好就可以,安装好后如下图所示:
3. 在用户变量中新建PATH值为:Android SDK中的tools绝对路径,本机为D:\Program Files\Android\android-sdk\tools。
4.安装成功后,运行android –h,如果出现如下画面说明安装成功。
3.4 ADT安装
1.目前Android开发所用的开发工具是Eclipse,在Eclipse编译IDE环境中,安装ADT,为Android开发提供开发工具的升级或者变更,简单理解为在Eclipse下开发工具的升级下载工具。
2.打开 Eclipse IDE,进入菜单中的 "Help" -> "Install New Software"
点击Add按钮,弹出对话框要求输入Name和Location:Name自己随便取,Location输入http://dl-ssl.google.com/android/eclipse。如下图所示
3. 确定返回后,在work with后的下拉列表中选择我们刚才添加的ADT,我们会看到下面出有Developer Tools,展开它会有Android DDMS和Android Development Tool,勾选他们。 如下图所示:
4.然后就是按提示一步一步next。
完成之后:
选择Window > Preferences...
在左边的面板选择Android,然后在右侧点击Browse...并选中SDK路径,本机为:
D:\Program Files\Android\android-sdk,因为路径有空格,所以正确的配置路径应该写成:D:\PROGRA~1\Android\android-sdk。
5.点击Apply、OK。配置完成。
4 程序源代码
package com.fit.android.game;
public final class R {
public static final class attr {
}
public static final class drawable {
public static final int icon=0x7f020000;
}
public static final class layout {
public static final int main=0x7f030000;
}
public static final class string {
public static final int app_name=0x7f040001;
public static final int hello=0x7f040000;
}
}
package com.fit.android.game;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Handler;
import android.view.View;
public class GameView extends View {
public int f = 0;
Snake snake = new Snake(320, 320);
Node random;
boolean runFlag = false;
Handler handler = new Handler();
Handler panelHandler;
int s=300;
Runnable updateThead = null;
public GameView(Context context, Handler pHandler) {
super(context);
panelHandler = pHandler;
random = getRandom();
updateThead = new Runnable() {
public void run() {
runFlag = true;
int result = snake.move(random);
if (result == 3 || result == 4) {
panelHandler.sendEmptyMessage(f);
handler.removeCallbacks(updateThead);
}
switch (result) {
case Snake.MOVE:
break;
case Snake.EAT:
f = f + 10;
if(s>100){
s = s - 10;
}
random = getRandom();
break;
case Snake.BREAK:
runFlag = false;
break;
case Snake.SWAP:
runFlag = false;
break;
}
postInvalidate();
if (runFlag) {
handler.postDelayed(this, s);
}
}
};
}
@Override
protected void onDraw(Canvas canvas) {
Paint p = new Paint();
p.setAntiAlias(true);
p.setColor(Color.GRAY);
canvas.drawRect(0, 0, 320, 320, p);
p.setColor(Color.GREEN);
random.draw(canvas, p);
snake.show(canvas);
}
public int getThreads() {
return 1;
}
public Node getRandom() {
int x = ((int) (Math.random() * 32)) * 10 + 5;
int y = ((int) (Math.random() * 32)) * 10 + 5;
while (!snake.checkRandom(x, y)) {
x = ((int) (Math.random() * 32)) * 10 + 5;
y = ((int) (Math.random() * 32)) * 10 + 5;
}
return new Node(x, y);
}
}
package com.fit.android.game;
import android.app.Activity;
import android.os.Bundle;
import android.view.KeyEvent;
public class MainActivity extends Activity {
Snake snake;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
GameView view = new GameView(this, null);
snake = view.snake;
setContentView(view);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_DPAD_UP:
snake.changeDirect(Snake.UP);
break;
case KeyEvent.KEYCODE_DPAD_RIGHT:
snake.changeDirect(Snake.RIGHT);
break;
case KeyEvent.KEYCODE_DPAD_DOWN:
snake.changeDirect(Snake.DOWN);
break;
case KeyEvent.KEYCODE_DPAD_LEFT:
snake.changeDirect(Snake.LEFT);
break;
}
return super.onKeyDown(keyCode, event);
}
}
package com.fit.android.game;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
public class MyActivity extends Activity {
Snake snake;
GameView view;
TextView tx;
Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
int score = msg.what;
tx.setText("您得到的总分数为:" + score);
view.handler.removeCallbacks(view.updateThead);
view.snake = new Snake(320, 320);
view.random = view.getRandom();
view.f = 0;
snake = view.snake;
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
view = new GameView(this, handler);
snake = view.snake;
LinearLayout lean = new LinearLayout(this);
tx = new TextView(this);
lean.setOrientation(LinearLayout.VERTICAL);
view.setLayoutParams(new LayoutParams(320, 320));
lean.addView(view);
LinearLayout lean1 = new LinearLayout(this);
lean1.setOrientation(LinearLayout.HORIZONTAL);
Button btn1 = new Button(this);
btn1.setText("开始");
btn1.setTextSize(24);
Button btn2 = new Button(this);
btn2.setText("暂停");
btn2.setTextSize(24);
Button btn3 = new Button(this);
btn3.setText("退出游戏");
btn3.setTextSize(24);
lean1.addView(btn1);
lean1.addView(btn2);
lean1.addView(btn3);
lean.addView(lean1);
lean.addView(tx);
setContentView(lean);
btn1.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
tx.setText("");
view.handler.post(view.updateThead);
}
});
btn2.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
view.handler.removeCallbacks(view.updateThead);
}
});
btn3.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
tx.setText("您的总分是:" + view.f);
view.handler.removeCallbacks(view.updateThead);
view.snake = new Snake(320, 320);
view.random = view.getRandom();
view.f = 0;
snake = view.snake;
}
});
}
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_DPAD_UP:
snake.changeDirect(Snake.UP);
break;
case KeyEvent.KEYCODE_DPAD_RIGHT:
snake.changeDirect(Snake.RIGHT);
break;
case KeyEvent.KEYCODE_DPAD_DOWN:
snake.changeDirect(Snake.DOWN);
break;
case KeyEvent.KEYCODE_DPAD_LEFT:
snake.changeDirect(Snake.LEFT);
break;
}
return super.onKeyDown(keyCode, event);
}
}
package com.fit.android.game;
import android.graphics.Canvas;
import android.graphics.Paint;
public class Node {
private int x;
private int y;
public Node(int x, int y) {
super();
this.x = x;
this.y = y;
}
public void draw(Canvas c, Paint p) {
c.drawCircle(x, y, 5, p);
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + x;
result = prime * result + y;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Node other = (Node) obj;
if (x != other.x)
return false;
if (y != other.y)
return false;
return true;
}
package com.fit.android.game;
import java.util.LinkedList;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
public class Snake {
public static final int UP = 1;
public static final int RIGHT = 2;
public static final int DOWN = 3;
public static final int LEFT = 4;
public static final int MOVE = 1;
public static final int EAT = 2;
public static final int BREAK = 3;
public static final int SWAP = 4;
private LinkedList<Node> self = new LinkedList<Node>();
private int direct = RIGHT;
private int widthX;
private int widthY;
public Snake(int wx, int wy) {
self.add(new Node(25, 5));
self.add(new Node(15, 5));
self.add(new Node(5, 5));
widthX = wx;
widthY = wy;
}
public void changeDirect(int d) {
switch (direct) {
case UP:
if (d == DOWN)
return;
break;
case RIGHT:
if (d == LEFT)
return;
break;
case DOWN:
if (d == UP)
return;
break;
case LEFT:
if (d == RIGHT)
return;
break;
}
direct = d;
}
public int move(Node bean) {
Node head = null;
Node first = self.get(0);
switch (direct) {
case UP:
head = new Node(first.getX(), first.getY() - 10);
break;
case RIGHT:
head = new Node(first.getX() + 10, first.getY());
break;
case DOWN:
head = new Node(first.getX(), first.getY() + 10);
break;
case LEFT:
head = new Node(first.getX() - 10, first.getY());
break;
}
if (head.getX() < 0 || head.getX() > widthX || head.getY() < 0
|| head.getY() > widthY) {
return BREAK;
}
for (int i = 0; i < self.size(); i++) {
if (head.equals(self.get(i))) {
return SWAP;
}
}
self.add(0, head);
if (head.equals(bean)) {
return EAT;
}
self.remove(self.size() - 1);
return MOVE;
}
public void show(Canvas c) {
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setColor(Color.RED);
self.get(0).draw(c, paint);
paint.setColor(Color.YELLOW);
for (int i = 1; i < self.size(); i++) {
self.get(i).draw(c, paint);
}
}
public boolean checkRandom(int x, int y) {
for (int i = 0; i < self.size(); i++) {
if (self.get(i).getX() == x && self.get(i).getY() == y) {
return false;
}
}
return true;
}
}
4.贪吃蛇程序截图
(1)主界面显示
(2)贪吃蛇运行界面
三实验结果及心得
(1)实验结果是成功实现了预定功能,能在贪吃蛇启动时随时暂停。
(2)通过这次生产实习,我们熟练掌握了JAVA的编程,并学会了基本的基于安卓的基本应用程序的开发,不仅锻炼了自己的动手能力,也提高了自己的思考和解决问题的能力。
(3)对每次的设计,要有一个清晰的程序设计思路和一个完整的软件流程图,在设计程序时,要反复思考,反复修改,不断改进是程序设计成功的必经之路。发现,提出,分析,解决问题和实践能力的提高都会受益于我在以后的学习,工作和生活中,在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。
指导教师评语:
实 验 成 绩:
指导(辅导)教师 :