您的位置:首页 > 其它

贪吃蛇

2015-12-28 19:50 369 查看

基础版

(原谅一只小辣鸡目前只做到这里,还没有实现自动跑起

// main.c
// snake
// by hling so

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include <windows.h>

#define SNAKE_MAX_LENGTH 20
#define SANKE_HEAD 'H'
#define SNAKE_BODY 'X'
#define BLANK_CELL ' '
#define SNAKE_FOOD '$'
#define WALL_CELL '*'

//snake stepping: dy = -1(up), 1(down); dx = -1(left),1(right),0(o=no move)
void snakeMove(int, int);
//put a food randomized on a blank cell
void put_money(void);
//out cells of the grid
void output(void);
//outs when gameover
void gameover(void);
//move
void move(void);

char map[12][12] =
{"************",  // 初始状态
"*          *",  // 直接打表
"*          *",
"*          *",
"*          *",
"*          *",
"*          *",
"*          *",
"*          *",
"*          *",
"*          *",
"************"};

//define vars for snake, notice name of vars in C
int snakeX[SNAKE_MAX_LENGTH] = {1, 2, 3, 4, 5};
int snakeY[SNAKE_MAX_LENGTH] = {1, 1, 1, 1, 1};
int snakeLength = 5;
int gamelife = 1;
char s[2];
int inputflag = 1;  //无效输入的标记
int moneyx, moneyy;  //钱币坐标
int moneycount = 0;  //钱币数量

int main() {
srand(time(NULL));
put_money();
output();
while(gamelife == 1) {
printf("please input w/W for up,a/A for left,d/D for right,s/S for down\n");
scanf("%s", s);
move();
if (inputflag == 0) {
inputflag = 1;
continue;
}
system("cls");
put_money();
output();
if(gamelife == 0)
gameover();
}
return 0;
}
void output(void) {
gamel
4000
ife = 0; //如果这次的行走不合法,将终止游戏
int i, j, k, snakeflag = 0, pos;  // snakeflag为1表明该点为蛇
for (i = 0; i < 12; i++) {
for (j = 0; j < 12; j++) {
//判断是否为蛇所在位置,是则输出蛇,否则输出地图
for (k = 0; k < snakeLength; k++) {

if (j == snakeX[k] && i == snakeY[k]) {
snakeflag = 1;  // 蛇的一部分,标记
break;
}
}
if (snakeflag == 1) {  //是蛇所以打印蛇
if (k == snakeLength - 1) {
if(i == 0 || i == 11 || j == 0 || j == 11) {
printf("H");
gamelife = 0;  // 蛇撞墙, 游戏结束
} else {  // 蛇头没有撞墙
printf("H");
gamelife = 1;  //有蛇头输出,说明蛇头没有碰到身体,游戏可以继续
}

} else {
printf("X");  // 蛇身
}
}
else {
if (i == moneyy && j == moneyx) // 钱币所在位置
printf("$");
else
printf("%c", map[i][j]);
}
snakeflag = 0;
}
printf("\n");
}
}
void snakeMove(int movex, int movey) {
int i;
if((snakeX[snakeLength - 1] + movex) == moneyx &&
(snakeY[snakeLength - 1] + movey) == moneyy  &&
snakeLength <SNAKE_MAX_LENGTH) {  // 如果吃了钱币并且蛇还没到最长
snakeLength++;                    // 蛇的长度加一
snakeX[snakeLength - 1] = moneyx;
snakeY[snakeLength - 1] = moneyy;
moneycount = 0;
} else {                              // 否则, 蛇只移动.
for(i = 0; i < snakeLength - 1; i++) {
snakeX[i] = snakeX[i + 1];
snakeY[i] = snakeY[i + 1];
}
snakeX[snakeLength - 1] = snakeX[snakeLength - 2] + movex;
snakeY[snakeLength - 1] = snakeY[snakeLength - 2] + movey;
}
}
void gameover(void) {
printf("--------------\nSORRY!GAMEOVER\n--------------\n");
}

void move(void) {
if (s[0] == 'w' || s[0] == 'W') {
// 如果蛇本来向下走, 输入w无效
if (snakeX[snakeLength - 1] == snakeX[snakeLength - 2] &&
snakeY[snakeLength - 1] == snakeY[snakeLength - 2] + 1);
// 否则,蛇向上走一格
else
snakeMove(0, -1);
} else if (s[0] == 's' || s[0] == 'S') {
// 如果蛇本来向上走, 输入s无效
if (snakeX[snakeLength - 1] == snakeX[snakeLength - 2] &&
snakeY[snakeLength - 1] == snakeY[snakeLength - 2] - 1);
// 否则,蛇向下走一格
else
snakeMove(0, 1);
} else if (s[0] == 'a' || s[0] == 'A') {
// 如果蛇本来向上右, 输入a无效
if (snakeX[snakeLength - 1] == snakeX[snakeLength - 2] + 1&&
snakeY[snakeLength - 1] == snakeY[snakeLength - 2] );
// 否则,蛇向左走一格
else
snakeMove(-1, 0);
} else if (s[0] == 'd' || s[0] == 'D') {
// 如果蛇本来向左走, 输入d无效
if (snakeX[snakeLength - 1] == snakeX[snakeLength - 2] - 1&&
snakeY[snakeLength - 1] == snakeY[snakeLength - 2] );
// 否则,蛇向右走一格
else
snakeMove(1, 0);
} else {
inputflag = 0; // 如果输入不是wsad,则提示正确输入
}
}

void put_money(void) {
int flag = 1; // 钱币刚好落在蛇身上或墙上的标志
if (moneycount == 0) {  // 如果没有钱币就加一个
while (flag == 1) {
int tempx = rand() % 11;
int tempy = rand() % 11;
flag = 0;
int i;
// 查看钱币是否落在蛇身上或是否在墙上
for (i = 0; i < snakeLength; i++) {
if ((tempx == snakeX[i] && tempy == snakeY[i]) ||
tempx == 0 || tempy == 0) {
flag = 1;
break;
}
}
if (flag == 0) {
moneycount = 1;
moneyx = tempx;
moneyy = tempy;
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: