- ベストアンサー
見た目が華やかなプログラム
変数、制御文、関数、構造体くらいまでの基礎を一通り終えたC言語初心者です このレベルの内容を使ってある程度見た目が華やかなプログラムを作りたいと思います。 以前、左上からスタート、右下がゴール、0なら進めて1のマスは進めないという迷路を作って、脱出するまでの最短距離を求めるプログラムを作ってみました。 しかし、入力に時間がかかる上に出力結果が「最短距離は=>X」と出るだけで地味です DOS画面動作なので限界はあるとは思いますが、それでももう少し華やかなものはないでしょうか? 出来れば完成品のソースコードなどがあるとベストです。 宜しくお願いいたします
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
#include <stdio.h> #define SIZEY 20 #define SIZEX 16 #define STARTY 0 #define STARTX 1 #define GOALY 19 #define GOALX 6 void print(int maze[][SIZEX], int step) { char *marks[] = {"■", " ", "・"}; int y, x; for(y = 0; y < SIZEY; y ++){ for(x = 0; x < SIZEX; x ++){ printf("%s", marks[maze[y][x]]); } putchar('\n'); } printf("Steps : %d\n\n", step); return; } void search(int maze[][SIZEX], int y, int x, int *step, int *shortest) { if(*step >= *shortest) return; if(y < 0 || SIZEY <= y) return; if(x < 0 || SIZEX <= x) return; if(maze[y][x] != 1) return; maze[y][x] = 2; if(y == GOALY && x == GOALX){ print(maze, *shortest); *shortest = *step; maze[y][x] = 1; return; } (*step) ++; search(maze, y, x + 1, step, shortest); search(maze, y + 1, x, step, shortest); search(maze, y, x - 1, step, shortest); search(maze, y - 1, x, step, shortest); maze[y][x] = 1; (*step) --; return; } int main(void) { int maze[SIZEY][SIZEX] = {{0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,}, {0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,}, {0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,}, {0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0,}, {0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0,}, {0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0,}, {0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0,}, {0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0,}, {0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0,}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,}, {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,}, {0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,}, {0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,}, {0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,}, {0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0,}, {0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0,}, {0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0,}, {0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0,}, {0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0,}, {0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,},}; int step = 0, shortest = SIZEX * SIZEY; print(maze, shortest); search(maze, STARTY, STARTX, &step, &shortest); return 0; }
その他の回答 (6)
- jacta
- ベストアンサー率26% (845/3158)
とりあえず、アスキーアートでも出力するとか。
お礼
文字列のまま突っ込んでおいて、1文字ずつ出すだけでもインパクトありそうですね。 試してみます。 回答ありがとうございました。
- D-Matsu
- ベストアンサー率45% (1080/2394)
SolarisだからNo.2回答が駄目ということでしたら、ANSIエスケープシーケンスではどうでしょう。 #参考URLはLinuxのものですが、おそらくそのまま使えます
お礼
おお、こんなのもあるんですね。 早速試してみたいと思います。 回答ありがとうございます。
- JaritenCat
- ベストアンサー率37% (122/322)
その迷路を自動生成するのも面白いでしょう。 DOS画面で80*20マスぐらいの迷路を作って、スタートからゴールまでの道が分かるように表示させましょう。 迷路生成のアルゴリズムはいろいろありますが、僕が知っているのは ・壁同士がぶつからないようにのばしてく方法 ・壁を格子状に作っておいて消していく方法 ぐらいです。探せばいろいろ出てくるでしょう。
お礼
迷路の自動生成ですか。 なるほど、ちょっと間に合うかどうかが分からないですが検討してみます。 ありがとうございます。
- beefisdead
- ベストアンサー率63% (92/145)
その迷路の最短脱出経路を表示するプログラムなどは見た目に楽しいはずです。 おそらく、迷路のマスにスタート地点からの最短距離を書き込んで行くような作り方をしていると思います。その場合は書き込んだ結果を利用すればゴールからスタートへと経路を辿ることが出来ます。 迷路はファイルから読み込めるようにすれば、いちいちコマンドラインで書かなくて済みますね。(ファイル操作はfopenやfgetsあたり)
お礼
なるほど、これをそのまま改良すればいいんですね。 ちょっと試してみたいと思います。 ありがとうございます。
- Oh-Orange
- ベストアンサー率63% (854/1345)
★アドバイス >見た目が華やかなプログラム ↑ それなら文字に色を付けてみてはどうでしょうか。 http://www.kumei.ne.jp/c_lang/intro/no_58.htm→『第58章 コンソールアプリで文字色を変える』 コンソールでも文字色を変えれば多少は華やかになるでしょう。 なお、紹介したリンク先は Windows OS 限定です。 ・コンソール関連のAPIを使えばコンソール画面のタイトル名なども変更できます。 http://msdn.microsoft.com/ja-jp/library/cc429123.aspx→『コンソール』 http://www.asahi-net.or.jp/~qb3k-kwsk/rpg/program/tutorial/game1/m100.html→『Programのプ:VC++で作る』 http://www.winapi-database.com/special/2001_9/index.html→『2001-9月号の特集』
お礼
うぅ、環境を明記していない自分がいけませんでした・・・。 実はSolarisで走らせなくちゃいけないので、Windows環境が使えない状態なんです。 でも、色を変えるなんてことも出来るんですね、知りませんでした。 ありがとうございます。
- aigaion
- ベストアンサー率47% (287/608)
大学の課題とかですかね? 最短経路問題はデータ構造とアルゴリズムの設計などC言語習いたてにはけっこう高度です. 見た目を特に重視しない課題で,ソースコードも提出するならそれなりに評価は高いと思いますよ. >出来れば完成品のソースコードなどがあるとベストです。 ネットにあるソースコードはそのまま提出すると確実にばれるのでやめた方が良いですよ.
お礼
や、宿題じゃないんですよ 提出する必要はないんで、どこかのソースそのままでも構わないんです。 デモもどきみたいなものをしたかったので、とりあえず動くものが欲しいなーと思ったんですが、既存のコードをちょっといじる方が早そうですね。 ありがとうございます。
お礼
ありがとうございます。 迷路を自動生成させ、待ち時間と無限ループをするように変えてみました。 確かにこれはインパクトあります。感謝です。