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

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

ただいまの
回答率

88.78%

processing データ通信(サーバ側からクライアント側へ配列データが遅れず、クライアント側が動きません)

受付中

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 409

noberon

score 9

Processing で2人対戦型シューティングゲームを作っています。サーバ側の動作はうまくいったのですが、クライアント側が動きません。

ゲーム概要としては画面の上と下に横移動しか出来ない自機を2つ配置します。それぞれがスペースキーで弾を打ちます。
画面中央にはランダムに動く敵を配置し、敵も弾を撃ちます。
プレイヤーは敵の攻撃を避けつつ敵を倒しスコアが高い方が勝ちと言ったものです。

弾の発射や当たり判定などの基本動作はサーバ側で制御し、クライアント側では自機の位置座標と打った弾の座標を送り、サーバから送られるサーバ側の自機や敵に関する座標を受け取り表示するコードを組んだのですが、データ通信がうまくいってないのかクライアント側が正常に表示されません。

説明が上手くできず申し訳ありませんが、以下のサーバ側のコードとクライアント側のコードを実行したら意味がわかると思います。(おそらくデータの送受信がうまくいってないと考えられます)
すみませんが詳しい方教えてください。
以下にサーバ側のコード、クライアント側のコードは回答への返信欄に載せてあります。

サーバー
//ソケット通信のためのライブラリを読み込み
import processing.net.*;
Server server;
//ポート番号を指定(今回は20000)
int port = 20000;

int keyy; //流れ管理
PImage player1,player2,bg, bombP1,bombP2;// bP: プレイヤーの弾
PImage[] enemy = new PImage[2];

int px1=240,py1=50,ph1=50,pw1=50; //プレイヤー1の座標と高さ幅
int px2,py2=700,pw2=50,ph2=50;//プレイヤー2の座標と高さ幅

float[] ex =new float[12]; //敵の座標
int[] ey = new int[12];
int[] ef = new int[12]; //フラグ  0:左方向  1:右方向 2:未使用
float[] ev = new float[12]; //敵の移動速度

int[] bPx1= new int[6];  //Player1弾
int[] bPy1= new int[6];
int[] bPx2 = new int[6];  //Player2弾
int[] bPy2= new int[6];

int[] bEx = new int[20];  //Enemy弾
int[] bEy = new int[20];
int[] bEv = new int[20]; //E弾速度

int eA =0;
int bEA =0;

int bombWait;
int keyKeep; //押下中のキー

int scoreS = 0;
int scoreC = 0;

void setup(){
  //サーバを生成prot番ポートで立ち上げ
  server = new Server(this, port);

  size(600,800);
  noStroke();
  frameRate(30);
  imgLoad();
  gameInit(bPy1); //ゲーム初期化
   gameInit(bPy2); 
}

void draw(){
  background(100);
  //FromC();
  // ToC();


  if( keyy == 0){
  gameTitle();

  }else if( keyy == 1){

    gamePlay();
  }else if( keyy == 2){
    gameOver();
  }

}
void FromC(){
  Client c = server.available();
  if(c != null) {
    //改行コード('\n')まで読み込む
    String msg = c.readStringUntil('\n');
    if (msg != null){
      //メッセージを空白で分割して配列に格納
      String[] data = splitTokens(msg);


      px2 = int(data[0]);
       bPx2[0] = int(data[1]); bPx2[1] = int(data[2]); bPx2[2] = int(data[3]);
       bPy2[0] = int(data[4]); bPy2[1] = int(data[5]); bPy2[2] = int(data[6]);


    }
  }
}

    void ToC(){
    //全てのデータの送信
       String msg = ex[0] + " " + ex[1] + " " +  ex[2] + " "+ ex[3]+" "+ ex[4]+" "+ ex[5]+" " + ex[6]  + " " +  ex[7] + " "+ ex[8]+" "+ ex[9]+
                              " "+ey[0] + " " + ey[1]  + " " +  ey[2] + " "+ ey[3]+" "+ ey[4]+" "+ ey[5]+" " + ey[6]  + " " +  ey[7] + " "+ ey[8]+" "+ ey[9]+

                               " "+bEx[0] + " "+bEx[1] + " " + bEx[2]+ " "+bEx[3]+" "+ bEx[4]+" "+bEx[5]+" " + bEx[6]  + " " +  bEx[7]+ " "+ bEx[8]+" "+ bEx[9]+
                               " "+bEy[0] + " "+bEy[1] + " " + bEy[2]+ " "+bEy[3]+" "+ bEy[4]+" "+bEy[5]+" " + bEy[6]  + " " +  bEy[7]+ " "+ bEy[8]+" "+ bEy[9]+
                                " "+px1+ " "+bPx1[0] + " " +bPx1[1]  + " " +  bPx1[2] +" "+bPy1[0] + " " +bPy1[1]  + " " +  bPy1[2] +" "+scoreS+ " "+scoreC +" "+keyy+'\n';
      print("server: " + msg);
      //サーバが接続しているすべてのクライアントに送信
      //(複数のクライアントが接続している場合は全てのクライアントに送信)
      server.write(msg);
    }


void gameInit(int[] bPy){
  keyy = 0;
 //px1 =240;


 for(int i =0; i<12; i++){
   ef[i] = 2;

   }
   for(int i=0; i<6; i++){
     bPy[i] = -20;  //-20:未使用

   }
   bombWait = 0;
   keyKeep = 0;

   for(int i=0; i<20; i++){
     bEy[i] = -20;  //-20:未使用
   }

}
void gameTitle(){
  keyy =1;
}
//int px,int py,int pw,int ph,int[]bPx,int[]bPy
void gamePlay(){
  px1 = playerMove(bPx1,bPy1,px1,pw1);  
  image(player1,px1,py1,pw1,ph1);
  // px2 = playerMove(bPx2,bPy2,px2,pw2);  
  image(player2,px2,py2,pw2,ph2);

  enemyMove();
  enemyDisp(bPx1,bPy1);
  enemyDisp(bPx2,bPy2);
  bombP1Move(bPx1,bPy1);
  bombP2Move(bPx2,bPy2);
  bombEMove(px1,py1,pw1,ph1);
  bombEMove(px2,py2,pw2,ph2);
  scoreDisp();
}
void gameOver(){
   scoreDisp();
}

void imgLoad(){
  player1 = loadImage("player2.png");
  player2 = loadImage("player1.png");
  enemy[0] =loadImage("敵.png");
  bombP1=loadImage("2弾.png");
   bombP2 =loadImage("1弾.png");
}
int playerMove(int[] bPx,int[] bPy,int px,int pw){ //**** void → int
    // if( (keyPressed == true) && (key == CODED) ){
    if( ( keyKeep == LEFT) && (px>0)  ){
      px -= 3;
    }
    if( ( keyKeep == RIGHT) &&(px <600-pw)  ){
      px += 3;
    }
    // }
    if( bombWait>0){
      bombWait--;
    }
    if( (keyPressed == true) && (key == ' ' ) && (bombWait == 0) ){
      bombWait =10; //10秒まち
      bombP1Add(bPx,bPy,px,pw);
      // bombP2Add(bPx,bPy,px,pw);
    }
    return px; //**** 追加
  }

void keyPressed(){
  if (key == CODED){
    if(   (keyCode == LEFT) || (keyCode == RIGHT)  ){
      keyKeep = keyCode;
    }
  }
}
void keyReleased(){
  if (key == CODED){
    if(   (keyCode == LEFT) || (keyCode == RIGHT)  ){
      keyKeep = 0;
    }
  }
}

void enemyMove(){
  for(int i=0; i<12; i++){
    ex[i] += ev[i];
    if( (ef[i] ==0) && (ex[i] < -50)  ){
      ef[i]= 2;  //画面外皮表示
    }
     if( (ef[i] ==1) && (ex[i] >600)  ){
      ef[i]= 2;  //画面外皮表示
    }
   }
   if ( random(1000)<20){ //敵の発生率
   enemyAdd();
   eA =1;
   } else{
     eA =0;
   }
}


void enemyDisp(int[] bPx,int[] bPy){
  for(int i=0;  i<10; i++){
    if ( ef[i] <2){
    image(enemy[0],ex[i],ey[i],50,50);

    for(int j=0; j<6; j++){
      if(  (bPx[j] < ex[i]+50) && (bPx[j]+25 > ex[i]) 
      &&  (bPy[j] < ey[i]+50) && (bPy[j]+25 > ey[i]) ){
        bPy[j] = -20;
        ef[i] = 2;
        scoreS +=10;
        break;
      }

    }

    }
    if ( (ef[i] < 2) && (random(2000)<10)  ){ //敵爆弾発生率
      bombEAdd(int  (ex[i]),  ey[i] );
      bEA = 1;
    }else{
      bEA = 0;
    }
  } 
}

  void enemyAdd(){
    for(int i=0; i<10; i++){
      if( ef[i] == 2){ //未使用の中から敵を追加
      ev[i] = random(0.5,2.5);
      if (random(100) <50){
        ef[i] = 0 ; //左
        ex[i] = 600;
        ev[i] =-ev[i] ;
      }
      else{
        ef[i] = 1;
        ex[i]= -80;
      }
      ey[i] = int(random(150,650));
      break;
      }
    }
  }

  void bombP1Add(int[] bPx,int[]bPy,int px,int pw){
    for(int i=0; i<3; i++){
      if ( bPy[i] ==  -20){ //未使用の弾を使う
      bPx[i] = px + (pw/2)-15; //Pの中心
      bPy1[i] = 70;
      break;     //一発のみ
      }
    }
  }

void bombP1Move(int[] bPx,int[]bPy){
  int bcnt =3;
  for(int i= 0; i<3; i++){
    if ( bPy[i] >0){
      bPy[i] += 5;
      bcnt--;
    }
    if ( bPy[i] >800){ //画面上外
      bPy[i] = -20; //未使用に戻す
    }
    image(bombP1,bPx[i],bPy[i]-8,30,30);


  }
  for(int i=0; i< bcnt; i++){
    image(bombP1, 230+i*26,10,25,25);
  }
}

void bombP2Move(int[] bPx,int[] bPy){
  int bcnt =3;
  for(int i= 0; i<3; i++){
    if ( bPy[i] >0){
      bPy[i] -= 5;
      bcnt--;
    }
    if ( bPy[i] >0){ //画面上外
      bPy[i] = -20; //未使用に戻す
    }
    image(bombP2,bPx[i],bPy[i]+8,30,30);
    //for(int e= 0; e<12; e++){
    // if(  (bPx[i] < ex[e]+50) && (bPx[i]+25 > ex[e]) 
    //  &&  (bPy[i] < ey[e]+50) && (bPy[i]+25 > ey[e]) ){
    //    scoreS +=10;

    //  }
    //}

  }
  for(int i=0; i< bcnt; i++){
    image(bombP2, 230+i*26,750,25,25);
  }
}

void bombEAdd(int  xx,  int  yy){
  for( int i=0;  i<10;  i++){
    if ( bEy[i] ==  -20){
      bEx[i] = xx +18;
      bEy[i] = yy;
      if(     random(100) < 50  ){
      bEv[i] = 1;
      }else{
         bEv[i] = -1;
      }
      break;
    }
  }
}

void bombEMove(int px,int py,int pw,int ph ){
  for( int i = 0;  i<10;  i++){
    //bEv[i] = 1;
   if (    (bEy[i] > 0)   ){
     //if(     random(100) < 50  ){
      bEy[i] -= bEv[i];
   // }
    //else{
    //  bEy[i] +=bEv[i];
    //}
   }
    if(( bEy[i] <= 0)   ||  ( bEy[i] >=800)  )  {
       //if(bEy[i] < 90)   {
      bEy[i]  = -20;
    }

    if(  (bEx[i] < px+pw)  && (bEx[i]+10 >px) 
    &&  (bEy[i] < py+ph)  && (bEy[i]+10 >py)  )  {
       bEy[i]  = -20;
      scoreS -=50;
    }


    fill(0);
    rect(bEx[i],bEy[i],10,10);
   // image(bombP,bEx[i],bEy[i]-8,10,10);
  }
}

void scoreDisp(){
  textSize(24);
  text( "score:"+scoreS, 10,25);
  text( "score:"+scoreC, 10,770);

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

0

クライアント側のプログラムがないけれど。

   void ToC(){
    //全てのデータの送信
     String msg = ex[0] + " " + ex[1] + " " +  ex[2] + " "+ ex[3]+" "+ ex[4]+" "+ ex[5]+" " + ex[6]  + " " +  ex[7] + " "+ ex[8]+" "+ ex[9]+
                              ""+ey[0] + " " + ey[1]  + " " +  ey[2] + " "+ ey[3]+" "+ ey[4]+" "+ ey[5]+" " + ey[6]  + " " +  ey[7] + " "+ ey[8]+" "+ ey[9]+

                               ""+bEx[0] + " "+bEx[1] + " " + bEx[2]+ " "+bEx[3]+" "+ bEx[4]+" "+bEx[5]+" " + bEx[6]  + " " +  bEx[7]+ " "+ bEx[8]+" "+ bEx[9]+
                               ""+bEy[0] + " "+bEy[1] + " " + bEy[2]+ " "+bEy[3]+" "+ bEy[4]+" "+bEy[5]+" " + bEy[6]  + " " +  bEy[7]+ " "+ bEy[8]+" "+ bEy[9]+
                                ""+px1+ ""+bPx1[0] + " " +bPx1[1]  + " " +  bPx1[2] +""+bPy1[0] + " " +bPy1[1]  + " " +  bPy1[2] +""+scoreS+ " "+scoreC +""+keyy+'\n';


の部分、msg生成の2行目以降の先頭が""になってるけど、きっと" "じゃないか、という気がする。
(その修正だけで動くかどうかはまた別の話)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/05/07 16:18

    回答ありがとうございます。その修正による効果はありませんでした。

    キャンセル

  • 2019/05/07 21:08

    クライアント側でも似たようなミスをしているのは気付いていますか?

    キャンセル

  • 2019/05/07 21:14

    え、そのスペースで通信に問題があるんですか?試してきます。

    キャンセル

  • 2019/05/07 21:29

    両方ともスペースを直してみましたが動きませんでした。訂正ありがとうございます。

    キャンセル

-1

クライアント側載せ忘れてましたすみません。

クライアント側

//ソケット通信のためのライブラリを読み込み
import processing.net.*;
Client client;

//他のマシンに接続するときは適切に変更
String serverAdder = "192.168.100.105";
//ポート番号を指定(今回は20000)
int port = 20000;

int keyy; //流れ管理
PImage player1,player2,bg, bombP1,bombP2;// bP: プレイヤーの弾
PImage[] enemy = new PImage[2];

int px1=240,py1=50,ph1=50,pw1=50; //プレイヤー1の座標と高さ幅
int px2=240,py2=700,pw2=50,ph2=50;//プレイヤー2の座標と高さ幅

float[] ex =new float[12]; //敵の座標
int[] ey = new int[12];
int[] ef = new int[12]; //フラグ  0:左方向  1:右方向 2:未使用
float[] ev = new float[12]; //敵の移動速度

int[] bPx1= new int[6];  //Player1弾
int[] bPy1= new int[6];
int[] bPx2 = new int[6];  //Player2弾
int[] bPy2= new int[6];

int[] bEx = new int[20];  //Enemy弾
int[] bEy = new int[20];
int[] bEv = new int[20]; //E弾速度

int bombWait;
int keyKeep; //押下中のキー

int scoreS = 0;
int scoreC = 0;

void setup(){
//指定されたアドレスとポートでサーバに接続
  client = new Client(this, serverAdder, port);

  //サーバー側
  size(600,800);
  noStroke();
  frameRate(30);
  imgLoad();
  gameInit(bPy1); //ゲーム初期化
   gameInit(bPy2); 
}

void draw(){
 background(100);
 if( keyy == 0){
   gameTitle();

  }else if( keyy == 1){
     gamePlay();

  }else if( keyy == 2){
    gameOver();
  }

  //サーバに送信するメッセージを作成
  //空白で区切り末尾は改行
  String msg = px2+""+bPx2[0]+""+bPx2[1]+""+bPx2[2]+""+bPy2[0]+""+bPy2[1]+""+bPy2[2]+"\n";
  print("server: " + msg);
  //サーバが接続しているすべてのクライアントに送信
  //(複数のクライアントが接続している場合は全てのクライアントに送信)
  client.write(msg);

 }

 //サーバーからデータを受け取るたびに呼び出される関数
void clientEvent(Client c) {
  //サーバからのデータ取得
  String msg = c.readStringUntil('\n');
  //メッセージが存在する場合
  if (msg != null) {
    //改行を取り除き,空白で分割して配列に格納
    String[] data = splitTokens(msg);

     //int()で文字列から整数に変換
     ex[0] = int(data[0]);   ex[1] = int(data[1]);  ex[2] = int(data[2]);   ex[3] = int(data[3]);  ex[4] = int(data[4]); ex[5] = int(data[5]);   ex[6] = int(data[6]);  ex[7] = int(data[7]);   ex[8] = int(data[8]);  ex[9] = int(data[9]);  
     ey[0] = int(data[10]);   ey[1] = int(data[11]);  ey[2] = int(data[12]);   ey[3] = int(data[13]);  ey[4] = int(data[14]); ey[5] = int(data[15]);   ey[6] = int(data[16]);  ey[7] = int(data[17]);   ey[8] = int(data[18]);  ey[19] = int(data[19]);  
      bEx[0] = int(data[20]);   bEx[1] = int(data[21]);   bEx[2] = int(data[22]);    bEx[3] = int(data[23]);   bEx[4] = int(data[24]);  bEx[5] = int(data[25]);    bEx[6] = int(data[26]);   bEx[7] = int(data[27]);    bEx[8] = int(data[28]);   bEx[9] = int(data[29]);
      bEy[0] = int(data[30]);   bEy[1] = int(data[31]);   bEy[2] = int(data[32]);    bEy[3] = int(data[33]);   bEy[4] = int(data[34]);  bEy[5] = int(data[35]);    bEy[6] = int(data[36]);   bEy[7] = int(data[37]);    bEy[8] = int(data[38]);   bEy[9] = int(data[39]);
    px1 = int(data[40]);  bPx1[0] = int(data[41]);    bPx1[1] = int(data[42]);     bPx1[2] = int(data[43]);    bPy1[0] = int(data[44]);   bPy1[1] = int(data[45]);    bPy1[2] = int(data[46]);   scoreS = int(data[47]);     scoreC = int(data[48]);   keyy = int(data[49]);


  }
}

void gameInit(int[] bPy){
  keyy = 0;
 //px1 =240;

 for(int i =0; i<12; i++){
   ef[i] = 2;

   }
   for(int i=0; i<6; i++){
     bPy[i] = -20;  //-20:未使用

   }
   bombWait = 0;
   keyKeep = 0;

   for(int i=0; i<10; i++){
     bEy[i] = -20;  //-20:未使用
   }
}

void gameTitle(){
  keyy =1;
}

  void gamePlay(){
  //px1 = playerMove(bPx1,bPy1,px1,pw1);  
  image(player1,px1,py1,pw1,ph1);

   px2 = playerMove(bPx2,bPy2,px2,pw2);  
  image(player2,px2,py2,pw2,ph2);

  //enemyMove();
  //enemyDisp(bPx1,bPy1);
  //enemyDisp(bPx2,bPy2);
  //bombP1Move(bPx1,bPy1);
  bombP2Move(bPx2,bPy2);
  //bombEMove(px1,py1,pw1,ph1);
  //bombEMove(px2,py2,pw2,ph2);
  //scoreDisp();

  //eD
  for(int i=0;  i<12; i++){
  image(enemy[0],ex[i],ey[i],50,50);
  }

  //bP1M
   int bcnt =3;
  for(int i= 0; i<3; i++){
     image(bombP1,bPx1[i],bPy1[i]-8,30,30);
      bcnt--;
  }
  for(int i=0; i< bcnt; i++){
    image(bombP1, 230+i*26,10,25,25);
  }

  //bEM
   for( int i = 0;  i<20;  i++){
      fill(0);
    rect(bEx[i],bEy[i],10,10);
   }

   //sD
   textSize(24);
  text( "score:"+scoreS, 10,25);
  text( "score:"+scoreC, 10,770);




}

void bombP2Move(int[] bPx,int[] bPy){
  int bcnt =3;
  for(int i= 0; i<3; i++){
    if ( bPy[i] >0){
      bPy[i] -= 5;
      bcnt--;
    }
    if ( bPy[i] >0){ //画面上外
      bPy[i] = -20; //未使用に戻す
    }
    image(bombP2,bPx[i],bPy[i]+8,30,30);
  }
  for(int i=0; i< bcnt; i++){
    image(bombP2, 230+i*26,750,25,25);
  }
}

void gameOver(){
 //  scoreDisp();
}

 void imgLoad(){
  player1 = loadImage("player2.png");
  player2 = loadImage("player1.png");
  enemy[0] =loadImage("敵.png");
  bombP1=loadImage("2弾.png");
   bombP2 =loadImage("1弾.png");
}  


int playerMove(int[] bPx,int[] bPy,int px,int pw){ //**** void → int
    // if( (keyPressed == true) && (key == CODED) ){
    if( ( keyKeep == LEFT) && (px>0)  ){
      px -= 3;
    }
    if( ( keyKeep == RIGHT) &&(px <600-pw)  ){
      px += 3;
    }
    // }
    if( bombWait>0){
      bombWait--;
    }
    if( (keyPressed == true) && (key == ' ' ) && (bombWait == 0) ){
      bombWait =10; //10秒まち
      //bombP1Add(bPx,bPy,px,pw);
      bombP2Add();
       // bombP2Add(bPx,bPy,px,pw);
    }
    return px; 
  }

   void bombP2Add(){
  //void bombP2Add(int[] bPx,int[]bPy,int px,int pw){
    for(int i=0; i<3; i++){
      if ( bPy2[i] ==  -20){ //未使用の弾を使う
      bPx2[i] = px2 + (pw2/2)-15; //Pの中心
      bPy2[i] = 750;
      break;     //一発のみ
      }
    }
  }

    void keyPressed(){
  if (key == CODED){
    if(   (keyCode == LEFT) || (keyCode == RIGHT)  ){
      keyKeep = keyCode;
    }
  }
}

void keyReleased(){
  if (key == CODED){
    if(   (keyCode == LEFT) || (keyCode == RIGHT)  ){
      keyKeep = 0;
    }
  }
}

////enemyMove ex,ev,ef
//if(eA ==1){
//  enemyAdd();
//}

////enemyDisp bPx,bPy
//if(bEA ==1){
//   bombEAdd(int  (ex[i]),  ey[i] );
//}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.78%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る