在贪吃蛇c语言程序中用怎样的数据结构表示一条蛇
时间: 2023-12-09 16:04:36 浏览: 25
通常情况下,我们可以使用一个链表来表示一条蛇,链表中每个节点表示蛇的一个身体部位,节点包含了每个身体部位的位置信息(如x坐标和y坐标)以及指向下一个节点的指针。蛇的头部节点作为链表的头节点,蛇的尾部节点则对应链表的尾节点。这样,在蛇移动的时候,我们只需要修改链表中节点的位置信息即可实现蛇的移动。同时,当蛇吃到食物时,我们只需要在链表的尾部添加一个新的节点即可。
相关问题
编写一个贪吃蛇c语言程序
以下是一个基于C语言编写的贪吃蛇程序,具体实现细节可以参考代码注释:
```c
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
#define WIDTH 30 // 游戏区域宽度
#define HEIGHT 20 // 游戏区域高度
int map[HEIGHT][WIDTH]; // 地图数组,用于存储游戏区域中的元素
int snake[WIDTH*HEIGHT][2]; // 蛇身数组,用于存储蛇身的坐标
int len = 3; // 蛇身长度
int dir = 1; // 蛇头方向,1表示向右,2表示向下,3表示向左,4表示向上
int score = 0; // 得分
// 初始化游戏区域
void initMap() {
int i, j;
for(i = 0; i < HEIGHT; i++) {
for(j = 0; j < WIDTH; j++) {
if(i == 0 || i == HEIGHT-1 || j == 0 || j == WIDTH-1) {
map[i][j] = -1; // 游戏区域边界
} else {
map[i][j] = 0; // 空白区域
}
}
}
}
// 在游戏区域中随机生成一个食物
void createFood() {
int x, y;
do {
x = rand() % (WIDTH-2) + 1;
y = rand() % (HEIGHT-2) + 1;
} while(map[y][x] != 0);
map[y][x] = -2; // 食物
}
// 初始化蛇身
void initSnake() {
int i;
for(i = 0; i < len; i++) {
snake[i][0] = WIDTH/2 + i;
snake[i][1] = HEIGHT/2;
map[snake[i][1]][snake[i][0]] = i == 0 ? 1 : i+1; // 蛇头为1,蛇身为大于1的整数
}
}
// 显示游戏区域
void showMap() {
int i, j;
system("cls"); // 清屏
for(i = 0; i < HEIGHT; i++) {
for(j = 0; j < WIDTH; j++) {
switch(map[i][j]) {
case -1: printf("#"); break; // 游戏区域边界
case -2: printf("$"); break; // 食物
case 0: printf(" "); break; // 空白区域
default: printf("*"); break; // 蛇身
}
}
printf("\n");
}
printf("Score: %d\n", score); // 显示得分
}
// 蛇移动
void move() {
int i;
int x = snake[0][0], y = snake[0][1];
switch(dir) {
case 1: x++; break; // 向右移动
case 2: y++; break; // 向下移动
case 3: x--; break; // 向左移动
case 4: y--; break; // 向上移动
}
if(map[y][x] == -2) { // 吃到食物
len++;
score += 10;
createFood();
} else if(map[y][x] != 0) { // 撞到边界或蛇身
printf("Game Over!\n");
exit(0);
}
map[snake[len-1][1]][snake[len-1][0]] = 0; // 蛇尾变为空白区域
for(i = len-1; i > 0; i--) { // 蛇身移动
snake[i][0] = snake[i-1][0];
snake[i][1] = snake[i-1][1];
map[snake[i][1]][snake[i][0]] = i+1;
}
snake[0][0] = x; // 蛇头移动
snake[0][1] = y;
map[y][x] = 1;
}
// 获取键盘输入
void getInput() {
if(kbhit()) {
switch(getch()) {
case 'w': if(dir != 2) dir = 4; break; // 上
case 's': if(dir != 4) dir = 2; break; // 下
case 'a': if(dir != 1) dir = 3; break; // 左
case 'd': if(dir != 3) dir = 1; break; // 右
}
}
}
int main() {
srand((unsigned)time(NULL)); // 随机数种子
initMap();
createFood();
initSnake();
while(1) {
showMap();
getInput();
move();
Sleep(100); // 控制蛇移动速度
}
return 0;
}
```
写一个贪吃蛇c语言程序
以下是一个简单的贪吃蛇C语言程序:
```c
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#define WIDTH 60
#define HEIGHT 20
int x, y;
int foodX, foodY;
int length = 2;
int snakeX[100], snakeY[100];
int gameOver = 0;
int score = 0;
void setup(){
x = WIDTH / 2;
y = HEIGHT / 2;
srand(time(NULL));
foodX = rand() % (WIDTH - 2) + 1;
foodY = rand() % (HEIGHT - 2) + 1;
}
void draw(){
system("cls");
for(int i = 0; i < WIDTH; i++){
printf("#");
}
printf("\n");
for(int i = 1; i < HEIGHT - 1; i++){
for(int j = 0; j < WIDTH; j++){
if(j == 0 || j == WIDTH - 1){
printf("#");
} else if(i == foodY && j == foodX){
printf("O");
} else if(i == y && j == x){
printf("X");
} else {
int print = 0;
for(int k = 0; k < length; k++){
if(snakeX[k] == j && snakeY[k] == i){
printf("x");
print = 1;
}
}
if(!print){
printf(" ");
}
}
}
printf("\n");
}
for(int i = 0; i < WIDTH; i++){
printf("#");
}
printf("\n");
printf("Score: %d\n", score);
}
void input(){
if(kbhit()){
switch(getch()){
case 'a':
x--;
break;
case 'd':
x++;
break;
case 'w':
y--;
break;
case 's':
y++;
break;
case 'x':
gameOver = 1;
break;
}
}
}
void logic(){
int prevX = snakeX[0];
int prevY = snakeY[0];
int prev2X, prev2Y;
snakeX[0] = x;
snakeY[0] = y;
for(int i = 1; i < length; i++){
prev2X = snakeX[i];
prev2Y = snakeY[i];
snakeX[i] = prevX;
snakeY[i] = prevY;
prevX = prev2X;
prevY = prev2Y;
}
if(x == foodX && y == foodY){
length++;
score += 10;
foodX = rand() % (WIDTH - 2) + 1;
foodY = rand() % (HEIGHT - 2) + 1;
}
if(x < 1 || x > WIDTH - 2 || y < 1 || y > HEIGHT - 2){
gameOver = 1;
}
for(int i = 0; i < length; i++){
if(snakeX[i] == x && snakeY[i] == y){
gameOver = 1;
}
}
}
int main(){
setup();
while(!gameOver){
draw();
input();
logic();
Sleep(100);
}
printf("Game over!\n");
printf("Your score is: %d\n", score);
return 0;
}
```
这个程序使用了简单的ASCII字符图形来显示场景,并在控制台中运行。玩家使用方向键来控制贪吃蛇,吃掉食物并增加分数,当贪吃蛇撞到墙壁或自身时游戏结束。