スポンサーサイト

--.--.-- --:--  スポンサー広告

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

| - | - | ↑ページトップ | このエントリーを含むはてなブックマーク | |

C言語で神経衰弱……のようなもの

2009.08.02 09:32  プログラミング・CG関連

色々書くとは言ったけど、久しぶりにブログを書くと感覚がおかしくなってる。
書き方を忘れた……っていうのかな。

まぁいいです。





この前期はレポートがとにかく多かったです。AIBOの話は少し書いてたけどね。
その中には、プログラミングの自由課題なるものも含まれてました。せっかくなので、公開してみることにします。

C言語 「神経衰弱」
shinkei.txt

ルールは簡単。2手に分かれて、交互に2枚ずつカードをめくる。そこで同じカードが現れたらポイントを獲得。カードを全てめくり終えると終了。そこでポイントの多い方が勝者。人生の勝ち組。


まだまだ未熟なので、結構ムダがあるのはご愛敬。動けばいいんですよw
ソースは普通に見られます。ただ、見にくいのだけは勘弁して下さい。
あと、プログラムの説明は割愛します。多分gdgdになると思うので。


もの好きな人は、拡張子を'c'に変えて触ってやってください。
Linux環境では一応動きます。動作確認したのはVine LinuxとUbuntuです。

----****----

【追記】同日20:10

Windows上で動かすと、コンパイルエラーや無限ループ等のバグが発生するようです。プログラムの動作を中止するときは、[Ctrl]+[C]で止まります。
Windowsで動かされる方は注意して下さい。というより、動かない可能性が高いです。

そのような旨を、大学の友人やブログのコメントでRiSKさんが教えて下さいました。ありがとうございます。

【追記】ここまで

----****----


とりあえず、実行結果だけ追記に書きます。結構長いので注意。



動いたそのままの結果を貼りつけ↓

トランプを制作しました。
トランプをシャッフルしました。
こちらがシャッフルされたトランプです。ご確認下さい。
ダイヤの7
ダイヤのA
ダイヤのK
ダイヤの6
ダイヤの4
ハートの8
ハートの9
スペードの8
スペードのA
ダイヤの5
クラブの9
クラブの4
ハートの2
ハートのA
ダイヤの9
スペードの6
スペードの7
ハートのQ
ダイヤのQ
クラブのK
スペードの2
クラブの2
ダイヤの10
ダイヤの8
ダイヤの3
クラブの6
ハートのK
スペードの4
スペードのQ
スペードの9
クラブの5
ハートの10
クラブの7
ダイヤの2
クラブのQ
クラブの3
スペードのK
ハートの7
スペードのJ
クラブのA
ハートの4
スペードの5
ハートの3
クラブのJ
クラブの8
クラブの10
ハートの6
ハートのJ
ダイヤのJ
スペードの3
ハートの5
スペードの10


それでは神経衰弱を開始します。
【注意】4行13列を越える選択をすると、エラーと判断して終了します。



===現在のトランプの様子。(□=未発見, ●=発見済, ▲=1度捲ったカード)===
12345678910111213
□□□□□□□□□□□□□
□□□□□□□□□□□□□
□□□□□□□□□□□□□
□□□□□□□□□□□□□


=====================================
************ 1ターン目 ************
=====================================
Aさん:0ポイント Bさん:0ポイント

==============
Aさんの番です。
==============

[1回目] めくりたいカードをn行m列で選択して下さい。(例:2 3)
1 2
_/_/_/_/_/_/_/_/_/_/
1の2は
ダイヤのAです。
_/_/_/_/_/_/_/_/_/_/

[2回目] めくりたいカードをn行m列で選択して下さい。(例:2 3)
1 1
_/_/_/_/_/_/_/_/_/_/
1の1は
ダイヤの7です。
_/_/_/_/_/_/_/_/_/_/



===現在のトランプの様子。(□=未発見, ●=発見済, ▲=1度捲ったカード)===
12345678910111213
▲▲□□□□□□□□□□□
□□□□□□□□□□□□□
□□□□□□□□□□□□□
□□□□□□□□□□□□□

カードは同じではありませんでした

==============
Bさんの番です。
==============

[1回目] めくりたいカードをn行m列で選択して下さい。(例:2 3)
1 3
_/_/_/_/_/_/_/_/_/_/
1の3は
ダイヤのKです。
_/_/_/_/_/_/_/_/_/_/

[2回目] めくりたいカードをn行m列で選択して下さい。(例:2 3)
1 4
_/_/_/_/_/_/_/_/_/_/
1の4は
ダイヤの6です。
_/_/_/_/_/_/_/_/_/_/



===現在のトランプの様子。(□=未発見, ●=発見済, ▲=1度捲ったカード)===
12345678910111213
▲▲▲▲□□□□□□□□□
□□□□□□□□□□□□□
□□□□□□□□□□□□□
□□□□□□□□□□□□□

カードは同じではありませんでした

=====================================
************ 2ターン目 ************
=====================================
Aさん:0ポイント Bさん:0ポイント

==============
Aさんの番です。
==============

[1回目] めくりたいカードをn行m列で選択して下さい。(例:2 3)
4 2
_/_/_/_/_/_/_/_/_/_/
4の2は
ハートの4です。
_/_/_/_/_/_/_/_/_/_/

[2回目] めくりたいカードをn行m列で選択して下さい。(例:2 3)
2 7
_/_/_/_/_/_/_/_/_/_/
2の7は
クラブのKです。
_/_/_/_/_/_/_/_/_/_/



===現在のトランプの様子。(□=未発見, ●=発見済, ▲=1度捲ったカード)===
12345678910111213
▲▲▲▲□□□□□□□□□
□□□□□□▲□□□□□□
□□□□□□□□□□□□□
□▲□□□□□□□□□□□

カードは同じではありませんでした

==============
Bさんの番です。
==============

[1回目] めくりたいカードをn行m列で選択して下さい。(例:2 3)
4 1
_/_/_/_/_/_/_/_/_/_/
4の1は
クラブのAです。
_/_/_/_/_/_/_/_/_/_/

[2回目] めくりたいカードをn行m列で選択して下さい。(例:2 3)
3 11
_/_/_/_/_/_/_/_/_/_/
3の11は
スペードのKです。
_/_/_/_/_/_/_/_/_/_/



===現在のトランプの様子。(□=未発見, ●=発見済, ▲=1度捲ったカード)===
12345678910111213
▲▲▲▲□□□□□□□□□
□□□□□□▲□□□□□□
□□□□□□□□□□▲□□
▲▲□□□□□□□□□□□

カードは同じではありませんでした

=====================================
************ 3ターン目 ************
=====================================
Aさん:0ポイント Bさん:0ポイント

==============
Aさんの番です。
==============

[1回目] めくりたいカードをn行m列で選択して下さい。(例:2 3)
2 7
_/_/_/_/_/_/_/_/_/_/
2の7は
クラブのKです。
_/_/_/_/_/_/_/_/_/_/

[2回目] めくりたいカードをn行m列で選択して下さい。(例:2 3)
3 11
_/_/_/_/_/_/_/_/_/_/
3の11は
スペードのKです。
_/_/_/_/_/_/_/_/_/_/



===現在のトランプの様子。(□=未発見, ●=発見済, ▲=1度捲ったカード)===
12345678910111213
▲▲▲▲□□□□□□□□□
□□□□□□▲□□□□□□
□□□□□□□□□□▲□□
▲▲□□□□□□□□□□□

カードの番号が同じでした。やったね。
ポイントは1点になりました。



===現在のトランプの様子。(□=未発見, ●=発見済, ▲=1度捲ったカード)===
12345678910111213
▲▲▲▲□□□□□□□□□
□□□□□□●□□□□□□
□□□□□□□□□□●□□
▲▲□□□□□□□□□□□


==============
Bさんの番です。
==============

[1回目] めくりたいカードをn行m列で選択して下さい。(例:2 3)
3 5
_/_/_/_/_/_/_/_/_/_/
3の5は
クラブの5です。
_/_/_/_/_/_/_/_/_/_/

[2回目] めくりたいカードをn行m列で選択して下さい。(例:2 3)
1 10
_/_/_/_/_/_/_/_/_/_/
1の10は
ダイヤの5です。
_/_/_/_/_/_/_/_/_/_/



===現在のトランプの様子。(□=未発見, ●=発見済, ▲=1度捲ったカード)===
12345678910111213
▲▲▲▲□□□□□▲□□□
□□□□□□●□□□□□□
□□□□▲□□□□□●□□
▲▲□□□□□□□□□□□

カードの番号が同じでした。やったね。
ポイントは1点になりました。



===現在のトランプの様子。(□=未発見, ●=発見済, ▲=1度捲ったカード)===
12345678910111213
▲▲▲▲□□□□□●□□□
□□□□□□●□□□□□□
□□□□●□□□□□●□□
▲▲□□□□□□□□□□□


=====================================
************ 4ターン目 ************
=====================================
Aさん:1ポイント Bさん:1ポイント

==============
Aさんの番です。
==============

[1回目] めくりたいカードをn行m列で選択して下さい。(例:2 3)


この操作がず~っと続きますw
トランプは見やすく工夫したつもりが、逆に見づらくなってますね……。それが今回の課題だったりする。やはりCUIでGUIっぽく表現するのは難しかった。


あと、ブラウザ上ではトランプのレイアウトが崩れますね。上の結果みたいに。
ターミナル上で動かす時は、キレイに揃ってくれます。
toranpu_4_13.jpg
こんな感じ。
この表現方法だと環境に依存するんだなって今思った。



最後は全てめくり終えたところで終了します。

===現在のトランプの様子。(□=未発見, ●=発見済, ▲=1度捲ったカード)===
12345678910111213
●●●●●●●●●●●●●
●●●●●●●●●●●●●
●●●●●●●●●●●●●
●●●●●●●●●●●●●


勝負がつきました。
Aさんのポイントは12点
Bさんのポイントは14点
よって、Bさんの勝ちです。
お疲れ様でした。ゲームを終了します。



やっぱり見にくい。
というか、神経衰弱ってめくったカードの番号を覚えるのが大切なはず。この仕様ではカードの場所と番号の関連付けがしにくい。"sleep()"を使って時間も止めてるけど、これが意外と逆効果かもしれない。






ちなみに、最初シャッフルしたデッキを見せているのは仕様。別に見せなくてもいいんだけどね。
実は、あの順番通りにトランプの様子は並んでます。左上から順に右下へ。だから、上から2番目にあった「ダイヤのA」は1行2列目にあったわけです。

別にどうでもいいね。
スポンサーサイト

テーマ : 大学生日記 - ジャンル : 日記

| コメント(2) | トラックバック(1) | ↑ページトップ | このエントリーを含むはてなブックマーク | |

この記事へのコメント

Re:C言語で神経衰弱……のようなもの

はじめまして。コーディングがんばりましたね。
おもしろそうだったのでソース読んでみました。で,気づいたことをいくつか。

unistd.h は非標準ですのでWindowsにはありません。もしかしてsleepの宣言はunistd.hでされているのでしょうか? だとしたら,
//#include <unistd.h>
#include<windows.h>
#define sleep Sleep
とすることでWindowsでsleepが使えます。これは参考までに。

> int i, want, y1, x1, y2, x2, first, second, a_point=0, b_point=0, count=1, judge;
ここで,wantは一度も使われていません。消した方がいいかもしれません。

> Card deck[53]; /* Card型の箱を52個用意 */
53個用意しているので,コメントが間違いです。

> srandom(time(NULL)); /* time()で取得した時刻を乱数の種として設定 */
標準にはsrandom関数はありません。stdlib.hで宣言されているsrandを使った方がいいと思います。
srand((unsigned)time(0)); // こんな感じで

> randNum1 = random()%52+1; /* 1~52までの数をランダムで出す。 */
> randNum2 = random()%52+1; /* 上に同じ */
標準にはrandom関数はありません。stdlib.hで宣言されているrandを使った方がいいと思います。
randNum1 = rand()%52+1; // こんな感じで

データ構造ですが struct Deck{ Card card[52];} deck; のような感じにして,deck を関数へ渡したりするのもいいかもしれません。

main関数内,while(1)内のAさんの処理とBさんの処理は同じでしょうか? 関数にすれば同じ事を二度書かずにすみます。将来3人,4人とプレイヤーを増やすのも簡単です。

RiSK | URL | 2009.08.02 18:35 | 編集

コメント返信

>>RiSKさん
初めまして。ご丁寧にコメントありがとうございます。
正直、欠陥だらけのソースを上げてしまって、恥ずかしく感じています。大変恐縮です。


>unistd.h は非標準ですのでWindowsにはありません。もしかしてsleepの宣言はunistd.hでされているのでしょうか?
はい、sleepはunistd.hで宣言してます。
Windowsではそのように宣言するんですね。分かりました。

>ここで,wantは一度も使われていません。
確かに使われてませんね。最初テストで数字を読み込んでいたときの残骸だと思います。気づきませんでした。

>53個用意しているので,コメントが間違いです。
おお、そんな所まで……。コメント文も大事ですよね。

>標準にはsrandomとrandom関数はありません。
これらは環境に依存するんでしょうか。知りませんでした。
この2つの関数は講義で指示されたものなので、あまり考えませんでした。今後気をつけます。

>データ構造ですが struct Deck{ Card card[52];} deck; のような感じにして,deck を関数へ渡したりするのもいいかもしれません。
そのように宣言するのも良さそうですね。
ただ、今回は授業内で作ったブラックジャックのソースを流用した部分が多いので、宣言は触らないことにしました。

>Aさんの処理とBさんの処理は同じでしょうか?
仰る通りです。ほぼ同じ処理を繰り返しているだけの流れです。ここは関数にできると思ったんですが、時間の都合上断念しました。


ここまで色々突っ込まれると、想像以上に問題点があったことを実感します。
わざわざ問題点を指摘して下さって、ありがとうございます。大変参考になりました。

リヴァ | URL | 2009.08.02 21:19 | 編集

コメントを書く


管理人にのみ表示

↑ページトップ

この記事へのトラックバック

この記事にトラックバックする(FC2ブログユーザー)

ハートの国のアリス
ハートの国のアリスの最新動画や評価レビュー、攻略情報なら「ハートの国のアリス」へ!

ハートの国のアリス  2009.08.02 10:57

↑ページトップ

カウンター

プロフィール

最近のコメント

アクセスランキング

リンク

応援

カテゴリー

カレンダー(月別)

東方の記録(ノーコンティニュークリア)

RSSフィード

中の人

アクセス関係

アクセス解析

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。