0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

左に落ちる2次元配列

0
Last updated at Posted at 2025-12-21

二次元配列を可視化したりマップ上を移動させたりするときに発生し困惑させる、ある現象を解説します。

プログラミングの世界で初心者を追い返す番犬のような存在の一つです。
あとは、全角スペースとか、数字(str)とか?

問題

一般に、二次元配列を用いたマップでは座標を(y, x)の順で表現します。
また、y座標が小さい点は上側にあり、大きい点は下側にあります。
そのため下の点は、(y+1, x)になります。

image.png
 見る人によって解釈が変わる看板

文章で説明されても分からないと思うので、体験してみましょう。

体験

5x5の二次元配列を作ります。

a = [
    ['b', 'c', 'd', 'e', 'f'],
    ['g', 'h', 'i', 'j', 'k'],
    ['l', 'm', 'n', 'o', 'p'],
    ['q', 'r', 's', 't', 'u'],
    ['v', 'w', 'x', 'y', 'z'],
]

たぶんこんな感じで作ると思います。

では、座標で要素を取り出す関数を考えてみましょう。

def get_a(x, y):
  return a[x][y]

直感的にはこうしますよね?
では、以下を実行してみましょう。

get_a(1, 0)

'w'が表示されそうですよね?
ですが、実際は以下が表示されます。

'g'

次に、真ん中の'n'を表示します。

get_a(2, 2)
'n'

下の's'を表示しようとします。
y軸を-1すれば良さそうです。

get_a(2, 1)
'm'

左の'm'が表示されました。

解説

今回の二次元配列は、配列の配列という様になっています。したがって、a[0][0]というのは、最初の配列のうちの最初の要素ということになります。

a = [ a[0], a[1], a[2] a[3] ] とあって
a[0] = [ a[0][0] a[0][1] a[0][2] a[0][3] ] とある

つまり、y軸というのは何番目の配列かを指しており、x軸というのはその配列の何番目の要素かを指しているのです。
また、y軸に+1するというのは、次の配列にいくということなので、下に進むことになります。

言い換えると、原点が左上にあるということです。

image.png
 二次元配列によるゲームマップのイメージ gemini-3-proにより生成

左上から始まり、右下に進んでいく特徴やn行のn文字目という風に指定する点で、文章と同じです。
よく考えたら、二次元配列を文章(アルファベットや記号の連続)として記述していくので当たり前ですね。
つまりこの問題は、世界の描写方法と文法の違いに起因すると言えます

解決策

正直慣れてしまえばどうということはないのですが、解決法として、以下のような関数を用いるというのがあります。

def get_a(x, y):
  y = (len(a)-1) - y  # yを反転
  return a[y][x]      # xとyを入れ替え

ですが、いちいちこれを書くのは面倒なので、慣れてしまうことをおすすめします。

気づいたら原点が左上に合っても違和感を感じなくなります。
ですが、自分はいまだに間違ってコードを書いていることがあります。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?