乌龟和野兔指针

时间:2015-06-18 13:51:41

标签: c arrays pointers

我正在建立一个模拟乌龟和野兔种族的计划。我这样做的方法是创建一个'_'的SIZE 70数组来模拟赛道。然后我创建了2个指针,char *harePtrchar *tortoisePtr,指向该数组中的元素(每个指针从[0]开始)指针指向的数组中的元素我也是试图改变为' T'和' H'模拟他们在赛道上的位置。

从那时起,我开发了一些算法,用于根据随机数生成器确定每个动作。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define SIZE 70

enum winner {TORTOISE, HARE};

int raceRunner (char wRaceTrack[], void (*moveHare)(char *harePtr, int i), void (*moveTortoise)(char *tortoisePtr, int i));

void moveHare (char *harePtr, int i);
void moveTortoise ( char *tortoisePtr, int i);

int main() {

    char racetrack [SIZE];

    size_t i;
    for (i = 0; i < SIZE; i++)
        racetrack[i] = '_';

    int winner;

    winner = raceRunner(racetrack, moveHare, moveTortoise);

    if (winner == 1)
        printf("The hare won!");

    if (winner == 2)
        printf("The tortoise won!");


}


int raceRunner (char wRaceTrack[], void (*moveHare)(char *harePtr, int i), void (*moveTortoise)(char *tortoisePtr, int i)){

    srand(time(NULL));
    int move = 1 + rand() %10;

    char *harePtr = wRaceTrack;
    char *tortoisePtr = wRaceTrack;

    size_t i;
    for (i = 0; i < SIZE; i++)
        printf("%c,", wRaceTrack[i]); 

    printf("\n\n");

    moveHare(harePtr, move);
    moveTortoise(tortoisePtr, move);

    i = 0;
    for (i = 0; i < SIZE; i++)
        printf("%c,", wRaceTrack[i]);

    printf("\n\n");

    if (harePtr = tortoisePtr)
        printf("OUCH! Damn tortoise bit the hare!\n\n");

    if (harePtr[69])
        return 1;

    else if (tortoisePtr[69])
        return 2;

    else
        raceRunner(wRaceTrack, moveHare, moveTortoise);


}

void moveHare ( char *harePtr, int i) {

    if (i == 1) {
       *harePtr = '_'; 
       harePtr - 12;
       *harePtr = 'H';        
    }


    if (2 <= i <= 3) {
        return;        
    }

    if (4 <= i <= 5){
        *harePtr = '_';
        harePtr + 9;
        *harePtr = 'H';
    }

    if (6 <= i <= 8) {
        *harePtr = '_';
        harePtr + 1;
        *harePtr = 'H';

    }

    if (9 <= i <= 10) {
        *harePtr = '_';
        harePtr - 2;
        *harePtr = 'H';
    }

}

void moveTortoise ( char *tortoisePtr, int i) {

    if (1 <= i <= 5) {
        *tortoisePtr = '_';
        tortoisePtr + 3;
        *tortoisePtr = 'T';
    }

    if (6 <= i <= 7){
        *tortoisePtr = '_';
        tortoisePtr - 6;
        *tortoisePtr = 'T';
    }

    if (8 <= i <= 1) {
        *tortoisePtr = '_';
        tortoisePtr + 1;
        *tortoisePtr = 'T';               
    }    
}

我尝试做的是首先将他们的CURRENT位置设置回&#39; _&#39;然后递增每个指针以相应地沿阵列向上或向下移动,具体取决于随机的内容生成器出现,并将该值更改为&#39; T&#39;或者&#39; H&#39;。指向数组中最后一个元素的第一个指针[69]赢得了比赛。

然而,当我运行程序时,它每次都会始终产生相同的结果,而野兔标记不会在阵列的任何位置出现。我很肯定这是因为我的指针设置不当,因为我仍然试图围绕整个概念。是否无法设置指向同一阵列的指针?或者我是否通过错误使用*和&amp;?错误地访问阵列?在使用这些操作数来正确地将指针与数组集成时,我老老实实地失去了,所以任何和所有帮助都是值得赞赏的。谢谢!

2 个答案:

答案 0 :(得分:2)

在您的代码中,存在许多问题。

  • <强>首先,

    harePtr - 12;
    ...
    harePtr + 9;
    ...
    tortoisePtr + 3;
    

    等。陈述基本上没用。它们不会像您可能想到的那样影响harePtrtortoisePtr。操作的结果 丢失,除非您在某个变量中收集相同内容。

    您可以在这方面使用+=-=来修改LHS操作数值。

  • <强>第二

    关于关系运算符的链接,比如

     if (1 <= i <= 5)
    

    请参阅this answer以了解为什么让您感到惊讶。在逻辑上是错误的。

  • <强>第三

    在您的代码中

    if (harePtr = tortoisePtr) –
    

    不会比较这些值,而是指定它。您需要使用==进行比较。

  • <强>四

    srand()用于种子随机数生成器。您只需从srand()致电main()一次。您可能需要参考related answer

答案 1 :(得分:0)

首先,从指针中减去一个数字将返回一个新值,而不是修改现有值。使用-=+=运算符实际更改内容。

其次,随机更改指针然后使用它而不先检查它是否仍在有效范围内意味着操作系统会在动物设法咬住另一个之前很久就咬你的程序。