目录
1.1课程设计的目的
1.2本选题的内容要求
1.3 软件开发运行环境
2.1设计思路
2.2软件总体结构图
2.3主要功能模块的设计
3.1 开始界面模块
3.1.1进入游戏设计
3.1.2退出游戏设计
3.1.3开始界面主要代码
3.2 游戏主界面显示模块
3.2.1游戏界面设计
3.2.2游戏界面鱼雷、炸弹、船艇设计
3.2.3游戏界面的主要代码
3.3 游戏按钮模块设计
3.3.1游戏开始按钮功能设计
3.3.2游戏暂停按钮功能设计
3.3.3游戏规则按钮功能设计
3.3.4游戏重新开始按钮功能设计
3.3.5游戏退出按钮功能设计
3.3.6游戏继续按钮功能设计
1.引言
1.1课程设计的目的
轮船大战游戏是一款经典的射击游戏,玩家需要通过控制战舰来消灭敌人并获得高分。本次课程设计通过开发轮船大战游戏,帮助学生掌握Android Studio开发工具的使用,深入了解Android平台的开发流程,提高学生的编程能力和实践经验。
1.2本选题的内容要求
游戏界面:游戏界面应该具有美观性和用户体验性,能够吸引玩家的眼球并提供良好的游戏体验。
游戏玩法:游戏玩法应该简单易懂,容易上手,同时要有足够的挑战性,让玩家能够体验到游戏的乐趣和刺激感。
游戏操作:游戏操作应该简单明了,易于掌握,不会让玩家感到疲惫或烦躁。
游戏规则:游戏规则应该明确简单,让玩家能够清楚地知道如何得分、如何获胜、如何失败等。
1.3 软件开发运行环境
本软件开发平台: Windows10系统
本软件集成开发环境: Android studio
本软件运行环境: Windows 7 或 以上版本
2.总体设计
2.1设计思路
游戏界面设计:游戏界面应该具有良好的视觉效果和用户体验,实现更加流畅的游戏效果和更高的游戏性能。游戏界面应该注重美观性和用户体验,保证游戏的可玩性和趣味性。
游戏玩法设计:游戏玩法应该简单易懂,容易上手,同时要有足够的挑战性,让玩家能够体验到游戏的乐趣和刺激感。
游戏操作设计:游戏操作应该简单明了,玩家可以通过屏幕来控制自己的舰艇进行移动和攻击。
代码质量设计:代码应该具有良好的可读性和可维护性,符合Android开发的规范和标准。代码中应该注重代码的重用性和模块化设计,让代码更加易于维护和扩展。
2.2软件总体结构图
图 2-1 轮船大战总体结构图
2.3主要功能模块的设计
- 开始界面模块
模块布局:该模块实现是进入游戏界面和退出游戏界面,单击进入游戏界面,会绘制游戏场景,还有得分、等级、生命等。
- 游戏主界面显示模块
主界面的布局:从上往下依次是天空、玩家船舰和海底以及随机生成的敌方船舰。
- 游戏按钮模块设计
游戏按钮模块布局:分别是开始按钮和退出按钮,如果点击了开始按钮,游戏开始,开始按钮Text变为暂停按钮,如果继续点击暂停按钮,会弹出对话框,显示继续游戏、游戏规则、重开开始、退出游戏。
3.详细设计与实现
3.1 开始界面模块
3.1.1进入游戏设计
开始游戏界面模块主要有进入游戏和退出游戏按钮,可以方便玩家进入游戏和退出游戏。
3.1.2退出游戏设计
开始游戏的主界面如下图所示,在主界面中对按钮的参数进行了调整使其更加美观。整体布局采用纵向排列。
图 3-1 开始界面图
3.1.3开始界面主要代码
(1) 进入游戏、退出游戏按钮的点击事件
public void onClick(View v) {
switch (v.getId()){
case R.id.start_btn:
//跳转界面GameActivity
startActivity(new
Intent(MainActivity.this,GameActivity.class));
//当您的活动完成并应该关闭时调用此函数。
finish();
break;
case R.id.exit_btn:
System.exit(0);
break;
}
}
3.2 游戏主界面显示模块
3.2.1游戏界面设计
顶部左边是得分、等级和生命的显示,顶部右边是开始、退出按钮的显示,实现开始游戏和退出游戏功能。下方是天空、轮船、敌方船舰和炸弹,实现场景显示,让用户更有画面体验感。底部三个按钮:分别是左移、右移以及射击,方便用户进行操作。
3.2.2游戏界面鱼雷、炸弹、船艇设计
1. 鱼雷设计:轮船大战中的鱼雷是玩家发送的,玩家可以通过鱼雷与敌方战舰战斗,鱼雷的数量会每2s/个,当玩家发射鱼雷击中敌方战舰,敌方战舰产生爆炸,玩家计分,并随着累计,等级提升。
图 3-3 鱼雷设计图
2. 得分、等级、生命设计:轮船大战中玩家可以通过发射鱼雷,消灭敌方船舰,等级提升。
图 3-4 得分、等级和生命设计图
3.玩家船舰设计图,用来显示玩家船舰:
图 3-5玩家船舰设计图
4.左移、右移和发射按钮设计图:玩家可以通过向左向右移动进行控制船舰,躲避炸弹伤害,可通过发射按钮攻击敌方船舰,获得计分以及等级提升。
图 3-6左移、右移和发射按钮设计图
5.开始、退出按钮设计图:玩家可通过点击退出按钮,实现退出游戏。也以通过点击开始按钮开始游戏,当玩家点击开始按钮,开始按钮文本更替为暂停,游戏开始。
图 3-7开始、退出按钮设计图
3.2.3游戏界面的主要代码
//绘制
@Override
protected void onDraw(Canvas canvas) {
//绘制天空
Rect say = new Rect(0,0,width,420);
colors = new int[]{Color.parseColor("#FF5ED6C2"),Color.parseColor("#FFC1EFE8"),Color.WHITE};
GradientDrawable mDrawable1 = new GradientDrawable(GradientDrawable.Orientation.TOP_BOTTOM,colors);
mDrawable1.setShape(GradientDrawable.RECTANGLE);
mDrawable1.setGradientType(GradientDrawable.LINEAR_GRADIENT);
//设置矩形绘制区域为say
mDrawable1.setBounds(say);
mDrawable1.draw(canvas); //绘制
//绘制海洋
Rect sea = new Rect(0,420,width,height);
colors = new int[]{Color.parseColor("#FF3C60D5"),Color.BLUE};
GradientDrawable mDrawable2 = new GradientDrawable(GradientDrawable.Orientation.TOP_BOTTOM,colors);
mDrawable2.setShape(GradientDrawable.RECTANGLE); //形状
mDrawable2.setGradientType(GradientDrawable.LINEAR_GRADIENT); //渐变
mDrawable2.setBounds(sea); //边界框
mDrawable2.draw(canvas);
//绘制数字
paint.setColor(Color.YELLOW);
paint.setTextSize(100f); //设置字体大小
//285-255
//分别画
canvas.drawText(String.valueOf(score),305,155,paint);
canvas.drawText(String.valueOf(pass),675,155,paint);
canvas.drawText(String.valueOf(liveNum),1050,155,paint);
//绘制玩家船舰
ship.drawShip(canvas);
drawBombNum(canvas);
/*
游戏触发事件检测
*/
//炸弹
if(!bumbArray.isEmpty()){
for(int i = 0;i < bumbArray.size();i++){
if(!bumbArray.get(i).flag){
bumbArray.get(i).drawBumb(canvas);
}
if(bumbArray.get(i).flag){
bumbArray.remove(i);
}
}
}
//爆炸
if(!blastArray.isEmpty()) {
for(int i = 0; i < blastArray.size(); i++)
{
if(!blastArray.get(i).isFlag()) {
blastArray.get(i).drawBlast(canvas);
}
if(blastArray.get(i).isFlag()) {
blastArray.remove(i);
}
}
}
//鱼雷
if(!torpedoArray.isEmpty()){
for(int i = 0; i < torpedoArray.size(); i ++) {
if(!torpedoArray.get(i).isFlag()) {
torpedoArray.get(i).drawTorpedo(canvas);
}
if(torpedoArray.get(i).isFlag()) {
torpedoArray.remove(i);
}
}
}
//潜艇
if(!submarineArray.isEmpty()){
for(int i = 0; i < submarineArray.size(); i ++) {
if(!submarineArray.get(i).isFlag()) {
submarineArray.get(i).drawSubmarine(canvas);
}
if(submarineArray.get(i).isFlag()) {
submarineArray.remove(i);
}
}
}
//有效攻击
if(!hitArray.isEmpty()){
for(int i = 0; i < hitArray.size(); i ++) {
if(!hitArray.get(i).isRunning()) {
hitArray.get(i).drawHitting(canvas);
}
if(hitArray.get(i).isRunning()) {
hitArray.remove(i);
}
}
}
}
//绘制指定数量炸弹
public void drawBombNum(Canvas canvas) {
Bitmap bomb= BitmapFactory.decodeResource(getContext().getResources(), R.drawable.bomb);
for(int i = 0;i < ship.getBombNum();i ++) {
canvas.drawBitmap(bomb,width/2+100 + 50*i + 70, 75,null);
}
}
3.3 游戏按钮模块设计
3.3.1游戏开始按钮功能设计
当玩家点击开始按钮:开始按钮文本替换为暂停,游戏立刻开始,敌方船舰和炸弹随机生成,玩家鱼雷数量增加,直到最多鱼雷数量5个。
游戏开始按钮主要代码:
public void onClick(View v) {
switch (v.getId()){
case R.id.pause_text:
if(gameText.getText().equals("开始")){
startGame();
}else{
//不是开始,置标志为false,暂停
//绘制暂停界面
gameView.getShip().setRunning(false);
showPauseDialog();
}
break;
case R.id.exit_text:
System.exit(0);
break;
case R.id.left_btn:
gameView.getShip().moveLeft();
//船左移动,重新绘制界面
gameView.invalidate();
break;
case R.id.right_btn:
gameView.getShip().moveRight();
gameView.invalidate();
break;
case R.id.shoot_btn:
//获取船的子弹数量
int bombNun = gameView.getShip().getBombNum();
//判断开始游戏
if(isRunning){
if( bombNun> 0 && bombNun <= 5) { //子弹判断
//新建子弹类
Bumb bumb = new
Bumb(GameActivity.this,gameView.getShip(),gameView);
bumbArray.add(bumb);
gameView.setBumbArray(bumbArray);
Thread t1 = new Thread(bumb); //创建线程
t1.start(); //启动
bombNun -- ; //发射子弹后,对数量 - 1
gameView.getShip().setBombNum(bombNun); //重新设置子弹数量
}
}
break;
}
}
//游戏运行
private void startGame(){
//初始未点击开始按钮状态
if(isRunning){
isRunning = false;
gameView.setLiveNum(3);
gameView.setPass(1);
gameView.setScore(0);
tm1.setSpeed(1000);
gameView.getShip().setBombNum(5);
isRunning = true;
gameView.getShip().setRunning(true);
for(int i = 0; i < gameView.getBumbArray().size(); i++)
{
((Bumb) gameView.getBumbArray().get(i)).flag = true;
}
for(int i = 0; i < gameView.getSubmarineArray().size(); i++)
{
((Submarine)gameView.getSubmarineArray().get(i)).setFlag(true);
}
for(int i = 0; i <gameView.getTorpedoArray().size(); i++)
{
((Torpedo)gameView.getTorpedoArray().get(i)).setFlag(true);
}
}
//开始游戏
if(!isRunning){
gameText.setText("暂停");
gameView.getShip().setRunning(true);
isRunning = true;
tm1 = new TimeManager(gameView.getShip(),GameActivity.this,submarine,gameView);
Thread t = new Thread(tm1);
t.start();
for(int i = 0; i < gameView.getBumbArray().size(); i++)
{
gameView.getBumbArray().get(i).flag = true;
gameView.getBumbArray().remove(i);
}
for(int i = 0; i < gameView.getSubmarineArray().size(); i++)
{
gameView.getSubmarineArray().get(i).setFlag(true);
gameView.getSubmarineArray().remove(i);
}
for(int i = 0; i < gameView.getTorpedoArray().size(); i++)
{
gameView.getTorpedoArray().get(i).setFlag(true);
gameView.getTorpedoArray().remove(i);
}
}
}
3.3.2游戏暂停按钮功能设计
当玩家点击暂停按钮:主界面船舰和炸弹停止移动,页面静止,弹出对话框,显示图片如下。
图3-8 暂停按钮功能设计界面
游戏暂停按钮主要代码:
//绘制暂停界面
private void showPauseDialog(){
AlertDialog.Builder builder = new AlertDialog.Builder(GameActivity.this);
final AlertDialog dialog = builder.create();
dialog.setCancelable(false);
//动态加载布局
View view = View.inflate(GameActivity.this, R.layout.pausedialog, null);
Button rule = (Button)view.findViewById(R.id.rule);
Button contiueBtn = (Button) view.findViewById(R.id.contiue);
rule.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showRuleDialog();
dialog.dismiss();
}
});
3.3.3游戏规则按钮功能设计
当玩家点击游戏规则按钮:弹出对话框游戏规则,如下图。
图3-9 游戏规则按钮功能设计图
游戏规则按钮功能主要代码:
//绘制暂停界面
private void showPauseDialog(){
AlertDialog.Builder builder = new AlertDialog.Builder(GameActivity.this);
final AlertDialog dialog = builder.create();
dialog.setCancelable(false);
//动态加载布局
View view = View.inflate(GameActivity.this, R.layout.pausedialog, null);
Button rule = (Button)view.findViewById(R.id.rule);
Button contiueBtn = (Button) view.findViewById(R.id.contiue);
rule.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showRuleDialog();
dialog.dismiss();
}
});
//继续
3.3.4游戏重新开始按钮功能设计
当玩家点击重新开始按钮:玩家得分、等级、生命,重置,游戏重新加载开始。
重新开始按钮功能主要代码:
//重新开始
Button again = (Button)view.findViewById(R.id.about);
again.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startGame();
synchronized(GameActivity.subLock) {
GameActivity.subLock.notifyAll();
}
dialog.dismiss();
gameView.invalidate();
}
});
3.3.5游戏退出按钮功能设计
当玩家点击退出按钮:游戏退出。如若想再次玩游戏,重新启动即可。
游戏退出按钮功能主要代码:
//退出
Button exit =(Button)view.findViewById(R.id.tuichu);
exit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
System.exit(0);
}
});
3.3.6游戏继续按钮功能设计
当玩家点击继续按钮:游戏继续,关闭对话框。
图3-10 继续按钮功能设计图
游戏继续按钮功能主要代码:
//继续
contiueBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
gameText.setText("暂停");
gameView.getShip().setRunning(true);
synchronized(GameActivity.subLock) {
//线程同步
GameActivity.subLock.notifyAll();
}
dialog.dismiss();
}
});
代码见我主页发布