1、玩法
贪吃蛇游戏是一款经典的益智游戏,有PC和手机等多平台版本。既简单又耐玩。该游戏通过控制蛇头方向吃蛋,从而使得蛇变得越来越长。
2、游戏表示
给定一个10*10的字符矩阵表示蛇的生存空间,其中有一条长度5的蛇(HXXXX), “H”表示蛇头,“X”表示蛇身体。空间中可能有食物(“$”表示)和障碍物(“*”表示)
你可以使用“ADWS”按键分别控制蛇的前进方向“左右上下”, 当蛇头碰到自己的身体或走出边界,游戏结束,否则蛇按你指定方向前进一步。
代码如下(蛇是按一次键盘走一次的而且还有其他bug哈哈哈哈哈哈)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define SNAKE_MAX_LENGTH 100
#define SNAKE_HEAD 'H'
#define SNAKE_BODY 'X'
#define BLANK_CELL ' '
#define SNAKE_FOOD '$'
#define WALL_CELL '*'
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 ; //初始化蛇的长度
/*控制蛇的移动以及吃到食物蛇变长*/
void snakeMove(char ch) {
//char ch = _getch();
int lastx = snakeX[0];
int lasty = snakeY[0];//保存蛇尾左边
int i, j;
for (i = 0; i < snakeLength - 1; i ++) {
snakeX[i] = snakeX[i + 1];
snakeY[i] = snakeY[i + 1];
map[snakeY[i]][snakeX[i]] = 'X';
} //蛇身坐标往前挪
switch(ch) {
case 'a':
snakeX[snakeLength-1] -= 1; //左移,改变蛇头坐标
break;
case 'd':
snakeX[snakeLength-1] += 1; //右移, 改变蛇头坐标
break;
case 's':
snakeY[snakeLength-1] += 1; //上移,改变蛇头坐标
break;
case 'w':
snakeY[snakeLength-1] -= 1; //下移,改变蛇头坐标
break;
}
// printf("%d ", snakeY[snakeLength - 1]);
if (map[snakeY[snakeLength-1]][snakeX[snakeLength-1]] == '$') { //如果吃到钱
snakeLength += 1; //长度加一
for (i = snakeLength - 1; i > 0; i --) {
snakeX[i] = snakeX[i - 1];
snakeY[i] = snakeY[i - 1];
map[snakeY[i]][snakeX[i]] = 'X';
} // 蛇的坐标往前挪
snakeX[0] = lastx;
snakeY[0] = lasty;//蛇尾坐标等于移动前蛇尾坐标
map[lasty][lastx] = 'X';
}
map[snakeY[snakeLength-1]][snakeX[snakeLength-1]] = 'H'; //蛇头
}
/*放置食物*/
void put_money() { //如果界面内没有 $,在随机的位置上放置 $
int i, j, ah = 1;
for (i = 1; i < 11; i ++) {
for (j = 1; j < 11; j ++) {
if (map[i][j] == '$') {
ah = 0;
break;
}
}
}
while (ah) {
int a = rand() % 9 + 1;
int b = rand() % 9 + 1;
if (map[a][b] == ' ') {
map[a][b] = '$';
break;
}
}
}
void set() { //把界面内不是 $ 的全部 变为空格
int i, j;
for (i = 1; i < 11; i ++) {
for (j = 1; j < 11; j ++)
if (map[i][j] != '$')
map[i][j] = ' ';
}
}
void show() { //打印界面
int i, j;
for (i = 0; i < 12; i ++) {
for (j = 0; j < 12; j ++) {
putchar(map[i][j]);
}
putchar('\n');
}
}
int gameover() {
int i, j;
for (j = 0; j < 12; j ++) { //撞墙 死
if (map[0][j] == 'H' || map[j][0] == 'H' || map[11][j] == 'H' || map[j][11] == 'H') {
printf("Game Over");
return 0;
}
}
for (i = 0; i < snakeLength - 1; i ++) { //吃自己 死
if (snakeX[snakeLength - 1] == snakeX[i] && snakeY[snakeLength - 1] == snakeY[i])
return 0;
}
return 1;
}
int main() {
char ch;
show();
while (gameover()) {
ch = _getch();
system("cls"); //清屏
set();
snakeMove(ch);
put_money();
show();
}
}