2015年07月

本日は38度まで上昇。とても散歩行く気力なし。
asでは次のような書法が可能だった。幽かに6年程前のコンサートHPで使った記憶がある。

function aa12(){
trace("123");
}

this["aa12"]();
// こんな表記が可能

var r = 12;
this["aa"+r]();
// こんな表記も可能。

まごころ弁当を注文し食す。東京で一度試してみたときに感じた不味さは感じなかったが、とにかく量が少なく、560円で高い。 
495040 

15時5分のバス+16時38分東岡崎駅発準急で富田病院へ。16時15分予約の診療を17時から。36度越えの暑い日。

今日は睡眠不足のせいか体調悪く、散歩も行かず。ただウィスコンシンカード分類課題は、前書きも含めてほぼ完成。

プログラムコードのあるxtmlファイルで次のようなエラーメッセージが冒頭に出る。
19
Firefoxで閲覧すると、
「XML パースエラー: 整形式になっていません。」というエラーが出てしまう。
09
「&」や「<」などの文字を使用していることなどが原因らしい。Kindle Previeeerでは問題なく表示されるが、
「&」→&amp;
「<」→&lt;

に直した方がいいだろう。
その後、上記以外の理由で出ていたエラーHTMLにおいて、何度探しても見つからなかったミスが見つかる。</P>タグを消してしまっていた。
下記は、style.cssに追加するクラスの再定義。
pre {
white-space: pre-wrap;
font-size: large;
color: #F03;
font-family: "Courier New", Courier, monospace;
line-height: 105%;
}
 

解決しそうなので忘れないうちにメモ。昨日の全角スペース置換などは却下。
1.  DCで次のテキストをepubに。
s1
2. 解凍してOEBPSフォルダ内のbodymatter_0_0.xhtmlを見ると、例によって、インデントが無視され、function start_random(){が<P>タグで囲まれ除外されている。文字も小さい。
s2
s4
s6
3. DWで整形し直す。<P>タグで囲まれているfunction start_random(){などを削除し、ここの<pre><code>タグの中に、再度1.のインデントを持つコードをコピー。
s7
4. style.cssの末尾に次のコードを追加。文字サイズを大きく、色を赤に。
pre {
white-space: pre-wrap;
font-size: large;
color: #F03;
}
s8

5.  こうなった。
s9
6. コードの一部の色を替える時は、面倒なのでこの際次のように<font>タグでも使っておく。
 s12s11
s10

あまりスマートな方法だとは言えないが、電子書籍の場合、文面をコピー&ペーストして使うわけではないので、次の方法が現時点で一番てっとり早い。インデントを全角スペースで置き換えるとDreamweaverのHTMLに外観上はインデントの空白を保持したままでペーストできる。もちろんこのソースはコンパイルできない。
1. テキストエディットでインデントを持つコード。
テキストエディット
2. miにコピー。mi上で置換を行なうのは、他のエディタでは「¥t」を検索できない(?)ため。
miにペースト
3. miの「検索・置換」。「正規表現検索」チェック。「¥t」を検索文字列に、全角スペース2〜3文字 を置換文字列に。
置換1
インデント
全角に
4.  DWにペーストした置換前と置換後
DW1
DW2
5. ブラウザで表示した置換前と置換後。
ブラウザ1
ブラウザ2

紆余曲折の末、プログラムコードの記載は、アクションパネルのスクリーンショットと、本文中で行なう1行単位の説明で落ち着きそうである。
 s034-22

デフォルトのスクリーンショットにおける影がいつの間にか随分大きくなった気がする。影の大きさを変更するユーティリティは有料なので、影なしでスクリーンショットを撮るしかない。
defaults write com.apple.screencapture disable-shadow -boolean true

killall SystemUIServer
08

$ defaults write com.apple.screencapture disable-shadow -boolean false

killall SystemUIServer
27
というより、今気付いたのだが、このブログに掲載した過去の写真や画像を見ると、これまで影なしで撮影してきたのではないか。livedoorブログにアップした画像には自動的に幽かな影が付くので、それを見誤っていたのかもしれぬ。



miでインデント(¥t)を4文字分スペースで置換しても、その場では置換されても、Dereamweaverにペーストすると、図のように空けたスペースは消えてしまう。それなのに、イコール前後のスペースは正しく残されているのである。
miの画面。
25
Dereamweaverの画面
45



 

約1年ぶりに再開した「ウィスコンシンカード分類課題ゲーム」本執筆は大体終わったと思ったら、肝心のEPUB化でまた頓挫してしまっている。プログラムコードのインデントが全く反映されないのだ。このことに以前は気づかなかったのか。DCによって生じる下図のようなミスの修正はCSSに手を入れる手作業で何とかなっても、やはりコードはすべて画像にしなければならないのだろうか。大変な手間がかかる。

さらにDCは、いかなる理由からか一度にアップできるファイル数が50に制限されていて、しばらく50以上のファイルをアップしたために出ていたそのエラーの原因に気づかなかった。画像ファイルだけで70を越えていたのだ。この点は、面倒ではあるが、画像を除いたテキストファイルだけをアップした後のepub解凍後のOEBPSフォルダ内に画像を入れ直し、再度圧縮してedpub化してしまえば問題はない。
42

 

1.グローバル変数宣言
2.グローバル変数初期化

3.メッセージハンドラ宣言 
4.メッセージハンドラ定義

5.グローバル変数再初期化関数
6.グローバル変数再初期化関数呼び出し

7.関数定義
8.関数呼び出し

WCST_As3.flaを大幅に書き直す。リプレイできるように、グローバル変数の初期化を行なう部分を関数mcpos_initに納めた。またゲームオーバーの画面は新しいフレームに作るのではなく、ゲーム中に表示されていたすべてのMCを画面外部に移動し、代わりに「Rplay」ボタンと「Gameover」静止テキストMCを画面表示することで最後の画面にする関数 mcpos_endで行なうことにした。
 
function mcpos_init(){
var xx = 3000;

totalcount = 0;
no = 0;
backno = 64;
seikai = 0;
count = 0;

bunrui = "color";
hindo = 4;
//グローバル変数の表示
bunruitext.text = bunrui;
counttext.text = count.toString();
hindotext.text = hindo.toString();
seikaitext.text = seikai.toString();
totalcounttext.text = totalcount.toString();
var seikairitsu = 0;
seikairitsutext.text = seikairitsu.toString();

//MCのステージ内部・外部への配置
for(var i = 0; i < 64; i++){
this["mc"+i].x = 3000;
this["mc"+i].y = 200;
}
//MC
waku.x = xx;
waku.y = 450;
seigo.x = xx; 
seigo.y = 200;
/////////////ダイナミックテキスト
bunruitext.x = 31; 
bunruitext.y = 54;
counttext.x = 31;
counttext.y = 100;
hindotext.x = 31;
hindotext.y = 150;
seikaitext.x = 160;
seikaitext.y = 220;
kaitoukaisu.x = 40
kaitoukaisu.y = 260
/////////////静止テキスト
totalcounttext.x = 160;
totalcounttext.y = 264;
seikairitsutext.x = 304;
seikairitsutext.y = 240;
/////////////ゲームオーバー時表示MC
gameover.x = xx;
gameover.y = 800;
/////////////ゲームオーバー時表示静止テキスト
seitoukaisu.x = 40
seitoukaisu.y = 220

/////////////ボタンMC
b0.x = 862; b0.y = 50;
b1.x = 150; b1.y = 450;
b2.x = 400; b2.y = 450;
b3.x = 650; b3.y = 450;
b4.x = 900; b4.y = 450;
b5.x = xx;  b5.y = 270;
}

function mcpos_end(){
var xx = 3000;
for(var i = 0; i < 64; i++){
this["mc"+i].x = xx;
this["mc"+i].y = 200;
}
waku.x = 3000;
waku.y = 450;
seigo.x = 3000; 
seigo.y = 200;
index.x= xx;
bunruitext.x = xx; 
counttext.x = xx;
hindotext.x = xx;
seikaitext.x = xx;
totalcounttext.x = xx;
seikairitsutext.x = xx;
seitoukaisu.x = xx;
kaitoukaisu.x = xx;
gameover.x = 435;
gameover.y = 200;
b0.x = xx; b1.x = xx;
b2.x = xx; b3.x = xx;
b4.x = xx; 
b5.x = 445; b5.y = 270;
}

mcpos_init();

この日からだったか、少し上昇気流に乗った感あり。坐り続けが相変わらずダメで絶望的になるも、昨日より大分ましだった。ウィスコンシンカード分類課題ゲーム作成再開。1年前のプログラムをかなり理解する。

1. 電球スキャン
 
2. 「であるって言えませんでした」原稿のスキャン

3. 折れ曲った方眼紙(裏は細かい)のスキャン
 
4. 耳薔帆Oの文字明滅

5. 障子を通した電球の光明滅

6. 他の手書き原稿スキャン+方眼升目+スキャナー内部の光
(原稿は折れ曲がってぼけていく)

7. 回転するハンガー。落ちるハンガー。

8. 円フォルムを折れ目として折れ曲った方眼紙

9. 夢 鉄のスプリング(影+影2)

10. 画鋲で止められて上から垂れ下がるカーテン(ぼける円弧)+遠近法で遠ざかるテーブル
  +手前で曲るテーブルの角

10.のテーブルは遠近を強調したワイヤーフレームがスムーズに回転し、その後に少しのインターバルを挟んで、レンダリング後の画像が非連続的に追ってっていく。 あえて版ずれの画像を使うなど。
lesson-600x270
003_2
 

しばらく遠ざかって忘れかけているepub本文のコード部分の色・行間・サイズ変更について。
以下はテキストエディットで開いた本文aa.txt。
38
この
var no:int;
var backno:int = 64;
var hit:Boolean;
部分の色を赤、行間50%、サイズ : mediumにする。

「でんでんコンバータ」でepubに変換。変換されたaa.epubをepub-Zip-unZipで解凍。
フォルダaa内のフォルダOEBPS内のbodymatter_0_0.xhtmlを開き、該当箇所を「code」divタグ囲む。
47
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:epub="http://www.idpf.org/2007/ops" xml:lang="ja" lang="ja">
<head>
<meta charset="utf-8" />
<link rel="stylesheet" href="style.css" type="text/css" />
<title>aaa</title>
</head>
<body class="bodymatter" epub:type="bodymatter">
<p>以下、簡単に冒頭からのコードの説明をしましょう。後の、WCST_As3_2.fla以降で、若干の修正と追加を行なっていきます。</p>
<p>タイムライン上には1フレームしかないので、現時点では、次の1行は必要でないが、最後にもう1フレーム増やす予定なので、ここで書いておきますく。</p>
<p>this.stop();</p>
<p>特定の関数(function)内部で宣言される変数は、ブラケットで囲まれたその関数内部にしか通用範囲を持ちませんが、次のように関数外部で宣言される変数は、グローバル変数として、どこから(すべての関数内部からでも)でも参照可能となります。変数の意味は次の通り。<br />
no…画面上部中央に出現する64個のカードのインデックスを記憶する変数<br />
backno…一つ前に出現したカードのインデックスを記憶する変数<br />
hit…正答だったときにtrue、誤答だったときにfalseを入れ、正誤(○×)の結果を表示するときに使用。</p>
<div class="code">
  <p>var no:int;<br />
    var backno:int = 64;<br />
  var hit:Boolean;</p>
</div>
<p>64枚のカードのデータセットを、配列の宣言とデータ初期化で行うものとします。<br />
配列変数color[0]~color[63]に、4種類の文字型(String型)データ、"red"、"green"、"yellow"、"blue"のいずれかを代入。<br />
配列変数form[0]~form[63]に、4種類の文字型(String型)データ、"sankaku"、"hoshi"、"juuji"、"maruのいずれかを代入。<br />
配列変数kazu[0]~kazu[63]に、4種類の数値データ、1"、2、3、4のいずれかを代入。</p>
<p>var color = new Array();<br />
var form = new Array();<br />
var kazu = new Array();</p>
</body>
</html>
34
style.cssに追加
 .code {
font-family: "Courier New", Courier, monospace;
font-size: medium;
line-height: 50%;
color: #F00;
font-weight: bold;
}
 
edpub-Zip-unZipでフォルダaaを圧縮。
Kindle Previewerでプレビュー。
34
25

この日は、上記電子書籍の復習をしたのみで、肝心のプログラミングに少しもやる気がおきず。

早朝5時半に散歩。こうまで暑いと(昼には35度に達したらしい)早足を心がけても、往復の所要時間が27、28分になる。アオキまで食料とマウス用単3電池を買いにいく。8本入りのパックが4ヶ月持つかどうか。

マウスポインタを含めてスナップショットを撮る方法。アプリケーションから「グラブ」起動。
グラブ2
グラブ1
グラブ3

1.WCST_As3_1ゲーム結果1。起動。
s11
2.「Start」ボタンクリック。「赤」カードが画面上部中央に表示される。
ss2
3.画面下部「赤」ボタンクリック。正答。「青」カードが画面上部中央に表示される。
ss3
4.画面下部「青」ボタンクリック。正答。「黄」カードが画面上部中央に表示される。
ss4
5.画面下部「黄」ボタンクリック。正答。「青」カードが画面上部中央に表示される。
ss5
6.画面下部「青」ボタンクリック。正答。カードが画面上部中央に表示される。 
ss6
7画面下部「赤」ボタンクリック。正答。「緑」カードが画面上部中央に表示される。
ss7
8.画面下部「緑」ボタンクリック。正答。「赤」カードが画面上部中央に表示される。。
ss8
9.画面下部「黄」ボタンクリック。 誤答。「赤」カードが画面上部中央に表示される。 
ss9

母の正確な経歴は、没した2004年当時にははっきりと分からなかった。同年に刊行した『遠くのリンゴの木』あとがきにも、未詳の経歴について触れている。そのときに分かっていたのは、幼年から小学生にかけては、三重県伊賀上野に居住していたらしいこと、その後東京の大森、吉祥寺に転居し、戦火によって松阪に疎開することになったということだけだった。転居はいずれも父竹雄の転々とした仕事の関係である。
ほぼ正確だと思われる経歴が判明したのはいつ頃だったろうか。松阪実家の蔵を掃除しているときに叔母泰子たちの発見した、節子幼稚園入園、小学校のクラス委員任命の免状に印されていた年月日などから、それが偶然明るみに出たのだった。すぐに偲ぶ会の経歴にも反映させたように、誕生から高校入学までの経歴は次の通りになっている。

●1932年(昭和7年)0歳
2月4日、三重県飯南郡漕代法田(現、三重県松阪市法田町)にて、誕生。 
出生後間もなく、三重県上野町(現、三重県伊賀市)に転居。
[竹雄 三重県立名張高等女学校 嘱託教員就任(後に教諭)]
------------------------------------------------------------------------------
●1934年(昭和9年)2歳
[竹雄 三重県立阿山高等女学校 教諭就任]
------------------------------------------------------------------------------
●1936年(昭和11年)4歳
白鳳幼稚園入園。 
------------------------------
------------------------------------------------ 
●1938年(昭和13年)6歳
上野町立尋常高等小学校(現、伊賀市立上野西小学校)入学。
 ------------------------------------------------------------------------------
●1939年(昭和14年)7歳
東京府東京市大森区東馬込(現、東京都大田区東馬込)に転居。 
東京市伊藤尋常小学校(現、品川区立伊藤小学校)に転校。 
[竹雄 横浜英和女学校 高等女学部教諭就任]
------------------------------------------------------------------------------
●1942年(昭和17年)10歳
東京府北多摩郡武蔵野町吉祥寺(現、東京都武蔵野市吉祥寺)に転居。
東京府北多摩郡武蔵野町第四国民学校(現、武蔵野市立第四小学校)に転校。
------------------------------------------------------------------------------
●1944年(昭和19年)12歳
東京府立武蔵高等女学校(現、東京都立武蔵高等学校)入学。
------------------------------------------------------------------------------
●1945年(昭和20年)13歳
戦災のため一月に松阪市に疎開。
三重県立飯南高等女学校に転入。
------------------------------------------------------------------------------
●1948年(昭和23年)16歳
三重県立飯南高等女学校が三重県立松阪南高等学校(現、三重県立松阪高等学校)と統合。

白鳳幼稚園 三重県伊賀市上野伊予町1067-1
 白鳳幼稚園
伊賀市立上野西小学校 三重県伊賀市上野丸之内112
伊賀市立上野西小学校
伊賀上野

三重県立名張高等女学校(三重県立名張高等学校)三重県名張市東町2067-2
三重県立阿山高等女学校(三重県立上野高等学校)三重県伊賀市上野丸之内107 

昔、相模原にある職業能力開発総合大学校に通っていたことがあった。いつ頃からいつまで行っていたかすぐには思い出せない。多分2000年を挟んで7、8年だったのことだったように思う。5月の発作後、何の脈絡もなく突然しばらく忘れていた昔のことを思い出すことが多く、この職業能力開発総合大学校の風景も、さっき急に脳裡に浮かんだ断片の一つである。ネットで調べてみたら、相模原のキャンパスは2013年に廃校となったという。まだ2年前のことだから、病気になった2012年には廃校が決定されていたとしても、まだ残存していてGoogleMapやストリートビューで当時の風景を偲ぶことはできたのに、今はそれすらできなくなってしまったようである。広いキャンパスなのに学生数は少なく、東京郊外でポツンと建っているのが今思うと妙に印象的な学校だった。下はWikiから。

職業能力開発総合大学校(しょくぎょうのうりょくかいはつそうごうだいがっこう、英語: Polytechnic University)は、東京都小平市小川西町二丁目32番1号に本部を置く日本の省庁大学校である。1961年(昭和36年)に設置された。大学校の略称は職業大(しょくぎょうだい)。
長期課程(学士(工学)を取得できる課程)および研究課程(修士(工学)を取得できる課程)は2011年(平成23年)度入学生の卒業および修了をもって廃止される[1]。2012年(平成24年)度より総合課程(学士(生産技術)[1]を取得できる課程として2012年2月に認可[2])が小平キャンパスに開設され、相模原キャンパスは2013年3月末で廃止された[1]。 

ネットで見つけた下の写真は、なくなった相模原キャンパスの正門の写真だろう。 
132127527309813224379_DSC01293
下のGoogleMapからは、どうしても当時の橋本駅からの道程を記憶通りに辿ることができない。一度所沢から車で行ったら朝の渋滞に引っ掛かり大幅に遅刻したことがあって、貰った回数チケットで駅からタクシーで行ったことが多かった。「二本松小学校入口」で左折して学校の正門まで行ったにが確かなのに、その正門のあったはずの場所が、地図でも航空写真でもストリートビューでも見つけることができないのだ。広大なキャンパス跡地は売却しただろうから、正門前の様子も変わってしまったのだろうけど。
57
37
25


WCST_as_1.fla…色だけを分類基準にして上部に表示されるランダムカードの色を下部の4色ボタンから選択
WCST_as_2.fla…ゲーム内容同じ。4色ボタンを0、21、42、63番の4種類のカードに変更。
WCST_as_3.fla…分類基準がcount=4ごとに「色」「形」「数」と順に変化。
WCST_as_4.fla…分類基準がcount=任意回数ごとに「色」「形」「数」の任意のどれかに変化。
WCST_as_5.fla…ゲーム終了フレーム追加

このWCST_as_3.flaへの変更方法がしばらく分からなかった。

function hantei(num){
// countは一つの基準グループ(色や形など)内で続いた図形出現回数。 
// totalcountはゲーム終了までの全ての図形出現回数
count++;
counttext.text = count.toString();
hindotext.text = hindo.toString();;
hit = false;
//現在の分類基準が「色」であり、前回の出現MCと今回の出現MCのカラーが同じ"red"なら。
if(bunrui == "color" && color[no] == color[num]) hit = true;
else if(bunrui == "form"  && form[no]  == form[num]) hit = true;
else if(bunrui == "kazu"  && kazu[no]  == kazu[num]) hit = true;
seigo.x = 700; 
if(hit == true)
seigo.gotoAndStop(1);
else
seigo.gotoAndStop(2);

if(hit == true)
seikai++;
// ここで次のMCを出現させる。
start_random();
// あらかじめ決めておいた同じ分類基準でMCが出現する回数(hindo)をcountが越えたら
// 次の新しい分類基準へ
if(count > hindo)
{
if(bunrui == "color")
bunrui = "form";
else if(bunrui == "form")
bunrui = "kazu";
else if(bunrui == "kazu")
bunrui = "color";
/*
var kijun  = Math.floor((Math.random() * 3)) + 1;

switch(kijun){
case 1: bunrui = "color";break;
case 2: bunrui = "form"; break;
case 3: bunrui = "kazu"; break;
}
*/
count = 0;
//次の同じ分類基準でMCが出現する回数(hindo)を乱数で決める(1〜8)
// hindo  = Math.floor((Math.random() * 8)) + 1;
bunruitext.text = bunrui;
}

}

******************************************************************1
プログラムで使用するムービークリップ(以下MC)やテキストフィールドを作成する。
必要なのは、まず64枚のカードと分類基準を決める4つのボタンの他、

1. 64枚のカードmc0~mc63
2. 分類基準を決める4枚のボタンb1、b2、b3、b4
3. スタートボタンb0
4. 正誤を示す○×MC seigo
5. ムービークリップ waku 
6-a. ダイナミックテキスト bunruitext
6-b. ダイナミックテキスト counttext
6-c. ダイナミックテキスト hindotext
6-d. ダイナミックテキスト seikaitext
6-e. ダイナミックテキスト totalcounttext
6-f. ダイナミックテキスト seikairitsutext
6-g. ダイナミックテキスト index
6-a. 静止テキスト seitoukaisu
6-b. 静止テキスト kaitoukaisu
6-c. ムービークリップ sen
 
このうちもっとも重要なのは、1〜4のムービークリップ(ボタン)であり、5〜6のダイナミックテキストや静止テキストは、ゲームの正答回数や正答率などの成績結果を表示するもので、必ずしも必須アイテムではないので、作成は最後にします。
1. [ファイル]-[新規]メニューから「新規ドキュメント」をオープン。「Action script3.0」「フレーレート30」。ステージサイズは1050×600

2.  ムービークリップを作成する。

2-1 64枚のカードを、ムービークリップとして[新規]-[シンボル]から作成。インスタンス名を"mc0〜63"とする。
    64枚のカードに印される4種類の形(三角、星、十字、円)。
    a. 三角 [位置]-35,  -35、[サイズ]70, 70
    b. 星  [位置]-35,  -35、[サイズ]70, 78.35
    c. 十字 [位置]-35,  -35、[サイズ]17.5, 17.5を5個
    d. 円  [位置]-35,  -35、[サイズ]70, 70
 
2.-2 分類基準を決める4枚のボタンb1、b2、b3、b4
2-3. スタートボタンb0
2-4 正誤を示す○×MC seigo

3. タイムラインの1フレーム目に次のスクリプトを置く。


64枚のカードを全部ステージ(1050×600)外部に置く。
for(var i = 0; i < 64; i++){
this["mc"+i].x = 3000;
this["mc"+i].y = 200;
}

4つのボタンを画面下部に左から並べて表示。
b11.x = 150; b11.y = 450;
b12.x = 400; b12.y = 450;
b13.x = 650; b13.y = 450;
b14.x = 900; b14.y = 450;
選択したボタン上に表示する黒い枠(waku)をステージ外部に置く。
waku.x = 3000;
waku.y = 450;
回答の結果正誤(○×)表示するMC(seigo)をステージ外部に置く。
seigo.x = 3000; 
seigo.y = 200;

スタートボタンと4つのボタンのメソッドaddEventListenerを実行する。これによって、
ボタンb0をクリックしたときには、関数b0Clickを実行する。
ボタンb11をクリックしたときには、関数b11Clickを実行する。
ボタンb12をクリックしたときには、関数b12Clickを実行する。
ボタンb13をクリックしたときには、関数b13Clickを実行する。
ボタンb14をクリックしたときには、関数b14Clickを実行する。
ようにイベントリスナーが定義される。

b0.addEventListener(MouseEvent.CLICK,b0Click);
b11.addEventListener(MouseEvent.CLICK,b11Click);
b12.addEventListener(MouseEvent.CLICK,b12Click);
b13.addEventListener(MouseEvent.CLICK,b13Click);
b14.addEventListener(MouseEvent.CLICK,b14Click);

////////////////////////////////////////////////
関数b0Click、関数b11Click〜関数b14Clickまでの定義。
スタートボタンのクリックに応答するb0Clickは、ここではstart_random();を呼び出すだけ。
function b0Click(evt){
start_random();
}
4つのボタンのクリックに応答するb11Click〜b14Clickは、そのボタンを選択したことを明示する黒枠をボタン上に置き、直後に、それぞれ0、4、8、12を引数に置いて関数hanteiを呼び出す。この引数に与える番号は、カード番号のインデックス0、4、8、12であり、color[0]は"red"、color[4]は"green"、color[8]は"yellow"、color[12]は"blue"となっている。

function b11Click(evt){
waku.x = b11.x;
hantei(0);
}

function b12Click(evt){
waku.x = b12.x;
hantei(4);
}

function b13Click(evt){
waku.x = b13.x;
hantei(8);
}

function b14Click(evt){
waku.x = b14.x;
hantei(12);
}

////////////////////////////////////////////////
●関数start_random

no  = Math.floor((Math.random() * 63));
算術関数Math.random()によって0.0 から 0.9999… までの小数値を取得できるので、その値を63をかけ、さらに Math.floorで小数点以下の値を切り捨て、0〜63の整数値を得られる。ゲーム開始時(backno == 64)以外は、一つ前のカードをステージ外に置き、乱数で得た0〜63のインデックスを持つカードを画面上部中央に表示する。ここで次に表示するカードとの比較のためにカード番号をbacknoに記憶しておく。

function start_random(){

no  = Math.floor((Math.random() * 63));
// 一つ前のMCをステージ外に。
if(backno != 64) 
this["mc"+backno].x = 3000;

this["mc"+no].x = 500;
backno = no;
}

●関数hantei
4つのボタンクリック

function hantei(num){

hit = false;
if(color[no] == color[num]) 
hit = true;

seigo.x = 700; 
if(hit == true)
seigo.gotoAndStop(1);
else
seigo.gotoAndStop(2);

// ここで次のMCを出現させる。
start_random();
}

******************************************************************2
色の違いを持つ4つのカードを、MC番号0、21、42、63番のインデックスを持つカードに入れ替える。この4枚のカードは、
1.「色=赤 "red"」    「形=三角 "sankaku"」「数=1」 
2.「色=緑 "green"」「形=星 "maru"」        「数=2」 
3.「色=緑 "yellow"」「形=十字 "maru"」     「数=3」 
4.「色=青 "blue"」   「形=円 "maru"」       「数=4」 
というように、「色」「形」「数」すべての分類基準において4つの違いを持つ4枚のカードである。ゲームの内容は変わらず、「色」だけを分類基準として、上部中央にランダムに表示されるカードと同じ色を持つカードを下の4枚から選んでクリックして正誤を確認するだけの内容である。 

こんなものでも苦労した。KDP本に掲載する図版の一つ。図版はひとまず最小限にとどめたい。最初に作るカードMCの一覧と表。duplicateMovieClipを使用しているので、As2.0で書いている。画像は横幅の解像度2500pix以下でも問題ないようである。
39
MChyou
for(i = 0; i < 64; i++){
no.duplicateMovieClip("no"+i, i);
this["no"+i].str.text = i;
}

for(var i = 0; i < 64;  i++){
this["mc"+i]._xscale = 50;
this["mc"+i]._yscale = 50;
}

for(i = 0; i < 16; i++){
this["mc"+i]._x = i * 110 + 80;
this["mc"+i]._y = 120;
this["no"+i]._x = i * 110 + 65;
this["no"+i]._y = 40;
}


for(i = 16; i < 32; i++){
this["mc"+i]._x = (i-16) * 110 + 80;
this["mc"+i]._y = 280;
this["no"+i]._x = (i-16)* 110 + 65;
this["no"+i]._y = 200;
}

for(i = 32; i < 48; i++){
this["mc"+i]._x = (i-32)* 110 + 80;
this["mc"+i]._y = 440;
this["no"+i]._x = (i-32) * 110 + 65;
this["no"+i]._y = 360;
}

for(i = 48; i < 64; i++){
this["mc"+i]._x = (i-48)* 110 + 80;
this["mc"+i]._y = 600;
this["no"+i]._x = (i-48) * 110 + 65;
this["no"+i]._y = 520;
}

昨日の記事の修正と追記。寝ている間に昨日いくら考えても分からなかったバグを発見。
4つのボタンクリックから飛ぶ関数hanteiに置く引数は、基準が「色」なら、0、4、8、12でなければならなかった。

function b11Click(evt){
waku.x = b11.x;
hantei(0);
}

function b12Click(evt){
waku.x = b12.x;
hantei(4);
}

function b13Click(evt){
waku.x = b1.x;
hantei(8);
}

function b14Click(evt){
waku.x = b1.x;
hantei(12);


52
このコードのために上図の上4つの色だけの差異を持つボタンを作っており、インスタンス名をbb1、bb2、bb3、bb4としている。また形や数を基準とするその下のボタンを使用するとしても 、関数hanteiに置く引数は同じである。
したがって、また手順を元に戻す。

1. MC素材の作成。64個のMCカード。スタートボタン
2. スタートボタンクリックでランダムに0〜63種類のカードを1枚ずつ表示。
    分類基準を「色」だけに決定し、上部に表示されるカードの色を、下に表示する4色ボタンのどれかをクリックして、応える。正答、誤答(○×)マークを表示。
3. 下に表示する4色ボタンを4つのボタン(色形、数全部の違いを持つ4ボタン)に変更する。
   分類基準を2.と同じく「色」のみ。
4. ランダムに上部表示されるカードが4枚ずつ分類基準(色、形、数)を変更していくものとする。
  分類基準の内容をテキストフィールドに表示。 
5. 5.を4枚ずつではなくランダム枚数(1〜8程度)ずつ類基準を変更していくものと変更する。
6. その他のMCや装飾を配置。toutalcount、正答回数、正答率を表示
  スタートボタンの二度目のクリックでゲームオーバーとする。  

しばらく放擲していたウィスコンシンカード分類課題ゲーム(WCST)のプログラムWSを見直している。 コース立方体より簡単だと思っていたのに、今読み返してみると、ソースをほとんど理解できないので愕然としている。いずれにせよ、元々分かり辛いゲーム内容ではあった。純粋なゲーム内容から言えば、コース立方体の方が単純で分かり易いと言えるかもしれない。ただ、一応完成に至ったと考えてよいとはいえ、、コース立方体は3Dアルゴリズムのプログラミングがかなりの難関だった。今思うと、どちらもよく作ることができたと思うばかりだ。まだわずか1年前の話しにすぎないが。

昨日書いた作成手順はいくつかの段階を省き、次のような改正案に改めるものとする。省かざるを得なかった部分は今の能力では理解できない。いずれ改訂版で補っていくものとして、かつてやっていたように、いきなり完成したプログラムを提示するのではなく、少しずつ機能を追加する手順でプログラムを積み上げていく。

1. MC素材の作成。64個のMCカード。スタートボタン

2. スタートボタンクリックで0〜63のMCをランダムに1枚ずつ上部に表示。

3. 分類基準を「色」だけに決定し、2.で表示されるカードの色を、下に表示する4つのボタン(色形、数全部の違いを持つ4ボタン)に変更する。正答、誤答(○×)マークを表示。

4. 16種類のカード(順序はランダム)が4枚ずつ分類基準を変更していくものとする。
  分類基準(色、形、数)の内容をテキストフィールドに表示。 
 
5. 4.を4枚ずつではなくランダム枚数(1〜8程度)ずつ類基準を変更していくものと変更する。

6. その他のMCや装飾を配置。toutalcount、正答回数、正答率を表示
  スタートボタンの二度目のクリックでゲームオーバーとする 

ただ、分かりにくいゲームとプログラムの割には、ソースコードは意外と短い。
6つのボタンクリックに応答するイベントドリブン 関数を除けば、使用する関数は、

function start_random(){ 
}

function hantei(num){


この二つだけで、後はカードに与える配列変数や、他のグローバル変数の初期化 、位置(画面外に移動)の初期化ぐらいである。
23
this.stop();

var totalcount:int = 0;
var no:int;
var backno:int = 64;
var hit:Boolean;
var seikai:int = 0;
var color = new Array();
var form = new Array();
var kazu = new Array();

color[0] = "red"; form[0] = "sankaku"; kazu[0] = 1;
color[1] = "red"; form[1] = "hoshi"; kazu[1] = 1;
color[2] = "red"; form[2] = "juuji"; kazu[2] = 1;
color[3] = "red"; form[3] = "maru"; kazu[3] = 1;

color[4] = "green"; form[4] = "sankaku"; kazu[4] = 1;
color[5] = "green"; form[5] = "hoshi"; kazu[5] = 1;
color[6] = "green"; form[6] = "juuji"; kazu[6] = 1;
color[7] = "green"; form[7] = "maru"; kazu[7] = 1;

color[8] = "yellow"; form[8] = "sankaku"; kazu[8] = 1;
color[9] = "yellow"; form[9] = "hoshi"; kazu[9] = 1;
color[10] = "yellow"; form[10] = "juuji"; kazu[10] = 1;
color[11] = "yellow"; form[11] = "maru"; kazu[11] = 1;

color[12] = "blue"; form[12] = "sankaku"; kazu[12] = 1;
color[13] = "blue"; form[13] = "hoshi"; kazu[13] = 1;
color[14] = "blue"; form[14] = "juuji"; kazu[14] = 1;
color[15] = "blue"; form[15] = "maru"; kazu[15] = 1;

////////////////////////////////////////////////

color[16] = "red"; form[16] = "sankaku"; kazu[16] = 2;
color[17] = "red"; form[17] = "hoshi"; kazu[17] = 2;
color[18] = "red"; form[18] = "juuji"; kazu[18] = 2;
color[19] = "red"; form[19] = "maru"; kazu[19] = 2;

color[20] = "green"; form[20] = "sankaku"; kazu[20] = 2;
color[21] = "green"; form[21] = "hoshi"; kazu[21] = 2;
color[22] = "green"; form[22] = "juuji"; kazu[22] = 2;
color[23] = "green"; form[23] = "maru"; kazu[23] = 2;

color[24] = "yellow"; form[24] = "sankaku"; kazu[24] = 2;
color[25] = "yellow"; form[25] = "hoshi"; kazu[25] = 2;
color[26] = "yellow"; form[26] = "juuji"; kazu[26] = 2;
color[27] = "yellow"; form[27] = "maru"; kazu[27] = 2;

color[28] = "blue"; form[28] = "sankaku"; kazu[28] = 2;
color[29] = "blue"; form[29] = "hoshi"; kazu[29] = 2;
color[30] = "blue"; form[30] = "juuji"; kazu[30] = 2;
color[31] = "blue"; form[31] = "maru"; kazu[31] = 2;

////////////////////////////////////////////////

color[32] = "red"; form[32] = "sankaku"; kazu[32] = 3;
color[33] = "red"; form[33] = "hoshi"; kazu[33] = 3;
color[34] = "red"; form[34] = "juuji"; kazu[34] = 3;
color[35] = "red"; form[35] = "maru"; kazu[35] = 3;

color[36] = "green"; form[36] = "sankaku"; kazu[36] = 3;
color[37] = "green"; form[37] = "hoshi"; kazu[37] = 3;
color[38] = "green"; form[38] = "juuji"; kazu[38] = 3;
color[39] = "green"; form[39] = "maru"; kazu[39] = 3;

color[40] = "yellow"; form[40] = "sankaku"; kazu[40] = 3;
color[41] = "yellow"; form[41] = "hoshi"; kazu[41] = 3;
color[42] = "yellow"; form[42] = "juuji"; kazu[42] = 3;
color[43] = "yellow"; form[43] = "maru"; kazu[43] = 3;

color[44] = "blue"; form[44] = "sankaku"; kazu[44] = 3;
color[45] = "blue"; form[45] = "hoshi"; kazu[45] = 3;
color[46] = "blue"; form[46] = "juuji"; kazu[46] = 3;
color[47] = "blue"; form[47] = "maru"; kazu[47] = 3;

////////////////////////////////////////////////

color[48] = "red"; form[48] = "sankaku"; kazu[48] = 4;
color[49] = "red"; form[49] = "hoshi"; kazu[49] = 4;
color[50] = "red"; form[50] = "juuji"; kazu[50] = 4;
color[51] = "red"; form[51] = "maru"; kazu[51] = 4;

color[52] = "green"; form[52] = "sankaku"; kazu[52] = 4;
color[53] = "green"; form[53] = "hoshi"; kazu[53] = 4;
color[54] = "green"; form[54] = "juuji"; kazu[54] = 4;
color[55] = "green"; form[55] = "maru"; kazu[55] = 4;

color[56] = "yellow"; form[56] = "sankaku"; kazu[56] = 4;
color[57] = "yellow"; form[57] = "hoshi"; kazu[57] = 4;
color[58] = "yellow"; form[58] = "juuji"; kazu[58] = 4;
color[59] = "yellow"; form[59] = "maru"; kazu[59] = 4;

color[60] = "blue"; form[60] = "sankaku"; kazu[60] = 4;
color[61] = "blue"; form[61] = "hoshi"; kazu[61] = 4;
color[62] = "blue"; form[62] = "juuji"; kazu[62] = 4;
color[63] = "blue"; form[63] = "maru"; kazu[63] = 4;

////////////////////////////////////////////////

b0.addEventListener(MouseEvent.CLICK,b0Click);
b1.addEventListener(MouseEvent.CLICK,b1Click);
b2.addEventListener(MouseEvent.CLICK,b2Click);
b3.addEventListener(MouseEvent.CLICK,b3Click);
b4.addEventListener(MouseEvent.CLICK,b4Click);

for(var i = 0; i < 64; i++){
this["mc"+i].x = 3000;
this["mc"+i].y = 200;
}

var  mcjunjo:Array = [7,4,13,16,8,11,4,9,5,16,12,11,2,9,9,10];

waku.x = 3000;
waku.y = 450;
seigo.x = 3000; 
seigo.y = 200;

b1.x = 150; b1.y = 450;
b2.x = 400; b2.y = 450;
b3.x = 650; b3.y = 450;
b4.x = 900; b4.y = 450;

function b0Click(evt){
start_random();
}

function b1Click(evt){
waku.x = b1.x;
hantei(0);
}

function b2Click(evt){
waku.x = b2.x;
hantei(21);
}

function b3Click(evt){
waku.x = b3.x;
hantei(42);
}

function b4Click(evt){
waku.x = b4.x;
hantei(63);
}

////////////////////////////////////////////////
function start_random(){
no  = Math.floor((Math.random() * 63));
// 一つ前のMCをステージ外に。
if(backno != 64) 
this["mc"+backno].x = 3000;

this["mc"+no].x = 500;
backno = no;
}

function hantei(num){

hit = false;
if(color[no] == color[num]) 
hit = true;

seigo.x = 700; 
if(hit == true)
seigo.gotoAndStop(1);
else
seigo.gotoAndStop(2);

if(hit == true)
seikai++;

// ここで次のMCを出現させる。
start_random();
}

再び、ウィスコンシンカード分類問題ゲームの作成手順

1. MC素材の作成。64個のMCカード。スタートボタン

2. スタートボタンクリックで予め決められた16種類のカード(順序はランダム)を1枚ずつ表示。

3. 分類基準を「色」だけに決定し、2.で表示されるカードの色を、下に表示する4色ボタン(4形ボタン、4数ボタン)のどれかの色ボタンをクリックして、応える。

4. 下に表示する4色ボタン(4形ボタン、4数ボタン)を4つのボタン(色形、数全部の違いを持つ4ボタン)に変更する。正答、誤答(○×)マークを表示。

5. 16種類のカード(順序はランダム)が4枚ずつ分類基準を変更していくものとする。
  分類基準(色、形、数)の内容をテキストフィールドに表示。 

6. 2.をランダム(0〜63)にする
 
7. 5.を4枚ずつではなくランダム枚数(1〜8程度)ずつ類基準を変更していくものと変更する。

8. その他のMCや装飾を配置。toutalcount、正答回数、正答率を表示
  スタートボタンの二度目のクリックでゲームオーバーとする。 

0211
25
35


↑このページのトップヘ