見出し画像

JavaScriptからPythonへの移植方法

移植というか、それぞれの違いを知ることで移植しやすくするための自分メモ。間違ってたら随時直そうかと。

JavaScriptはjs、Pythonはpyで記述
・jsはかっこ{}で括るのに対してpythonはタブインデントで対応
 (注)タブインデントとスペースインデントは混在不可
・pyでは小数range指定は不可なので整数化して使用する
・jsは行末にセミコロン必要(無くても動く場合ある)
・jsでは型混在してても動く、pyは混在するとエラーになる
 (注)pyは明示的な型宣言がないのでそれっぽい名前つけたほうが良い

(注)
ここではjsに対する基本的なものをまとめてます。
主に移植するときに参考にしたものをまとめてます。
pyにおけるリスト、タプル、辞書に関することは記述しません。

■配列
<js>

var o_dottbl0 = new Array(0x4a);
o_dottbl0 = [
	0x09,0x01,0x0a,0x01,0x0b,0x01,0x0c,0x01,0x0d,0x01,0x09,0x02,0x09,0x03,0x09,0x04,
	0x0a,0x04,0x0b,0x04,0x0c,0x04,0x0d,0x05,0x0d,0x06,0x0c,0x07,0x0b,0x07,0x0a,0x07,
	0x09,0x06,0x12,0x01,0x13,0x01,0x14,0x01,0x11,0x02,0x11,0x03,0x11,0x04,0x11,0x05,
	0x11,0x06,0x12,0x07,0x13,0x07,0x14,0x07,0x15,0x02,0x15,0x03,0x15,0x04,0x15,0x05,
	0x15,0x06,0x12,0x05,0x13,0x04,0x14,0x03,0xff,0xff];

<py>

o_dottbl0 = [0 for dot in range(0x4a)]
o_dottbl0 = [
	0x09,0x01,0x0a,0x01,0x0b,0x01,0x0c,0x01,0x0d,0x01,0x09,0x02,0x09,0x03,0x09,0x04,
	0x0a,0x04,0x0b,0x04,0x0c,0x04,0x0d,0x05,0x0d,0x06,0x0c,0x07,0x0b,0x07,0x0a,0x07,
	0x09,0x06,0x12,0x01,0x13,0x01,0x14,0x01,0x11,0x02,0x11,0x03,0x11,0x04,0x11,0x05,
	0x11,0x06,0x12,0x07,0x13,0x07,0x14,0x07,0x15,0x02,0x15,0x03,0x15,0x04,0x15,0x05,
	0x15,0x06,0x12,0x05,0x13,0x04,0x14,0x03,0xff,0xff]
data = [1,2,3,4]

としてもいいようです。

■二次元配列
<js>

// スプライトワーク
const O_SPR_WORK_MAX = 0x42;
const WORKPARAM = 5;
var O_SPR_WORK = new Array(O_SPR_WORK_MAX);
for( var i = 0; i < O_SPR_WORK_MAX; i++) {
	O_SPR_WORK[i] = new Array( WORKPARAM );
}

<py>

#スプライトワーク
O_SPR_WORK_MAX = 0x42
WORKPARAM = 5
O_SPR_WORK = [[0 for i in range(WORKPARAM)] for j in range(O_SPR_WORK_MAX)]

■変数/コメント
<js>

var high_score = 0;			// ハイスコア

<py>

high_score = 0		#ハイスコア

■for
<js>

// 初期座標セット
for (var y = 0; y < YSIZE; y++) {
	for (var x = 0; x < XSIZE; x++) {
		pos[y * XSIZE + x]  = new Array(2); // x,y
		pos[y * XSIZE + x][0] = x * DDOT; // xpos
		pos[y * XSIZE + x][1] = y * DDOT; // ypos
	}
}

<py>
rangeの使い方
 range( start, end, step)
   jsで言うところの、for( i = start; i < end; i++ )

 range( end )
の場合は、range( 0, end, 1 )の略記

# 初期座標セット
for yp in range(YSIZE):
	for xp in range(XSIZE):
		pos[yp * XSIZE + xp][0] = xp * (RADIUS+DDOT)	#xpos
		pos[yp * XSIZE + xp][1] = yp * (RADIUS+DDOT)	#ypos
js
    for( _cnt = 0; _cnt < 0x1000; _cnt++ )
↓
py
    for _cnt in range( 0, 0x1000, 1 )
  または
    for _cnt in range(0x1000)

■if
<js>

if( color_mode == 2 ) {		//タイトル
	<処理>
} else if( color_mode == 1 ) {
	<処理>
} else {
	<処理>
}

<py>

if color_mode == 2:		#タイトル
	<処理>
elif color_mode == 1:
	<処理>
else:
	<処理>

■switch
<js>

switch( pattern ) {
	case 1:
		<処理>
		break;
	case 2:
		<処理>
		break;
	default:
		<処理>
		break;
}

<py>
無し?ifで代用

■関数
<js>

function dot_put( xp, yp, color_mode ) {
	<処理>
}

<py>

def dot_put( xp, yp, color_mode ):
	#グローバル変数使う場合はここに記述する必要がある
	global XSIZE,XSIZE2
	global YSIZE,YSIZE2
	global RADIUS,RADIUS2
	global DDOT,DDOT2
	global title_xoff,title_yoff
	global TT_KANKAKU

	<処理>

■条件式
<js>

	||		//OR
	&&		//AND

<py>

	or		#OR
	and		#AND

■無限ループ
<js>

for(;;){}
while(1){}

<py>

while True:

■クラス(使ったことはないのでそのうち・・・
<js>
<py>

■ソース分割
<js>
<py>
pythonのソース分割はいろいろとめんどくさい
クラスにしてれば問題ないのかも?

この記事が気に入ったらサポートをしてみませんか?