左右に移動させるプログラムを組みたいのですが・・・

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

左右に移動させるプログラムを組みたいのですが・・・

#1

投稿記事 by うさこ » 13年前

シューティングゲームで、自機を左右に移動させるプログラムを組んでいます。
今までに組んだプログラムは下記のとおりです。

コード:

void main ( )
{	
	int ax;  // x
	int ay = 0; 
	int amx; 
	int amy = 1; // y方向

	amx = 0;

	
	clear ( );
	setCursor ( 0 );
	
	for ( ax = 0; ; ){

		locate ( ax , ay );
		printf ( "*" );
		_sleep ( 50 );
		locate ( ax , ay );
		printf ( " " );
		locate ( 40 , 21 );
		printf ( "▲" );

		///////////////////////////////元  縦
        
		if ( ay >= 20 ){
			amy = 0;   //上
		}
		if ( ay <= 0 ){
			amy = 1;
		}
		if ( amy == 1 ){
			ay++;
		}else{
			ay--;
		}

		//////////////////////////////横

		if ( ax >= 79 ){
			amx = 0;
		}
		if ( ax <= 0 ){
			amx = 1;
		}
		if ( amx == 1 ){
			ax++;
		}else{
			ax--;
		}
	}
 
(前にも質問させていただいて、指摘を受けたところは直しています。)

このプログラムの中に、1を押したら自機が左に。3を押したら自機を右にというプログラムを書きたいのですが
if文をどのようにして書いたらいいのか悩んでいます。 
そして、自機が右端、左端に行ったら自機をそこで止めなければいけないです。
(左は0で左端ですが、右は79までです。)
自機が中央にあるので、左に行くためには自機のx座標を減らし・・・・というのは検討がついたのですが、
それ以上がわからず、質問をさせていただきました。


環境は下記の通りです。  
OS : Windows
コンパイラ名 :Microsoft Visual Studio 2008 (2010版もあるのですが、学校の環境が2008版なので、こちらを使っています。)

C言語の知識については、人並み以下だと思います・・・ですが、ただ今必死で復習しています。
よろしくおねがいしますm(_)m

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

Re: 左右に移動させるプログラムを組みたいのですが・・・

#2

投稿記事 by beatle » 13年前

1を押した、3を押したということを検知する方法はご存知でしょうか。
それが分かれば

コード:

if (1が押された && x座標 > 0)
{
    /* x座標を1減らす */
}
if (3が押された && x座標 < 79)
{
    /* x座標を1増やす */
}
という感じに書けると思います。
2つめのif文にelseを付けないのは、1と3が押された場合に動かないようにするためです。

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

Re: 左右に移動させるプログラムを組みたいのですが・・・

#3

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

前にも書きましたが非標準関数?マクロ?が使われているため学校での正解は分かりません。
使われているヘッダ類も不明なのです。

非標準関数の一覧。
clear ( );
setCursor ( 0 );
locate ( ax , ay );

WindowsだとGetKeyState()関数などが利用できます。
http://msdn.microsoft.com/ja-jp/library/cc364676.aspx
これを使った場合は学校の課題だとNGかも知れません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

うさこ

Re: 左右に移動させるプログラムを組みたいのですが・・・

#4

投稿記事 by うさこ » 13年前

ご回答ありがとうございますm(_)m

あらためて書かせていただきますと、全貌は下記のようになっております。

コード:

#include <stdio.h>
#include <conio.h>
#include <windows.h>

void    locate    ( int, int );
void    color     ( WORD );
void    clear     ( void );
void    setCursor ( int );
void    clear     ( void );

void main ( )
{	
	int ax;  // x
	int ay = 0; 
	int amx; 
	int amy = 1; // y方向
	int key; 
	int x; //自機用

	amx = 0;

	
	clear ( );
	setCursor ( 0 );
	
	for ( ax = 0; ; ){

		locate ( ax , ay );
		printf ( "*" );
		_sleep ( 50 );
		locate ( ax , ay );
		printf ( " " );
		locate ( 40 , 21 );
		printf ( "▲" );

		///////////////////////////////元  縦
        
		if ( ay >= 20 ){
			amy = 0;   //上
		}
		if ( ay <= 0 ){
			amy = 1;
		}
		if ( amy == 1 ){
			ay++;
		}else{
			ay--;
		}

		//////////////////////////////横

		if ( ax >= 79 ){
			amx = 0;
		}
		if ( ax <= 0 ){
			amx = 1;
		}
		if ( amx == 1 ){
			ax++;
		}else{
			ax--;

			}

		}

	setCursor ( 1 );
	getch ( );
	color ( FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE );
}

このプログラムですと、今しがた回答をいただいたプログラムを入れればいいのでしょうか?
ご回答お待ちしていますm(_)m

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

Re: 左右に移動させるプログラムを組みたいのですが・・・

#5

投稿記事 by beatle » 13年前

うさこ さんが書きました: このプログラムですと、今しがた回答をいただいたプログラムを入れればいいのでしょうか?
取り敢えず入れてみて、ダメだったら質問するようにしませんか。
それとも、回答者側が実際に実験してみて「ああ、提案したプログラムじゃ動かないや」ってのを確認しないとダメですか?
その動作確認などは質問者さんの役目だと思うのですが。

というより、そういう試行錯誤しないとプログラミング力は伸びません。
「これを挿入してみて下さい」って言われて挿入するのはコピペと変わりません。

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

Re: 左右に移動させるプログラムを組みたいのですが・・・

#6

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

このヘッダ内容からするとkbhit()とgetch()を組み合わせて使ったほうが良いでしょうね。
http://www.geocities.co.jp/SiliconValle ... 7/c/c7.htm

int key;
if (kbhit()) key = getch();

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

うさこ

Re: 左右に移動させるプログラムを組みたいのですが・・・

#7

投稿記事 by うさこ » 13年前

・取り敢えず入れてみて、ダメだったら質問するようにしませんか。
 それとも、回答者側が実際に実験してみて「ああ、提案したプログラムじゃ動かないや」ってのを確認しないとダメですか?
 その動作確認などは質問者さんの役目だと思うのですが。



回答、ありがとうございますm(_)m
まさにその通りですね。説明も、やり方も、不十分だったようです。
これからも、肝に銘じていきますので、機会があれば回答よろしくお願いしますm(_)m

うさこ

Re: 左右に移動させるプログラムを組みたいのですが・・・

#8

投稿記事 by うさこ » 13年前

softya(ソフト屋) さんが書きました:このヘッダ内容からするとkbhit()とgetch()を組み合わせて使ったほうが良いでしょうね。
http://www.geocities.co.jp/SiliconValle ... 7/c/c7.htm

int key;
if (kbhit()) key = getch();

これでkeyにキーボードの入力文字が入ります。
ご回答ありがとうございますm(_)m
これで、またプログラムを組んでみたいと思います。

うさこ

Re: 左右に移動させるプログラムを組みたいのですが・・・

#9

投稿記事 by うさこ » 13年前

何度もすみませんm(_)m
とりあえず、回答をいただいたプログラムを打ってみました。
しかし、キーの入力を受け付けるプログラムからの発展がイマイチよくわかりません・・・。
書いたプログラムは下記の通りです。

コード:

#include <stdio.h>
#include <conio.h>
#include <windows.h>

void    locate    ( int, int );
void    color     ( WORD );
void    clear     ( void );
void    setCursor ( int );
void    clear     ( void );

void main ( )
{	
	int ax;  // x
	int ay = 0; 
	int amx; 
	int amy = 1; // y方向
	int key; 
	int x; //自機用

	amx = 0;

	
	clear ( );
	setCursor ( 0 );
	
	for ( ax = 0; ; ){

		locate ( ax , ay );
		printf ( "*" );
		_sleep ( 50 );
		locate ( ax , ay );
		printf ( " " );
		locate ( 40 , 21 );
		printf ( "▲" );

		///////////////////////////////元  縦
        
		if ( ay >= 20 ){
			amy = 0;   //上
		}
		if ( ay <= 0 ){
			amy = 1;
		}
		if ( amy == 1 ){
			ay++;
		}else{
			ay--;
		}

		//////////////////////////////横

		if ( ax >= 79 ){
			amx = 0;
		}
		if ( ax <= 0 ){
			amx = 1;
		}
		if ( amx == 1 ){
			ax++;
		}else{
			ax--;
		}

		if ( _kbhit ( ) ) key = getch ( );     //書いたのは、ここから↓です
			if ( key == '1' ){
				if ( key && ax > 0 ){
					x--;
				}
			}
			if ( key == '3' ){
				if ( key && ax < 79 ){
					x++;
				}
			}
	}
1が押されたとき、自機を左に動かしたいのでxを減らす。
3が押されたとき、自機を右に動かしたいのでxを増やす。
というはわかっているのですが、このような感じで、変な式になってしまいます。
最初に回答をいただいた下記のプログラム(↓)

コード:

if (1が押された && x座標 > 0)
{
    /* x座標を1減らす */
}
if (3が押された && x座標 < 79)
{
    /* x座標を1増やす */
}
ですと、キー受付の式から考えて私的には下記のようになってしまいます。

コード:

		if ( _kbhit ( ) ) key = getch ( );
			if ( key == '1' ){
				if ( key && ax > 0 ){
					x--;
				}
			}
			if ( key == '3' ){
				if ( key && ax < 79 ){
					x++;
				}
			}
	}
となってしまいます。しかし、これではビルドは通りますがデバッグエラーになります。(そもそも、キー受付の所から間違っているので・・・)
さっきよりもわかりにくくなってしまっているかもしれませんが、
まず、自機を左にだけでも動くようにしたいです。
よろしくお願いしますm(_)m

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

Re: 左右に移動させるプログラムを組みたいのですが・・・

#10

投稿記事 by beatle » 13年前

デバッグエラーということですが、どんなエラーメッセージか記載してください。
axとxの関係が分かりません。ax > 0を調べているのにx--;して大丈夫なのでしょうか。
「そもそも、キー受付の所から間違っているので・・・」というのは、どこが間違いだとお考えでしょうか。ぱっと見、キー入力は合っているように見えるのですが。

それから、65行目から74行目にかけて、インデントをちゃんとしましょう。1段深くなっているのは実際の動作と食い違っておりミスの元です。

変数名を分かりやすくした方がいいようです。axやamxなど、プログラムを初めて見る人には何の意味か分かりません。

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: 左右に移動させるプログラムを組みたいのですが・・・

#11

投稿記事 by みけCAT » 13年前

キーを押さないとkey変数が更新されないので、
例えば1を押すと、次に何かキーが押されるまで

コード:

                if ( key && ax > 0 ){
                    x--;
                }
が実行されると思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

Re: 左右に移動させるプログラムを組みたいのですが・・・

#12

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

ax,amxを提案したの私なので反省。axはasterX、amxはasterMoveXとさせて頂きます。
なので、axとxですがasterXとplayerX(自機x)なので無関係きわまりないです。

あとキーを検知しつづける問題で、
if (kbhit()) key = getch();
else key='';
とすればOKです。ごめんなさい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

うさこ

Re: 左右に移動させるプログラムを組みたいのですが・・・

#13

投稿記事 by うさこ » 13年前

beatle さんが書きました:デバッグエラーということですが、どんなエラーメッセージか記載してください。
axとxの関係が分かりません。ax > 0を調べているのにx--;して大丈夫なのでしょうか。
「そもそも、キー受付の所から間違っているので・・・」というのは、どこが間違いだとお考えでしょうか。ぱっと見、キー入力は合っているように見えるのですが。

それから、65行目から74行目にかけて、インデントをちゃんとしましょう。1段深くなっているのは実際の動作と食い違っておりミスの元です。

変数名を分かりやすくした方がいいようです。axやamxなど、プログラムを初めて見る人には何の意味か分かりません。

ご回答ありがとうございますm(_)m
変数をわかりやすく・デバッグエラーの記入・インデントなど、
指摘を受けましたところは、逐次直しますm(_)m
ありがとうございました!

うさこ

Re: 左右に移動させるプログラムを組みたいのですが・・・

#14

投稿記事 by うさこ » 13年前

みけCAT さんが書きました:キーを押さないとkey変数が更新されないので、
例えば1を押すと、次に何かキーが押されるまで

コード:

                if ( key && ax > 0 ){
                    x--;
                }
が実行されると思います。

ご回答ありがとうございますm(_)m
わかりました。それを考えてもう一回やります!

うさこ

Re: 左右に移動させるプログラムを組みたいのですが・・・

#15

投稿記事 by うさこ » 13年前

softya(ソフト屋) さんが書きました:ax,amxを提案したの私なので反省。axはasterX、amxはasterMoveXとさせて頂きます。
なので、axとxですがasterXとplayerX(自機x)なので無関係きわまりないです。

あとキーを検知しつづける問題で、
if (kbhit()) key = getch();
else key='';
とすればOKです。ごめんなさい。

ご回答ありがとうございますm(_)m
変数名に関しましては、大丈夫です!ありがとうございます!
キー検知に関しましても了解しました。それでもう一回やってみます!

うさこ

Re: 左右に移動させるプログラムを組みたいのですが・・・

#16

投稿記事 by うさこ » 13年前

2日ほどプログラムを考えてみました。
やっとのことで、左にはなんとか行くようにはなりましたが、
端まで行くと、*に干渉して*と一緒に動き出します。
右にはいかず、’3’を押しても頑として動きません(入力の受け付けはされているようです。)
今まで書いたプログラムは、下記のようになります

コード:

#include <stdio.h>
#include <conio.h>
#include <windows.h>

void    locate    ( int, int );
void    color     ( WORD );
void    clear     ( void );
void    setCursor ( int );
void    clear     ( void );

void main ( )
{	
	int ax;        //*x
	int ay = 0;   //*y
	int amx;      //x軸
	int amy = 1; // y軸
	int key;   //キー検知用
	int x;    //自機のx

	x = 40;
	amx = 0;

	
	clear ( );
	setCursor ( 0 );
	
	for ( ax = 0; ; ){
		
		locate ( ax , ay );
		printf ( "*" );
		_sleep ( 50 );
		locate ( ax , ay );
		printf ( " " );
		locate ( x , 21 );
		printf ( "▲" );
		printf ( " " );

		///////////////////////////////元  縦
        
		if ( ay >= 20 ){
			amy = 0;   //上
		}
		if ( ay <= 0 ){
			amy = 1;
		}
		if ( amy == 1 ){
			ay++;
		}else{
			ay--;
		}

		//////////////////////////////横

		if ( ax >= 79 ){
			amx = 0;
		}
		if ( ax <= 0 ){
			amx = 1;
		}
		if ( amx == 1 ){
			ax++;
		}else{
			ax--;
		}
                           
      //ここから↓を新たに加えました。

		if ( _kbhit ( ) ){
			key = ( getch ( ) );

			locate ( x , 21 );
			printf ( "▲" );
			locate ( x , 21 );
			printf ( "" );

			if ( key == '1' ){
				
				if ( key && ax >= 0 ){
					x--;
				}
				if ( key == '3' ){
				if ( key && ax <= 79 ){
					x++;
				}
				
				if ( ax >= 0 ){
					x = 0;
				}

				if ( ax <= 79 ){
					x  = 0;
				}
				}
			}
		}
	}
変数名はまだ変えていません;すみませんm(_)m
(この問題が終わったら変えようと思いますm(_)m)
現在困っているのは、
1→どうしたら端まで行ったら止まるか。
2→右にはどうしたら動くか。
上記の2点です。
左には行ったので、右も同じようにやればいいのでは・・・?と思われると思いますが、
その同じが上手くいかず、困っていますm(_)m
ご回答よろしくお願いしますm(_)m

うさこ

Re: 左右に移動させるプログラムを組みたいのですが・・・

#17

投稿記事 by うさこ » 13年前

すみません、
座標はxが0まで(左)。yが(79)までとなっています。

うさこ

Re: 左右に移動させるプログラムを組みたいのですが・・・

#18

投稿記事 by うさこ » 13年前

すみません、もう一つ付け足しますm(_)m

入力キーを受け付けて、1を押せば左に、3を押せば右に行くように書くプログラム↓

コード:

if ( _kbhit ( ) ){
			key = ( getch ( ) );

			locate ( x , 21 );
			printf ( "" );

			if ( key == 'x' ){
				break;
			}

			if ( key == '1' ){
				
				if ( key && ax >= 0 ){
					x--;
				}
			if ( key == '3' ){
				if ( key && ax <= 79 ){
					x++;
				}
なんですが、本日初めに質問した内容には、
「左には行くが右にはいかない」と書いたのですが、

コード:

if ( _kbhit ( ) ){
			key = ( getch ( ) );

			locate ( x , 21 );
			printf ( "" );

			if ( key == 'x' ){
				break;
			}

			/*if ( key == '1' ){
				
				if ( key && ax >= 0 ){
					x--;
				}*/
			if ( key == '3' ){
				if ( key && ax <= 79 ){
					x++;
				}
1の入力受付の箇所を丸々コメントで囲むと、右にも一応行くようです;
しかし、左同様端まで来ると、端で止まらずそのまま*と動き続けます。
(なお、上記に貼ったプログラムには、 if ( ax >= 79 ){ ~   というのを省いています。)
これもあるとお考えの上で、どうぞよろしくおねがいしますm(_)m

うさこ

Re: 左右に移動させるプログラムを組みたいのですが・・・

#19

投稿記事 by うさこ » 13年前

さっきから連投してすみません;

皆様の回答のおかげで、無事左右共に動くようになりました!
最後の方はグダグダとなってしまいましたが;
本当にありがとうございましたm(_)m
またこの掲示板にお世話になるかもしれませんが、
その時はどうぞよろしくお願いしますm(_)m
ありがとうございました。

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

Re: 左右に移動させるプログラムを組みたいのですが・・・

#20

投稿記事 by beatle » 13年前

フォーラムルールに書いてありますが、解決したら解決した方法やソースコードを貼り付けてください。
後で読む人の参考にするためですのでよろしくお願いします。

うさこ

Re: 左右に移動させるプログラムを組みたいのですが・・・

#21

投稿記事 by うさこ » 13年前

beatle さんが書きました:フォーラムルールに書いてありますが、解決したら解決した方法やソースコードを貼り付けてください。
後で読む人の参考にするためですのでよろしくお願いします。

すみません;
解いた物を下記に張り付けます。

コード:

#include <stdio.h>
#include <conio.h>
#include <windows.h>

void    locate    ( int, int );
void    color     ( WORD );
void    clear     ( void );
void    setCursor ( int );
void    clear     ( void );

void main ( )
{	
	int ax;       //x軸
	int ay = 0;   //y軸
	int amx;      //*x
	int amy = 1;  // *y
	int key;      //キー入力用
	int x;        //自機用
	int y;        //玉用

	y = 20;
	x = 40;
	amx = 0;

	
	clear ( );
	setCursor ( 0 );
	
	for ( ax = 0; ; ){
		
		locate ( ax , ay );
		printf ( "*" );
		_sleep ( 50 );
		locate ( ax , ay );
		printf ( " " );
		locate ( x , 21 );
		printf ( "▲" );
		printf ( " " );

		///////////////////////////////縦P
        
		if ( ay >= 20 ){
			amy = 0;   //上
		}
		if ( ay <= 0 ){
			amy = 1;
		}
		if ( amy == 1 ){
			ay++;
		}else{
			ay--;
		}

		//////////////////////////////横P

		if ( ax >= 79 ){
			amx = 0;
		}
		if ( ax <= 0 ){
			amx = 1;
		}
		if ( amx == 1 ){
			ax++;
		}else{
			ax--;
		}

		//////////////////////////////キー入力受付P(自機移動))

		if ( _kbhit ( ) ){
			key = ( getch ( ) );

			locate ( x , 21 );
			printf ( "" );

			if ( key == 'x' ){
				break;
			}
				
			if ( key == '1' ){
			     if ( key && ax >= 0 ){
					x--;
					if ( x == 0 ){
						x = 1;
					}
					}
			}

			if ( key == '3' ){
				if ( key && ax <= 79 ){
					x++;
					if ( x == 79 ){
						x = 78;
					}
				}
			}
		}
	}

「キー入力受付」と書いてある所から下を加えたところ、
自機が左右に動き、端まで行ったら止まるプログラムが完成いたしました
(xを押すと終了するというのも付け足してあります。)
変数名は、なにがどのような役割のものなのか、コメントととして残しました。
(わかりづらさは変わらないと思いますが・・・・)

とりあえず、このように書いたらうまくいきました^^
ありがとうございましたm(_)m

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

Re: 左右に移動させるプログラムを組みたいのですが・・・

#22

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

怪しい所があります。一度指摘してますが、

コード:

                 if ( key && ax >= 0 ){
                    x--;
                    if ( x == 0 ){
                        x = 1;
                    }
アスタリスクXと自機の座標に何の関連があるのでしょう?
あとif文にkeyのある意味は何でしょう?

コメントについても的確ではありません。
int ax; //x軸
int ay = 0; //y軸
int amx; //*x
int amy = 1; // *y
int key; //キー入力用
int x; //自機用
int y; //玉用
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

うさこ

Re: 左右に移動させるプログラムを組みたいのですが・・・

#23

投稿記事 by うさこ » 13年前

softya(ソフト屋) さんが書きました:怪しい所があります。一度指摘してますが、

コード:

                 if ( key && ax >= 0 ){
                    x--;
                    if ( x == 0 ){
                        x = 1;
                    }
アスタリスクXと自機の座標に何の関連があるのでしょう?
あとif文にkeyのある意味は何でしょう?

コメントについても的確ではありません。
int ax; //x軸
int ay = 0; //y軸
int amx; //*x
int amy = 1; // *y
int key; //キー入力用
int x; //自機用
int y; //玉用

ご指摘ありがとうございますm(_)m
私なりに下記のプログラム

コード:

if (1が押された && x座標 > 0)
{
    /* x座標を1減らす */
}
if (3が押された && x座標 < 79)
{
    /* x座標を1増やす */
}
を参考に作らせていただきました。
その為、専門的なことは声を大にしては言えません;
すみませんm(_)m
コメントについては、自分の解釈上このようになっているのですが・・・
すみません;

ご指摘ありがとうございましたm(_)m
気付いた点がありましたら、またコメントお願いしますm(_)m

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

Re: 左右に移動させるプログラムを組みたいのですが・・・

#24

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

うさこ さんが書きました:
softya(ソフト屋) さんが書きました:怪しい所があります。一度指摘してますが、

コード:

                 if ( key && ax >= 0 ){
                    x--;
                    if ( x == 0 ){
                        x = 1;
                    }
アスタリスクXと自機の座標に何の関連があるのでしょう?
あとif文にkeyのある意味は何でしょう?

コメントについても的確ではありません。
int ax; //x軸
int ay = 0; //y軸
int amx; //*x
int amy = 1; // *y
int key; //キー入力用
int x; //自機用
int y; //玉用

ご指摘ありがとうございますm(_)m
私なりに下記のプログラム

コード:

if (1が押された && x座標 > 0)
{
    /* x座標を1減らす */
}
if (3が押された && x座標 < 79)
{
    /* x座標を1増やす */
}
を参考に作らせていただきました。
その為、専門的なことは声を大にしては言えません;
すみませんm(_)m
コメントについては、自分の解釈上このようになっているのですが・・・
すみません;
たぶん何となく動いただけってのは解決ではありません。
プログラムは言葉にして説明できるので、出来ないようなら理解できてないと言うことなんです。
if (1が押された && x座標 > 0)
(1)1が押されたって言うのはプログラムでどうやるべきでしょうか?
(2)x座標 > 0は何をしたいのでしょうか?
(3)そして2つを&&する意味は?
以上を考えて回答してみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

うさこ

Re: 左右に移動させるプログラムを組みたいのですが・・・

#25

投稿記事 by うさこ » 13年前

softya(ソフト屋) さんが書きました:
うさこ さんが書きました:
softya(ソフト屋) さんが書きました:怪しい所があります。一度指摘してますが、

コード:

                 if ( key && ax >= 0 ){
                    x--;
                    if ( x == 0 ){
                        x = 1;
                    }
アスタリスクXと自機の座標に何の関連があるのでしょう?
あとif文にkeyのある意味は何でしょう?

コメントについても的確ではありません。
int ax; //x軸
int ay = 0; //y軸
int amx; //*x
int amy = 1; // *y
int key; //キー入力用
int x; //自機用
int y; //玉用

ご指摘ありがとうございますm(_)m
私なりに下記のプログラム

コード:

if (1が押された && x座標 > 0)
{
    /* x座標を1減らす */
}
if (3が押された && x座標 < 79)
{
    /* x座標を1増やす */
}
を参考に作らせていただきました。
その為、専門的なことは声を大にしては言えません;
すみませんm(_)m
コメントについては、自分の解釈上このようになっているのですが・・・
すみません;
たぶん何となく動いただけってのは解決ではありません。
プログラムは言葉にして説明できるので、出来ないようなら理解できてないと言うことなんです。
if (1が押された && x座標 > 0)
(1)1が押されたって言うのはプログラムでどうやるべきでしょうか?
(2)x座標 > 0は何をしたいのでしょうか?
(3)そして2つを&&する意味は?
以上を考えて回答してみてください。

うさこ

Re: 左右に移動させるプログラムを組みたいのですが・・・

#26

投稿記事 by うさこ » 13年前

softya(ソフト屋) さんが書きました:
うさこ さんが書きました:
softya(ソフト屋) さんが書きました:怪しい所があります。一度指摘してますが、

コード:

                 if ( key && ax >= 0 ){
                    x--;
                    if ( x == 0 ){
                        x = 1;
                    }
アスタリスクXと自機の座標に何の関連があるのでしょう?
あとif文にkeyのある意味は何でしょう?

コメントについても的確ではありません。
int ax; //x軸
int ay = 0; //y軸
int amx; //*x
int amy = 1; // *y
int key; //キー入力用
int x; //自機用
int y; //玉用

ご指摘ありがとうございますm(_)m
私なりに下記のプログラム

コード:

if (1が押された && x座標 > 0)
{
    /* x座標を1減らす */
}
if (3が押された && x座標 < 79)
{
    /* x座標を1増やす */
}
を参考に作らせていただきました。
その為、専門的なことは声を大にしては言えません;
すみませんm(_)m
コメントについては、自分の解釈上このようになっているのですが・・・
すみません;
たぶん何となく動いただけってのは解決ではありません。
プログラムは言葉にして説明できるので、出来ないようなら理解できてないと言うことなんです。
if (1が押された && x座標 > 0)
(1)1が押されたって言うのはプログラムでどうやるべきでしょうか?
(2)x座標 > 0は何をしたいのでしょうか?
(3)そして2つを&&する意味は?
以上を考えて回答してみてください。

うさこ

Re: 左右に移動させるプログラムを組みたいのですが・・・

#27

投稿記事 by うさこ » 13年前

softya(ソフト屋) さんが書きました:
うさこ さんが書きました:
softya(ソフト屋) さんが書きました:怪しい所があります。一度指摘してますが、

コード:

                 if ( key && ax >= 0 ){
                    x--;
                    if ( x == 0 ){
                        x = 1;
                    }
アスタリスクXと自機の座標に何の関連があるのでしょう?
あとif文にkeyのある意味は何でしょう?

コメントについても的確ではありません。
int ax; //x軸
int ay = 0; //y軸
int amx; //*x
int amy = 1; // *y
int key; //キー入力用
int x; //自機用
int y; //玉用

ご指摘ありがとうございますm(_)m
私なりに下記のプログラム

コード:

if (1が押された && x座標 > 0)
{
    /* x座標を1減らす */
}
if (3が押された && x座標 < 79)
{
    /* x座標を1増やす */
}
を参考に作らせていただきました。
その為、専門的なことは声を大にしては言えません;
すみませんm(_)m
コメントについては、自分の解釈上このようになっているのですが・・・
すみません;
たぶん何となく動いただけってのは解決ではありません。
プログラムは言葉にして説明できるので、出来ないようなら理解できてないと言うことなんです。
if (1が押された && x座標 > 0)
(1)1が押されたって言うのはプログラムでどうやるべきでしょうか?
(2)x座標 > 0は何をしたいのでしょうか?
(3)そして2つを&&する意味は?
以上を考えて回答してみてください。
回答ありがとうございますm(_)m
間違えて、引用した文章をそのまま2つも置いてしまいました;すみません;

if ( 1が押された && x座標 > 0 )
というのにつきまして、意味を回答せよとのことなので回答します。

(1)"1が押された”といのは、プログラム的に、if ( key == '1' ) だと思います。
   しかし、私の書いたプログラムでは、if ( key && ax > 0 ){
   の上に、if ( key == '1' ){ を書いてしまっているので、そこで宣言された"key"を
   "1が押された"というのに見立て、keyと書きました。
(2)、(3)はまとめて
   if ( 1が押されたら && x座標 > 0 )
   というのを日本語にすると、
「もし(if)、( 1が押されて(key) かつ(&&) x座標(ax) が 0より大きかったら(>) ) 」
  となると思うのですが、それを考えて今回は

コード:


 if ( key == '1' ){
                if ( key && ax > 0 ){
                    x--;
という結果に落ち着きました。
まだまだ説明不足かもしれません;
最初の質問にも書いた通り、理解度は人並み以下だと思います。
ですが、人並み以下なりに回答しますので、
気付いた点があればまたコメントよろしくお願いしますm(_)m

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

Re: 左右に移動させるプログラムを組みたいのですが・・・

#28

投稿記事 by beatle » 13年前

うさこ さんが書きました: if ( 1が押された && x座標 > 0 )
というのにつきまして、意味を回答せよとのことなので回答します。

(1)"1が押された”といのは、プログラム的に、if ( key == '1' ) だと思います。
   しかし、私の書いたプログラムでは、if ( key && ax > 0 ){
   の上に、if ( key == '1' ){ を書いてしまっているので、そこで宣言された"key"を
   "1が押された"というのに見立て、keyと書きました。
「"1が押された”といのは、プログラム的に、if ( key == '1' ) だと思います。」
これについては良さそうです。

「"key"を"1が押された"というのに見立て」
今作っているのはコンピュータプログラムです。いくら人間が勝手に「見立て」ても、コンピュータが見立ててくれるわけありません。
C言語ですと、0以外の数値は全て「真」ですから、'1'という数値も真です。(1という文字のASCIIコード '1' は49です)

keyが'1'のとき key == '1' という式は真です。同様に key という式も真です。
keyが'3'のとき key == '1' という式は偽です。しかし key という式は真です。

結局何を言いたいかというと、if ( key && ax > 0 )の中で key は常に真なので書く必要はありません。
書いても混乱させるだけです。

# 返信するのに必要のない箇所まで引用する必要はありません。ちょっと上にスクロールさせれば引用元の本文がちゃんと載っているわけですから。

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

Re: 左右に移動させるプログラムを組みたいのですが・・・

#29

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

keyに関してはbeatleさんが説明してくれていますので、もうひとつの話を
x座標(ax) が 0より大きかったら(>) 
とありますが、axが0より大きかったらと言う条件は何のためにあるのでしょう?
うさこさんが考えるaxが0より小さければx++をしてはいけない理由は何でしょうか?
そこがスッポ入り抜けてしまっているんです。

プログラムは1命令・1つの式に意味があります。
そこを無視してしまっては思った動作をしないプログラムしか生まれて来ません。
プログラムをするということは、すべて理解すると言うことです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

うさこ

Re: 左右に移動させるプログラムを組みたいのですが・・・

#30

投稿記事 by うさこ » 13年前

beatle さんが書きました:
うさこ さんが書きました: if ( 1が押された && x座標 > 0 )
というのにつきまして、意味を回答せよとのことなので回答します。

(1)"1が押された”といのは、プログラム的に、if ( key == '1' ) だと思います。
   しかし、私の書いたプログラムでは、if ( key && ax > 0 ){
   の上に、if ( key == '1' ){ を書いてしまっているので、そこで宣言された"key"を
   "1が押された"というのに見立て、keyと書きました。
「"1が押された”といのは、プログラム的に、if ( key == '1' ) だと思います。」
これについては良さそうです。

「"key"を"1が押された"というのに見立て」
今作っているのはコンピュータプログラムです。いくら人間が勝手に「見立て」ても、コンピュータが見立ててくれるわけありません。
C言語ですと、0以外の数値は全て「真」ですから、'1'という数値も真です。(1という文字のASCIIコード '1' は49です)

keyが'1'のとき key == '1' という式は真です。同様に key という式も真です。
keyが'3'のとき key == '1' という式は偽です。しかし key という式は真です。

結局何を言いたいかというと、if ( key && ax > 0 )の中で key は常に真なので書く必要はありません。
書いても混乱させるだけです。

# 返信するのに必要のない箇所まで引用する必要はありません。ちょっと上にスクロールさせれば引用元の本文がちゃんと載っているわけですから。
ご回答ありがとうございましたm(_)m

うさこ

Re: 左右に移動させるプログラムを組みたいのですが・・・

#31

投稿記事 by うさこ » 13年前

softya(ソフト屋) さんが書きました:keyに関してはbeatleさんが説明してくれていますので、もうひとつの話を
x座標(ax) が 0より大きかったら(>) 
とありますが、axが0より大きかったらと言う条件は何のためにあるのでしょう?
うさこさんが考えるaxが0より小さければx++をしてはいけない理由は何でしょうか?
そこがスッポ入り抜けてしまっているんです。

プログラムは1命令・1つの式に意味があります。
そこを無視してしまっては思った動作をしないプログラムしか生まれて来ません。
プログラムをするということは、すべて理解すると言うことです。
ご回答ありがとうございますm(_)m
「axが0より大きかったら」という条件の意味ですが、
端( 0 , 21 )までいったら増やすのを止めるためにあるんだと今まで思っていました・・・。
(逆もまた然り)

「プログラムは1命令・1つの式に意味があります。
そこを無視してしまっては思った動作をしないプログラムしか生まれて来ません。
プログラムをするということは、すべて理解すると言うことです」
たしかに、ごもっともな意見です。もっとしっかり勉強しなければなと思うばかりです。
(思うだけならダメだろといわれそうですが、そこはただ今復習中の身です;)

また説明が不十分化もしれませんが、今はここまでが自分のわかる範囲なのかもしれません。すみません。
ですが、質問されたことには答えようと思います。

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

Re: 左右に移動させるプログラムを組みたいのですが・・・

#32

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

そうですね。
自分でテストしてみてください。
keyとaxとxの関係をデバッガで値を見ながら動作を理解するのです。
デバッガではブレークポイントで任意の場所に止める事ができます。
その止まった時点で、変数をマウスでクリックすれば値を見ることができます。
「プログラムのデバッグ実行」
http://cvwww.ee.ous.ac.jp/vc10prog.html#7
うさこ さんが書きました: 「axが0より大きかったら」という条件の意味ですが、
端( 0 , 21 )までいったら増やすのを止めるためにあるんだと今まで思っていました・・・。
(逆もまた然り)
この動作は予定や想像通り行われていますか?
ax,x,keyの値を書きだしてみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

うさこ

Re: 左右に移動させるプログラムを組みたいのですが・・・

#33

投稿記事 by うさこ » 13年前

softya(ソフト屋) さんが書きました:そうですね。
自分でテストしてみてください。
keyとaxとxの関係をデバッガで値を見ながら動作を理解するのです。
デバッガではブレークポイントで任意の場所に止める事ができます。
その止まった時点で、変数をマウスでクリックすれば値を見ることができます。
「プログラムのデバッグ実行」
http://cvwww.ee.ous.ac.jp/vc10prog.html#7
うさこ さんが書きました: 「axが0より大きかったら」という条件の意味ですが、
端( 0 , 21 )までいったら増やすのを止めるためにあるんだと今まで思っていました・・・。
(逆もまた然り)
この動作は予定や想像通り行われていますか?
ax,x,keyの値を書きだしてみてください。

ご回答ありがとうございますm(_)m
ブレークポイントという単語自体は知っていましたが
そういう使い方もあるのですね。勉強になりました!

「この動作は予定や想像通り行われていますか?
ax,x,keyの値を書きだしてみてください」
値を書き出してみてくださいというのがあの、どういった意味でしょうか?
中に入っている数字を書けということでしょうか?

また、「この動作は予定や想像通り行われていますか?」についてですが
予定道りに動いていますが、想像通りではないというところが現状です・・・。

プログラムは本当に苦手で、しかしこのままではいけないなと思い、
買った本と毎日にらめっこにている状態です。
至らない点ばかりですが、回答よろしくお願いしますm(_)m

うさこ

Re: 左右に移動させるプログラムを組みたいのですが・・・

#34

投稿記事 by うさこ » 13年前

すみません、意味がわかりました;

値というのは、デバッガをやった時の値ということだったのですね;
すみません理解力が低くて;

key,x.axの値は、以下のようになっていました。
key = 49
x = 40
ax = 0
でした。
xとaxは予定していたものと同じでしたが、
keyはなぜ49・・・・?と疑問です。
key といういらない値を入れたので、こうなっているのでしょうか・・・。

連投ですみませんが、回答よろしくお願いしますm(__)m

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

Re: 左右に移動させるプログラムを組みたいのですが・・・

#35

投稿記事 by beatle » 13年前

うさこ さんが書きました: keyはなぜ49・・・・?と疑問です。
こちらをどうぞ御覧ください ASCII文字コード
文字としての'1'は数値としての49と等しいですから、keyに49が入っているのでしょうね。

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

Re: 左右に移動させるプログラムを組みたいのですが・・・

#36

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

うさこ さんが書きました:key = 49
x = 40
ax = 0
でした。
xとaxは予定していたものと同じでしたが、
keyはbeatleさんが解説されているとおりです。
axが0でxが40なのですが本当に予定通りですか?
このままxを減らしていってaxとxがどうなるか確認してみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

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