求高手们帮忙解决一问题
怎么用二维数组画地图?
#include <windows.h> #include <time.h> #include <conio.h> #include <stdio.h> /*表示蛇移动的方向*/ #define DIR_UP 0 #define DIR_DOWN 1 #define DIR_LEFT 2 #define DIR_RIGHT 3 #define DIM_F 20 #define DIM_S 40 #define FENCE '@' #define BLANK ' ' /**********************************/ /*定义蛇身的结点*/ typedef struct node { COORD point;//坐标 char data;//字符 struct node *next; }*Snake_list; Snake_list snake_header = NULL;//定义表示蛇的单链表头 char map[DIM_F][DIM_S];//游戏地图 char key_code;//接收键盘输入的键的ASCII码值 COORD food_point, end;//定义游戏中食物的坐标, 和存储蛇尾的坐标end char food_char;//食物字符 char director;//标识蛇走的方向 char food_flag; //表示是否有食物1(有), 0(没有) char key_tuch;//表示是否有新的键值按下 int count=-1;//计分 COORD Create_snake_head(); void Add_snake_node(COORD p, char data); void Init_map(); int Create_food(); void Get_key(); void Show_snake(); void Get_key_code(); void Moving(); void Show_game(); void Eat_food(); void IS_die(); void Eat_itself(); void Meet_fence(); void Show_mark(); int main() { SetConsoleTitle("Snake 1.0.0"); Init_map(); Show_game(); food_flag = Create_food(); director = rand()%4; Add_snake_node(Create_snake_head(), rand()%26+65); Show_mark(); HANDLE getkey_handle = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) Get_key, NULL, 0, NULL); while( true ) { DWORD state_key = WaitForSingleObject( getkey_handle, 0 ); if( state_key = WAIT_OBJECT_0 ) { Get_key(); } if( key_tuch ) { Get_key_code(); } Moving(); if( food_flag == 0 ) { Show_mark(); food_flag = Create_food(); } Show_game(); Sleep(500); } return 0; } /* *功能:在刚进入游戏的时候先创建一个蛇头所在的坐标 *返回值:蛇头的坐标 */ COORD Create_snake_head() { COORD point; point.X = rand()%20 + 10; point.Y = rand()%10 + 5; while( point.X == food_point.X && point.Y == food_point.Y ) { point.X = rand()%20 + 10; point.Y = rand()%10 + 5; } return point; } /* *功能:向链表中插入一个结点 *传入参数:结点的坐标值 显示的字符 */ void Add_snake_node(COORD p, char data) { if( snake_header == NULL ) { snake_header = (Snake_list) malloc (sizeof(Snake_list)); snake_header->next = NULL; snake_header->data = data; snake_header->point = p; } else { Snake_list temp = (Snake_list) malloc (sizeof(Snake_list)); temp->data = data; temp->point = p; temp->next = snake_header; snake_header = temp; } return; } /* *功能:初始化游戏地图 */ void Init_map() { int x; for( x=0; x<DIM_F; ++x ) { map[x][0] = map[x][DIM_S-1] = FENCE; } for( x=0; x<DIM_S; ++x ) { map[0][x] = map[DIM_F-1][x] = FENCE; } return; } /* *功能:创建蛇的食物 *创建成功 *返回值1 */ int Create_food() { Snake_list temp = snake_header; srand(time(NULL)); food_point.Y = rand()%(DIM_F-2) + 1; food_point.X = rand()%(DIM_S-2) + 1; while( temp ) { if( (food_point.X == 1 && food_point.Y == 1) || (food_point.X == DIM_S-2 && food_point.Y == DIM_F-2) || (food_point.X == 1 && food_point.Y == DIM_F-2) || (food_point.X == DIM_S-2 && food_point.Y == 1) ) { food_point.Y = rand()%(DIM_F-2) + 1; food_point.X = rand()%(DIM_S-2) + 1; temp = snake_header; } else { if( temp->point.X != food_point.X || temp->point.Y != food_point.Y ) { temp = temp->next; } else { food_point.Y = rand()%(DIM_F-2) + 1; food_point.X = rand()%(DIM_S-2) + 1; temp = snake_header; } } } srand(time(NULL)); food_char = rand()%26+65; map[food_point.Y][food_point.X] = food_char; return 1; } /* *功能:获取按键 */ void Get_key() { while( true ) { key_code = getch(); key_tuch = 1; Sleep(40); } } /* *功能:把蛇身所在的位置标识相应的字母 */ void Show_snake() { Snake_list temp = snake_header; while( temp ) { map[temp->point.Y][temp->point.X] = temp->data; temp = temp->next; } map[end.Y][end.X] = BLANK; return; } /* *功能:用按键的值转换成蛇移动的相应方向标识 *并把按键标识 清零 表示当前没有要处理的按键 */ void Get_key_code() { switch( key_code ) { case 'A': case 'a': director = DIR_LEFT; break; case 'S': case 's': director = DIR_DOWN; break; case 'W': case 'w': director = DIR_UP; break; case 'D': case 'd': director = DIR_RIGHT; break; default: break; } key_tuch = 0; return; } /* *功能:完成蛇的惯性移动 */ void Moving() { Eat_food(); end.X = snake_header->point.X; end.Y = snake_header->point.Y; switch( director ) { case DIR_LEFT://向左边移动 end.X = end.X-1; break; case DIR_UP://向上移动 end.Y = end.Y-1; break; case DIR_RIGHT://向右边移动 end.X = end.X+1; break; case DIR_DOWN://向下移动 end.Y = end.Y+1; break; default: break; } Snake_list temp = snake_header; COORD pp; while ( temp!=NULL ) { pp.X = temp->point.X; pp.Y = temp->point.Y; temp->point.X = end.X; temp->point.Y = end.Y; end.X = pp.X; end.Y = pp.Y; temp = temp->next; } IS_die(); return; } /* *功能:将数组全部打印一次 */ void Show_game() { COORD p; p.X = 0; p.Y = 0; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), p); Show_snake(); for( int i=0; i<DIM_F; ++i ) { for( int j=0; j<DIM_S; ++j ) { printf( "%c", map[i][j] ); } printf("\n"); } return; } /* *功能:判断是否可以吃食物 *吃到后 把食物加到蛇身 *并且 把食物标识清零 表示当前已经没有食物 */ void Eat_food() { switch( director ) { case DIR_LEFT://向左边移动 if( food_point.X == snake_header->point.X-1 && food_point.Y == snake_header->point.Y ) { Add_snake_node(food_point, food_char); food_flag = 0; } break; case DIR_UP://向上移动 if( food_point.Y == snake_header->point.Y-1 && food_point.X == snake_header->point.X ) { Add_snake_node(food_point, food_char); food_flag = 0; } break; case DIR_RIGHT://向右边移动 if( food_point.X == snake_header->point.X+1 && food_point.Y == snake_header->point.Y ) { Add_snake_node(food_point, food_char); food_flag = 0; } break; case DIR_DOWN://向下移动 if( food_point.Y == snake_header->point.Y+1 && food_point.X == snake_header->point.X ) { Add_snake_node(food_point, food_char); food_flag = 0; } break; default: break; } return; } /* *功能:判断游戏是否结束 */ void IS_die() { Eat_itself(); Meet_fence(); return; } /* *功能:蛇头碰到了蛇身 */ void Eat_itself() { Snake_list temp1 =snake_header, temp2 = snake_header; temp2 = temp1->next; while( temp2 ) { if( temp2->point.X == temp1->point.X && temp2->point.Y == temp1->point.Y ) { COORD point; point.X = DIM_S; point.Y = DIM_F; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), point); printf("吃到自己啦\n"); exit(0); } temp2 = temp2->next; } return; } /* *功能:蛇头碰到了墙 */ void Meet_fence() { if( snake_header->point.X == 0 || snake_header->point.X == DIM_S-1 || snake_header->point.Y == 0 || snake_header->point.Y == DIM_F-1) { COORD point; point.X = DIM_S; point.Y = DIM_F; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), point); printf("撞墙\n"); exit(0); } return; } /* *功能:显示得分 */ void Show_mark() { COORD point; point.X = DIM_S+10; point.Y = DIM_F/2; ++count; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), point); printf("%d 分", count*100); return; }