RPG風名前入力画面

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
C++ビギナ

RPG風名前入力画面

#1

投稿記事 by C++ビギナ » 11年前

補助会話装置の研究をしております。

そこで、RPGなどのゲームでよく見られるプレイヤーの名前入力画面のような物をC++で作成したいのですが当方C++の知識はHallowWorld程度で御座います。
現段階ではキーボードからの入力と実行画面での表示は完成させました。
しかしキーボードからの文字入力は無し、50音表と十字キー移動、決定/削除ボタンを実装したいので、御教授お願いいたします。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: RPG風名前入力画面

#2

投稿記事 by softya(ソフト屋) » 11年前

足らない情報だらけなので、答えに困る状況です。
OSやら入出力装置、利用ライブラリなどを明記して頂かないと万の可能性を羅列するわけにも行きません。
それとC++と言って色々ありまして、C言語を勘違いしている可能性もあります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

C++ビギナ

Re: RPG風名前入力画面

#3

投稿記事 by C++ビギナ » 11年前

申し訳ありませんでした。

OSはWin7、開発環境はVisualStudio2013C++を使用しています。
インターフェイスはまだ考案しているので現段階では「十字、スペース、Backキー」を使用できれば良いです。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: RPG風名前入力画面

#4

投稿記事 by softya(ソフト屋) » 11年前

VisualStudio2013C++にも色々なライブラリ/API/フレームワークが利用できますので、もっと詳しくお願いします。
ざっと画面描画は5種類以上の方法がありえます。
VisualStudio2013C++であることと、C言語なのかC++であるかは別の問題でもあります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
へにっくす
記事: 634
登録日時: 13年前
住所: 東京都

Re: RPG風名前入力画面

#5

投稿記事 by へにっくす » 11年前

C++ビギナ さんが書きました:現段階ではキーボードからの入力と実行画面での表示は完成させました。
と、言うことですから、まずは今のプロジェクトを固めて添付した方が話が早い気がします。
またはメインのソースを

コード:

で囲って掲示するとかね。
written by へにっくす

C++ビギナ

Re: RPG風名前入力画面

#6

投稿記事 by C++ビギナ » 11年前

すみません、これ以上詳しくとなると何処を参照して良いのか分からないです。

>VisualStudio2013C++であることと、C言語なのかC++であるかは別の問題でもあります。
えと、つまりVS2013C++ではC++は使えないということでしょうか




>>へにっくす さん
以下がソースです。

コード:

#include <stdio.h>
#include <iostream>

int main(void)
{
	char test[30];
	
	std::cin >> test;
	
	printf("%s\n",test);
	
	std::cout << test << std::endl;
	
	return 0;
}
[\code]

C++ビギナ

Re: RPG風名前入力画面

#7

投稿記事 by C++ビギナ » 11年前

Win32API、VC++6プロジェクト
は判明いたしました。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: RPG風名前入力画面

#8

投稿記事 by softya(ソフト屋) » 11年前

逆にややこしいのはVisualStudio2013C++にはC言語とC++とC++/CLIと言う3種類の言語が搭載されているためです。
あとAPI/フレームワークは標準関数/Win32API/MFC/.NET/DirectXなど沢山あります。
今回のは黒いウィンドウの標準関数って事でよろしいですか?

VC++6プロジェクトはVisualStudioC++6.0(1998年頃の大変古いもの)のプロジェクトのことなので、MFCの可能性が高いものです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

C++ビギナ

Re: RPG風名前入力画面

#9

投稿記事 by C++ビギナ » 11年前

徐々に理解してきました。

VC++のプロジェクトで作成します。
今回は黒いウィンドウでおねがいします。

すみません。VC++6は間違いでした。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: RPG風名前入力画面

#10

投稿記事 by softya(ソフト屋) » 11年前

正確に書いておくとVC++のプロジェクトで言語はC++で、プロジェクトの種類はWin32コンソールアプリケーション、使用ライブラリは特になしで標準関数の範囲という事になります。
俗にいうCUI(キャラクタユーザインタフェース)でのプログラミングとなります。
「キャラクタユーザインタフェース - Wikipedia」

では、入力を考えず「あいうえお」を並べた画面は作れますか?
※ あと現在選んでいる位置を示すカーソルも表示して下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

C++ビギナ

Re: RPG風名前入力画面

#11

投稿記事 by C++ビギナ » 11年前

ただ表示させるだけ?でよろしいでしょうか

code

#include <stdio.h>

int main(void){

char str[30] = "あ い う え お";

printf("%s\n",str);
}

\code

C++ビギナ

Re: RPG風名前入力画面

#12

投稿記事 by C++ビギナ » 11年前

すみません、カーソル表示ができないです

C++ビギナ

Re: RPG風名前入力画面

#13

投稿記事 by C++ビギナ » 11年前

文字をキーボード入力する場合はカーソル移動できるのですが、ただ文字列を入力する場合はカーソルの表示すら間々なりません。
なにか特殊な関数が必要なのでしょうか

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: RPG風名前入力画面

#14

投稿記事 by softya(ソフト屋) » 11年前

カーソルをどう考えているか聞きたかったので聞いたわけですが、野暮ったい手ですが選択中の文字を[]で囲む方法があります。
[あ]って事ですね。すべてプログラムで操作が必要です。

あと、配列、文字列、漢字なので全角文字、if,for,whileなどの制御は理解されている必要があると思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

C++ビギナ

Re: RPG風名前入力画面

#15

投稿記事 by C++ビギナ » 11年前

このようになりました。

code

#include <stdio.h>

int main(void){

int a,flag=1;
char str[30] = "あいうえお";

while(flag==1){

scanf("%c",&a);
switch(a){
case '1':

printf("%s\n",str);
break;

case '2':
flag=0;
break;
}
}
}

\code

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: RPG風名前入力画面

#16

投稿記事 by softya(ソフト屋) » 11年前

codeタグの使い方が間違っていますので確認をお願いします。プレビューでの確認もなさって下さい。
http://dixq.net/board/board.html#k10

ちなみに、どんどんC言語化しているのですが問題ないのでしょうか?
C++に拘らないのならC言語で作ったほうが良いとは思いますが。

> あと、配列、文字列、漢字なので全角文字、if,for,whileなどの制御は理解されている必要があると思います。

こちらもどの程度出来るかも教えてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

C++ビギナ

Re: RPG風名前入力画面

#17

投稿記事 by C++ビギナ » 11年前

すみません、上のプログラムだとVSで動かなかったです。

if,for,whileは簡単な電卓を作った際に覚えましたが、文字配列で使用する場合は理解できていません

C++ビギナ

Re: RPG風名前入力画面

#18

投稿記事 by C++ビギナ » 11年前

目指しているものがC++での開発なので,C++でお願いします。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: RPG風名前入力画面

#19

投稿記事 by softya(ソフト屋) » 11年前

> すみません、上のプログラムだとVSで動かなかったです。
私の所では動きます。やりたい意図が不明なプログラムではありますが。

C++の理解度やら、C++である必然性が不明です。
どこまでC++の機能を使う必要性があるかも不明ですね。
あと期限がまだ先なら、先走らずにじっくり取り組まれることをオススメします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

C++ビギナ

Re: RPG風名前入力画面

#20

投稿記事 by C++ビギナ » 11年前

恥ずかしながらあと2週間で形にしなければならないのです。

最終的に使いたいインターフェイスがC++での開発環境になっているので、それが理由です。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: RPG風名前入力画面

#21

投稿記事 by softya(ソフト屋) » 11年前

これから私が忙しくなるので、ちょっとサポートしつづけられ無さそうですね。
ちなみにC++でクラスを継承してとかまでのレベルを要求されるのなら軽く半年とか見てもらわないと難しいです。
C++をC++として使うとは、そういう事なので。
C言語に毛が生えた程度でしたら、そこまではかかりませんが2週間は短いですね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

C++ビギナ

Re: RPG風名前入力画面

#22

投稿記事 by C++ビギナ » 11年前

最低限やりたい事を纏めますと
50音表の表示、テキストカーソルの移動、文字決定、決定された文字を出力
なのですが、やはり2週間では難しいですよね

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: RPG風名前入力画面

#23

投稿記事 by softya(ソフト屋) » 11年前

C言語の理解とある程度のプログラムの経験、C++らしさを求めなければ数時間もかからずに出来ますね。C++で熟練している人はC++で同様な時間で出来ます。
初心者の場合は、色んな所でつまずくのでどれだけの期間でできるかは未知数です。
周辺知識やら言語知識が足らない事で思ったものを組み立てらないので、ものすごく時間がかかります。
どこまでのC++知識を必要かC++ビギナさん自身が理解していないので、説明する側もどこまで説明すべきかわからないのが現状です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

C++ビギナ

Re: RPG風名前入力画面

#24

投稿記事 by C++ビギナ » 11年前

コード:


#include <stdio.h>

int main(void){

	int a,flag = 1;
	char str[30] = "あいうえお";
	
	while (flag == 1){
		scanf_s("%c", &a);
		if (a = 1){
			printf("%s\n", str);
		}
		else{
			flag = 0;
		}
	}
	
	return 0;
}

[\code]

文字列の出力は理解しました。
あとはここから「カーソル移動」「決定ボタン」「決定された文字の出力」が分かれば完了です。

C++ビギナ

Re: RPG風名前入力画面

#25

投稿記事 by C++ビギナ » 11年前

コード:

#include <stdio.h>

int main(void){

	int x,flag = 1;
	char a[20] = { "あいうえお" };
	char b[20] = { "かきくけこ" };
	
	while (flag == 1){
		scanf_s("%c", &x);
		if (x = 1){
			printf("%s\n",a);
			printf("%s\n", b);
			break;
		}
		else{
			flag = 0;
			break;
		}
	}
}
[\code]

少し書き換えたのですが、一瞬実行画面が表示されておわってしまいます。

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

Re: RPG風名前入力画面

#26

投稿記事 by usao » 11年前

コードがこういう風に↓見えるようになっているかどうか
プレビューでちゃんと確認してください,と言われているのですよ.

コード:

#include "stdafx.h"
#include <iostream>
#include <string>
#include <Windows.h>

//
int main( int argc, char **argv )
{
    const int Nx = 5;
    const int Ny = 5;
    const std::string Chars[Ny][Nx] = {
        "あ","か","さ","た","な",
        "い","き","し","ち","に",
        "う","く","す","つ","ぬ",
        "え","け","せ","て","ね",
        "お","こ","そ","と","の"
    };

    int PosX = 0;
    int PosY = 0;
    std::string CurrStr;

    bool bRedraw = true;
    while( 1 )
    {
        if( bRedraw )
        {//show
            bRedraw = false;

            system( "cls" );
            for( int y=0; y<Ny; y++ )
            {
                for( int x=0; x<Nx; x++ )
                {
                    if( x==PosX && y==PosY )
                    {   std::cout << '[' << Chars[y][x] << ']'; }
                    else
                    {   std::cout << ' ' << Chars[y][x] << ' '; }
                }
                std::cout << std::endl;
            }
            std::cout << std::endl << CurrStr;
        }

        //key
        if( GetAsyncKeyState( VK_ESCAPE ) )break;

        if( GetAsyncKeyState( VK_UP ) )
        {   PosY=(PosY>0 ? PosY-1 : Ny-1 ); bRedraw=true;   }
        else if( GetAsyncKeyState( VK_DOWN ) )
        {   PosY=(PosY<Ny-1 ? PosY+1 : 0 ); bRedraw=true;   }
        else if( GetAsyncKeyState( VK_LEFT ) )
        {   PosX=(PosX>0 ? PosX-1 : Nx-1);  bRedraw=true;   }
        else if( GetAsyncKeyState( VK_RIGHT ) )
        {   PosX=(PosX<Nx-1 ? PosX+1 : 0 ); bRedraw=true;   }
        else if( GetAsyncKeyState( VK_RETURN ) )
        {   CurrStr+=Chars[PosY][PosX]; bRedraw=true;   }

        //wait
        Sleep( 50 );
    }

    //
    return 0;
}

C++ビギナ

Re: RPG風名前入力画面

#27

投稿記事 by C++ビギナ » 11年前

usaoさん
ありがとうございます。すみません変な見間違いをしていました。
載せていただいたソースですが、「IntelliSense: ソース ファイルを開けません "targetver.h"」とエラーが出てしまいました。

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

Re: RPG風名前入力画面

#28

投稿記事 by usao » 11年前

あなたがどのような作業工程を経てそうなったのかわからないのと,
これまでそのようなエラーに遭遇したことが無いということもあり,さっぱり不明です.

・リビルドしてもダメですか?
・#include "stdafx.h"の行を取っ払ってみたらどうなりますか?
・そのエラーが出てる状況でもとりあえず実行だけはできたりとかしませんか?


#あと,前もって断っておきますが,
 私の張ったコードでは いろいろと不足なハズです.
 何かしらヒントにできればいいですね,程度のものですので.

C++ビギナ

Re: RPG風名前入力画面

#29

投稿記事 by C++ビギナ » 11年前

#include "stdafx.h"を取り払ったら実行できました。
これは大変参考になります。ありがとうございます。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: RPG風名前入力画面

#30

投稿記事 by softya(ソフト屋) » 11年前

usaoさん、ありがとうございます。
今後はusaoさんのコードを中心に話を進めて下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

Re: RPG風名前入力画面

#31

投稿記事 by usao » 11年前

>usaoさん、ありがとうございます。
>今後はusaoさんのコードを中心に話を進めて下さい。

うーん,なんでしょう.
・このままノーヒント的進行では(失礼ながら)かなり厳しそうに見受ける のと
・2週間という期限が差し迫っているらしいこと
を考慮して
「そこそこ参考になりそうなもの」を提示させていただいた ということにすぎないのですよね.

「これだけが動くプログラムができれば終了」という練習問題的な話ではなくて
一機能(モジュール)として作らなければならないという話でしょうから
このサンプル然としたコードの中に,参考にできそうな要素(記述とか使ってる関数とか?)があれば
そこを足がかりにしてもらればまぁ…という程度というか.

なので,このコードについて意味がわからんとかいう箇所があるならば
(そうならないように なるべく平易に書いたつもりですが)
その説明くらいはしないでもないですが,
これ中心で進めていく,というのは違うような……?

オフトピック
あと,何故
>ありがとうございます。
と言われるのかわかりません.

#ところで この話にもっと適したキーボード入力取得用の関数って無いですかね.
 何かキーが押されるまで処理が返らない&押されたキーの種類が返される ようなのがあれば
 その方が楽そうなのですが…

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: RPG風名前入力画面

#32

投稿記事 by softya(ソフト屋) » 11年前

「ありがとうございます」は、返答できなかったので代わりにありがとうございますって意味ですね。

> これ中心で進めていく,というのは違うような……?

どっか拠り所がないと進まないと思ったものですから。
C++ビギナさんのやりたい事もいまいち不明なままですから。

>#ところで この話にもっと適したキーボード入力取得用の関数って無いですかね.
> 何かキーが押されるまで処理が返らない&押されたキーの種類が返される ようなのがあれば
> その方が楽そうなのですが…

最終的に入力インターフェイスが変わるらしいのでこだわっても意味が無さそうです。
そっちの方が実際は大変そうなんですが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

Re: RPG風名前入力画面

#33

投稿記事 by usao » 11年前

>最終的に入力インターフェイスが変わるらしいのでこだわっても意味が無さそうです。

言われてみればそのとおりですね.
そこの部分の方式が 実際に使うもの と似ていた方が良さそうですね.
すなわち,
最終的な入力インターフェイス から得られる操作入力の形態:

例えば,今キーボードで代用していますが,それと同じように,{↑,↓,←,→,選択,…}みたいな操作種類選択の情報なのか,
マウスみたいに,現在座標とその場所に対するアクション(クリックとか) みたいな方式なのか…

みたいなことが先にわかっていた方がよさそうな気がしますね.
(誰かがコードを貼るにしても,その入力形態を踏まえた形のものになるでしょうし)

C++ビギナ

Re: RPG風名前入力画面

#34

投稿記事 by C++ビギナ » 11年前

失礼致します。以前頂いたプログラムに「一文字削除」のコマンド

コード:

else if (GetAsyncKeyState(VK_BACK))
		{
			CurrStr = -1; bRedraw = true;
		}
を追加してみたのですが、それまでに入力していた文字全てが削除されてしまいます。
直前の一文字だけを削除する場合はどのように書き込めば良いでしょうか

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

Re: RPG風名前入力画面

#35

投稿記事 by usao » 11年前

期限は今週中という感じでしょうか?
今の段階でそういう記述が出てくるというのは
std::string CurrStr;
って何ですか? というのが全く分かっていないということであり,相当まずいですね…


念のため,私が書いたやつの動作について説明しておきますと…

・CurrStrの(文字列としての)内容は最初は空っぽ("")です.
・Enterキーが押されたとき,CurrStrの末尾に,文字列Chars[PosY][PosX]の内容が付け加えられます.
 例えば,カーソルが一番左上(PosX=0, PosY=0)の位置にあるとき, Chars[PosY][PosX]の内容は "あ" なので,
 CurrStr の内容は結果として "あ" になります.
・例えば,さらにキー操作によってカーソル位置が PosX=4, PosY=3 に来たときにEnterを押せば,
 CurrStr の末尾に "ね" が追加され,結果として "あね" になります.

…という具合です.


「一文字削除」 という場合,
現在の CurrStr の末尾の文字(列)がCurrStr から削除されるような操作を行えばよいわけです
(上記の例で言えば,"ね" が取り払われて CurrStrの内容が "あ" になればいい).
対して,あなたの書いたコードだと,(とりあえず -1って何? というのを置いといても)
CurrStr に「現在のCurrStrの内容と何ら関係ない定数(-1)」を代入 しているわけですから
現在の内容に即した結果 (ここで言うところの "あ") は得られないでしょう.


・文字列上で操作する場合,std::string のメソッドである erase() や substr() 等が使えるでしょう.
 ただ, 動作の見た目(意味)的には 【末尾の「1文字」を削除】 であっても,
 日本語とかの文字(「全角文字」と言えばいいのか?正しい言葉が何かはわからないけど)って,プログラム上の文字数(Byte数)がいくつなの?
 っていう問題があるのでこれも注意が必要 (とりあえず現状 2byte と決め打ちしてしまってもいいのかも…?)

・削除操作をしようとした際に,CurrStrの内容が空である という場面もあり得るので,この点も注意が必要かと


std::stringの使い方等については検索なりされた方が早いと思います.
(今のままだと,このモジュールができても,結果の文字列を使う箇所のコーディングができなくなってしまうでしょうし)

C++ビギナ

Re: RPG風名前入力画面

#36

投稿記事 by C++ビギナ » 11年前

コード:

	
else if (GetAsyncKeyState(VK_BACK))
		{
			 CurrStr = CurrStr.erase(CurrStr.size()-1); bRedraw = true;
			
		}
こちらに書き換えたところ,直前の一文字を削除することが出来ました.ありがとうございます

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

Re: RPG風名前入力画面

#37

投稿記事 by usao » 11年前

2回連続で削除操作とかテストしてみても正しく動作していますか?

(あと,erase()の戻り値をCurrStrに代入する必要は特にないと思う)

C++ビギナ

Re: RPG風名前入力画面

#38

投稿記事 by C++ビギナ » 11年前

お礼が大幅に遅くなってしまい申し訳ありませんでした。
無事審査も通り、晴れて合格です。大変お世話になりました。ありがとうございます。

二回連続削除の件ですが、若干修正いたしまして正常に動作してくれています。

閉鎖

“C言語何でも質問掲示板” へ戻る