エラーが発生しています。

ライフゲーム

by ふんすけ@来年から頑張る, at 2017年9月27日 23:52:57

powered by hsp3dish.js / OpenHSP

コメント
説明

ライフゲームです。

▲下記は目標。

1.マウスクリックで生・死を操作できるようにする 2017/11/20 stick命令で解決

2.生存条件を入力できるようにする

▲問題点

ボタンがチカチカする ->そもそもボタン要る?

->メモ:update_cellをコメントアウトにすると落ち着く->周囲のセルカウントをlive_cell = rnd(9)にすると落ち着く->dx = … : dy = … をコメントアウトすると落ち着く->ループ部分を羅列して書いてもダメ->剰余算を何回か繰り返すとダメっぽい?->ログで OVER HSP_LIMIT_STEP 30000 が出るとチカチカ

ボタンに文字列が表示されない

->メモ:button_test.hspでも表示されないのでHSP部屋の仕様?<-嘘、ランタイムバージョンを最新(3.5b5)にしたらイケました

// ライフゲーム(上と下、右と左が繋がってる トーラス
// HSP部屋のおまじない
#include "hsp3dish.as"

#const C_S 16		; セルのサイズ(縦横兼用
#const W_X 640		; ウィンドウサイズX
#const W_Y 480		; ウィンドウサイズY
#const C_X W_X / C_S	; セルの横表示数
#const C_Y W_Y / C_S	; セルの縦表示数

//==============================
// はじまり
//==============================
	// 初期化
	screen 0, W_X, W_Y
	
	// セル (サイズ8x8)
	dim  cell, C_X, C_X		; セル横60x縦60
	dim _cell, C_X, C_X		; セル一時保存用
	// セル周囲探索用
	dim dx, 8
	dim dy, 8
	dx = -1,  0,  1, -1, 1, -1, 0, 1
	dy = -1, -1, -1,  0, 0,  1, 1, 1
	// 待機時間
	await_time = 64
	// 更新フラグ
	flg_update = 0
	
/*
	// dishでは入力系割り込み使えない->stick
	// キー押下時処理
	onkey gosub *inkey
	// マウスクリック処理
	onclick gosub *inmouse
*/

;	// スタート画面の表示
;	goto *start_screen
	
;	// 開始ボタン
;	pos 500, 10
;	button goto "start", *main_loop
	
*main_loop
	
	redraw 0
	
	gosub *init_screen	; 画面全体の初期化
	gosub *draw_cell	; セルの表示
	if flg_update {
		gosub *update_cell	; セルの更新
	} else {
		gosub *pause
	}
	
	redraw 1
	
	await await_time
	
	gosub *input_stick
	
	goto *main_loop

//==============================
// セルの初期化
//==============================
*cell_clear
	memset cell, 0, 4 * C_X * C_X
	return

//==============================
// セルのランダム初期化
//==============================
*cell_rnd
	repeat C_Y
		y = cnt
		repeat C_X
			x = cnt
			cell( x, y ) = rnd( 2 )
		loop
	loop
	return

//==============================
// 画面の初期化
//==============================
*init_screen
	// 灰で画面消去
	color 64, 64, 64 : boxf ;0, 0, 480, 480
	// 黒で線引き
	color 0, 0, 32
	repeat C_X
		x1 = C_S * cnt + C_S - 1
		y1 = 0
		x2 = x1 + 1
		y2 = 639
		boxf x1, y1, x2, y2		; 縦線
		boxf y1, x1, y2, x2		; 横線
	loop
	return

//==============================
// ポーズ画面
//==============================
*pause
	pos 0, 0
	color $ff, $ff, $ff
;	font msgothic, 16
	mes "PAUSE  "
	mes " "
	mes "LEFT CLICK  -- CHANGE CELL  "
	mes "RIGHT CLICK -- PAUSE / GO  "
	mes "SPACE KEY   -- RANDOM CELL  "
	mes "ESC KEY     -- CLEAR CELL  "
	mes "<- KEY      -- SLOW  "
	mes "-> KEY      -- FAST  "
	mes "AWAIT TIME  -- " + await_time + "  "
	return

//==============================
// セルの表示
//==============================
*draw_cell
	color 0, 128, 0		; 深緑?
	repeat C_Y
		y = cnt
		repeat C_X
			x = cnt
			// セルが生(1)の場合、表示する
			if cell( x, y ) {
				x1 = C_S * x
				y1 = C_S * y
				x2 = x1 + C_S - 1
				y2 = y1 + C_S - 1
				boxf x1, y1, x2, y2 
			}
		loop
	loop
	return

//==============================
// セルの更新
//==============================
*update_cell
	// 表示セルを一時セルにコピー
;	repeat C_Y
;		y = cnt
;		repeat C_X
;			x = cnt
;			cell( x, y ) = _cell( x, y )
;		loop
;	loop
	memcpy _cell, cell, 4 * C_X * C_X
	// セルの更新
	repeat C_Y
		y = cnt
		repeat C_X
			x = cnt
			// 対象セル(x,y)の周り(8近傍)の生きているセルのカウント
			live_cell = 0
			repeat 8
				sx = ( x + dx( cnt ) + C_X ) \ C_X
				sy = ( y + dy( cnt ) + C_Y ) \ C_Y
				if _cell( sx, sy ) : live_cell ++
			loop
			// 対象セル(x,y)が生きている(1)場合
			// 周りの生きているセルが2つより少ない場合->過疎死
			// 周りの生きているセルが3つより多い場合->過密死
			if cell( x, y ) {
				if live_cell < 2 or live_cell > 3 {
					cell( x, y ) = 0
				}
;				if live_cell < 2 {
;					_cell( x, y ) = 0
;				} else : if live_cell > 3 {
;					_cell( x, y ) = 0
;				// 周りの生きているセルが2,3の場合->生存
;				} else {
;					_cell( x, y ) = 1
;				}
			// 対象セル(x,y)が死んでいる(0)場合
			// 周りの生きているセルが3つの場合->誕生
			} else {
				if live_cell == 3 {
					cell( x, y ) = 1
				}
;				if live_cell == 3 {
;					_cell( x, y ) = 1
;				} else {
;					_cell( x, y ) = 0
;				}
			}
		loop
	loop
	return

//==============================
// 
//==============================
*input_stick
	stick inkey, 1 | 4
	// ←キー
	if inkey & 1 {
		await_time += 16
		await_time = limit( await_time, 16, 992 )
	}
	// →キー
	if inkey & 4 {
		await_time -= 16
		await_time = limit( await_time, 16, 992 )
	}
	// スペースキー
	if inkey & 16 {
		gosub *cell_rnd
	}
	// ESCキー
	if inkey & 128 {
		gosub *cell_clear
	}
	// 
	// マウスクリック
	if inkey & 256 {
		if flg_update == 0 {
			x = mousex / C_S
			y = mousey / C_S
			cell( x, y ) = 1 - cell( x, y )
		}
	}
	// マウス右クリック
	if inkey & 512 {
		flg_update = 1 - flg_update
	}
	return

/*
//==============================
// キー押下時処理
//==============================
*inkey
;	dialog "" + iparam
	// Rキー
	if iparam == 82 {
		gosub *cell_rnd
;		goto *start_screen
	}
	// Cキー
	if iparam == 67 {
		gosub *cell_clear
;		goto *start_screen
	}
	// +キー
	if iparam == 59 {
		await_time += 16
		await_time = limit( await_time, 16, 992 )
	}
	// -キー
	if iparam == 45 {
		await_time -= 16
		await_time = limit( await_time, 16, 992 )
	}
	return

//==============================
// マウスクリック処理
//==============================
*inmouse
;	dialog "" + iparam + "," + wParam + "," + lParam
	// 右クリック
	if iparam == 0 {
		if flg_update == 0 {
			x = lparam & 0xffff
			y = lparam >> 16
			x = x / C_S
			y = y / C_S
			cell( x, y ) = 1 - cell( x, y )
;			goto *start_screen
		}
	}
	// 左クリック
	if iparam == 3 {
		flg_update = 1 - flg_update
	}
	return
*/

ステップ数の上限:30000 ランタイムバージョン:3.5b5

作成者
icon

ふんすけ@来年から頑張る

ここはユーザの紹介文

詳しく...


関連プログラム