Pygameへの道 〜 非プログラマの無責任ハッキング

CJK NETWORK


2003/12/12(金)

 昨日のは不等号を<とかにするの忘れてました。
 画面の上下左右が変なのは、ただ配列をprintしているだけだからです。後で直します。


2003/12/11(木)

 まー、某氏から「ランダムマップRPG作って下さい」と言われたわけで。
 それのせいにするつもりはないけれど、たぶんそれを命令と思って従った方が無駄な時間を過ごさずに済む気がする。
 とか言いつつ今日はもう眠いので、こっちも15分間ハッキングな感じ。以下材料とレシピ。

変数名内容とか型とか備考
score得点int-
map地図int[15][15]とりあえず広さは15x15とする。0は壁。1は平地。
x主人公のx位置int-
y主人公のy位置int-
m主人公の行動int↑1、→2、↓3、←4。0なら何もしない。(一応)
gameover終了フラグbool真なら終了。
 
関数/手続き名内容とか引数とか戻り値とか備考
mapcreateマップ生成なしint[15][15]引数はランダムの種にする予定。
inputwait入力待ちなしintユーザの入力を待ち、行動値を返す。↑1、→2、↓3、←4。0なら何もしない。(一応)
gameovercheck終了チェックint,intbool引数の位置からみて、四方が壁ならTrue、それ以外ならFalseを返す。
さしあたり。予約語とかは先生知りません。

# -*- coding: cp932 -*-

# マップ生成関数 // とりあえず平地だけを返す
def mapcreate():
	r = []
	for i in range(15):
		r.append([])
		a = []
		for j in range(15):
			a.append(1)
		r[i]=a
	return r

# 入力待ち関数 // とりあえずinputで数字入れるだけ
def inputwait():
	a = 0
	while not (1<=a<=4):
		a = input("1:up 2:right 3:down 4:left? ")
	return a

# 終了判定関数
def gameovercheck(cmap,cx,cy):
	if (cy==0 or cmap[cx][cy-1]==0) and (cx==14 or cmap[cx+1][cy]==0) and (cy==14 or cmap[cx][cy+1]==0) and (cx==0 or cmap[cx-1][cy]==0):
		return True
	else:
		return False

# 初期設定
map = mapcreate()
x,y = 7,7
map[x][y] = 0
score = 0
gameover = False
for i in range(15):
	print map[i]
print x,y,score

# メインループ
while not gameover:
	# 入力待ち
	m = inputwait()
	# 論理的に移動、移動できなかったらループ	
	if (m==1) and (y!=0 and (map[x][y-1]>=1)):
		y -= 1
	elif (m==2) and (x!=14 and (map[x+1][y]>=1)):
		x += 1
	elif (m==3) and (y!=14 and (map[x][y+1]>=1)):
		y += 1
	elif (m==4) and (x!=0 and (map[x-1][y]>=1)):
		x -= 1
	else:
		continue
	# 主人公の位置を壁にする
	map[x][y] = 0
	# スコア加算
	score += 10
	# 画面更新 // とりあえずprintするだけ…
	for i in range(15):
		print map[i]
	print x,y,score
	# 終了判定
	gameover = gameovercheck(map,x,y)

# 終了処理 // pass:何もしない命令
pass

 以上、動いて、終了判定して、終了するところまで。
 これでランダムマップRPGにおけるゲーム性の半分くらいは完成です。
 画面が縦になってるのは後で直しますが……ソースの改行ってできないのかしら。

 で、なんと、Noneの反対語は存在しないんだそうです。
 bool型はTrueとFalse。
 types.NoneTypeという型があり、その唯一の値がNone。0ビット変数というか。NoneType型の変数は、存在していれば必ずNoneなわけ。
 や、Pythonは型をそんな意識しなくてもいいんだけどさ…。

 以上、15分とか言いながら2時間くらいかかりました。配列を作る方法で悩んだ。


2003/12/10(水)

 麻雀の点数計算プログラム。……というかスクリプトだなこれは。

# -*- coding: cp932 -*-
# ↑日本語を通すために必要みたいです。

# 麻雀的切り上げ計算関数
def m_round(r):
    return int((r+99)/100)*100

# 点数計算関数:第3引数が真なら親、偽なら子で、デフォルトは子。
def mahjong(han,fu,oya=None):
    fu = int((fu+9)/10)*10
    if oya:
        a = 6
    else:
        a = 4
    b = m_round(fu*a<<han+2)
    if b >= 2000 * a:
        if han >= 13:
            b = 8000 * a
        elif han >= 11:
            b = 6000 * a
        elif han >= 8:
            b = 4000 * a
        elif han >= 6:
            b = 3000 * a
        else:
            b = 2000 * a
    return b

# ツモ時の支払分配計算関数:戻り値は配列。第2引数が真なら親、偽なら子で、デフォルトは子。
def tsumo(point,oya=None):
    if oya:
        a = m_round(point / 3)
        return [a,a,a]
    else:
        a = m_round(point / 2)
        b = m_round(point / 4)
        return [a,b,b]

# メインルーチン
h = input("han? ")
f = input("fu? ")
p_oya = mahjong(h,f,1)
p_ko = mahjong(h,f)
print p_oya,tsumo(p_oya,1)
print p_ko,tsumo(p_ko)

 やー……昔を思い出すなあ。いいなあこれ。
 しかし半端にPascalとか触ってきた弊害として、関数内の変数にプライバシーを求めてしまう。
 プログラム全体で変数名を重複させないのってけっこう難しいんじゃないかなあ。

 で、Noneの反対語って何ですか。


Created by "Team CJK" ( CHINO Jun'ichi, JUEI Tomoyuki, KIRIHARA Miyahito )
home : http://www.maplecat.net/cjk/
mail : j-chino♪maplecat.net(♪をアットマークに)