還是俄羅斯方塊之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.pswp.cn/news/273619.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/273619.shtml
英文地址,請注明出處:http://en.pswp.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…