还是俄罗斯方块之android版

前面的,口水话 请直接跳过。

虽然现在不比以前了 也没多少人气了,放到首页 都不到几百的点击量。也许博客园整体水平也是在往水的方向发展。不谈那些了,哥也曾经辉煌过 有过一天上千的点击量 ,哥也曾经有过粉丝,被小妹称为大神去指点问题,虽然这大神水分有点重。

人都是有虚荣心的 正是因为这样激励着我持续学习技术,去探索。 才有我持续发表技术博文的动力。我写的都是自己真切实意的关于技术的心得经验 并不是纯控件 使用demo 或者商业数据库项目那种码农式的代码。有那么一丁点算法或者技术上的技巧 属于我自己的偏好 但是大多数智商水平也就小学 ,就图像处理那几篇 用到的算法原理也就超过初中智商水平一点点。

从四年前进歪医用胶片公司发俄罗斯方块的博文开始就一直持续不断的激励着我,然后一有东西我都记录下来。不说了 要点击量就去写小说了 还有钱。

 

正文,到博客园从写c#俄罗斯方块开始 ,可能有的朋友已经把它忘了。那么我们又来写俄罗斯方块 只不过这次是android版的 。也许是结束 ,也许是新的开始呢。

主代码在原来c#基础上改的 基本上没怎么动,如果你见过原来的版本 一看就明白 还是那几个类。对于android平台的开发自己看书 本身没几天 勿喷。

游戏主要逻辑类三个 game gamearea shape,这里多了个point  因为c#里有用于定位的值类型Point ,java里没有 那么我们就为他手动定义一个 免得改动其他逻辑代码 。

先说game类 ,new game() 既代表初始化了一个游戏,以前c#版本 游戏数据直接在form里通过gdi重绘 ,游戏数据展现给使用者 这是最基本的。所以我让game类变成自定义控件 继承自view 一来我可以通过这种方式把它放到主界面 二来游戏数据发生改变需要重绘的时候 可以通过自带的函数重绘。

 其他的基础代码方面 c#跟java稍微有差别比如

定义二维数组

c#

1 bool[,] gameAreaArray;

java

1 boolean [][] gameAreaArray;

还有java里的switch 好像只能判断数字,害的我把switch代码都改成了if else if 幸好不多。

android里添加事件 是setonClickListener 然后把一堆东西都写在那个函数里面,这个我也暂时还没习惯 熟悉了就好了。

android下的界面及控件都是以xml树状结构配置,并且跟代码对应 所有控件都继承自view。就单从这一设计理念上来说他跟wpf是一样的,左边xml界面 右边代码界面。用这种理念去看 winform或者mfc界面,winform 或者mfc界面 那种方式就像山顶洞人。wpf也不像winform那样一定双击通过硬编码去添加按钮事件,个人觉得通过硬编码添加按钮处理 弊端多。winform搞个什么漂亮点的界面得onPaint 搞个什么漂亮点的界面得onPaint 还不能随心所欲的设计界面。 说明时代是发展的社会是进步的 新东西不得不学啊。

android下木有messagebox.show() 让我这种这种大老土 情何以堪啊。最常用的是toast。

方块不断的下落 原来在winform 用timeer控件,在android平台 暂时我没有找到timer控件 所有我就用了多线程。也是在网上大概瞄了下java的多线程处理方式 然后根据自己的要求抄了段代码了事。

 1 Thread ttt;
 2         ttt = new Thread(new Runnable() {
 3             @Override
 4             public void run() {
 5                 while (true) {
 6                         if (gg.isOver()) {
 7                             return;
 8                         } else {
 9                             // 对游戏逻辑 进行“下移” 操作(具体的下移到什么地方 比如到底了又如何
10                             // 这些逻辑统统是在game类里面进行判断 操作)
11                             mekSound(gg.go());
12                         }
13                         try {
14                             Thread.sleep(1000);
15                         } catch (InterruptedException e) {
16                             e.printStackTrace();
17                         }
18                     
19                 }
20             }
21         });
22         ttt.start();

但是有一个小问题,认真看过代码都知道 这个俄罗斯方块游戏 背后的数据模型就是一个二维数组 ,这里新开一个线程对数据执行“下落”的操作。而界面主线程的按钮同时也要对同一数据进行左右移动 或者变形操作,我代码逻辑里控制了 游戏本身不会报错 但是会出现一些很神奇的事情 比如方块掉到坑里了之类的。都说的很明白了 需要进行所谓的线程间数据同步 这个请亲们自己去修复。

 

 关于音频处理,得分或者什么的时候总得给点叮当声 什么的吧 否则死气沉沉的,特别是现在这种眼球经济的时代 没卖相更加死得快。

音频处理我是用的网上推荐的自带的Mediaplayer 对于我来说足够。对于不同的类型 比如得分 什么的 我给不同的音效,唯一注意的地方就是 ,在播放前就给回掉函数 播放完成后对资源进行回收 ,要不然搞几下你的程序就搞不起了  我试过。
音频处理:

 1 public void mekSound(int type) {
 2 
 3         switch (type) {
 4                 case 1:
 5             m_sound = MediaPlayer.create(this, R.raw.money);
 6             m_sound.start();
 7             m_sound.setOnCompletionListener(new OnCompletionListener() {
 8 
 9                 @Override
10                 public void onCompletion(MediaPlayer arg0) {
11                     // TODO Auto-generated method stub
12                     m_sound.release();
13                 }
14             });
15             break;
16         default:
17             break;
18         }
19 
20     }

要记住始终以用户为前提,得分时的金币的声音可以让脑残的用户觉得愉悦。


关于另外一个小东西,通常情况下android 程序按一下返回键 不是都会提示 “再次按返回退出程序”么。这个其实也很简单,按第一下记录时间 按第二下再次记录时间 如果时间差低于两秒 就退出 ,否则给toast提示“再次按返回键退出”:

 1 private boolean m_flagExit = false;
 2     Date backTime = new Date("1900/1/1");
 3 
 4     @Override
 5     public boolean onKeyDown(int keyCode, KeyEvent event) {
 6         // TODO Auto-generated method stub
 7         if (keyCode == KeyEvent.KEYCODE_BACK) {
 8             Date nowTime = new Date();
 9             if (backTime.getYear() == nowTime.getYear()
10                     && backTime.getMonth() == nowTime.getMonth()
11                     && backTime.getDate() == nowTime.getDate()
12                     && backTime.getHours() == nowTime.getHours()
13                     && backTime.getMinutes() == nowTime.getMinutes()
14                     && nowTime.getSeconds() - backTime.getSeconds() <= 2  ) {
15                 return super.onKeyDown(keyCode, event);
16             } else {
17                 backTime = nowTime;
18                 Toast.makeText(this, "再次按返回键退出游戏", 500).show();
19                 return false;
20             }
21         }
22         return false;
23     }


程序设计上只要你用心去想这个事情的来龙去脉 那么你就能够把它做成功。

另外我还自己用photoshop画了几个图标 虽然有点丑

下面是完整项目代码:
猛击此处下载

这里是可以直接安装的app:

猛击此处下载

谁说做c#开发的就不能做java开发了 。java就是个蛋 只不过另外一套开发平台 熟悉而已 ,说到底不过是工具。

手机上也可以用socket 也可以进行io 各种文件流网络流操作  也可以想怎么绘图怎么绘图 ,并且开发接口也很方便 。这他娘的就是电脑嘛  当还沉浸在老一代PC程序员时代的时候 所谓的移动互联网时代已经到了我们身边  老了 没跟上时代的脚步 不服不行啊。

现在离开歪医用胶片的公司了 ,算是告别吧。可能以后发的东西质量 渐差, 或者发的比较少。各位兄台见谅

转载于:https://www.cnblogs.com/assassinx/p/3926041.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/273619.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Integer 值判断相等

Integer 值判断相等 案例&#xff1a; public class Test {public static void main(String[] args) {Integer a 127;Integer b 127;System.out.println("a b :" (a b));System.out.println("a.equals(b):"a.equals(b));String x "127";Str…

自定义快捷命令程序(VC++加批处理)

一 概述 在看《从小工到专家-程序员修炼之道》时&#xff0c;看到建议使用Shell&#xff0c;很有感触。在很多时候&#xff0c;通过键盘操作&#xff0c;比鼠标的确会块很多&#xff0c;如果能用好shell命令&#xff08;或批处理命令&#xff09; &#xff0c;的确能节省我们…

Redis 快速入门

简介 Redis 是一个 Key-Value 存储系统。和 Memcached 类似&#xff0c;它支持存储的 value 类型相对更多&#xff0c;包括 string(字符串)、 list(链表)、 set(集合)和 zset(有序集合)。这些数据类型都支持 push/pop、add/remove 及取交集并集和差集及更丰富的操作&#xff0c…

7. Adapter

转载于:https://www.cnblogs.com/anit/p/3930202.html

Redis 中常用命令

Redis 中常用命令 keys 返回满足给定 pattern 的所有 key。 127.0.0.1:6379> keys *1) "name2"2) "myzset"3) "myset7"4) "name"5) "myset6"6) "mylist"7) "mylist2"8) "myset3"9) "…

CGI与Servlet的区别和联系

1. 定义&#xff1a; CGI(Common Gateway Interface 公共网关接口)是HTTP服务器与你的或其它机器上的程序进行“交谈”的一种工具&#xff0c;其程序须运行在网络服务器上。 2. 功能&#xff1a; 绝大多数的CGI程序被用来解释处理杰自表单的输入信息&#xff0c;并在服 务器产生…

Redis sorted set 类型操作及常用命令

七个原则 Redis 是一个操作数据结构的语言工具&#xff0c;它提供基于 TCP 的协议以操作丰富的数据结构。在 Redis 中&#xff0c;数据结构这个词的意义不仅表示在某种数据结构上的操作&#xff0c;更包括了结构本身及这些操作的时间空间复杂度。Redis 定位于一个内存数据库&am…

Gradle中的buildScript代码块

在编写Gradle脚本的时候&#xff0c;在build.gradle文件中经常看到这样的代码&#xff1a; build.gradle1 2 3 4 5 6 7 8 9 buildScript {repositories {mavenCentral() } }repositories {mavenCentral() }这样子很容易让人奇怪&#xff0c;为什么repositories要声明两次哪&…

Redis List 类型操作及常用命令

七个原则 Redis 是一个操作数据结构的语言工具&#xff0c;它提供基于 TCP 的协议以操作丰富的数据结构。在 Redis 中&#xff0c;数据结构这个词的意义不仅表示在某种数据结构上的操作&#xff0c;更包括了结构本身及这些操作的时间空间复杂度。Redis 定位于一个内存数据库&am…

Hibernate查询之Criteria查询

转自&#xff1a;http://www.cnblogs.com/Laupaul/archive/2012/02/15/2353194.html Criteria是一种比hql更面向对象的查询方式。Criteria 可使用 Criterion 和 Projection 设置查询条件。可以设置 FetchMode( 联合查询抓取的模式 ) &#xff0c;设置排序方式&#xff0c;Crite…

IntelliJ Idea 常用插件

必备插件 Lombok 使用此插件可以使得我们的代码简洁&#xff0c;不用去写很多的set/get方法。使用之前需要引入 lombok 插件依赖。 JsonFormat 基于GsonFormat。快速将JSON字符串转换为实体类。它支持Jackson注释。 MyBatis Log Plugin 将 SQL 直接打印在控制台&#xff0c;不用…

jQuery 学习笔记(jQuery: The Return Flight)

第一课. ajax&#xff1a;$.ajax(url[, settings]) 练习代码&#xff1a; $(document).ready(function() {$("#tour").on("click", "button", function() {$.ajax(/photos.html, {success: function(response) {$(.photos).html(response).fadeI…

Redis Hash 类型操作及常用命令

七个原则 Redis 是一个操作数据结构的语言工具&#xff0c;它提供基于 TCP 的协议以操作丰富的数据结构。在 Redis 中&#xff0c;数据结构这个词的意义不仅表示在某种数据结构上的操作&#xff0c;更包括了结构本身及这些操作的时间空间复杂度。Redis 定位于一个内存数据库&am…

Redis set 类型操作及常用命令

七个原则 Redis 是一个操作数据结构的语言工具&#xff0c;它提供基于 TCP 的协议以操作丰富的数据结构。在 Redis 中&#xff0c;数据结构这个词的意义不仅表示在某种数据结构上的操作&#xff0c;更包括了结构本身及这些操作的时间空间复杂度。Redis 定位于一个内存数据库&am…

缓存初解(五)---SpringMVC基于注解的缓存配置--web应用实例

之前为大家介绍了如何使用spring注解来进行缓存配置 &#xff08;EHCache 和 OSCache&#xff09;的简单的例子&#xff0c;详见 Spring基于注解的缓存配置--EHCache AND OSCache 现在介绍一下如何在基于注解springMVC的web应用中使用注解缓存&#xff0c;其实很简单&#xff0…

Redis String 类型操作及常用命令

七个原则 Redis 是一个操作数据结构的语言工具&#xff0c;它提供基于 TCP 的协议以操作丰富的数据结构。在 Redis 中&#xff0c;数据结构这个词的意义不仅表示在某种数据结构上的操作&#xff0c;更包括了结构本身及这些操作的时间空间复杂度。Redis 定位于一个内存数据库&am…

于我,过去,现在和未来 —— 西格里夫·萨松

In me, past, present, future meet            于我&#xff0c;过去、现在和未来To hold long chiding conference              商讨聚会 各执一词 纷扰不息My lusts usurp the present tense             林林总总的 欲望&#xff0c;…

Java assert关键字

Java assert关键字 Assert 简介 Java2在1.4中新增了一个关键字&#xff1a;assert。在程序开发过程中使用它创建一个断言(assertion)。语法格式有两种&#xff1a; assert condition; 这里condition是一个必须为真(true)的表达式。如果表达式的结果为true&#xff0c;那么断言为…

linux 二级域名设置

首先&#xff0c;你的拥有一个有泛域名解析的顶级域名&#xff0c;例如&#xff1a; domain.com  其次&#xff0c;在 httpd.conf 中打开 mod_rewrite  之后&#xff0c;在 httpd.conf 的最后&#xff0c;添加以下内容&#xff1a;  RewriteEngine on  RewriteMap lowe…

Spring Boot @Conditional 注解

Spring Boot Conditional注解 Conditional是Spring4新提供的注解&#xff0c;它的作用是按照一定的条件进行判断&#xff0c;满足条件的才给容器注册Bean。 Conditional注解定义 Target({ElementType.TYPE, ElementType.METHOD}) Retention(RetentionPolicy.RUNTIME) Documente…