## Java編程那些事兒50—多維數組使用示例2
鄭州游戲學院 陳躍峰
出自:[http://blog.csdn.net/mailbomb](http://blog.csdn.net/mailbomb)
**6.6.3 存儲圖形結構**
要求:根據數組中的值,在對應位置繪制指定的字符。規定0繪制空格,1繪制星號(*)。數組的值如下所示:
??????????????????????????? {
???????????????????????????????????? {0,0,0,1,0,0,0},
???????????????????????????????????? {0,0,1,0,1,0,0},
???????????????????????????????????? {0,1,0,0,0,1,0},
???????????????????????????????????? {1,0,0,0,0,0,1},
???????????????????????????????????? {0,1,0,0,0,1,0},
???????????????????????????????????? {0,0,1,0,1,0,0},
???????????????????????????????????? {0,0,0,1,0,0,0}
??????????????????????????? }
該題目是一個基本的數組應用,數組中的值存儲的是控制信息,程序根據數組中的值實現規定的功能。
實現思路:循環數組中的元素,判斷數組中的值,根據值繪制對應的字符即可。
實現的代碼如下所示:
~~~
?????????????????? int[][] map = {
???????????????????????????????????? {0,0,0,1,0,0,0},
???????????????????????????????????? {0,0,1,0,1,0,0},
???????????????????????????????????? {0,1,0,0,0,1,0},
???????????????????????????????????? {1,0,0,0,0,0,1},
???????????????????????????????????? {0,1,0,0,0,1,0},
???????????????????????????????????? {0,0,1,0,1,0,0},
???????????????????????????????????? {0,0,0,1,0,0,0}
?????????????????? };
?????????????????? //輸出數組的值
?????????????????? for(int row = 0;row < map.length;row++){
??????????????????????????? for(int col = 0;col < map[row].length;col++){
???????????????????????????????????? switch(map[row][col]){
???????????????????????????????????? case 0:
?????????????????????????????????????????????? System.out.print(' ');
?????????????????????????????????????????????? break;
???????????????????????????????????? case 1:
?????????????????????????????????????????????? System.out.print('*');
?????????????????????????????????????????????? break;
???????????????????????????????????? }
??????????????????????????? }
??????????????????????????? System.out.println();
?????????????????? }
~~~
類似的代碼在游戲開發中,可以用來代表游戲中的地圖數據,或者俄羅斯方塊等益智游戲中地圖塊的值。
**6.6.4 螺旋數組**
要求:存儲和輸出nXm的螺旋數組,其中n和m為大于0的整數。
以下是一些螺旋數組的示例:
1???????? ?2??3??4??????????????????? ?1??2??3??4??5
12?13?14?5???????????????????? 14 ?15 ?16 ?17?6
11 ?16?15?6???????????????????? 13 ?20 ?19 ?18 ?7
10?9??8??7???????????????????? 12 ?11 ?10 ??9 ?8
4X4螺旋數組??????????????????????? 4X5螺旋數組
對于螺旋數組來說,其中的數值很有規則,就是按照旋轉的結構數值每次加1,實現該功能需要對數組和流程控制有角深刻的認識。
實現思路:聲明一個變量來代表需要為數組元素賦的值,對于其中的數字來說,每個數字都有一個移動方向,這個方向指向下一個元素,根據該方向改變數組的下標,如果到達邊界或指向的元素已經賦值,則改變方向。
實現代碼如下:
~~~
???????? ???????? int n = 4;
?????????????????? int m = 5;
?????????????????? int[][] data = new int[n][m];
?????????????????? int dire;?? //當前數字的移動方向
?????????????????? final int UP = 0;?? //上
?????????????????? final int DOWN = 1; //下
?????????????????? final int LEFT = 2; //左
?????????????????? final int RIGHT = 3;//右
?????????????????? dire = RIGHT;
?????????????????? int value = 1;??? //數組元素的值
?????????????????? int row = 0;???? //第一維下標
?????????????????? int col = 0;???? //第二維下標
?????????????????? data[0][0] = 1;?//初始化第一個元素
?????????????????? while(value < n * m){
??????????????????????????? switch(dire){
???????????????????????????????????? case UP:
?????????????????????????????????????????????? row--; //移動到上一行
?????????????????????????????????????????????? if(row < 0){ //超過邊界
??????????????????????????????????????????????????????? row++; //后退
??????????????????????????????????????????????????????? dire = RIGHT;
?????????????????????????????????????????????? ???????? continue; //跳過該次循環
?????????????????????????????????????????????? }else if(data[row][col] != 0){//已賦值
??????????????????????????????????????????????????????? row++; //后退
??????????????????????????????????????????????????????? dire = RIGHT;
??????????????????????????????????????????????????????? continue; //跳過該次循環
?????????????????????????????????????????????? }
?????????????????????????????????????????????? break;
???????????????????????????????????? case DOWN:
?????????????????????????????????????????????? row++; //移動到下一行
?????????????????????????????????????????????? if(row >= n){ //超過邊界
??????????????????????????????????????????????????????? row--; //后退
??????????????????????????????????????????????????????? dire = LEFT;
??????????????????????????????????????????????????????? continue; //跳過該次循環
?????????????????????????????????????????????? }else if(data[row][col] != 0){//已賦值
??????????????????????????????????????????????????????? row--; //后退
??????????????????????????????????????????????????????? dire = LEFT;
??????????????????????????????????????????????????????? continue; //跳過該次循環
?????????????????????????????????????????????? }
?????????????????????????????????????????????? break;
???????????????????????????????????? case LEFT:
?????????????????????????????????????????????? col--; //移動到前一列
?????????????????????????????????????????????? if(col < 0){ //超過邊界
??????????????????????????????????????????????????????? col++; //后退
??????????????????????????????????????????????????????? dire = UP;
??????????????????????????????????????????????????????? continue; //跳過該次循環
?????????????????????????????????????????????? }else if(data[row][col] != 0){//已賦值
??????????????????????????????????????????????????????? col++; //后退
??????????????????????????????????????????????????????? dire = UP;
??????????????????????????????????????????????????????? continue; //跳過該次循環
?????????????????????????????????????????????? }
?????????????????????????????????????????????? break;
???????????????????????????????????? case RIGHT:
?????????????????????????????????????????????? col++; //移動到后一行
?????????????????????????????????????????????? if(col >= m){ //超過邊界
??????????????????????????????????????????????????????? col--; //后退
??????????????????????????????????????????????????????? dire = DOWN;
??????????????????????????????????????????????????????? continue; //跳過該次循環
?????????????????????????????????????????????? }else if(data[row][col] != 0){//已賦值
??????????????????????????????????????????????????????? col--; //后退
??????????????????????????????????????????????????????? dire = DOWN;
??????????????????????????????????????????????????????? continue; //跳過該次循環
?????????????????????????????????????????????? }
?????????????????????????????????????????????? break;
??????????????????????????? }
??????????????????????????? value++; //數值增加1
??????????????????????????? data[row][col] = value;//賦值???????????????????
?????????????????? }
?????????????????? //輸出數組中的元素
?????????????????? for(int i = 0;i < data.length;i++){
??????????????????????????? for(int j = 0;j < data[i].length;j++){
???????????????????????????????????? if(data[i][j] < 10){//右對齊
?????????????????????????????????????????????? System.out.print(' ');
???????????????????????????????????? }
???????????????????????????????????? System.out.print(data[i][j]);
???????????????????????????????????? System.out.print(' ');
??????????????????????????? }
??????????????????????????? System.out.println();
?????????????????? }
~~~
在該代碼中dire代表當前元素的移動方向,每個根據該變量的值實現移動,如果移動時超出邊界或移動到的位置已賦值,則改變方向,并跳過本次循環,如果移動成功,則數值增加1,對數組元素進行賦值。
對于多維數組來說,更多的是設計數組的結構,并根據邏輯的需要變換數組的下標,實現對于多維數組元素的操作。
- 前言
- (1)序言
- (2)程序設計是什么?
- (3)你適合學習程序設計嗎?
- (4)如何學好程序設計?
- (5)程序設計介紹小結
- (6)計算機軟件基本概念
- (7)進制的概念
- (8)計算機內部的數據表達
- (9)網絡編程基礎
- (10)Java語言簡介
- (11)JDK的獲得、安裝和配置
- (12)第一個HelloWorld程序
- (13)Eclipse基本使用
- (14)Eclipse基礎使用進階
- (15)如何學好Java語法
- (16)代碼框架、關鍵字和標識符
- (17)基本數據類型
- (18)變量和常量
- (19)數據類型轉換
- (20)空白、語句結束和注釋
- (21)算術運算符
- (22)比較運算符
- (23)邏輯運算符
- (24)賦值運算符
- (25)位運算符
- (26)移位運算符
- (27)其它運算符
- (28)運算符優先級
- (29)表達式
- (30)流程控制基礎
- (31)if語句語法(1)
- (32)if語句語法(2)
- (33)if語句語法(3)
- (34)switch語句語法
- (35)while語句語法
- (36)do-while語句語法
- (37)for語句語法
- (38)break和continue語句
- (39)流程控制綜合示例1
- (40)流程控制綜合示例2
- (41)流程控制綜合示例3
- (42)流程控制綜合練習
- (43)數組概述
- (44)數組基礎語法
- (45)數組使用示例1
- (46)數組使用示例2
- (47)數組使用示例3
- (48)多維數組基礎
- (49)多維數組使用示例1
- (50)多維數組使用示例2
- (51)多維數組練習
- (52)方法聲明
- (53)方法聲明示例
- (54)方法調用
- (55)方法重載和參數傳遞
- (56)方法練習
- (57)面向對象基礎
- (58)類(一)
- (59)類(二)
- (60)對象
- (61)面向對象設計方法和面向對象特性(一)
- (62)繼承(二)
- (63)多態性
- (64)訪問控制符、修飾符和其它關鍵字
- (65)static修飾符
- (66)final修飾符
- (67)this和super
- (68)抽象類和接口(一)
- (69)抽象類和接口(二)
- (70)抽象類和接口(三)
- (71)內部類簡介
- (72)包的概念
- (73)JDK文檔使用
- (74)java.lang包介紹1
- (75)String類使用
- (76)StringBuffer類和System類
- (77)包裝類
- (78)時間和日期處理
- (79)Random隨機處理
- (80)集合框架簡述
- (81)異常處理概述
- (82)異常處理語法1
- (83)異常處理語法2
- (84)IO簡介
- (85)IO類體系
- (86)文件操作之File類使用
- (87)文件操作之讀取文件
- (88)文件操作之寫文件
- (89)讀取控制臺輸入
- (90)裝飾流使用1
- (91)裝飾流使用2
- (92)IO使用注意問題
- (93)多線程基礎
- (94)多線程實現方式1
- (95)多線程實現方式2
- (96)多線程使用示例1
- (97)多線程使用示例2
- (98)多線程問題及處理1
- (99)多線程問題及處理2
- (100)多線程問題及處理3
- (101)網絡編程概述
- (102)網絡編程技術1
- (103)網絡編程技術2
- (104)網絡編程技術3
- (105)網絡編程技術4
- (106)網絡編程技術5
- (107)網絡協議概念
- (108)網絡編程示例1
- (109)網絡編程示例2
- (110)網絡編程小結