2EI実験でオセロプログラム
2EIの後期実験では、後半の私の担当実験では、「五目並べ・オセロ」のプログラム 作成というテーマを実施しています。 思考プログラムは大変だけど、標準入出力で2人が交互にコマを置く場所の x,y座標を入力する。そしてゲームの禁止手判定や勝敗判定をするプログラムを 作るというテーマ。 授業で、2次元配列や関数がちょうど終わったあたりなので、 配列表示や盤面周辺に壁の領域を作るというテクニックを、 雛形プログラムで見せるだけで、2週テーマの割にそれなりに完成させてくれます。
ただ今回、元々プログラミングが好きなK君は、自分の実験週のちょっと前あたりから、 先発で実験をやっている友達をみて面白そうということで、グラフィックス表示・マウス入力も含めて完成度の高いものを 実験前から作り始めたようです。
思考ルーチン組んじゃった
実験2週目ということで、課題に取り組んでもらっていたら、K君のプログラムの前で 他の人が「すげーすげー」の声。よく見ると、思考ルーチン組んでます。 完成度も高く、オセロで手を打てる場所をヒント表示してくれたり、 オセロも得意そうな学生さんも「負けそう」な雰囲気。
本人に、完成度を何気なく聞いてみる。
「何手読み?」→「難易度変えられるけど、これは7手です」
「終盤は完全読み?」→「終盤は打てる手少ないし倍の手数、だから14手です」
「コーナーの処理は?」→「配点高くしてます」
「枝切りは?」→「α・βです」
「行数は?」→「3000行」
適当なサイトに転がっている物を、自己流で部分的に改造しただけなら、 こういった回答をスラスラできません。
思わず、「来年の高専プロコンの競技部門、声かけるからね…」
「レポートに3000行印刷は、頼むからやめてね。フローチャートだけにして…」
ものづくりとしては面白…(01/31)
- 01/30 ものづくりとしては面白いけど、逮捕されてもしらんぞ… "下腹部を押し付けて「いいね!」" #fnct http://japanese.engadget.com/2012/01/29/…
- 01/30 各種センサーを使った制御実験に使えそうなキット…と思ったが品切れかょ!! #fnct http://www.switch-science.com/products/d…
- 01/30 Seeeduinoなんて製品も出てる、Arduino互換ボードでUSBがmini&CPU等も小型品を使用。 #fnct http://flyman.jugem.cc/?eid=959
この記事は、 の @TohruSaitohに掲載した #fnct タグ付き記事を、まとめたものです。
グラフィックスと総括
プログラミング応用の授業は、3次元グラフィックスの計算方法の説明も先週に終り、 今日は課題作成の時間とした。 途中、試験前ということもあり、関数の引数の受け渡しの復習と、型についての説明を行った。
変数の受け渡し
基本は、関数への値渡しと返り値による受け渡しを説明。 関数による複数の計算結果を、呼び出し側に伝えるには、 ポインタ渡し、配列渡し、構造体渡しがある。 簡単には、以下のような例をベースに説明。
int foo( int x , int y ) { : return x*x + y*y ; } void main() { printf( "%d\n" , foo( 12 , 34 ) ) ; } //--- void rarg( double*r , double*th , double x , double y ) { *r = sqrt( x*x + y*y ) ; *th = atan2( y , x ) ; } void main() { double zr , zth ; rarg( &zr , &zth , 1.0 , 2.0 ) ; } //--- void rarg( double rth[2] , double xy[2] ) { rth[0] = sqrt( xy[0] * xy[0] + xy[1] * xy[1] ) ; rth[1] = atan2( xy[1] , xy[0] ) ; } void main() { double zrth[2] , zxy[2] = { 1.0 , 2.0 } ; rarg( zrth , zxy ) ; } //--- struct RTH { double r , th ; } ; struct XY { double x , y ; } ; void rarg( struct RTH*p , struct XY*q ) { p->r = sqrt( q->x * q->x + q->y * q->y ) ; p->th = atan2( q->y , q->x ) ; } void main() { struct RTH rth ; struct XY xy = { 1.0 , 2.0 } ; rarg( &rth , &xy ) ; }
この後に、プログラムの式を正確に理解するためのヒントとして、 型の概念を説明し、式の一部分もそれぞれ型を持ち、 演算子を適用するごとに型が変化していく状況を説明する。