質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

1回答

2107閲覧

C コンソールアプリケーションで矢印キーで選択するメニューシステムを作りたいです。

ranaka

総合スコア2

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

0クリップ

投稿2023/01/05 14:37

編集2023/01/06 04:43

前提

学校の課題でコンソール上で動くゲームを作っています。
今は数字を入力をさせて行動を選択させています

矢印の表示位置については、例えば下キーが入力されたら一行下に矢印を表示して上の矢印を空白などで消せばいいと見当がついています。
アローキーを入力させるのがまず分かりません。
数字で行動させている今はif文で攻撃させたりしていますが、矢印の位置で攻撃させるにはどうしたらいいかが分かりません。

実現したいこと

行動をアローキーで選んでエンターキーで決定できるようにしたい

→ 攻撃  スキル

補足情報(FW/ツールのバージョンなど)

VisualStudio2022使ってます

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ranaka

2023/01/05 15:51

これを見てもどうすれば実現すればいいのかわかりません
jimbe

2023/01/05 16:22 編集

コンソールは基本的には表示位置を制御出来ません。 ですがそれを出来るようにする構造・ライブラリがあり、エスケープシーケンスとか curses というもので、それらを勉強しなくてはならないということです。(所謂普通のWindowsプログラムとは全く違うものです。) os やコンソールシステムに因って様々な違いがあるかもしれませんので、ご自身の使用している環境についても理解している必要はあるでしょう。
fana

2023/01/06 01:32

使用している環境での「表示をクリアしてカーソル位置(:次のprintf()とかで表示が始まる位置)を一番左上に戻す」方法を探すのがとりあえずは一番手っ取り早い気がします. system("cls") みたいな. で,それを用いて,表示を更新する必要が出た際には毎度 全部消して→全部書く で画面更新するっていう. 表示がちらつくだとか不満は出てきそうですが.
ranaka

2023/01/06 04:36

皆様表示位置に関してコメントしてくださりありがたく大変恐縮ですが、僕はアローキーで選択してエンターキーで決定するにはどうしたらいいのかが分からないんです。
fana

2023/01/06 04:59 編集

Oh... であれば,その旨を質問文そのものに明記するとよいでしょう.(編集してあるのか.失礼.) おそらく「キーを押した」を知る手段を探す必要があると思います. (C言語の標準的な方法ではそれは存在しないハズなので,やはり環境固有の手段を探すことになるかと)
jimbe

2023/01/07 10:14 編集

>アローキーで選択してエンターキーで決定するにはどうしたらいいのか → 攻撃  スキル というイメージにおいてアローキーで選択という場合、上下のアローキーで"→"が上下に動いて攻撃かスキルを指すように表示が変わるという動きと見ていますが、それはあってますでしょうか。 あっているとすれば、必要な処理はアローキーの入力判定と、"→"の移動処理と思います。 入力自体は getch() 的なもので出来、"→"の移動処理の方が大変と考えているのですが、移動処理は本質問では対象としていないということでしょうか。 >一行下に矢印を表示して上の矢印を空白などで消せばいいと見当がついています 見当違いで無ければ良いですが…。
guest

回答1

0

環境固有の手段と思われる以下を利用した.
(Windows10 上で Visual Studio を使用し,C++コンソールアプリとして作った.)

  • 表示系に system("cls")
  • 入力系に _getch()

C

1#include <stdio.h> 2#include <stdlib.h> //for system() 3#include <conio.h> //for _getch() 4 5#define N_MENU_ITEMS (3) 6const char *MenuItemText[N_MENU_ITEMS] = { "Atack", "Skill", "(Quit)" }; 7 8enum Key 9{ 10 Unknown, 11 Up, Down, Enter 12}; 13 14Key Input() 15{ 16 int v = _getch(); 17 if( v==0 || v==0xE0 ) 18 { 19 switch( _getch() ) 20 { 21 case 0x48: return Up; break; 22 case 0x50: return Down; break; 23 default: return Unknown; break; 24 } 25 } 26 return ( v==0x0D ? Enter : Unknown ); 27} 28 29void Show( int CurSel ) 30{ 31 system( "cls" ); 32 printf( "----------\n" ); 33 for( int i=0; i<N_MENU_ITEMS; ++i ) 34 { 35 printf( "%c %s\n", (i==CurSel ? '*' : ' ' ), MenuItemText[i] ); 36 } 37 printf( "----------\n" ); 38} 39 40int main(void) 41{ 42 int QuitSelected = 0; 43 int CurSel = 0; 44 Show( CurSel ); 45 46 while( !QuitSelected ) 47 { 48 switch( Input() ) 49 { 50 case Up: 51 if( --CurSel<0 ){ CurSel = N_MENU_ITEMS-1; } 52 Show( CurSel ); 53 break; 54 case Down: 55 if( ++CurSel>=N_MENU_ITEMS ){ CurSel = 0; } 56 Show( CurSel ); 57 break; 58 case Enter: 59 printf( "[%s] Selected\n", MenuItemText[CurSel] ); 60 if( CurSel == N_MENU_ITEMS-1 ){ QuitSelected = 1; } 61 default: 62 break; 63 } 64 } 65 return 0; 66}

こんな感じの表示になる.上下矢印キーで * を動かして,Enterで決定.
(Quit) のところで Enter を押すと終了する.

---------- * Atack Skill (Quit) ----------

投稿2023/01/06 06:53

編集2023/01/06 06:54
fana

総合スコア11663

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2023/01/06 07:06 編集

[質問へのコメント]欄のところで出てきたものを使ってみた,というだけの話なので,こんなので役に立つ回答となるのかどうかわからんけど. ※ getch() に関しては,msdn で > getch は、 _getch 関数の非推奨のエイリアスです > (中略) > 代わりに _getch を使うことをお勧めします と書かれていたので, _getch() を使った. https://learn.microsoft.com/ja-jp/cpp/c-runtime-library/reference/getch?view=msvc-170
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問