安卓开发小游戏
1. Android小游戏 之《数字华容道》
[toc]
最近看《最强大脑》,看到其中的“数字华容道”这个小游戏挺有意思,于是萌生了自己写一个的想法,正好结合之前的文章 《Android开发艺术探索》第4章 View的工作原理 ,顺便复习一下。
GitHub链接: https://github.com/LittleFogCat/Shuzihuarong
说做就做。
经过一夜的粗制滥造,初版已经完成,现在复盘一下详细过程。
在4x4的方格棋盘中,摆放了1 15一共十五个棋子。玩家需要在最短时间内,移动棋子将1 15按顺序排列好。
本文app结构很简单,分为三个界面:目录,游戏,高分榜。分别对应的是MenuAcitivity、GameActivity、HighScoreActivity。其中MenuActivity为主界面。
新建棋盘类 BoardView ,继承自ViewGroup。在xml文件中直接加入BoardView即可。
新建棋子类 CubeView ,继承自TextView。
棋子只包含一个数字,所以简单的继承自TextView即可。由于我们还需要比对棋子是否在正确的位置,所以我们还需要给每个棋子加上数字和位置属性。
这里,我们定义了一个类Position,用于描述棋子在棋盘中的位置。
我们参考Android系统屏幕坐标系,以棋盘左上角为零点,每向右一格横坐标加一,每向下一格纵坐标加一。如图:
接下来,我们开始定义棋盘View:BoardView,这也是这个游戏的重头戏。
首先,考虑需要添加哪些属性。由于时间关系,我这里只加入了棋盘尺寸。
在style.xml文件中加入:
其中sizeH为棋盘列数,sizeV为棋盘行数。(默认4x4大小,以下文中均以4x4为例)
分别对应BoardView的 mSizeX 和 mSizeY 属性。
首先我们新建一个 cube_view.xml ,作为单颗棋子的布局。在BoardView的构造方法中,我们使用LayoutInflater将总共15颗棋子加载出来,并指定它们的位置,逐一保存在mChildren数组中。
最后,我们记录了没有棋子的空格所在位置 mBlankPos 。这个位置很关键,因为我们之后的的操作中都是围绕这个空格来的。
measure和layout的过程很简单,这里由于是自己使用,假定宽高都是定值。因为之前所有的CubeView都没有定义宽高,默认是0,所以在onMeasure中,我们使用BoardView的宽除以列数,高除以行数,得到每颗棋子的宽高并给其赋值。这样处理虽然很粗放,但是只是试玩的话并没有什么影响。
我是按照从左往右、从上往下的方式依次排列棋子,并且没有考虑棋子的margin属性,所以onLayout很简单:
至此,棋子在棋盘中就已经排列好了。
一开始的时候,我考虑的是,生成1~15的不重复随机数,然后依次给CubeView赋值即可。即:
虽然看起来是能行得通的,但是在实际的游戏过程中,遇到了非常严重的问题,那就是会出现无解的死局,也就是说无论如何都不可能解出来的棋局。经过网上搜索之后证实了这个bug的存在,而且市面上流传的该类app很多都是有这个bug的!所以这个办法就被废弃掉了,得想一个新的方法。
由于必须是按照顺序放置然后打乱的棋局才能保证有解,不能随机乱放置,所以我就模拟手动打乱,写了一个新的棋局生成器:
原理很简单,因为空格的位置是唯一的,那么我们把空格的上下左右四个棋子随机找出一个,与空格互换位置,也就模拟了一次手动点击。当点击的次数足够多时(这里循环了10000次),就可以看做是已经打乱的棋盘了。
最后把生成好的棋盘,保存在一个二维数组中即可。
(因为有个10000次的循环,我担心时间过长,于是将其放在线程中执行,但是后来我觉得自己多此一举了。)
然后,在BoardView中定义一个setData方法,来把生成好的棋局装进来:
这样,就完成了棋局的生成。
游戏过程基本是极简的。
在初始化方法中(2.1),我们给每个棋子都定义了点击事件,模拟真实场景。具体来讲,就是当我们点击一个棋子的时候:如果棋子在空格周围,则将棋子移动到空格处;反之,则不进行任何操作。(如果设置滑动同理)
这样我们的Position类就派上用场了。
在2.1的 init() 方法中,我们有这么一句:
即是,当我们点击了其中一个棋子时,会触发 moveChildToBlank(view) 方法。这个方法的目的正是上面所说。
在移动棋子之后,我们需要检查一下是否是正确排列的顺序,如果是的话,那么表明游戏完成。
首先创建HighScore类,包含姓名,用时,步数,时间。
高分榜使用SharedPreferences+Gson,将一个List<HighScore>转换为json形式保存在本地。
最佳成绩的记录是在GameActivity中完成的。流程如下:
总的来说,逻辑简单清晰。
自己开发的自然是需要作弊功能了!暂且不表。
由于只用了一个晚上完成,所以还很粗糙,很多功能不够完善,而且也没做适配和测试,难免会有bug存在。主要是把思路记录下来,方便以后自己和他人做个参考。
数字华容道GitHub地址: https://github.com/LittleFogCat/Shuzihuarong
2. 求一个安卓开发小游戏源代码,临时交作业用
package com.fiveChess;
import android.app.Activity;
import android.os.Bundle;
import android.view.Display;
import android.view.Menu;
import android.view.MenuItem;
import android.view.Window;
import android.view.WindowManager;
public class MainActivity extends Activity {
GameView gameView = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
Display display = this.getWindowManager().getDefaultDisplay();
gameView = new GameView(this,display.getWidth(),display.getHeight());
setContentView(gameView);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
menu.add("重新开始").setIcon(android.R.drawable.ic_menu_myplaces);
menu.add("退出");
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if(item.getTitle().equals("重新开始")){
gameView.canPlay = true;
gameView.chess = new int[gameView.row][gameView.col];
gameView.invalidate();
}else if(item.getTitle().equals("退出")){
finish();
}
return super.onOptionsItemSelected(item);
}
}
package com.fiveChess;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.view.MotionEvent;
import android.view.View;
public class GameView extends View {
Context context = null;
int screenWidth,screenHeight;
String message = "";//提示轮到哪个玩家
int row,col; //划线的行数和列数
int stepLength = 30;//棋盘每格间距
int[][] chess = null;//0代表没有棋子,1代表是黑棋,2代表白旗
boolean isBlack = true;
boolean canPlay = true;
public GameView(Context context,int screenWidth,int screenHeight) {
super(context);
this.context = context;
this.screenWidth = screenWidth;
this.screenHeight = screenHeight;
this.message = "黑棋先行";
row = (screenHeight-50)/stepLength+1;
col = (screenWidth-10)/stepLength+1;
chess = new int[row][col];
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Paint paint = new Paint();
paint.setColor(Color.WHITE);
canvas.drawRect(0, 0, screenWidth, screenHeight, paint);//画背景
paint.setColor(Color.BLUE);
paint.setTextSize(25);
canvas.drawText(message, (screenWidth-100)/2, 30, paint);//画最顶层的字
paint.setColor(Color.BLACK);
//画棋盘
for(int i=0;i<row;i++){
canvas.drawLine(10, 50+i*stepLength, 10+(col-1)*stepLength, 50+i*stepLength, paint);
}
for(int i=0;i<col;i++){
canvas.drawLine(10+i*stepLength,50,10+i*stepLength,50+(row-1)*stepLength, paint);
}
for(int r=0;r<row;r++){
for(int c=0;c<col;c++){
if(chess[r][c] == 1){
paint.setColor(Color.BLACK);
paint.setStyle(Style.FILL);
canvas.drawCircle(10+c*stepLength, 50+r*stepLength, 10, paint);
}else if(chess[r][c] == 2){
//画白棋
paint.setColor(Color.WHITE);
paint.setStyle(Style.FILL);
canvas.drawCircle(10+c*stepLength, 50+r*stepLength, 10, paint);
paint.setColor(Color.BLACK);
paint.setStyle(Style.STROKE);
canvas.drawCircle(10+c*stepLength, 50+r*stepLength, 10, paint);
}
}
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if(!canPlay){return false;}
float x = event.getX();
float y = event.getY();
int r = Math.round((y-50)/stepLength);
int c = Math.round((x-10)/stepLength);
if(r<0 || r>row-1 || c<0 || c>col-1){return false;}
if(chess[r][c]!=0){return false;}//若有棋子则不再画棋子了
if(isBlack){
chess[r][c] = 1;
isBlack = false;
message = "轮到白棋";
}else{
chess[r][c] = 2;
isBlack = true;
message = "轮到黑棋";
}
invalidate();
if(judge(r, c,0,1)) return false;
if(judge(r, c,1,0)) return false ;
if(judge(r, c,1,1)) return false;
if(judge(r, c,1,-1)) return false;
return super.onTouchEvent(event);
}
private boolean judge(int r, int c,int x,int y) {//r,c表示行和列,x表示在y方向上的偏移,y表示在x方向上的偏移
int count = 1;
int a = r;
int b = c;
while(r>=0 && r<row && c>=0 && c<col && r+x>=0 && r+x<row && c+y>=0 && c+y<col && chess[r][c] == chess[r+x][c+y]){
count++;
if(y>0){
c++;
}else if(y<0){
c--;
}
if(x>0){
r++;
}else if(x<0){
r--;
}
}
while(a>=0 && a<row && b>=0 && b<col && a-x>=0 && a-x<row && b-y>=0 && b-y<col && chess[a][b] == chess[a-x][b-y]){
count++;
if(y>0){
b--;
}else if(y<0){
b++;
}
if(x>0){
a--;
}else if(x<0){
a++;
}
}
if(count>=5){
String str = "";
if(isBlack){
str = "白棋胜利";
}else{
str = "黑棋胜利";
}
new AlertDialog.Builder(context).setTitle("游戏结束").setMessage(str).setPositiveButton("重新开始", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
chess = new int[row][col];
invalidate();
}
}).setNegativeButton("观看棋局", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
canPlay = false;
}
}).show();
return true;
}
return false;
}
}
PS:五子棋,无需图片,直接在程序里画出来的。注意我发的是两个文件,一个activity,一个类文件,别把它当成一个文件了
3. 怎样制作网页游戏
很多人想投身游戏行业,成为真正的游戏制作人。但是他们对游戏的制作过程,和各个职位的职能都是比较陌生的。对网页游戏开发也不够了解,游戏到底是怎么制作出来的呢?\x0d\x0a\x0d\x0a网页游戏开发的程序构成分为三大部分:第一是数据流程。第二是美术。第三是程序。\x0d\x0a1、数据流程\x0d\x0a数据流程其中,数据流程包括了功能。也只有在功能中才能体现数据流程。\x0d\x0a比如最简单的卖买产品。要实现这个功能,那么需要有产品基础表、产品详细表、商店表、背包表。如果扩展性更强,相应的双表是少不不了的。\x0d\x0a表的问题都简单了,关键是这个物品有什么用,这样物品的来源,一大堆数据,物品的走向,又是一大堆数据。最后,这些数据得绕成一个圈。绕圈是一件困难的事情,特别是功能和道具多了起来的时候。难度是2的n次方。\x0d\x0a2、美术\x0d\x0aUI:简洁漂亮的界面总会有好处。\x0d\x0a小图标:道具,地图,装备,一类至少10个吧?大体上百把个是需要的。\x0d\x0a3、程序分5个部分\x0d\x0a数据库:一大堆基础数据表和详细数据表。基础数据表:比如等级1到等级100的用户的属性初始值。详细数据表:每个用户的具体属性。\x0d\x0a功能页面、功能函数。主要就是数据存取,判断,数据走向。\x0d\x0aajax函数:(可选)某些需要伪即时的功能要用到。\x0d\x0ajavascript函数:(可选)模拟客户端的数据计算。也就是webgame的与时间相关的数据。分为两部分。一部分是真实数据,是由服务器端的定时器计算的。另一部分是只有初始值,客户端显示用的。不需要即时同步,仅仅需要模拟同步就行。\x0d\x0a服务器定时器:(C语言或自己设定服务器)定时循环执行某一段代码。而这段代码主要是根据数据库的数据进行更新。这个可以找个C语言程序员来做。对于C语言程序员来讲,这个功能是相当的简单。当然,具体的处理数据的判断和操作数据库,需要你自己写。让C语言程序员给你段标准代码就行了。完全支持sql语句的。\x0d\x0a当然在网页游戏开发前,还要组织相关的专业人才,制作一款网络游戏需要的最核心人才是原画、2D、3D、程序设计、策划等这些方面的人才是必不可少的,因此,要开发一个网页游戏除了要程序员以外,千万不要忘了准备以上人才。
4. 怎样自己动手制作安卓版小游戏
用RPG MakerXP吧,那样你只要有一些语言基础就会制作出自己想要的游戏。
载文字游戏制作工具
点击新建,进入游戏制作界面。
拖动左侧图片可以设置为背景图,远景图,近景图等。制作工具提供一些素材,也可以自己下载后导入。
如何制作一个属于自己的游戏
双击文字框可以编辑文本,包括角色名称对话内容等。包括头像设置,字体颜色等。
如何制作一个属于自己的游戏
点击素材库可以免费下载各种素材,包括背景图、人物立绘、游戏音乐等。可以满足一般游戏的制作而不需要另外下载。
如何制作一个属于自己的游戏
下方可以设置游戏流程画面效果等,包括剧情页面跳转等,具体操作多多研究就可以轻松掌握啦~
5. android 开发 本人正在做一个小游戏 如何能够实现点击屏幕任意位置开始
public boolean onTouch(View view, MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_DOWN){//之捕捉屏幕被按下的事件
}
详情查阅API
6. 用android编出来的小游戏有哪些
小鸟、水果忍着什么的就不用说了,想必你也玩烂了。
我推荐几个我在玩的:
1、stupidzombies(几个子弹内打死所有屏幕上的僵尸,子弹会在屏幕上弹来弹去)
2、ageofwind2(中世纪海盗游戏,出去炸翻海上的船,然后捡桶子回去卖钱,修船买新船,挺有意思,重力感应操作方向,刚开始有点不熟,熟练了可以风筝n只船)
3、whackyourboss(只有20关,中文名好像叫老板的20种死法,如果你在工作,说不定你会喜欢)
4、三国杀。这个就不用说了吧
5、beats。跳舞机游戏。
6、battleheart(中文名勇者之心,打怪升级的,有法师、猎人、战士、dk、野蛮人、盗贼几种职业)
7、canknockdown(踢罐子,拿球砸罐子,有点意思)
8、where‘smywater?(鳄鱼爱洗澡)
9、三剑之舞(棒子的游戏,类似于地下城与勇士)
10、deathrally(死亡拉力赛,赛车咯)
11、游戏发展国(这个会玩上瘾的,不过很快就通关了,通关后还是可以继续玩)
12、streetball(街头篮球,挺容易的,基本上随便选一个人物都能完爆对手,我每场得分28+,盖帽18个,两双啊,哈哈)
13、skaterboy(滑板游戏)
14、cheesetower(某些网站上排名靠前的游戏,玩了觉得一般般)
好了就这些,还有很多删了都不记得了。
7. 开发了一个安卓小游戏,插入有米广告apk,但是没有收入
平台一般是到第2日才会统计上1日的数据的,你如果是今天测试,应该明天或后天再查看。
apk在上传到应用市场前(即向外发布之前),注意要做好保护措施:如混淆代码或加密或加固之类的。
如果不做好保护,发布后很容易被打包党进行二次打包再发布,这样劳动成果就被打包党窃走了。
8. 易安卓可以制作安卓的小游戏吗
可以,易安卓里也有小游戏事例可以看看在下手,我曾经用这开发过一个小游戏😊😊😊😊
9. 手机如何自己编程做游戏
如果你有兴趣在android上设计一些游戏,那么我这儿有一些对你有所帮助的东西,我是android Market上一个名为LightRacer的小赛车游戏的开发者,虽然在此之前我也曾开发过游戏,但这仍然是我的第一个android上的应用,在这个过程中我学到了很多在android上开发游戏的经验,并且,我也很乐意将这一切与你分享。好了,让我们开始吧,如果你之前做过游戏的开发,那么转移到android这样的移动平台上并不是件难事,你要做的只是学习一下新的架构与API,如果你是一个新手,我这儿也为你准备了一个入门清单,它适用于任何类型的游戏开发,比如动作类、策略类、模拟类或者智力类。
开启分步阅读模式
操作方法
01
在这门课最后,你会完成一个可以运行在安卓机或者安卓平板上的游戏。你可以与你的家人朋友分享它,用你的新知识进一步改进你的游戏,或者完全自己创造一个游戏。
02
如果你有兴趣在android上设计一些游戏,那么我这儿有一些对你有所帮助的东西,我是android Market上一个名为LightRacer的小赛车游戏的开发者,虽然在此之前我也曾开发过游戏,但这仍然是我的第一个android上的应用,在这个过程中我学到了很多在android上开发游戏的经验,并且,我也很乐意将这一切与你分享。好了,让我们开始吧,如果你之前做过游戏的开发,那么转移到android这样的移动平台上并不是件难事,你要做的只是学习一下新的架构与API,如果你是一个新手,我这儿也为你准备了一个入门清单,它适用于任何类型的游戏开发,比如动作类、策略类、模拟类或者智力类。
03
获取SDK第一步当然是下载并安装android的SDK[软件开发套件],这套SDK主要包括有核心库文件,一个模拟器,开发工具和一些示范的样例文件。我强烈推荐你使用 Eclipse 和 android eclipse 扩展。如果你只是使用android,Eclipse IDE就已经足够了,但如果这是你第一次开发Java应用,建议你还是下载完整的
04
学习应用架构就像迷人的内在美一样,这是理解
android 应用架构的关键,如果你不学习它,你设计出来的游戏将是一种很难修复bug的产品。你需要了解应用程序、活动、Intents以及它们是如何互相联系交互的,Google在这儿提供了良好的信息架构。真正重要的是,你要理解为什么在你设计的游戏中需要不止一个的活动进程以及如何设计一个用户体验良好的游戏。这些都应当配合到应用的生命周期中。
05
学习应用的生命周期应用的生命周期是由AndroidOS操作系统进行管理的,你的活动进程都将做为系统命令进行创建,正确处理这些事件对一个应用程序来说是极为重要的,因为终端用户不会知道什么是正确的。最好在开始设计你的游戏之前搞明白这些,因为这有助于节省你的调试时间以及避免代价高昂的重新设计。
06
对大多数应用而言,默认设置即可开始工作,但对游戏而言,你可能需要调整单态实例的信号为打开。在默认情况下,Android会新建一个活动实例进程,因为它认为这是比较合适的,而游戏,你可能只希望有一个活动的实例进程,这有一点儿影响,它需要你了解一些系统状态的管理,但对我来说,它解决了资源管理的问题,还是值得的。
07
主循环是否需要一个主循环是根据你写的游戏类型而决定的,如果你写的游戏没有时间依赖性或者只是响应用户的输入而没有其它的视觉变化,你可能并不需要一个主循环。如果你设计的是一个平面的动作游戏或者动画游戏,计时游戏或者其实类型的自动游戏,你就应该认真考虑使用主循环。
10. 编写安卓小游戏
在电脑上如何玩安卓手机游戏呢?由于手机的屏幕有限制,有时玩一些手机时并不过瘾,今天小编就教大家在电脑上玩转安卓手机游戏的方法,下面一起来看看吧!
很多朋友在安装BlueStacks模拟器的过程中遇到各种问题,所以会中途放弃,今天小编就跟大家共享一份个人安装(BlueStacks)操作步骤,希望能帮上朋友们!
注:安装模拟器的时候电脑上装有360安全卫士的请关掉在安装不然会导致安装失败。
*Windows7系统的同学可以不用安装WindowsInstaller4.5.rar和NetFx20SP2_x86.exe直接安装BlueStacks模拟器。
*windows XP系统的同学如果你的电脑中装WindowsInstaller4.5.rar和NetFx20SP2_x86.exe程序,就不要在安装了直接安装BlueStacks模拟器。
下面以windows XP系统为例:
【BlueStacks模拟器安装教程】
1、安装BlueStacks需要下载3个安装包分别是
(1).WindowsInstaller4.5.rar下载地址: WindowsInstaller4.5.rar
(2). NetFx20SP2_x86.exe下载地址:NetFx20SP2_x86.exe
(3). BlueStacks.zip下载地址: BlueStacks.zip最新官方下载:bluestacks
2、将下载好的WindowsInstaller4.5.rar解压出来打开。
2.1双击WindowsXP-KB942288-v3-x86.exe安装,安装完成后不要重启电脑,接着安装NetFx20SP2_x86.exe程序;
2.2.双击已下载好的NetFx20SP2_x86.exe安装,安装完成后重起电脑;
2.3.把已下载好的BlueStacks模拟器解压出来,双击打。
2.4双击BlueStacks.msi安装.
2.5.这时弹出一个警告,我可以忽略点击OK按钮.
2.6.点击完成退出安装向导.
2.7.这时电脑的上方多了一个悬浮操作栏,点击圈中图标进行设置语言.
2.8.点击NEXT,
2.9.用鼠标拖到最底部选择中文(简体)好了这时你的安卓模拟器就是中文版了.
3.0这里不做设置点击返回按钮
下面附一张小编安装成功的截图,用鼠标切水果啦~~用鼠标切水果的感觉很不一样哦!
水果忍者(Fruit Ninja)无广告 1.8.6.2 安卓版 评分:
5.0
类别: 休闲益智 大小:31.3M 语言: 中文
查看详细信息 >>
下载 275 次