初级贪吃蛇
来源:互联网 发布:淘宝在线布局工具 编辑:程序博客网 时间:2024/06/05 11:37
1.实现蛇的移动。
#include <stdio.h> #include <stdlib.h>#include <time.h>#define SNAKE_MAX_LENGTH 20#define SNAKE_HEAD 'H'#define SNAKE_BODY 'X'#define VLANK_CELL ' '#define SNAKE_FOOD '$'#define WALL_SELL '*'char map[12][12] = { "************", "*XXXXH *", "* *", "* *", "* *", "* *", "* *", "* *", "* *", "* *", "************",};int snakeX[SNAKE_MAX_LENGTH]={1,2,3,4,5};int snakeY[SNAKE_MAX_LENGTH]={1,1,1,1,1};int snakeLength = 5;int gameRunning=1;void snakeMove(int snakeX[], int snakeY[]){int headX= snakeX[snakeLength-1]; int headY= snakeY[snakeLength-1];char control=_getch(); switch (control) { case 'w': snakeY[snakeLength-1]--; break; case 'a': snakeX[snakeLength-1]--; break; case 's': snakeY[snakeLength-1]++; break; case 'd': snakeX[snakeLength-1]++; break; default: return; } if (map[snakeY[snakeLength-1]][snakeX[snakeLength-1]] != VLANK_CELL && map[snakeY[snakeLength-1]][snakeX[snakeLength-1]] != SNAKE_FOOD) {gameOver();}map[snakeY[snakeLength-1]][snakeX[snakeLength-1]]='H';map[headY][headX]='X';map[snakeY[0]][snakeX[0]]=' ';int i;for(i=0;i<snakeLength-1;i++){ snakeY[i]=snakeY[i+1]; snakeX[i]=snakeX[i+1];}snakeY[snakeLength-2]=headY;snakeX[snakeLength-2]=headX;output();} void put_money(void);void output(){ system("cls"); int i = 0 ; for (i = 0; i < 12; ++i) {int k;for(k = 0;k<12;++k){ printf("%c", map[i][k]); } printf("\n");
}
}
void gameOver() {printf("GAME OVER!!\n");gameRunning = 0;}int main(){output();while (gameRunning) { snakeMove(snakeX,snakeY);}printf("GAME OVER!!\n");}
这样就基本实现了蛇的移动。
2.吃食物和增长蛇身。
#include <stdio.h>#include <stdlib.h>#include <time.h>char BLANK_CHAR = ' ';char WALL_CHAR = '*';char SNAKE_HEAD_CHAR = 'H';char SNAKE_BODY_CHAR = 'X';char FOOD_CHAR = '$';char map[12][13] = { "************", "* *", "* *","* *","* *", "* *", "* *", "* *", "* *", "* *", "* *", "************",};int snakeHeadX = 1, snakeHeadY = 1;int snakeBodyX[100] = {0}, snakeBodyY[100] = {0};int snakeBodyLen = 0;int snakeTailIndex = -1;int willBeLonger = 0;int foodX = 0, foodY = 0;int gameRunning = 1;void printMap() { system("cls"); int i = 0 ; for (i = 0; i < 12; ++i) { printf("%s\n", map[i]); }}void spawnFood() { // Random food position foodX = rand() % 10 + 1; foodY = rand() % 10 + 1; while (map[foodX][foodY] != BLANK_CHAR) { foodX = rand() % 10 + 1;foodY = rand() % 10 + 1; } map[foodX][foodY] = FOOD_CHAR;}void initGame() { // Initialize snake snakeHeadX = snakeHeadY = 1; map[snakeHeadX][snakeHeadY] = SNAKE_HEAD_CHAR; snakeBodyLen = 0; gameRunning = 1; snakeTailIndex = -1; willBeLonger = 0; // Initialize food spawnFood(); // Initialize game gameRunning = 1; printMap();}void gameOver() {system("cls");printf("GAME OVER!!\n");gameRunning = 0;}void snakeMove(char control) { map[snakeHeadX][snakeHeadY] = BLANK_CHAR; // record the previous snake head position int prevSnakeHeadX = snakeHeadX; int prevSnakeHeadY = snakeHeadY; switch (control) { case 'w':snakeHeadX--;break; case 'a':snakeHeadY--;break; case 's':snakeHeadX++;break; case 'd':snakeHeadY++;break; default:return; } if (map[snakeHeadX][snakeHeadY] != BLANK_CHAR && map[snakeHeadX][snakeHeadY] != FOOD_CHAR) { // DIEDgameOver(); }map[snakeHeadX][snakeHeadY] = SNAKE_HEAD_CHAR; int moved = 0; // If willBeLonger, then make it longer if (willBeLonger) {willBeLonger = 0;moved = 1;// make spaceint i;for (i = snakeBodyLen - 1; i > snakeTailIndex; --i) { snakeBodyX[i + 1] = snakeBodyX[i]; snakeBodyY[i + 1] = snakeBodyY[i];}snakeBodyX[snakeTailIndex + 1] = prevSnakeHeadX;snakeBodyY[snakeTailIndex + 1] = prevSnakeHeadY;if (snakeTailIndex < 0) snakeTailIndex = 0;map[prevSnakeHeadX][prevSnakeHeadY] = SNAKE_BODY_CHAR;snakeBodyLen++; } // Check if ate food if (snakeHeadX == foodX && snakeHeadY == foodY) {willBeLonger = 1;spawnFood(); } // Head has already moved, **Move the body** // if "no body" here or added tail just now, then it needn't move if (snakeBodyLen <= 0 || moved) return; map[snakeBodyX[snakeTailIndex]][snakeBodyY[snakeTailIndex]] = BLANK_CHAR; snakeBodyX[snakeTailIndex] = prevSnakeHeadX; snakeBodyY[snakeTailIndex] = prevSnakeHeadY; map[prevSnakeHeadX][prevSnakeHeadY] = SNAKE_BODY_CHAR; // Move tail index snakeTailIndex = (snakeTailIndex - 1 + snakeBodyLen) % snakeBodyLen;}int main() { // Initialize random seed srand(time(NULL)); initGame(); char control = 0; while (gameRunning) {control=_getch(); // " %c": the space is used to skip blank character, like '\n'snakeMove(control);printMap();}
这样就完成了基本的通过wasd来控制的贪吃蛇游戏了。
阅读全文