以下是用c语言写的贪吃蛇的代码,我想知道这段代码哪段用了数据结构的知识,又用了哪些数据解耦的知识
时间: 2024-02-21 10:00:03 浏览: 28
以下是代码:
```
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
#include <time.h>
#define MAXSIZE 1000
typedef struct node{
int x;
int y;
}Node;
typedef struct snake{
Node body[MAXSIZE];
int length;
int direction;
}Snake;
Node food;
int score;
void init(Snake *snake)
{
int i;
snake -> length = 3;
snake -> direction = 77;
for(i = 0; i < snake -> length; i++){
snake -> body[i].x = 20 - i;
snake -> body[i].y = 20;
}
srand(time(NULL));
food.x = rand() % 38 + 1;
food.y = rand() % 18 + 1;
score = 0;
}
void draw(Snake *snake)
{
int i;
system("cls");
printf("score:%d\n\n", score);
for(i = 0; i < snake -> length; i++){
printf("@");
if(i == snake -> length - 1){
printf(">");
}
}
printf("\n\n");
for(i = 0; i < 20; i++){
printf("# #\n");
}
for(i = 0; i < snake -> length; i++){
gotoxy(snake -> body[i].x, snake -> body[i].y);
printf("*");
}
gotoxy(food.x, food.y);
printf("$");
}
void updateWithoutInput(Snake *snake)
{
int i;
for(i = 0; i < snake -> length - 1; i++){
snake -> body[i] = snake -> body[i + 1];
}
switch(snake -> direction){
case 75:snake -> body[snake -> length - 1].x--;break;
case 77:snake -> body[snake -> length - 1].x++;break;
case 72:snake -> body[snake -> length - 1].y--;break;
case 80:snake -> body[snake -> length - 1].y++;break;
}
if(snake -> body[snake -> length - 1].x == food.x && snake -> body[snake -> length - 1].y == food.y){
snake -> length++;
score += 10;
food.x = rand() % 38 + 1;
food.y = rand() % 18 + 1;
}
}
void updateWithInput(Snake *snake)
{
char input;
if(kbhit()){
input = getch();
switch(input){
case 75:
case 80:
case 77:
case 72:
if(abs(snake -> direction - input) != 2){
snake -> direction = input;
}
break;
default:break;
}
}
updateWithoutInput(snake);
}
int check(Snake *snake)
{
int i;
if(snake -> body[snake -> length - 1].x == 0 || snake -> body[snake -> length - 1].x == 39 || snake -> body[snake -> length - 1].y == 0 || snake -> body[snake -> length - 1].y == 19){
return 1;
}
for(i = 0; i < snake -> length - 1; i++){
if(snake -> body[snake -> length - 1].x == snake -> body[i].x && snake -> body[snake -> length - 1].y == snake -> body[i].y){
return 1;
}
}
return 0;
}
int main()
{
Snake snake;
init(&snake);
while(1){
draw(&snake);
Sleep(200);
updateWithInput(&snake);
if(check(&snake) == 1){
printf("\n\n\n\n\n\n\n\n\n\n Game over!\n\n");
system("pause");
return 0;
}
}
return 0;
}
```
这段代码用了如下的数据结构:
1. 链表:通过定义Node结构体,把每个节点的坐标定义为Node结构体的成员,从而形成一个链表,表示蛇的身体;
2. 结构体:通过定义Snake结构体,把蛇的身体和方向等信息封装在一起,方便处理;
这段代码用了如下的数据解耦的知识:
1. 模块化编程:通过定义多个函数,把不同的功能模块分离开来,使得代码结构更加清晰,易于维护和扩展;
2. 抽象化:通过把蛇的身体和方向等信息封装在Snake结构体中,把食物的坐标封装在food结构体中,使得代码更加简洁,易于理解。