「食べログ」の投稿に関して
レストランの飲食に関する投稿・検索サイト「食べログ」に色々とレビューを書いていますが、たまに”下書き戻し”(俗称)されます。これは公開したレビューの内容が”食べログの基準(ガイドライン)から外れている”場合に、サポートがそれを判断して公開モードから下書きモードに変更することです。SGMと略すこともあります。
基準の詳細は割愛しますが、基本的に前向きな内容を期待されているようで、私のように後ろ向きの情報を共有しようとするとSGMされるようで、過去に数十回SGMをされた経験があります。
その場合、指摘された箇所(メールで具体的に指摘される)を書き直して再公開することが基本ですが、めんどくさい場合は下書きのまま放置したりもします。そういうレビューも複数存在します。
現在の投稿数(公開分)は1,420件で、レビューを書いたのが1522件なので、見かけ上は100件あまり下書きのまま放置している計算になります。ただし、その中でSGMされて放置状態のレビューは10数件だと思います(通常の下書きとはすぐには区別できないので数えるのがめんどくさい)。
さて、ついこの間もSGMされました。まあ慣れっこなので「またか」という感じであまり気にしませんが、食べログサポートからそのようなメールを受け取ると、正直、嫌な気分になるのは確かです。書いたときに薄々SGMされるかも?と思いながら公開していることも少なくないので”確信犯”とも言えますが、たまに「これが何でSGMされるんだ?」というケースもあります。
今回、ここに転記するのはそんなSGMされたレビューになります。SGMされた理由の箇所を▼▼▼▼▼と▲▲▲▲▲でくくりましたが、今回はかなり多くの文面が引っかかったようです。確かに明細違いの事実とそれへのスタッフの対応、そして起こった理由の推測を事細かに書いたのですが、おそらく(例え注文品の写真やレシートの画像があったとしても)ミスが発生した客観的な証拠としては不十分なのは分かりますが、文章的にはクレームではなく対応が良かったという報告と、他の客への注意喚起だったのですが、後ろ向きの内容だと判断された面があったのも否めません。(個人的には他の箇所、例えばスタッフの一人の”ももちゃん”の部分もビミョーではないかと思っていたのですけどね)
ーーーーーー初期の投稿内容へのサポートからの自動コメントーーーーーー
食べログサポートからのメールをご確認ください。
食べログにご投稿いただき、ありがとうございます。
大変恐縮ではございますが、口コミガイドラインに該当しておりましたため、下書き状態へ変更させていただきました。お手数をお掛けしますが、食べログサポートからのメールをご確認いただき、口コミのご修正をお願いいたします。
ーーーーーーーーーーーー初期の投稿内容の転記ーーーーーーーーーーーー
「鳥ぶら」に関する様々な考察【長文】
相変わらずリピートしています。今回で4回目となりますが、この店に関して色々と分かってきた感じなので、中間報告としてまとめてみます。(って最終報告があるわけでもなく)
◉焼き鳥のカテゴリーに関するコスパ
この店は焼き鳥が主力商品となっています。もちろん(いわゆる)サイドメニューも豊富にラインアップされていますが、まずは焼き鳥ということで、今まで食べた焼き鳥に関してコスパ(美味しさ÷コスト)を評価してみたいと思います。以下の並びはメニュー順で☆3個が満点です。(ーは未食)
塩焼鳥 (220円)☆☆☆
冷製白レバー(190円)☆☆
ネギ焼き ( 80円)☆
とろハツ (150円)☆☆☆
むね明太 (150円)☆
うずら卵 (150円)☆
悪魔のあぶら(170円)☆☆☆
奇跡の砂肝 (180円)☆☆
コリコリ丸骨(180円)☆
ももにんにく(180円)ー
白せせり (180円)☆☆
肉汁つくね (240円)ー
ももの塩わさび焼き (220円)☆☆
ももの自家製タレ焼き(220円)ー
極上肝の醤油焼き(180)ー
赤ひも (180円)☆
鳥かわ串 (150円)☆☆☆悪魔のあぶら(ぼんじり)と鳥かわ串は個人的な好みなので、人にオススメできるのは「塩焼鳥」と「とろハツ」でしょうか。あとは好みに応じてというところでしょう。
なお、他の人の投稿で「外看板に“焼き鳥80円〜”とあったがそれはネギ焼きのことなので焼き鳥じゃない。嘘を書くな」というのを何件か見かけました。この辺りはグレーゾーンでしょうね。私自身も最初に見た時に、安いなと思ったのは確かです。実際には平均するとその倍以上の単価ですから、違和感がないとは言えません。
何れにしても焼き鳥とは言えない「ネギ焼き」と「うずら卵」はオススメしませんが。(ネギの間に小さいむね肉でも挟んで俗にいう「ネギマ」に仕立てればいいのに←私は食べないけど)
◉単品料理(サイドメニュー)に関するコスパ
焼き鳥以外の単品料理もたくさんありますが、まだほとんど食べていないません。でも現時点で、とりあえず食べたもののコスパを報告します。
玉子焼き (380円)☆☆
長いごぼう天 (380円)☆☆☆
卵黄やきそば (480円)☆☆
薬味どっさりやっこ(380円)☆この中では「長いごぼう天」がオススメです。くだんの“ももちゃん”もイチオシしていますし、同価格の他の料理と比較してもお値打ちだと思います。逆に今回食べた「薬味どっさりやっこ」は値段不相応で、280円にランクダウンすべきです。パックの木綿豆腐を半分に切ったものの上にネギやカイワレなどの薬味をてんこ盛りしただけのスピードメニューなのです。厨房内でももちゃんがサクッと盛り付けて持ってきてくれました。(厨房が見えるポジションはこういう時に役立つ)
「卵黄やきそば」は私好みの味で、ソースがこれでもかというぐらい使われています。学生時代に通ったお好み焼き屋で毎回「焼きそば定食」を食べていたのですが、その時追加でソースをかけていました。食べた後に皿にソースが残るぐらいたっぷりと。ももちゃんは「味が濃すぎない?」と心配してくれましたが「(私の好みに合っていて)ちょうどいいよ」と返事をしたほどです。ちなみに焼きそばは別のスタッフが製造担当しています。
◉スタッフと精算に関して
基本的には若い人が中心となって店を回しています。おそらくその中でも主に男性が中心となり女性スタッフが周りを固めている感じで、その中心となる男性も日によって変わります。客観的に見てよく働いて(動いて)はいると言えますが、若さゆえに接客レベルは満点とは言えません。ギリギリセーフ的な言い回しと配膳・回収時の動作です。客によっては不満に思うかも知れませんが、私は気にするのをやめました。そういう店なんだと割り切っています。
今回気になったのはレジ精算です。「レシートはご入用ですか」とよく聞くセリフで、私は必ず「ください」と言います。このレビューを書く時に必要だからです。
▼▼▼▼▼
ところが今回、そのレシートを受け取って店外に出てから何気に明細を確認すると「生中 3」と印字されていました。このレビューの写真を見ても分かるように、私は生中は1杯しか飲んでいません。しかもハイボールの明細が抜けています。つまり、
【レシート】
鳥ぶら 1 200
生中 3 570
【実際】(飲食順)
ハイボール 1 150
鳥ぶら 1 200
生中 1 190ということで踵を返して店に入り直しレジ係をしている男性(中心となって動いている人)に確認したのです。すると会話の途中に横から若い女性スタッフが加わってきて、電卓を使って計算し始めました。すぐに差額を求めたようで「(カード支払いだけど)お返しは現金になります」と、差額であろう253円を手渡してくれました。
実はこの女性、ももちゃんが仕込みをしている厨房と同じ場所で働いていたのですが、“後ろ向き”の表情と態度で何となく仕事に対して消極的に見えたのです。新しいバイトさんかと思って見ていたのですが、このレジ精算対応を見るとそうでもなさそうなのです。計算は得意というところでしょうか。
ちなみに検算してみると、
誤:(200+190x3)x1.1=847
正:(150+200+190)x1.1=594
差額:747-594=253ということで合っています。ただ、男性スタッフと私とのやりとりの途中で入って来たのにもかかわらず、迅速かつ正確に差額が計算できたのは少々不思議で、おそらくですがオーダー履歴とレシートを比較したのでしょう。私に限らず客の言葉は曖昧な場合があるので(基本的に酔っ払いなので)、普通なら確認のために再精算には時間がかかるはずです。
というか、不思議なのはレシートには間違いがあるのにオーダーは正しく受け付けられて配膳も問題なかった事実です。
これ以降は想像ですが、オーダーシステム(スタッフがスマホで受注している)とレジシステムがうまく同期が取れていないのではないかと思うのです。
▶︎受注エントリー→厨房へのオーダー指示→配膳
▶︎配膳エントリー→レジシステムへ送信配膳済みの時点での入力時にテーブル番号を間違えて入力するとこのような結果になる可能性は考えられるのです。実際のシステムを見たわけではないのであくまで想像ですけど。
実はこの現象は最近行っている他の居酒屋でも経験していて、私は生中はほとんど頼まないのですが、なぜかレシートに印字されていたりするのです(それも1ヶ月の間に2回も)。その居酒屋もスマホとタブレットを使ったオーダー&チェックシステムを使っています。
大抵は自宅に帰ってレビューを書く段階で明細を見直すのですが、今回は第六感(?)が働いてすぐに確認して気づいたというわけです。この明細違いに関してはやはり他の投稿者も書いていたりします。それを読んだ時には「そうあることでもないだろう」と思っていたのですが、実際に自分が経験することになった段階で「普通にあり得るかも」と思うようになりました。
つまり今回の女性スタッフのスムーズな対応は、過去に何回も経験したからなのかも知れません。ただこのような間違いが一人の客に起こった場合、少なくとももう一人の客にも影響するはずです。つまり、差額の253円はそっちの客へも“逆差額”となっているはずなのです。店として請求額はトータルでは合っているはずなので、私に返した253円はどこかで回収しないと合わないことになります。結果としてレジを〆た際に現金に過不足が発生してしまいます。
この辺りはどう処理されたか気になりますが、日常的に発生しうるリスクと考えて、雑収入(雑損失)扱いにでもしているのでしょうか。
この請求額の間違いは過去に神戸の餃子専門店でも経験したことがあります。その店では人によるオーダーだったので単純なヒューマンエラーなのですが、隣の人が追加注文して食べた餃子の分が私の方についていたのです。きっとスタッフが追記する際に伝票を間違えたのでしょう。
いくら機械が便利になっても人が介在する限りこのようなミスは起こり得るわけで、例の株1円売買のようなことも発生するのでしょうね。
▲▲▲▲▲
◉ももちゃん関して
今回、お孫さんがいることが分かりました。その件で少しお話ししましたが、「お金がかかるんだよね」と言いながらも嬉しそうに働いていました。あとダイエットに関しても例のオートファジー(※)の件は知っていたようで、「私もやってみようかな」と言っていましたが、早朝から夕方までの勤務なので食事の時間が一般的ではなく、16時間の空白時間を無理なく確保するのが難しそうでした。
(※1日の中で16時間以上食事を摂らない時間を確保出来れば、体内に蓄積された余分なものが消費され結果的にダイエットになるという理論(自分解釈)。基本的には睡眠時感を挟むことで無理なくその時間を確保できる。具体的には朝食を抜いて昼食と夕食は普通に食べることで、例えば20時から翌12時まで食べなければ16時間経過し“オートファジー”が働くということになり、私も1年以上続けていて昼や夜に(レビューを書くため?)好きなものを食べていても結果的に4kgほど体重が落とせて今は安定している。これ以上は落ちないし落とす必要もないと思っているが。)
以上、長文になってしまいましたが、次回はももちゃんオススメの「明太子ポテトサラダ」と、未食の焼き鳥を食べたいと思います。
ごちそうさまでした。
追記:
ももちゃんが開口一番「インスタに書いた?」と聞くのです。私はインスタはここんとこ書いていないので「もしかしたら食べログ?」と質問返しをしました。(つづく)←4,000文字超でアプリが落ちる
ーーーーーーーーーーーー転記終わり(保存用)ーーーーーーーーーーーー
まあ、しょうがないので再アップする際には指摘箇所を割愛するしかないとは思います。せっかく時間をかけて書いたのに、なんて、実は思いつくまま打ち込んだだけなので、そんなに時間はかけていないのです。なので駄文レビューとなっています。
(終わり)
ブルーレイの悲哀
音声や映像メディアとそれを扱う機器は時代と共にどんどん高性能化しています。還暦越えの私はその流れにどっぷりと浸かりながら生きてきた感があります。
【メディア】
♫レコード
♫カセットテープ
🎬ビデオテープ
🎬レーザーディスク
♫CD
🎬DVD
🎬ブルーレイ
(私が使用していないMDやデジタルメディアなどは省略)
最近では懐古趣味というか、メルカリでいわゆる”8トラ”、8トラックテープおよび再生装置を入手しましたが、これはリアルタイムでは見たことある程度なのでそれも割愛します。(カセットテープの変形版とも言えますし)
高性能化に伴い実際の使用時のトラブルや不満点も多くなっているように思うのです。それがこの日記の本題です。”シンプルイズベスト”を実感している毎日なのです。
そこで、タイトルにあるようにブルーレイに絞ってこれまでの経緯をまとめてみたいと思います。ほんとイラっとくるようなことばかりが起きるのです。
10年以上前にDVDレコーダーからブルーレイレコーダーに買い替えました(というか一時的には併用していた)。確かにTOSHIBA製のDVDレコーダーも高機能だったがトラブルはなかったように記憶しています。起動が遅いとか機能が細かすぎて解りにくいとかはありましたが、使えんな、みたいな感想を持ったことはなかったと思います。実はオフラインで今でも使えるようにはしています。DVD+VHSというハイブリッド仕様なので、昔のVHSテープなどのDVD化などに重宝しています。
最初に買ったのはSONY製のブルーレイレコーダーだったのですが、購入時から数年は快適に使えていたのですが、徐々に調子が悪くなってきました。基本機能は問題ないのですがメディアの認識時に意味不明な動作をするのです。要はブルーレイの円盤をプレイヤーに読み込ませたときの動きです。
・認識しない(このメディアは使用できません)
・記録形式が異なって認識される(ビデオは再生できません)
多く発生したのが認識エラーで自分自身で録画したメディアを再セットしたのに認識できないのです。他社のものなら互換性の問題で有り得る現象かも知れませんが、その個体で録画したメディアが認識できないのはどう考えてもおかしいです。あるいは、ビデオフォーマットと認識されずにデータディスクとして認識されてしまうこともありました。
上記の現象が徐々に増えて行きました。当初はホコリや汚れのせいかと思いクリーニングディスクなどを使ってドライブをクリーンアップしましたが、現象は改善しませんでした。
先月まではこんな状況でだましだまし使ってたところ、SONYからこんなメールが届きました。
「お使いのレコーダーは当社アプリの対象外になります」
このアプリはネット経由で録画番組の確認や予約が出来るもので、結構気に入って使っていたのに、いきなり旧機種は切り捨てると言うわけです。確かに10年以上昔の機種をサポートし続けるのは難しいのかも知れませんが、かなりショックを受けたのは確かです。このアプリの使用頻度はSNS系のアプリと同じくらい高かったのです。
トラブルも多くなってきたこともあって、このメールが来ことがきっかけとなり、買い替えるしかないか、と思うようになりました。じゃあ同じSONYの最新機種にしようかと思いました。それが普通の流れだと思うしSONYの目論見もそうだと思います。
だがしかし。
念のために私が買い替え候補にした機種のネット上での評価を見てみたのですが・・・
・全体的に反応が遅くイラつく
・操作性が旧機種と全く異なっている
いずれも同一メーカーに買い替える理由がなくなってしまう要素になります。今の機種が「サクサク動く」し「操作性に慣れている」わけで、レビューを見て失望したのです。SONYよ、もうだめなのか、と。
そこで同一メーカーへの買い替えを諦め(というかリセットして)機種選びをやりなおしました。結局、Panasonicのレコーダーに決定したのです。しかも基本スペックは同等なのにSONYのものより安いのです。確かに安いのには理由があるのですが、私が求めるところではないので無視できます。(ネットはWi-Fiのみとか全面パネルに表示ユニットがないとか)
また動作自体もストレスなく快適であると評価しています。まあ今はネット経由で視聴したり予約しているため、直接レコーダーを操作していないので実際の操作感は比較できないのですが、タイムラグが発生する可能性のあるネット経由での操作で問題ないということは、直接再生でも問題ないという解釈も可能だと思います。
結果的には新しい機種にはほぼ満足しています。細かい点をあげればきりがないのですが、少なくともSONYのレコーダー(旧機種)よりも倍ちかい満足度になっています。1番大きいのがネット経由でスマホやタブレット、PCで録画内容やTV放送が見られる点です。自室にTVがない(というかアンテナ線が配線されていない)ので、今まではネットの配信で適当に間に合わせていたのが、リアルタイムに見ることが可能になったり、録画した内容を自室で見る際に従来はいちいちメディアに書き込んで、自室にあるプレイヤーで見ていたのです(レコーダー自体は居間にある)。
これらの点が一気に解消したので現状は快適な視聴が出来ていてかなり満足しているのです。確かにネット経由で視聴できるようにするまでの試行錯誤(Wi-Fiルーターの新調やアプリの設定など)はあったにせよ、最終的には希望する機能が使えるようになったので問題とは思っていません。(というかこの初期段階が1番楽しかったりする)
この環境にさらに、数か月前に導入した液晶プロジェクターを組み合わせて、”なんちゃって”ホームシアターを堪能する毎日が続いています。この液晶プロジェクターも過去からの導入歴がいろいろあるのですが、その件はまた別途まとめてみたいと思います。
追記:録画用のブルーレイディスクの認識ってどうしてあんなに遅いのだろうか?基本仕様がマルチセッションだからしょうがないのだろうけど・・・
森村誠一氏を偲ぶ
2023年7月24日にミステリー作家の森村誠一氏が亡くなりました。享年90。
氏の作品に出合ったのは、ほぼ半世紀前の高校生の時、学校の近くの本屋でなにげに手にした『高層の死角』という文庫本でした。背表紙にはタイトルや作者名以外に”乱歩賞受賞”と印刷されており、当時、江戸川乱歩の作品も読んでいたので、そのつながりで興味を持ちました。
その作品を読んだことがきっかけで”本格ミステリー”の世界の面白さを知った私は、氏の作品を手当たり次第に読みました。時には徹夜してまで。
結局、氏の作品は社会人になってからも増え続け、自室の本棚の大部分を占めるまでになりました。もちろん他の作家の作品も買ってはいましたが、森村氏の文庫本は相当数に及んだのです。本棚に並べると主に角川文庫の青表紙が目立っていたせいもあり、本屋でも自然に青い色を探してしまう毎日でした。
森村氏は作家活動を開始した当初はホテルや山岳をテーマにしたミステリーが中心でしたが、やがて人間性や社会問題も扱うようになり、幅広い分野で作品を提供してくれました。後年には時代小説なども書かれていましたが、私自身は分野的に好みではなかったので、氏のすべての作品を読破するまでにはいきませんでした。
残念ながら断捨離の一環で去年に氏の作品の蔵書を手放してしまいましたが、手元には『高層の死角』だけは保存しています。ただ、紙の書籍は全体的に字が小さいので、機会を見て『高層の死角』を始めとする“もう1度読みたい作品”に関して再度電子ブック版を購入し、フォントサイズを大きくして読み直してみたいと思っています。
森村誠一さん、安らかにお眠りください。
やっぱり趣味のプログラミングは楽しい(Part6/end)
(Part5より)
実は別のプログラムソースを元に、ChatGPTにリバースエンジニアリングさせたことがありました。要は、ソースコードから「仕様書」を作らせたのです。この時はかなりの精度で”生成”できたので、今回完成したプログラムについても作らせることにしました。
以下のソースプログラムから、プログラム仕様書を作成してください。
・プログラムの概要
・ゲームの遊び方
・メソッドの一覧
・変数一覧表
・仕様の拡張案
/*
* イスカンダルのトーフ屋ゲーム
* original copyright 1978 by N.Tsuda
* convert & arrange to Java version by T.Sunahachi 2023
*/
import java.util.InputMismatchException;
import java.util.Random;
import java.util.Scanner;
public class TofuGame {
static int STARTGOLD = 5000; // 開始時の所持金
static int GOALGOLD = 30000; // 目標金額
static int TOFUBAIKA = 50; // トーフの売価
static int TOFUGENKA = 40; // トーフの原価
static int SELLMAX = {500, 200, 100}; // 天気ごとの最大売上個数
static String TENKIWORDS = {"晴れ", "曇り", "雨"}; // 天気を表す言葉
static int hare; // 晴れの確率
static int kumori; // 曇りの確率
static int ame; // 雨の確率
private static Random random = new Random();
// メインメソッド
public static void main(String args) {
Scanner scanner = new Scanner(System.in);
String input;
(以下略)
すると、こんな感じの文章が出来上がってきたのですが……(レイアウトが乱れているのは、HatenaBlogのエディタの勝手な挙動のせい)
プログラム仕様書
プログラムの概要:
このプログラムは「イスカンダルのトーフ屋ゲーム」というゲームを実行するものです。プレイヤーはトーフ屋を経営し、目標金額を達成することを目指します。プレイヤーとコンピュータが交互にトーフを作り、天候に応じてトーフを売ります。売上に基づいて所持金が増減し、先に目標金額に到達したプレイヤーが勝利となります。ゲームの遊び方:
a. プログラムを実行すると、「イスカンダルのトーフ屋ゲーム (Java版)」と表示されます。
b. ルール説明を表示するかどうか尋ねられます。"y"を入力するとルールが表示されます。
c. ゲームが開始され、プレイヤーとコンピュータが交互にプレイします。
d. ゲーム終了後、プレイを続けるかどうか尋ねられます。"y"を入力するとゲームが継続されます。
e. 目標金額に到達したプレイヤーが勝利となり、ゲームが終了します。メソッドの一覧:
- main(String args): プログラムのエントリーポイント。ゲームのメイン処理を呼び出します。
- displayRules(): ゲームのルール説明を表示します。
- gameMain(): トーフ屋ゲームのメイン処理を実行します。
- tenkiYohou(): 天気予報を表示します。
- randomNum(int max): 指定された最大値までの乱数を生成します。
- inpTofu(int limit): プレイヤーが作成するトーフの個数を入力します。
- compTofu(int limit, int player): コンピュータが作成するトーフの個数を決定します。
- nextTenki(): 翌日の天候を決定します。
- soldTofu(int tenki, int make): 売れるトーフの個数を計算します。
変数一覧表:
STARTGOLD
: 開始時の所持金 (初期値: 5000)GOALGOLD
: 目標金額 (初期値: 30000)TOFUBAIKA
: トーフの売価 (初期値: 50)TOFUGENKA
: トーフの原価 (初期値: 40)SELLMAX
: 天気ごとの最大売上個数を格納した配列 (初期値: [500, 200, 100])TENKIWORDS
: 天気を表す言葉を格納した配列 (初期値: ["晴れ", "曇り", "雨"])hare
: 晴れの確率kumori
: 曇りの確率ame
: 雨の確率random
: 乱数生成に使用するRandomクラスのインスタンスscanner
: 入力を受け取るためのScannerクラスのインスタンスinput
: ユーザーの入力を格納する変数playerMake
: プレイヤーが作成するトーフの個数computerMake
: コンピュータが作成するトーフの個数playerSold
: プレイヤーが売ったトーフの個数computerSold
: コンピュータが売ったトーフの個数playerProfit
: プレイヤーの利益computerProfit
: コンピュータの利益playerGold
: プレイヤーの所持金computerGold
: コンピュータの所持金仕様書の拡張案:
難易度設定の追加
現在のプログラムでは、トーフの作成数や売上個数などの要素がランダムに決定されています。拡張として、プレイヤーがゲームの難易度を選択できるようにします。難易度によって、作成数や売上個数などのパラメータを調整します。複数日のプレイ
現在のプログラムでは、ゲームは1日ごとに繰り返されますが、拡張として複数日のプレイをサポートします。プレイヤーは指定された日数分だけゲームを進めることができます。各日の結果や利益を記録し、最終日に最終的な所持金や勝敗を表示します。イベントの追加
ゲームにさらなるバラエティを加えるために、イベントを追加します。イベントはランダムに発生し、天候や売上数に影響を与えることがあります。例えば、イベントが発生すると晴れの確率が上昇したり、売上数が増加したりすることがあります。イベントの内容や影響は多様化させることで、ゲームのエンターテイメント性を向上させます。UIの改善
現在のプログラムはコンソールベースで動作しますが、拡張としてグラフィカルユーザーインターフェース(GUI)を導入します。GUIを使用することで、より直感的な操作や視覚的な情報表示を実現し、ユーザーエクスペリエンスを向上させます。プレイヤーのカスタマイズ
プレイヤーが自身のトーフ屋をカスタマイズできる機能を追加します。プレイヤーは店舗のデザインやトーフの品質、販売戦略などを選択できます。これにより、プレイヤーの戦略や選択の影響がゲームに反映され、より自己のプレイスタイルに合ったゲーム体験を提供します。
(ChatGPT)
今回の『イスカンダルのトーフ屋ゲーム』に関しても、まあまあの仕様書が出来上がったようです。ゲームの遊び方の部分がイマイチですが、それ以外は完璧と言えるかと思います。
特に仕様の拡張案(いつのまにか”仕様書の拡張案”に変わっている)に関しては、どんどん提案してくるようで、ChatGPTはこのあたりが得意分野と言うことがわかります。
つづきをお願いします
拡張案のつづきです:
リーダーボードの追加
プレイヤーのスコアや成績を追跡するリーダーボード機能を実装します。プレイヤーは自分の成績を保存し、他のプレイヤーと競い合うことができます。リーダーボードは、最も高い売上や最長連続営業日数などの指標でランキングされます。これにより、プレイヤー同士の競争やゲームへのモチベーションが高まります。成長要素の追加
プレイヤーがゲーム内で成長する要素を追加します。例えば、トーフのレシピを改良したり、新しい販売戦略を学んだりすることができます。成長要素は、プレイヤーの経験ポイントやレベルといった形で表現され、新たなチャレンジや報酬を提供します。追加のトーフバリエーション
現在のプログラムでは、トーフの種類は限られています。拡張として、さまざまなトーフのバリエーションを追加します。豆腐以外の材料を使った特別なトーフや、季節限定のフレーバーなど、プレイヤーにより多様な選択肢を提供します。インゲーム通貨とアイテムショップ
プレイヤーがゲーム内で獲得した通貨を使用して、特別なアイテムやアップグレードを購入できるアイテムショップを実装します。アイテムショップには、効率的なトーフ作成ツールやマーケティングキャンペーンなど、プレイヤーの進行をサポートするアイテムが用意されます。マルチプレイヤーモード
複数のプレイヤーがオンライン上で一緒にプレイできるマルチプレイヤーモードを追加します。プレイヤー同士が協力したり競争したりすることができます。共同経営のトーフ屋やトーフ作りの対戦など、さまざまなプレイスタイルに対応します。イベントや特別なイベントアイテムの追加 定期的なイベントを開催し、プレイヤーに特別な報酬やアイテムを提供します。例えば、季節イベントやトーフ祭りなどのイベントを開催し、限定のレシピや装飾品を手に入れることができます。これにより、プレイヤーはゲーム内での長期的な興味を維持しやすくなります。
チャレンジモードの追加
プレイヤーに特定の目標や制限が与えられるチャレンジモードを追加します。例えば、時間内にできるだけ多くのトーフを作る、予算制限内で最高の利益を上げるなどのチャレンジがあります。チャレンジモードは、プレイヤーの戦略力やスキルを試す機会となります。ストーリーラインの拡張
ゲームにストーリーラインを追加し、プレイヤーがトーフビジネスの世界で冒険をする要素を提供します。プレイヤーはトーフ業界の新たな展開やキャラクターとの出会い、困難な選択を経験することができます。ストーリーラインはゲームの興奮と没入感を高め、プレイヤーにより深い体験をもたらします。コミュニティ機能の強化
プレイヤー同士がコミュニケーションを取りやすい環境を提供します。フレンドリストやチャット機能などのコミュニティツールを実装し、プレイヤーが情報や助言を共有し、協力したり競い合ったりすることができるようにします。コミュニティの活発化は、ゲームの楽しさと持続性を高める効果があります。ゲームのバランス調整と改善
フィードバックやデータ分析を通じて、ゲームのバランスを見直し、不均衡な要素を改善します。プレイヤーのフィードバックを重視し、ゲームプレイの公正さと面白さを向上させるために、(以下略)
(ChatGPT)
今回の結論として、(無料利用の範囲での)ChatGPTはプログラミングの世界においては下記のようなことが言えると思います。
- 新たなプログラムの生成は出来る(今回の日記には書いていないが実験済み)
- 既存のソースコードの言語間のコンバートは苦手
- リバースエンジニアリングは出来るが、その中でもアイデアの提供は得意技
という感じで今回のシリーズ?は終わりたいと思います。
やっぱり趣味のプログラミングは楽しい(Part5)
(Part4より)
やはりここまでのプログラミング作業はChatGPTには重荷だったようで、本来の”生成AI”の能力範囲を超えた使い方だとの結論に達しました。分かってはいましたが……
結局、中途半端な出来損ないJavaソースをEclipseに貼り付け、それを自力で直すことにしましたが、内容がほとんどでたらめだったので、その骨組み(メソッド)を利用しただけで、元々のBASICソースを参照しながら大半のコードを書き換える結果となりました。まあ、こういう作業も嫌いじゃなく、若いころを思い出しながら地道にプログラムを作り込んで行きました。ほんと、20歳前後のころは寝ることを惜しんでパソコンの前でしこしことコード(言語はBASIC)を打ち込んでいたのです。
作ったプログラムは専門雑誌に何度か投稿し掲載もされ、自己満足していた自分がいました。(このあたりの話は長くなるのでここでは割愛)
実を言うとJava言語は3年前に必要にかられて始めたばかりで、当初は「最近の言語はめんどくさいな」などと思いながら触っていたのですが、慣れてくると開発環境(Eclipse)に馴染んできたせいもあって、徐々に苦痛が快感に変化していったのです。
特にゲームソフトを作りこんでいる最中は夢中になって、若いころと同じように時間を忘れて触っている自分がいたりもします。まさか還暦を過ぎた自分が新たな言語にハマるとは思ってもみませんでした。
ということで、完成したJava言語にによる『イスカンダルのトーフ屋ゲーム』は下記のようになりました。ここで公開しても意味はないでしょうけど(本来はGitHubなどで公開すべき?)、とりあえずのメモ代わりに貼り付けておきます。(字数は足りるかな?)
/*
* イスカンダルのトーフ屋ゲーム
* original copyright 1978 by N.Tsuda
* convert & arrange to Java version by T.Sunahachi 2023
*/import java.util.InputMismatchException;
import java.util.Random;
import java.util.Scanner;public class TofuGame {
static int STARTGOLD = 5000; // 開始時の所持金
static int GOALGOLD = 30000; // 目標金額
static int TOFUBAIKA = 50; // トーフの売価
static int TOFUGENKA = 40; // トーフの原価
static int SELLMAX = {500, 200, 100}; // 天気ごとの最大売上個数
static String TENKIWORDS = {"晴れ", "曇り", "雨"}; // 天気を表す言葉
static int hare; // 晴れの確率
static int kumori; // 曇りの確率
static int ame; // 雨の確率private static Random random = new Random();
// メインメソッド
public static void main(String[] args) {Scanner scanner = new Scanner(System.in);
String input;// 開始時の処理
System.out.println("イスカンダルのトーフ屋ゲーム (Java版)");
System.out.print("ルール説明しますか?[y/n]:");
input = scanner.nextLine();
if (input.equalsIgnoreCase("y")) {
displayRules();
}
do {
// ゲームのメイン処理
System.out.println("===== ゲームスタート =====");
gameMain();
// 継続確認処理
System.out.println();
System.out.print("プレイを続けますか?[y/n]:");
input = scanner.nextLine();
System.out.println();
if (input.equalsIgnoreCase("n")) {
System.out.print("おつかれさまでした。");
break;
}
} while (true);
}// 説明文の表示処理
private static void displayRules() {
System.out.println();
System.out.println("ここはイスカンダル星。あなたはここでトーフ屋を経営し、");
System.out.println("地球への帰還費用を作り出さなくてはいけません。");
System.out.println("でもお向かいには、コンピュータが経営するトーフ屋があります。。。");
System.out.println();
System.out.println("トーフの原価は1個" + TOFUGENKA + "円、販売価格は" + TOFUBAIKA + "円です。");
System.out.println("1日に売れる個数は天候に左右されます。");
System.out.println("晴れると" + SELLMAX[0] + "個、曇りだと" + SELLMAX[1] + "個、雨のときは" + SELLMAX[2] + "個まで売れます。");
System.out.println("トーフは日持ちしないので、売れ残った分はすべて廃棄します。");
System.out.println("所持金" + STARTGOLD + "円から始めて、早く" + GOALGOLD + "円を超えた方が勝ちです。");
System.out.println();
}// トーフ屋ゲームのメイン処理
private static void gameMain() {int playerMake; // プレイヤーの作成個数
int computerMake; // コンピュータの作成個数
int playerSold; // プレイヤーの売上個数
int computerSold; // コンピュータの売上個数
int playerProfit; // プレイヤーの利益
int computerProfit; // コンピュータの利益
int playerGold = STARTGOLD; // プレイヤーの所持金
int computerGold = STARTGOLD; // コンピュータの所持金do {
// 所持金の表示処理
System.out.println();
System.out.println("あなたの所持金は " + playerGold + "円 です。");
System.out.println("わたしの所持金は " + computerGold + "円 です。");
System.out.println();// 勝負の判定処理
if (playerGold >= GOALGOLD || computerGold >= GOALGOLD) {
if (playerGold >= computerGold) {
System.out.println("***** あなたの勝ちです! *****");
} else {
System.out.println("***** コンピュータの勝ちです *****");
}
return;
}// 天気予報の表示処理
tenkiYohou();// トーフの作成処理
playerMake = inpTofu(playerGold / TOFUGENKA);
computerMake = compTofu(computerGold / TOFUGENKA, playerMake);// 翌日の天気の決定・表示処理
int tenki = nextTenki();// 結果表示処理
playerSold = soldTofu(tenki, playerMake);
computerSold = soldTofu(tenki, computerMake);
System.out.println("あなたは " + playerMake + "個 作り、" + playerSold + "個 売れました。");
System.out.println("わたしは " + computerMake + "個 作り、" + computerSold + "個 売れました。");
playerProfit = playerSold * TOFUBAIKA - playerMake * TOFUGENKA;
computerProfit = computerSold * TOFUBAIKA - computerMake * TOFUGENKA;
System.out.println();
System.out.println("あなたの利益は " + playerProfit + "円 です。");
System.out.println("わたしの利益は " + computerProfit + "円 です。");// 所持金の計算
playerGold += playerProfit;
computerGold += computerProfit;} while (true);
}// 天気予報の表示
private static void tenkiYohou() {System.out.println("***** 天気予報 *****");
hare = randomNum(100);
kumori = randomNum(100 - hare);
ame = 100 - hare - kumori;System.out.println("晴の確率は " + hare + " %です。");
System.out.println("曇の確率は " + kumori + " %です。");
System.out.println("雨の確率は " + ame + " %です。");
}// 0~指定数までの乱数を発生させる
private static int randomNum(int max) {
if (max == 0) return 0;
return random.nextInt(max);
}// トーフの作成数の入力処理
private static int inpTofu(int limit) {System.out.println();
System.out.println("現在、あなたが作ることのできるトーフは" + limit + "個までです。");
Scanner scanner = new Scanner(System.in);
int num = 0;
do {
System.out.print("作る個数を入力してください:");
try {
num = scanner.nextInt();
} catch(InputMismatchException e) {
System.out.println("数字を正しく入力してください。");
scanner.nextLine();
// ↑ dummy method! (https://qiita.com/Choco_Late/items/5b6a9fdc98b53194a643)
continue;
}
if (num >= 1 && num <= limit) {
break;
} else {
System.out.println("作ることのできる範囲外の個数です。再入力してください。");
}
} while (true);return num;
}// コンピュータの作成個数
private static int compTofu(int limit, int player) {int num;
String watashi;
if (ame >= 40) {
num = SELLMAX[2]; // 雨を想定
} else if (kumori < 40 - ame) {
num = SELLMAX[0]; // 晴れを想定
} else {
num = SELLMAX[1]; // 曇りを想定
}
if (num > limit) {
num = limit;
}
if (num == player) {
watashi = "も";
} else {
watashi = "は";
}
System.out.println("わたし" + watashi + " " + num + "個 トーフを作りました。");
return num;
}// 天気の決定&表示処理
private static int nextTenki() {int tenkiVal;
// 1~100のサイコロを振る
int dice = random.nextInt(100) + 1;
if (dice <= hare) {
tenkiVal = 0;
} else if (dice <= hare + kumori) {
tenkiVal = 1;
} else {
tenkiVal = 2;
}System.out.println();
System.out.println("ーーーーーーーー 次の日 ーーーーーーーー");// ウェイト処理
try {
for (int i = 0; i < 3; i++) {
System.out.print("・");
Thread.sleep(1000);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println();System.out.println("天候は " + TENKIWORDS[tenkiVal] + " です。");
return tenkiVal;}
// 売上個数の計算
private static int soldTofu(int tenki, int make) {int sold = make;
if (make > SELLMAX[tenki]) {
sold = SELLMAX[tenki];
}
return sold;}
}
やっぱり趣味のプログラミングは楽しい(Part4)
(Part3より)
やはりというか、ChatGPTは万能ではないということで(もともと文章を生成する機能に特化したものだし)諦めればいいのに、しつこく再度トライすることにしました。
ということで、今度はこんな感じで、ChatGPTにお願いしました。
以下のPrologのプログラムをJava言語に書き換えてください。
%;;;; -*- coding: utf-8 -*-
%
% tofu.prolog - イスカンダルのトーフ屋ゲーム(Prolog版)
% by たけおか (take at takeoka.net)
% ver.1.0
% 2012/DEC/09
% for SB-Prolog or GNU Prolog
%
% Copyright (C) 1978 - 2000 by Nobuhide Tsuda
% http://vivi.dyndns.org/tofu/tofu.html
% 著作権は津田伸秀さん (ntsuda@beam.ne.jp) にあります。
%
% この Prolog版は、たけおか しょうぞうが、
% 永野圭一郎氏の(gano@is.s.u-tokyo.ac.jp) perl版 tofu.plを元に
% 書き直したものです。
%
%
% consult('/home/take/src/tofuya/tofu-prolog/tofu.prolog').
% ?- tofu.% millisleep
%#+sbcl (defun millisleep(x) (sleep (/ x 1000)))
millisleep(X) :- XX is X/1000.0, sleep(XX).
% 乱数初期化
:- dynamic(irandom/2).
defRand :- retractall(irandom(_,_)),defRand1.
defRand :- defRand1.defRand1 :-
current_prolog_flag(prolog_name,'GNU Prolog'),
%%for GnuProlog
!,asserta((irandom(R,N) :- !,random(RR),R is floor(RR * N + 0.0))).
defRand1 :-
%%for SWIProlog
!,asserta((irandom(R,N) :- (!,R is random(N)))).% 0 - 100の整数乱数
random100(R) :- irandom(R, 101).(以下略)
以下はJava言語に書き換えたプログラムです。
import java.util.Random;
import java.util.Scanner;public class TofuGame {
private static Random random = new Random();private static void millisleep(long milliseconds) {
try {
Thread.sleep(milliseconds);
} catch (InterruptedException e) {
e.printStackTrace();
}
}private static int random100() {
return random.nextInt(101);
}private static int calc(int comp, int hare, int ame) {
int x;
if (hare >= 50) {
x = 500;
} else if (ame > 30) {
x = 100;
} else {
x = 300;
}
return Math.min(comp / 40, x);
}private static void disp(String str) {
System.out.print(str);
}private static void displn(String str) {
System.out.println(str);
}private static void dispShojikin(String name, int gold) {
int ggg = gold / 1000;
System.out.print(" " + name + " " + gold + " 円 ");
for (int i = 0; i < ggg; i++) {
System.out.print("■");
}
for (int i = 0; i < Math.max(30 - ggg, 0); i++) {
System.out.print("□");
}
System.out.println();
}private static void dispYohou(int hare, int kumori, int ame) {
int hhh = hare * 10 / 25;
int kkk = kumori * 10 / 25;
int aaa = 1000 / 25 - (hhh + kkk);
System.out.println();
System.out.println("明日の天気予報: 晴れ " + hare + "% くもり " + kumori + "% 雨 " + ame + "%");
for (int i = 0; i < hhh; i++) {
System.out.print("◎");
}
for (int i = 0; i < kkk; i++) {
System.out.print("・");
}
for (int i = 0; i < aaa; i++) {
System.out.print("●");
}
System.out.println();
}private static int inpTofu(int limit) {
Scanner scanner = new Scanner(System.in);
while (true) {
System.out.print("トーフを何個作りますか?(1〜" + limit + ")> ");
int x = scanner.nextInt();
if (x > 0 && x <= limit) {
return x;
}
}
}private static int profit(int n, int sold) {
return Math.min(sold, n) * 50 - (n * 40);
}private static void dispResult(int player, int comp) {
if (player > comp) {
System.out.println("あなたの勝ちです。");
} else if (player < comp) {
System.out.println("コンピュータの勝ちです。");
} else {
System.out.println("引き分けです。");
}
}private static void tofu() {
defRand();
displn("イスカンダルのトーフ屋ゲーム (Java版)");
(中略)
このように修正することで、プレイヤーとコンピュータのトーフの作成、天候の設定、利益の計算などが行われます。ゲームは所持金が30,000円以上になるかどちらかの勝利条件が満たされるまで続きます。
(ChatGPT)
と、うまく行きそうに思えたのですが、必要となるメソッドが何故か抜けているのです。
calc メソッドを表示して
申し訳ありませんが、提供されたコードには
calc
メソッドが含まれていません。おそらく、別のコードやメソッドを参照している可能性があります。もしくは、calc
メソッドについて詳細な説明を教えていただければ、その内容に基づいてお手伝いできるかもしれません。ご提供いただいた情報が不十分な場合は、追加の詳細を教えていただけますか?(ChatGPT)
いやいや、元のソースコードにcalcメソッドに相当する部分は含まれていますよ。どこかで抜け落ちたのだろうということで、今度はChatGPTが生成したJava言語のソースを貼り付けてみたのです。
このJavaのコードを正しく修正してください。
import java.util.Random;
import java.util.Scanner;public class TofuGame {
private static Random random = new Random();public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("イスカンダルのトーフ屋ゲーム (Java版)");
System.out.println("ルール説明しますか?[y/n]");
String input = scanner.nextLine();
if (input.equalsIgnoreCase("y")) {
displayRules();
}
tofu();
System.out.println("プレイを続けますか?[y/n]");
input = scanner.nextLine();
if (input.equalsIgnoreCase("y")) {
main(args);
}
}(以下略)
修正されたコードは以下の通りです。
(コードは略)
これで修正が完了しました。修正したコードを試してみてください。修正内容は、不要な
main
メソッドを削除し、calc
メソッドを追加している点です。また、関数名の日本語表記を英語表記に修正しています。ご不明な点があれば、遠慮なくお知らせください。
(ChatGPT)
なんとなくうまく行ったような末尾の文章でしたが、結局は未完成のプログラムでしかなかったのです。当然でしょうね。もともと仕様が不明だと言って抜け落ちていたcalcメソッドを何の情報も与えない状況で”勝手に生成”したのですから。
やっぱり趣味のプログラミングは楽しい(Part3)
(Part2より)
ところが、結論を先に書けば、やっぱりというか今回はなかなかうまくいかなかったのです。まずは、こんな質問をしてみました。
「イスカンダルのとうふ屋ゲーム」を知っていますか?
申し訳ありませんが、「イスカンダルのとうふ屋ゲーム」については、私の知識には含まれていません。可能性のある理由として、そのゲームが非常に新しいか、または地域的な人気があるゲームである可能性があります。詳細について教えていただければ、お手伝いできるかもしれませんが、保証することはできません。他の質問やお手伝いできることがあれば、どうぞお知らせください。
(ChatGPT)
まあ、知っているほうがおかしいとは思いましたが。日本人の99.9999%の人は知らないと思うし(数字は適当)、ということで、本題のほうにはいったわけですが。
以下のRubyで書かれたプログラムをJava言語に変換してください。
#!/usr/bin/env ruby
# -*- coding: utf-8 -*-
##■イスカンダルのトーフ屋ゲーム■ (外部仕様より再現)
##Copyright (C) 1978-2013 by N.Tsuda
##Reference: http://vivi.dyndns.org/tofu/tofu.html
##背景: あなたはイスカンダル星で遭難し、帰りの費用を稼ぐためにトーフをなるべくたくさん売ってお金を稼がなければならない。
##最初に所持金1000円が与えられる。
##30000円儲けることができれば、めでたくイスカンダルから脱出することができる。
##トーフは製造に一個あたり10円かかり、一個あたり12円で売ることができる。
##トーフは晴れの日は100個、曇りの日は50個、雨の日は10個売れる。
##売れなかった分は損失となる。
##あなたは天気予報を見て、明日いくつのトーフを製造するかを決めねばならない。
##
##A Tofu vendor surviving in Iscandar
##Copyright (C) 1978-2013 by N.Tsuda
##Reference: http://vivi.dyndns.org/tofu/tofu.html
##Background: You are a castaway in planet Iscandar in outer space, and you have to gain money by making and selling Tofu in order to go back to your mother planet.
##Initially you have 1,000 yen. The goal is to gain 30,000 yen for your traveling fee.
##One Tofu costs 10 yen for production, and the unit price is 12 yen.
##The sales of Tofu depends on weather: you can sell 100 Tofu on a fine day, 50 on a cloudy day, and 10 on a rainy day.
##Watch weather forecast and determine the quantity of Tofu you are going to make.class Iscandar
COST = 10
PRICE = 12
RATE = {
fine: 100,
cloudy: 50,
rainy: 10
}
RED = "\e[31m"
GRN = "\e[32m"
SO = "\e[m"(以下略)
以下は、提供されたRubyプログラムをJava言語に変換したものです。ただし、Javaの出力はターミナルではなくコンソール上に表示されるため、一部の出力部分には調整が必要です。
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import java.util.Scanner;public class Iscandar {
private static final int COST = 10;
private static final int PRICE = 12;
private static final Map<String, Integer> RATE = new HashMap<String, Integer>() {{
put("fine", 100);
put("cloudy", 50);
put("rainy", 10);
}};
private static final String RED = "\u001B[31m";
private static final String GRN = "\u001B[32m";
private static final String SO = "\u001B[m";private Map<String, Integer> forecast;
private int total;public Iscandar() {
forecast = new HashMap<>();
total = 1000;showComment();
}private void showComment() {
String filename = Iscandar.class.getSimpleName() + ".java";
// コメント行のみを抽出して表示することで対応します
// 必要に応じてファイルの読み込みを行ってください
System.out.println("##イスカンダルのトーフ屋ゲーム## (外部仕様より再現)");
System.out.println("##Reference: http://vivi.dyndns.org/tofu/tofu.html");
System.out.println("##背景: あなたはイスカンダル星で遭難し、帰りの費用を稼ぐためにトーフをなるべくたくさん売ってお金を稼がなければならない。");
System.out.println("##最初に所持金1000円が与えられる。");
System.out.println("##30000円儲けることができれば、めでたくイスカンダルから脱出することができる。");
System.out.println("##トーフは製造に一個あたり10円かかり、一個あたり12円で売ることができる。");
System.out.println("##トーフは晴れの日は100個、曇りの日は50個、雨の日は10個売れる。");
System.out.println("##売れなかった分は損失となる。");
System.out.println("##あなたは天気予報を見て、明日いくつのトーフを製造するかを決めねばならない。");
System.out.println();
}private Map<String, Integer> calcProbab() {
Map<String, Integer> probab = new HashMap<>();
Random random = new Random();
probab.put("fine", random.nextInt(100));
probab.put("cloudy", random.nextInt(100 - probab.get("fine")));
probab.put("rainy", 100(ChatGPT)
例によって途中で切れています。そこで、いつものように続きを表示させて、すべて表示されたと思われるソースコードをEclipseに貼り付けました。エラーは出なかったものの実行させると、思ったような動きにはならずゲームルール的に滅茶苦茶な動作をしたのです。