【C++】ボールの跳ね返りについての質問

このQ&Aのポイント
  • C++を初めて1週間の者が、ボールの跳ね返りについて学んでいます。コード内で跳ね返りの計算を行っていますが、bxの値がなぜプラスの符号に変わるのか疑問です。
  • コード内でbxに推移量を代入しているため、跳ね返りがうまく動作しています。ただし、処理が2度目の跳ね返りになると、bxがなぜプラスの符号に変わるのか不明です。
  • bxには最初に正の値を代入しているため、初回の跳ね返りは問題ありません。しかし、2度目の跳ね返りではbxにマイナスの符号を代入していますが、それによりbxがなぜプラスの符号に変わるのか理解できません。
回答を見る
  • ベストアンサー

【C++】低レベルな質問ですいません

C++を初めて1週間の者です // ボールの移動量 static int bx=6; // 設定した移動量分、xに加算し、動かす x += bx; // 跳ね返り計算部分 if ( x < 0 ){ x = 0; bx = -bx; // 値を反転 }else if ( x > WIDTH ){ x = WIDTH; bx = -bx; } ○弾の跳ね返りを学んでいます 上記コードはうまいこと跳ね返りは成功しています 跳ね返り部分のbx = -bxですが これはbxをマイナスの符号にしてつっこんでいると理解しています それでは2度目の跳ね返りのさい、 bxは-6を持っていて、さらにマイナスのbxをつっこむと bxはなぜプラスの符号に変わるのですか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

> 跳ね返り部分のbx = -bxですが > これはbxをマイナスの符号にしてつっこんでいると理解しています いいえ、(コメントにもあるとおり)「符号を反転して代入」しているのです。

その他の回答 (3)

  • koi1234
  • ベストアンサー率53% (1866/3459)
回答No.4

-(-6)になるから+6になる 別の書き方すれば  bx *= -1; と同じ

回答No.2

>跳ね返り部分のbx = -bxですが >これはbxをマイナスの符号にしてつっこんでいると理解しています 正確には、-1を掛けているので、「符号の反転」だと思いますよ。

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.1

数学の問題のような気もしますが……。 >bx = -bx; は bx = 0 - bx; と同義な扱いなんではないですかね? # bx = bx * -1; とか bx *= -1; とかの書き方もありますかねぇ。 んで……bxが正数の場合は bx = 0 - (6); って事で負数に、負数だった場合は bx = 0 - (-6); で正数になる。ということかと。

関連するQ&A

  • C言語 ゲーム

    このプログラムに関数を一つ増やしたいのですが、うまくできません。どこを、どうすればいいでしょう? 迷路の内容は未完成です。 #include <stdio.h> #include <conio.h> #include <stdlib.h> #include <string.h> int KEY(int *Kn,int *Y,int *X); int main(void) { //数値格納 int kn; //入力キー int sty,stx; //座標 int fy,fx; //マップ範囲 int jm[25][40]; //移動可不判定 char mapc[3]={0};//複写されたマップ構成情報 //カウント int y,x; //判定生成、座標生成・描写用 //マップチップ char mc[2][3]={ /*mc[0] 移動可能*/" ", /*mc[1] 移動不可*/"■"}; //マップ構成 (最大値 25行x40列) char map[][81]={ /*00*/"■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■", /*01*/"■ ■                                    ■", /*02*/"■ ■■■■ ■                               ■", /*03*/"■ ■■   ■                               ■", /*04*/"■  ■ ■■■                               ■", /*05*/"■■ ■ ■                                 ■", /*06*/"■  ■ ■                                 ■", /*07*/"■ ■■ ■                                 ■", /*08*/"■    ■ ■                               ■", /*09*/"■                                      ■", /*10*/"■                                      ■", /*11*/"■                                      ■", /*12*/"■                                      ■", /*13*/"■                                      ■", /*14*/"■                                      ■", /*15*/"■                                      ■", /*16*/"■                                      ■", /*17*/"■                                      ■", /*18*/"■                                      ■", /*19*/"■                                      ■", /*20*/"■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■"}; //マップ範囲算出 fy=sizeof(map)/81; //行 fx=strlen(map[0])/2; //列 //キャラクター初期座標指定 sty=8,stx=8; /* 判定生成 */ for(y=0;y<fy;y++){ for(x=0;x<fx;x++){ strncpy(mapc ,&map[y][(x)*2] ,2 ); if(strncmp(mc[1],mapc,2)==0){jm[y][x]=1;} //移動不可判定 else if(strncmp(mc[0],mapc,2)==0){jm[y][x]=0;} //移動可能判定 } } /* 画面出力 */ while(1){ system("cls"); //画面消去 /* 座標生成、描写 */ for(y=0;y<fy;y++){ for(x=0;x<fx;x++){ strncpy(mapc ,&map[y][(x)*2] ,2); if(jm[y][x]==0){ if(y==sty&&x==stx) {printf("%s","○");} //キャラ表示 else if(strncmp(mc[0],mapc,2)==0) {printf("%s",mapc );} //移動可能表示 } else if (strncmp(mc[1],mapc,2)==0) {printf("%s",mapc );} //移動不可表示 } if(fx<40){printf("\n");} //fxが40未満の場合、改行 } if(sty==1&&stx==1){ printf("ゴールしました\n"); } /* 入力キー、移動座標出力 */ KEY(&kn,&sty,&stx); /* 壁、マップ外への侵入防止 */ for(y=0;y<sty+1;y++){ for(x=0;x<fx;x++){ if((y==sty&&x==stx&&jm[y][x]==1)||(fy<=sty||fx<=stx)){ if(kn==0x4b){stx++;} else if(kn==0x4d){stx--;} else if(kn==0x48){sty++;} else if(kn==0x50){sty--;} break; } } } /* 終了操作 */ if(kn==0x1b){printf("▼終了します。\n") ;break;} } } /* 入力キー、移動座標出力 */ int KEY(int *Kn,int *Y,int *X){ while(1){ *Kn=getch( ); //1:通常キー if (*Kn==0){ *Kn=getch( ); //2:特殊キー if (*Kn==0x4b){(*X)--;}// ← else if (*Kn==0x4d){(*X)++;}// → else if (*Kn==0x48){(*Y)--;}// ↑ else if (*Kn==0x50){(*Y)++;}// ↓ else if (*Kn==0x80){ }//特殊キー追加場所 else {continue;} break; } else if (*Kn==0x1b){}// Esc //else if (*Kn== ){} 通常キー追加場所 else {continue;} break; } return 0; }

  • C言語 ゲーム

    今回が質問初めてです。見にくかったらすいません。下のプログラムですが、これに構造体を使わなくてはいけないのですが、まったくわかりません。みなさんはどう書き換えますか? #include <stdio.h> #include <conio.h> #include <stdlib.h> #include <string.h> int KEY(int *Kn,int *Y,int *X); int main(void) { //数値格納 int kn; //入力キー int sty,stx; //座標 int fy,fx; //マップ範囲 int jm[25][40]; //移動可不判定 char mapc[3]={0};//複写されたマップ構成情報 //カウント int y,x; //判定生成、座標生成・描写用 //マップチップ char mc[2][3]={ /*mc[0] 移動可能*/" ", /*mc[1] 移動不可*/"■"}; //マップ構成 (最大値 25行x40列) char map[][81]={ /*00*/"■■■■■■■■■■", /*01*/"■ ■      ■", /*02*/"■ ■■■■ ■ ■", /*03*/"■ ■■   ■ ■", /*04*/"■  ■ ■■■ ■", /*05*/"■■ ■ ■   ■", /*06*/"■  ■ ■ ■■■", /*07*/"■ ■■ ■   ■", /*08*/"■    ■ ■ ■", /*09*/"■■■■■■■■■■"}; //マップ範囲算出 fy=sizeof(map)/81; //行 fx=strlen(map[0])/2; //列 //キャラクター初期座標指定 sty=8,stx=8; /* 判定生成 */ for(y=0;y<fy;y++){ for(x=0;x<fx;x++){ strncpy(mapc ,&map[y][(x)*2] ,2 ); if(strncmp(mc[1],mapc,2)==0){jm[y][x]=1;} //移動不可判定 else if(strncmp(mc[0],mapc,2)==0){jm[y][x]=0;} //移動可能判定 } } /* 画面出力 */ while(1){ system("cls"); //画面消去 /* 座標生成、描写 */ for(y=0;y<fy;y++){ for(x=0;x<fx;x++){ strncpy(mapc ,&map[y][(x)*2] ,2); if(jm[y][x]==0){ if(y==sty&&x==stx) {printf("%s","○");} //キャラ表示 else if(strncmp(mc[0],mapc,2)==0) {printf("%s",mapc );} //移動可能表示 } else if (strncmp(mc[1],mapc,2)==0) {printf("%s",mapc );} //移動不可表示 } if(fx<40){printf("\n");} //fxが40未満の場合、改行 } if(sty==1&&stx==1){ printf("ゴールしました\n"); } /* 入力キー、移動座標出力 */ KEY(&kn,&sty,&stx); /* 壁、マップ外への侵入防止 */ for(y=0;y<sty+1;y++){ for(x=0;x<fx;x++){ if((y==sty&&x==stx&&jm[y][x]==1)||(fy<=sty||fx<=stx)){ if(kn==0x4b){stx++;} else if(kn==0x4d){stx--;} else if(kn==0x48){sty++;} else if(kn==0x50){sty--;} break; } } } /* 終了操作 */ if(kn==0x1b){printf("▼終了します。\n") ;break;} } } /* 入力キー、移動座標出力 */ int KEY(int *Kn,int *Y,int *X){ while(1){ *Kn=getch( ); //1:通常キー if (*Kn==0){ *Kn=getch( ); //2:特殊キー if (*Kn==0x4b){(*X)--;}// ← else if (*Kn==0x4d){(*X)++;}// → else if (*Kn==0x48){(*Y)--;}// ↑ else if (*Kn==0x50){(*Y)++;}// ↓ else if (*Kn==0x80){ }//特殊キー追加場所 else {continue;} break; } else if (*Kn==0x1b){}// Esc //else if (*Kn== ){} 通常キー追加場所 else {continue;} break; } return 0; }

  • C言語

    forの直後で1+2+3+4+5+・・・・・・・と加算し続ける式がわからないので教えてください。 #include<stdio.h> int main(void) { char moji; int i,sum; printf("正の整数を1から順に加算します。n\"); printf("加算を開始してよろしいですか。(Y=実行。N=終了)\n"); moji=getchar(); if(moji==y) { for(i=2;sum>=1001;i++) { この部分がわかりません; printf("加算値は%dです。¥n",sum); } }else if(moji=='n'){ printf("終了します。\n"); }else{ printf("YまたはNを入力してください。\n"); } return 0; }

  • C言語のプログラムについて質問

    明解C言語という書籍に 大きい方を表示するプログラム #include <stdio.h> int maxof(int x, int y) {  if (x > y)   return (x);  else   return (y); } int main(void) {  int na, nb;  puts("二つの整数を入力してください。");  printf("整数1:"); scanf("%d", &na);  printf("整数1:"); scanf("%d", &na);  printf("大きいほうの値は%dです。\n", maxof(na, nb));  return (0); } の関数maxofを利用し、 int max4(int w, int x, int y, int z) {  return (maxof(maxof(w, x), maxof(y, z))); } を挿入して変えれば四つの整数から最大値を求められるとのことですが、 コンパイルがうまくいきません。 関数maxofのwとx,yとzをそれぞれ比較し最大値を求めてさらにmaxof(w, x)とmaxof(y, z)を比較して最大値を求めるということですよね?ですので、 maxof(w, x) {  if (w > x)   return (w);  else   return (x); } maxof(y, z) {  if(y > z)   return (y);  else   return (z); を挿入しようとしたらmaxofはすでにありますというようなことが表示されてだめでした。 また、 int maxof(maxof(int w, int x), maxof(int y, int z)) { if (w > x)   return (w); if (w < x)   return (x); if (y > z)   return (y); if (y < z)   return (z); if (maxof(w, x) > maxof(y, z))   return (maxof(w, x)); if (maxof(w, x) < maxof(y, z))   return (maxof(y, z)); } としてみましたがやはりだめでした。 前のページの説明を読み返したりネットで調べてもわかりませんでした。 何がわからないのかがわからないのでもうお手上げです。 長くなってすいません プログラム例と説明をお願いします。

  • コードの最適化について質問です。以下の2つのコードにおいて、最適化が可能なポイントを教えていただけませんか?

    *gccコンパイラを通します。 ///code1/// void filter_optimized(int width, int height, int numcol, int rw, int gw, int bw) { int x, y, z; for (z=0; z<numcol; z++) for (x=0; x<height; x++) for (y=0; y<width; y++) if (z==0) c[x][y][z] = bw*((bw*a[x][y][0]+gw*a[x][y][1]+rw*a[x][y][2])/(rw+gw+bw)); else if(z==1) c[x][y][z] = gw*((bw*a[x][y][0]+gw*a[x][y][1]+rw*a[x][y][2])/(rw+gw+bw)); else c[x][y][z] = rw*((bw*a[x][y][0]+gw*a[x][y][1]+rw*a[x][y][2])/(rw+gw+bw)); return; } ///code2/// void edge_optimized(int width, int height, int numcol) { int x, y, z; int tmp; for (y = 0; y < width; y++) for (x = 0; x < height; x++) for (z = 0; z < numcol; z++) b[x][y][z] = (a[x][y][0]+a[x][y][1]+a[x][y][2])/3; for (y = 0; y < width; y++) for (x = 0; x < height; x++) for (z = 0; z < numcol; z++) { tmp = computeGx(width, height, x, y, z, b); if (tmp < 0) tmp = -tmp; if (tmp > 255) tmp = 255; c[x][y][z] = tmp; tmp = computeGy(width, height, x, y, z, b); if (tmp < 0) tmp = -tmp; if (tmp + c[x][y][z] > 255) c[x][y][z] = 255; else c[x][y][z] += tmp; c[x][y][z] = 255 - c[x][y][z]; if ((x==0)||(y==0)||(x==height-1)||(y==width-1)) c[x][y][z] = 255; } return; }

  • C#のメンバ変数について

    下記のコードで enterName の変数を static void Resurut() のメソッドへの受け渡しが上手くいかず、どなたか修正点を教えて頂けないでしょうか? 【ソースコード】 static class Program { static string enterName; static int cntWin = 0; //勝利回数 static int cntLose = 0; //敗北回数 static int cntDraw = 0; //引分回数 //ユーザー名の入力 static void Main(string[] args) { string enterName = Console.ReadLine(); Console.WriteLine("ユーザ名を入力してください: {0}", enterName); Start(); Resurut(); } *一部省略 static void Resurut() { if (cntWin > cntLose) { Console.WriteLine("{0}さんの総合勝利です", enterName); } else if (cntLose > cntWin) { Console.WriteLine("CPUの総合勝利です"); } else if (cntWin == cntLose) { Console.WriteLine("引き分けです"); } } }

  • boolean型

    class Bool {   static boolean b;   public static void main(String [] args) {     int x=0;     if (b ) {       x=1;     }     else if (b = false){       x=2;     }     else if (b){       x=3;     }     else {       x=4;     }     System.out.println("x = " + x);     System.out.println(b=false);   } } SUNのサイトにあった「どのような結果になるか」と言う問題なのですが、8行目の if(b=false) の部分がifの括弧の中はBoolean型じゃないといけないのに 代入してるからコンパイルエラーだなとおもったのですが あっさりコンパイルは通ってx=4と言う出力です・・・ (b=false) と言うのはどのようにコンパイルされているのですか?? なぜ 代入が、BooleanとしてOKなのでしょうか??

    • ベストアンサー
    • Java
  • C++

    ICPCの過去問です。 問題文:http://www.deqnotes.net/acmicpc/p0003/ja 過去問を解いたのですが実行が上手くいかずに困っています。 私の書いたソースコード: #include <iostream> #include <string> using namespace std; class Line{ public: char* Read(){ char number[1024];//数字を入れる配列 static char sentence[76];//できあがった文字列を入れる配列 char word;//現在の文字 int i=0;//カウンタ int s=0;//sentenceのカウンタ int y=0;//数字が何回連続したかを数える char one[5]={'.',',','!','?',' '}; char two[3]={'a','b','c'}; char three[3]={'d','e','f'}; char four[3]={'g','h','i'}; char five[3]={'j','k','l'}; char six[3]={'m','n','o'}; char seven[4]={'p','q','r','s'}; char eight[3]={'t','u','v'}; char nine[4]={'w','x','y','z'}; int c; while(c = getchar() != '\n'){//数を一文字ずつ配列にいれていく number[i] = c; i++; } for(int x=0;x<(i+1);x++){ if(number[x]=='0'){ if(word == 'N'){} else{sentence[s]=word;s++;y=0;word='N';} } else{ if(number[x]=='1'){ word=one[y]; y++; y=y%5;} else if(number[x]=='2'){ word=two[y]; y++; y=y%3;} else if(number[x]=='3'){ word=three[y]; y++; y=y%3; } else if(number[x]=='4'){ word=four[y]; y++; y=y%3; } else if(number[x]=='5'){ word=five[y]; y++; y=y%3; } else if(number[x]=='6'){ word=six[y]; y++; y=y%3; } else if(number[x]=='7'){ word=seven[y]; y++; y=y%4; } else if(number[x]=='8'){ word=eight[y]; y++; y=y%3; } else{ word=nine[y]; y++; y=y%4; } } } sentence[i]='N'; return sentence;//配列の先頭のポインタを返す } }; int main(){ int n;//行数 cin>>n; getchar();//改行をとる char *first[n]; int i; int x=0; char ch; char *Fir; for(i=0;i<n;i++){ Line line; first[i] = line.Read(); } for(int j=0;j<i;j++){ Fir = first[i]; while((ch = Fir[x]) != 'N'){ cout << ch ; x++; } cout << '\n'; } return 0; } 実行結果: 1 20 Segmentation fault となってしまいます。 coutやコメントアウトで動きを追ってみたところ、下から8行目くらいのwhile文がなければ、segumentation faultはおきませんでした。ポインタの扱いが間違っているのかなとは思うのですが、どこが悪いのか考えても分かりません。どなたか教えてください。

  • Javaのif文がわかりません!

    public class If2 {   static boolean b1, b2;   public static void main(String[] args) {     int x = 0;     if ( !b1 ) {     if ( !b2 ) {       b1 = true;       x++;       if ( 5 > 6) {         x++;       }       if ( !b1 ) x = x + 10;       else if ( b2 = true ) x = x + 100;       else if ( b1 | b2 ) x = x + 1000;       }     }     System.out.println(x);    }  } ------------------------------------------------------------ 正常にコンパイルされ、101とでます。 if文の()内にある!b1というのが意味が分かりません^^; 2行目でb1とb2はfalseになるのは分かりましたが !b1や!b2はfalseではない!ということですか? 誰か教えてください!よろしくお願いします!!

  • C言語の問題がわからないです。

    C言語のプログラムで、列数を自分で決めて、 (例)3列         ●(この行を最後として)   □● ●□● 上記のプログラムを作りたいのですが、 上手くいきません。途中まで作ったのですが、なかなか思うようにいかないです。どうすれば上記のようになりますでしょうか? #include <stdio.h> void disp(int x, int y); main() { int i,n; printf("表示する列:"); scanf("%d",&n); disp(3,3); for(i=1;i<=n;i++){ if(i%2==0){ disp(n-i,4); disp(i,2); } else{ disp(n-i,4); disp(i,1); } disp(1,3); } } void disp(int x, int y) { int i; for(i=0;i<x;i++){ if(y==1){ printf("●"); } else if(y==2){ printf("□"); } else if(y==3){ printf("\n"); } else{ printf("\0"); } } }

専門家に質問してみよう