2016-09-03 12 views
1

私はこのガイドに従ってC++でスネークゲームを作ったが、私はCで私のものを作った。 https://www.youtube.com/watch?v=PSoLD9mVXTACスネークゲーム自体が衝突する

私はそれ以外の場合は1つの問題のみが設定されています。私は蛇がそれ自体に適切に衝突するようにすることはできませんし、なぜビデオの男のために働いているのか分かりませんが、同じコードが私のために働いていません。

コードは醜く、うまく構成されていません。私を裁かないでください、私はまだ学んでいます!

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

int gameOver = 1; 
const int width = 20; 
const int height = 20; 
typedef enum {STOP = 0, LEFT, RIGHT, UP, DOWN} eDirection; 
eDirection dir; 
int x, y, fruitX, fruitY, score; 

int tailX[100], tailY[100]; 
int nTail; 


void Setup(){ 
    gameOver = 0; 
    dir = STOP; 
    x = width/2; 
    y = height/2; 
    fruitX = rand() % width; 
    fruitY = rand() % height; 
    score = 0; 

} 

void Draw(){ 

    system("cls"); 

    for(int i = 0; i < width +3; i++) 
     printf("#"); 
     printf("\n"); 

    for(int i = 0; i < height; i++){ 

     for(int j = 0; j < width+2; j++){ 


       if(j == 0){ 
        printf("#"); 
       } 
       if(j == width+1){ 
        printf("#"); 
       } 

       if(i == y && j == x){ 
        printf("*"); 

       }else if(i == fruitY && j == fruitX){ 
        printf("F"); 

       }else{ 

        int print = 0; 
        for(int k = 0; k < nTail; k++){ 

         if(tailX[k] == j && tailY[k] == i){ 

          printf("*"); 
          print = 1; 
         } 
        } 
        if(!print){ 
         printf(" "); 
        } 
       } 

      } 
      printf("\n"); 
     } 

    for(int i = 0; i < width +3; i++) 
     printf("#"); 
     printf("\n"); 


    printf("\nScore : %d",score); 
} 

void Input(){ 

    if (kbhit()){ 
     switch (getch()){ 
      case 'a': 
       dir = LEFT; 
       break; 
      case 'd': 
       dir = RIGHT; 
       break; 
      case 'w': 
       dir = UP; 
       break; 
      case 's': 
       dir = DOWN; 
       break; 
      default: 
       break; 
     } 
    } 

} 

void Logic(){ 


    int prevX = tailX[0]; 
    int prevY = tailY[0]; 
    int prev2X, prev2Y; 
    tailX[0] = x; 
    tailY[0] = y; 

    for(int 1 = 0; i < nTail; i++){ 
     prev2X = tailX[i]; 
     prev2Y = tailY[i]; 
     tailX[i] = prevX; 
     tailY[i] = prevY; 
     prevX = prev2X; 
     prevY = prev2Y; 

    } 

    if(x > width || x < 0 || y > height-1 || y < 0){ 
     gameOver = 1; 
    } 
    if(x == fruitX && y == fruitY){ 

     fruitX = rand() % width; 
     fruitY = rand() % height; 
     score = score + 10; 

     nTail++; 
    } 
    //collision code 
    for(int i = 0; i < nTail; i++) 
     if(tailX[i] == x && tailY[i] == y){ 
      gameOver = 1; 
    } 


    switch(dir){ 

     case LEFT: 
      x--; 
      break; 
     case RIGHT: 
      x++; 
      break; 
     case UP: 
      y--; 
      break; 
     case DOWN: 
      y++; 
      break; 
     default: 
      break; 
    } 



} 

int main(){ 

    Setup(); 
     while(!gameOver){ 
      Draw(); 
      Input(); 
      Logic(); 
      Sleep(100); 
     } 

return 0; 
} 
+2

デバッガを使用する必要があります。また、[Minimal、Complete、Verifiable example](https://stackoverflow.com/help/mcve)を投稿してください。 – Xiobiq

+1

デバッガはどのように使用しますか? – Corvo

+0

注: 'int main()'のようなシグネチャは推奨されておらず、Cでは使用しないでください。代わりに、プロトタイプスタイルのシグネチャ(例えば、 'int main(void)')を使用してください。 – Olaf

答えて

1

果物を打つとすぐにプログラムが失敗します。

説明

あなたのコードが起動すると、あなたが何の尾を持っていない、すなわちnTail0です。 Logic()

あなたが実行します。

tailX[0] = x; 
tailY[0] = y; 

ので、インデックスゼロ(nTailがゼロであっても)、現在の位置に設定されています。

あなたはあなたが果物ヒット時:

if(tailX[0] == x && tailY[0] == y){ 
     gameOver = 1; 
    } 

、それは正確である:

if(x == fruitX && y == fruitY){ 

    fruitX = rand() % width; 
    fruitY = rand() % height; 
    score = score + 10; 

    nTail++; <---- Here you increment nTail so it becomes 1 
} 

を次にあなたがnTail以来

//collision code 
for(int i = 0; i < nTail; i++) 
    if(tailX[i] == x && tailY[i] == y){ 
     gameOver = 1; 
} 

を行うが、それは同じです1ですLogicの先頭にあなたが割り当てたもの。

//collision code 
for(int i = 1; i < nTail; i++) 
     ^^^ 

衝突検出に関連する別の問題: - 言い換えれば、それはtruegameoverは1

たぶんソリューションは1代わりの0から開始することであるになりますです。

if(x == fruitX && y == fruitY){ 

    fruitX = rand() % width; 
    fruitY = rand() % height; 
    score = score + 10; 

    nTail++; <---- Here you increment nTail but no value is 
         written to tailX[nTail-1] and tailY[nTail-1] 
         after the increment 
} 
//collision code 
for(int i = 0; i < nTail; i++) 
    if(tailX[i] == x && tailY[i] == y){ <-- Here you use tailX[nTail-1] and tailY[nTail-1] 
     gameOver = 1; 
} 

果物を取ったばかりのときは、尾の部分ではない値と比較します。

+0

私がnTailの長さを3にして自分自身に戻った場合、私はcollisionでforループを設定すると自分自身と衝突することができます。私はあなたが言ったことに従って、私はまだ適切に動作するために衝突を取得することはできません。 – Corvo

+0

この行をどのように変更しましたか?(int 1 = 0; i 4386427

+0

forループをどのように変更しましたか? '1'または...から始めるには? – 4386427