Java中的Ascii表

时间:2015-04-16 18:12:25

标签: java ascii

我在制作用于游戏的桌子时遇到了麻烦。它需要

  • 3个人物角色@
  • 2个怪物#
  • 3个宝箱*
  • 和4个障碍O

表格需要10 x 10个方格,差距应填入. 应该看起来像这样:

   1 2 3 4 5 6 7 8 9 10
 1 . @ . * . . . . . .
 2 . . . . . # . . O .
 3 . . . . . . . . . .
 4 . . . . . . . . . .
 5 . . . # . . @ . . .
 6 . . O . . . . . . .
 7 . . . . O . . . O .
 8 . . . . . . * . . .
 9 . * . . . . . . . .
10 . . . . . . . @ . .

我还需要能够最后移动章节。这是我的醋栗代码。但我只能得到它.@,否则我只会出错。即使使用else if

package test;

import java.util.Scanner;


public class Test {

    public static void show(boolean[][] grid) {

        String s = "";

        for (boolean[] row : grid) {

            for (boolean col : row)

                if (col)

                    s += "@ ";

                else

                    s += ". ";

            s += "\n";

        }

        System.out.println(s);

    }

    public static boolean[][] gen() {

        boolean[][] grid = new boolean[10][10];

        for (int r = 0; r < 10; r++)

            for (int c = 0; c < 10; c++)

                if (Math.random() > 0.2)

                    grid[r][c] = true;

        return grid;

    }

    public static void main(String[] args) {

        boolean[][] world = gen();

        show(world);

        System.out.println();

        world = nextGen(world);

        show(world);

        Scanner s = new Scanner(System.in);

        while (s.nextLine().length() == 0) {

            System.out.println();

            world = nextGen(world);

            show(world);

        }

    }

    public static boolean[][] nextGen(boolean[][] world) {

        boolean[][] newWorld

        = new boolean[world.length][world[0].length];

        int num;

        for (int r = 0; r < world.length; r++) {

            for (int c = 0; c < world[0].length; c++) {

                num = numNeighbors(world, r, c);

                if (occupiedNext(num, world[r][c]))

                    newWorld[r][c] = true;

            }

        }

        return newWorld;

    }

    public static boolean occupiedNext(int numNeighbors, boolean occupied) {

        if (occupied && (numNeighbors == 2 || numNeighbors == 3))

            return true;

        else if (!occupied && numNeighbors == 3)

            return true;

        else

            return false;

    }

    private static int numNeighbors(boolean[][] world, int row, int col) {

        int num = world[row][col] ? -1 : 0;

        for (int r = row - 1; r <= row + 1; r++)

            for (int c = col - 1; c <= col + 1; c++)

                if (inbounds(world, r, c) && world[r][c])

                    num++;

        return num;

    }

    private static boolean inbounds(boolean[][] world, int r, int c) {

        return r >= 0 && r < world.length && c >= 0 &&

        c < world[0].length;

    }

}

有没有人对什么能帮助我获得所有符号有任何想法?

2 个答案:

答案 0 :(得分:2)

您正在为网格使用布尔2-D数组。因此每个条目只能有两个值。例如,如果将其切换为int [] [],则可以为可能包含该单元格的不同类型的对象指定不同的值。比如说:

  1. 人类&#34; @&#34;
  2. 怪物&#34;#&#34;
  3. Treasure Chest&#34; *&#34;
  4. 障碍&#34; O&#34;
  5. 也许使用0 =未占用&#34;。&#34;,因为整数默认为零。

答案 1 :(得分:2)

用于存储数据的数据结构(boolean[][])每个单元格只能容纳两个不同的值,但您需要五个。您可以保留类似的程序结构,但可以通过更改为byte[][]来容纳所需的不同值的数量。

此外,您可以通过使用数组将这些show()值映射到适当的显示字符来至少简化byte方法。

也许这会让你朝着有用的方向前进:

    private final static char[] DISPLAY_SYMBOLS = { '.', '@', '#', '*', 'O' };
    // ...

    public static void show(byte[][] grid) {
        for (byte[] row : grid) {
            StringBuilder sb = new StringBuilder();

            for (byte col : row) {
                sb.append(DISPLAY_SYMBOLS[col]).append(' ');
            }

            System.out.println(sb.toString());
        }
    }