2013-03-14 40 views
-5

我一直在这个项目上工作了一段时间,现在我无法在我的项目中找到我的问题。 URL:https://github.com/blackwolf12333/Snake 蛇是离身体几个点,似乎并没有移动。我之前有过一段段错误,但我找不到这个错误的问题!我几乎尝试了几乎所有的东西,重新编写代码从头到尾阅读它。它在Linux中编码!蛇的头部距离身体有几点距离(C++游戏)

的main.c

#include "snake.h" 
#include "ncurses.h" 

void update(); 
void draw_snake(); 
void check_move(int c); 

void cleanup(); 

int main() { 
initscr(); 
noecho(); 
cbreak(); 

snake = create_snake_at(20, 10); 
add_body_part(&snake.head); 
//add_body_part(snake.head.next); 

int key; 
printw("Press any key to continue..."); 
while((key = getch()) != 'q') { // when 'q' is pressed the game will exit. 
check_move(key); 
update(); // updates game logic/graphics 
refresh(); 
} 
refresh(); 
endwin(); 
cleanup(); 
return 0; 
} 

void update() { 
    //clear(); 
    move_snake(); 
    draw_snake(); 
} 

void check_move(int c) { 
    switch(c) { 
    case 6517: // up arrow 
move_up(); 
break; 
case 6617: 
move_down(); 
break; 
case 6817: 
move_left(); 
break; 
case 6717: 
move_right(); 
break; 
default: 
break; 
    } 
    draw_snake(); 
} 

void print_body_part(body_part_t *part) { 
    move(part->pos.y, part->pos.x); 
if(part->head) { 
addch('$'); 
} else { 
addch('*'); 
} 
} 

void draw_snake() { 
    body_part_t *next = &snake.head; 
    int i = 0; 
    while(next) { 
     move(i, 0); 
     printw("part is head: %d\tpart x: %d\tpart y: %d\n", next->head, next->pos.x, next->pos.y); 
     print_body_part(next); 
     next = next->next; 
     i++; 
    } 
} 

void cleanup() { 
    body_part_t *next; 
    for(next = &snake.head; next != NULL; next = next->next) { 
     //free(next); 
    } 
} 

move.c

#include "move.h" 
#include "snake.h" 

//TODO: add collision logic here! 
void move_up() { 
snake.head.pos.y++; 
} 

void move_down() { 
snake.head.pos.y--; 
} 

void move_left() { 
snake.head.pos.x--; 
} 

void move_right() { 
snake.head.pos.x++; 
} 

move.h

#ifndef MOVE_H 
#define MOVE_H 

void move_up(); 
void move_down(); 
void move_left(); 
void move_right(); 

#endif 

position.c

#include "position.h" 

void initialize_position(position_t *pos, int x, int y) { 
pos->x = x; 
pos->y = y; 
} 

position.h

#ifndef POSITION_H 
#define POSITION_H 

typedef struct position { 
int x; 
int y; 
} position_t; 

void initialize_position(position_t *pos, int x, int y); 

#endif 

snake.c

#include "snake.h" 

body_part_t create_body_part(int head, int x, int y); 
position_t get_position_next_to(body_part_t *part); 

void add_body_part(body_part_t *prev) { 
body_part_t *part = malloc(sizeof(body_part_t)); 
part->head = prev->head & 0; 
part->pos = get_position_next_to(prev); 
part->dir = prev->dir; 
part->next = NULL; 
prev->next = part; 
} 

snake_t create_snake_at(int x, int y) { 
snake_t *snake = malloc(sizeof(snake_t)); 
body_part_t head = create_body_part(1, x, y); 
snake->head = head; 
snake->health = MAX_HEALTH; 
return *snake; 
} 

body_part_t create_body_part(int head, int x, int y) { 
body_part_t *part = malloc(sizeof(body_part_t)); 
part->head = head; 
initialize_position(&part->pos, x, y); 
part->dir = LEFT; 
part->next = NULL; 
return *part; 
} 

position_t get_position_next_to(body_part_t *part) { 
    position_t pos; 
    switch(part->dir) { 
    case UP: 
     initialize_position(&pos, part->pos.x, part->pos.y++); 
     break; 
    case DOWN: 
     initialize_position(&pos, part->pos.x, part->pos.y--); 
     break; 
    case LEFT: 
     initialize_position(&pos, part->pos.x--, part->pos.y); 
     break; 
    case RIGHT: 
     initialize_position(&pos, part->pos.x++, part->pos.y++); 
     break; 
    default: 
     break; 
    } 
    return pos; 
} 

void move_snake() { 
body_part_t *next; 
for(next = &snake.head; next != NULL; next = next->next) { 
switch(next->dir) { 
case UP: 
move_up(); 
break; 
case DOWN: 
move_down(); 
break; 
case LEFT: 
move_left(); 
break; 
case RIGHT: 
move_right(); 
break; 
} 
} 
} 

snake.h

#ifndef SNAKE_H 
#define SNAKE_H 

#include "stdlib.h" 
#include "position.h" 
#include "move.h" 

#define MAX_HEALTH 20 

typedef struct body_part body_part_t; 

typedef enum DIR { 
UP, 
DOWN, 
LEFT, 
RIGHT 
} direction; 

typedef struct body_part { 
int head; 
position_t pos; 
direction dir; 
body_part_t *next; 
} body_part_t; 

typedef struct snake { 
body_part_t head; 
int health; 
} snake_t; 

/* 
This is the main snake struct, if later multiple snakes will be implemented this should be replaced with something else 
*/ 
snake_t snake; 

snake_t create_snake_at(int x, int y); 
void add_body_part(body_part_t *prev); 
void move_snake(); 

#endif 
+5

请发布您的问题的简短,自包含,正确(可编译),示例(http://sscce.org/)。不要指望有人拉你的github项目并为你解决所有问题。 – meyumer 2013-03-14 18:20:04

+0

整个代码不超过200行,我认为github会更容易阅读,但很快就会在第一篇文章中添加代码。 – 2013-03-14 18:24:30

+0

@约翰史密斯,你错过了“短而自足”的部分。 – 2013-03-14 18:51:40

回答

1

我认为你的问题可能是部分在get_next_position_to功能,在这里你增加的位置身体部分传入功能。我认为这应该只能增加。 “正确”的情况下,还修改X和Y.

position_t get_position_next_to(body_part_t *part) { 
    position_t pos; 
    switch(part->dir) { 
    case UP: 
     initialize_position(&pos, part->pos.x, part->pos.y + 1); 
     break; 
    case DOWN: 
     initialize_position(&pos, part->pos.x, part->pos.y - 1); 
     break; 
    case LEFT: 
     initialize_position(&pos, part->pos.x - 1, part->pos.y); 
     break; 
    case RIGHT: 
     initialize_position(&pos, part->pos.x + 1, part->pos.y); 
     break; 
    default: 
     break; 
    } 
    return pos; 
} 

两个此外,您move_snake功能不更新以下的身体部位。由于您正在使用链接列表,因此您可以将列表的最后一个元素移动到头部之后,并在移动头部之前将位置等从头部复制到下一个元素。您需要将您的列表更改为双向列表。您可以使用循环缓冲区更高效地对此进行编码。

您的列表清除功能是错误的,因为您在再次访问它之前释放下一个元素。你需要存储一个临时的和迭代的,然后释放临时的。你绝对不应该免费获得snake.head,因为你没有使用malloc。它应该是这样的:

void cleanup() { 
    body_part_t* tmp; 
    body_part_t *next = snake.head.next; 
    while (next) { 
     tmp = next; 
     next = next->next; 
     free(tmp); 
    } 
} 
+0

终于有人决定查看我的代码并帮助我。我非常感谢你的帮助,我会尽快解决我的错误。 – 2013-03-14 20:32:14