スキップしてメイン コンテンツに移動

プチコン3号で1画面プログラム「BLK2048」をリリース

飛び出すブロック崩し BLK2048 をリリースしました。


名前にもあるように 2048 面が選択できます。


投稿プログラム : BLK2048 - プチコン3号まとめWiki


公開キーは 【1D34VKKV】 です。


プレイするには、ダウンロードしたフォルダの BLK2048 を実行してください。


 


1画面プログラムはワンライナーのようなもので、スクロールしない1画面の範囲におさめた文字数の少ないプログラムのことです。


最初は習作として作っていたブロック崩しでしたが、飛び出すアニメーションをつけて大喜利に出そうと検討したとき、せっかくならまだやったことがない1画面プログラムにできるかどうかやってみようと思いチャレンジしました。


f:id:SakuraCrowd:20150126213022p:plain


もう、見た感じうじゃーっとしてて保守してくださいとか言われたら、反射的にいやです(`・ω・´)とお断りするレベルのプログラムです。


でも、やってみるとこれはこれで面白いです。


 


1画面プログラムを作るときに意識したこと


自分の感想では50~60行くらいの普通のプログラムならなんとかぎゅぎゅっと圧縮すれば1画面にいけると思いました。


圧縮といっても、機械的に次のことをやっただけです。



  • 数字のあとの命令文はくっつけて書く(ENDIF だけは区切る必要あり)

  • ラベルの前の文はくっつけて書く

  • 文字列の前後の文はくっつけて書く

  • 配列[]のあとの文はくっつけて書く


とにかく、区切る必要のないものはくっつけて書くだけです。


IF 文は ENDIF を忘れると条件分岐の処理として後の命令が呼び出されてしまうので1行IFで省略している場合は、ENDIFを書いてから圧縮したほうがよいです。


 


変数名など省略できるものはなるべく少ない文字数にしました。


しかし、どの変数が何を表すのかがわかりにくくなります。


そこで、プログラムにコメントを書くかわりに、パソコンのテキストで変数名の管理をしました。


このアルファベットは使ってないよね?とびくびくしながら変数を使う問題がこれで解消できます。


 


50~60行というのもさらっといいましたがわりと短いです。


普通に書いてたら、変数宣言と初期化だけでそれぐらい使うかもしれません。


プログラムを書く上で気をつけたのは、同じ命令はなるべく1回書くだけにする。


たとえば、何度も BUTTON の入力を行ったり、 LOCATE で表示位置を変えないようにして、1箇所ですむように、仕様も含めて工夫しました。


 


「本当にやりたいことは何だ?」


これは私がお世話になった方からよくされたアドバイスですが、1画面プログラムのような限られた文字数の中で、この問いかけは何度も思い出されました。


ちょっとシチュエーションは違うのですが、要するに限られた中で取捨選択をしてよりよいものを作るというトレーニングという側面が1画面プログラムにはあるのかなーと思ったり思わなかったりしました。


 


作品の紹介


そんなこんなで作ったのがこんな感じです。


f:id:SakuraCrowd:20150126230057p:plain


f:id:SakuraCrowd:20150126230121p:plain


f:id:SakuraCrowd:20150126215800p:plain


f:id:SakuraCrowd:20150126230139p:plain


f:id:SakuraCrowd:20150126223134p:plain


 


f:id:SakuraCrowd:20150126223109p:plain


なんかよくわからないかもしれませんが、ブロック崩しで崩したブロックがくるくる回転しながら手前にとびだしてきているところです。


これが、意外ときれいで爽快です。自画自賛で3割り増しだとは思うのですが、そう思いました。



[プチコン3号]BLK2048[1画面プログラム][ブロック崩し][petitcom] - YouTube


私のプレイ動画ですが、ブロック崩しがこんなに難しいとは思いませんでした。


この動画は撮影のために操作しづらい姿勢でやっているというのはあるのですが、それにしても瞬殺レベルです。途中からはバーをのばした鑑賞モードにしています。


鑑賞モードを作ってよかったと本当に思いながら撮影しました。


その後、あらためて本気で挑戦しましたが、ブロック数が100個を超えるものはクリアできませんでした。(´・ω・`)


 


球の反射


ブロックと球との当たり判定が、ぐぐってもジャストなものがなかなかでてこなくて結局自分でいろいろと工夫してそれっぽくしてみました。


持っているゲーム開発のための物理の本などをみても、当たった方向に対して、移動の増分値の符号を反転させると書いてあるだけで、肝心な当たった方向の検知については書かれていませんでした。


 


まずは、壁の上下左右のどこにぶつかったのかを次の前提条件から判別します。



  • ブロックの上と下、左と右が同時にぶつかるということはありません。

  • 水平方向と垂直方向でそれぞれ進行方向にブロックがあります。


そこで、SPHITSP でブロックとぶつかったら、そのブロックとの水平方向と垂直方向の差分を比較します。


水平方向のほうが差分が大きいなら、水平方向で進行方向にブロックがあると判断します。


そのときは球を移動させる水平方向の増分値 V に -1 をかけて逆にします。


同様に垂直方向の差分が大きければ垂直方向の増分値 W に -1 をかけて逆にします。


もしも差分が同じならば角にあたったと判断して、V,W両方に -1 をかけて進行方向を逆にします。


 


周りの壁については球の座標を比較して、超えたら増分値 V, W の該当する変数に -1 をかけています。


左側にあるバーとの接触の際は、球がバーのどの位置にいようとも右側に跳ね返すようにしました。


途中までは物理の勉強などをしようとしていたのですが、途中でブロック崩しを作るのであって物理エンジンを作るのではない(そもそも難しすぎる)と思い直しました。


そうしたら、変なこだわりが消えて、ケースバイケースの処理を組み合わせて短いプログラムで、それっぽく動かせるようになりました。


それはそれとして、球の反射に関するよい説明などありましたら教えていただけるとうれしいです。


 


コメント

このブログの人気の投稿

QTableView で表を表示してみる

タイトルは駄洒落を狙っているわけではありません。 こんばんわ SakuraCrowd です。 今回は今作っているソフトの経過報告です。 最近のブログのパターンは、 「XXX作ったよ。これがスクリーンショットね。あとこんなこと思ったよ。」 という流れですが、 今日はできていないソフトの部分的な話なので、 いつもよりもプログラムちっくな話になると思います。(´Ծ_Ծ´)メガネノトキハマジメブッテル QTableView は GUIライブラリ Qt のクラスです。 それを Python で使うための PySide というライブラリを使っています。 某表計算ソフト っぽい表の GUI です。 このデータの日付が 09/01 なのでおそらくその日に   QTableView 使うぞ!(`・ω・´) とサンプルデータを作ったのでしょう。 Qt Designer という GUI エディタを使うとポトペタでウィンドウを設計できます。 選択できる GUI の中に QTableView と QTableWidget があります。 どちらも上のような表の GUI です。 QTableWidget は 簡単 に値をいれたりできます。 Qt Designer 上で直接編集 することができるので、 サンプルの表を簡単に作ることができます。 それに対して、 QTableView は Qt Designer 上では値を編集できません。たぶん。 QTableView の強みは MVC の構造 を使えることです。 名前のとおり QTableView は View です。 これにデータを管理している Model オブジェクトを設定して使います。 Model クラスを作る手間がかかりますが、 GUI の細かな操作をしなくても Model に応じた表を表示してくれます。 Model は QAbstractTableModel を 継承 して作ります。 コンストラクタで基底クラスの処理を呼び出し、いくつかの純粋仮想関数をオーバーライドします。 def __init__ ( self , parent= None , *args):

LibreOffice Writer 文書の差分 (WinMerge x TortoiseGit) + 社畜PCの原因と対策

お久しぶりです。皆様におかれましてはお風邪などをひかれてはいませんでしょうか。 春と秋だけあればいいのにヽ(`Д´)ノとつい思ってしまう SakuraCrowd です。 今日はいつものような製作日記ではなく、ちょっとした役立つメモを書きました。 タイトルにもあるとおり、 TortoiseGit への WinMerge の導入の仕方です。 今まではソースコードくらいしか差分で確認しなかったので、 TortoiseGit 標準の Diff ツールで問題なかったのですが、 LibreOffice の Writer が最近自分の中で便利だと話題になっていて、それを差分表示するためにちょっと調べてみました。 #Writer は、文章書いて、ちょっと絵をいれたり表を作るのに便利だと思います。 #リッチテキストのエディタを探していて、これが一番よさそうな気がしたので使ってます。 それとブログを書くときはあまり長く書かないつもりだった、 Win7 PC が社畜PCになってしまった際の原因と対策も後半に書きました。割と有用な情報かもしれませんので、時間がありましたらご覧下さい。 まずは TortoiseGit で Writer の odt ファイルを管理して、差分も普通に表示させる方法です。 WinMerge(+plugin) 導入手順 すでに TortoiseGit はインストールしてある前提ではなします。 1.信頼と実績の窓の杜様から WinMerge 日本語版をダウンロードします。 WinMerge - 窓の杜ライブラリ 私の PC は 64 ビット版なのでそちらを選びました。 2.WinMerge をインストールします。 フォルダを指定し普通にインストールできます。 インストール直前の設定で TortoiseGit をチェックしておくと自動的に TortoiseGit の利用する Diff ツールの設定を置き換えてくれるようです。 これの設定は TortoiseGit の設定の Diff ツールの項目で確認できます。 3.LibreOffice Writer のファイルを読むためのプラグインをダウンロードします。 ぐぐって出てくる英語版のDLサイトは応答がなかったりしましたが、日本語版は大

QWidget の選択時のデザインを CSS で変える方法

ひさびさに書きやすいネタができたので、1ヶ月ぶりくらいに書きます。 ここ1ヶ月の作業内容 タイトルのとおりなのですが、 テーマがいきなりマニアックでとまどったり、 デスチェリー農場の続編はどうしたんだよおおおお! とか新作を楽しみにしている生命が宇宙のどこかにいるかもしれないので あらかじめ書いておくと、 ここ1ヶ月は日記ソフトを作ろうと python + pyside + sqlite の勉強をしていました。 勉強というか、ウィンドウ起動から初めて、 GUI をせっせと作ったり、ファイル保存と復元を作ったりしてます。 Copy & Paste や Redo/Undo など未実装の処理も多くあります。 今回は、タブ遷移とかクリックで選択されたウィジェットの、 背景色が変わるとか、 枠線が出るとか そんな設定を CSS で実現します。 PySide と CSS について PySide は前も Raspberry Pi 2 で使う mount コマンドの GUI ツールで使いました。 Python の GUI フレームワークです。 さすがに HSP ほど簡単にウィンドウを出すことはできませんが、 かなり楽だし、 GUI の種類や機能もかなり充実しています。 ある程度 GUI を作っていて、 こんな露骨なウィンドウだと受けが悪いんじゃないかな と思いました。 なんか今っぽいおしゃれなデザインにしたい。 そんな誘惑にかられて調べていると、 CSS でお手軽にデザインを変更 できることがわかりました。 QWidget 派生のオブジェクトを作る際に、 setStyleSheet(str_css)で css を読み込ませることで簡単に実現できます。 次の例では file.css というファイルに書いた css を QWidget 派生クラスのオブジェクトに読み込ませます。 # css の読み込み with open("file.css","r") as f:     self.setStyleSheet("".join(f.readlines())) いろいろな G