タイトルが悪い場合は申し訳ありませんが、より良いタイトルが思いつきませんでした。
最近、C++ で書かれた小さなコンソール メモリ ゲーム プログラムを見たのですが、それをきっかけに (まったくもって) C で複製するようになりました (主に、このプログラムの特定の側面が私に突き刺さりました)。
たとえば、「カード」をめくった場合に、コンソール ウィンドウが静的な効果をどのように持っているかを見たとき、私は興味をそそられました。
//Console Screen Before "Card Flip"
1 2 3
1 * * *
2 * * *
3 * * *
Flip Which Card? (x,y): _
1,1
プログラムの可能な出力を入力したとしましょう:
//Console Screen After "Card Flip"
1 2 3
1 9 * *
2 * * *
3 * * *
Flip Which Card? (x,y): _
これが実際に私がプログラムを複製するように促したものです。正直なところ、私の唯一の目標は、この種の静的コンソールを複製することです。私の推測では、このプログラムの作成者は、ユーザーが入力するたびに画面をクリアし、更新された行列 (この場合はマスクされていない 1,1 の値) を再出力するだけです。
そこで、同様のプログラムを初期化するための一種のセットアップ画面を作成することにしました。
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int flips, x, y;
do
{
printf("*****Game Setup*****");
printf("\n\tGrid Size (x):_");
printf("\nGrid Size (y): ");
printf("\nAmount of Flips (0 is Unlimited): \n");
scanf("%d", &x);
system("cls");
}
while(x <= 0);
do
{
printf("*****Game Setup*****");
printf("\nGrid Size(x): %d", x);
printf("\n\tGrid Size(y):_");
printf("\nAmount of Flips (0 is Unlmited): \n");
scanf("%d", &y);
system("cls");
}
while(y <= 0);
do
{
printf("*****Game Setup*****");
printf("\nGrid Size(x): %d", x);
printf("\nGrid Size(y): %d", y);
printf("\n\tAmount of Flips (0 is Unlmited):_\n");
scanf("%d", &flips);
system("cls");
}
while(flips < 0);
if(!flips) printf("Beginning %d by %d Memory Game with Unlimited Flips...", x ,y);
else printf("Beginning %d by %d Memory Game with %d Flips...", x, y, flips);
return 0;
}
期待どおりに動作しますが、これと同じ効果を達成するためのより良い方法がおそらくあると思います。この方法で行うと、コードの長さが指数関数的に増加し、効率的ではありません。それだけでなく、この方法を使用すると「UI」がせいぜいお粗末です. どうにかして点滅する入力カーソルを適切に動かすことができれば、はるかに良いと思います.
例えば:
*****Game Setup*****
Grid Size (x): _
Grid Size (y):
...
次に1
、たとえば次のように入力すると、カーソルは単に次の領域に「移動」します。
*****Game Setup*****
Grid Size(x): 1
Grid Size(y): _
...
%n
どういうわけか、指定子を使用して後者を達成することを考えていましたがprintf
、それが可能かどうかはよくわかりません(についてはほとんど知りません%n
)。
これを(より効率的に)行うためのより良い方法はありますか?もしそうなら、上記のようにカーソルを「移動」する方法はありますか? このようなことをどのようにしますか?
このコンセプト全体が、私の好奇心を本当にかき立てました。