贪吃蛇

来源:互联网 发布:2017java饱和了吗知乎 编辑:程序博客网 时间:2024/04/30 14:11

基础版

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

// 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 cellvoid put_money(void);//out cells of the gridvoid output(void);//outs when gameovervoid gameover(void);//movevoid move(void); char map[12][12] =     {"************",  // 初始状态      "*          *",  // 直接打表      "*          *",     "*          *",     "*          *",     "*          *",     "*          *",     "*          *",     "*          *",     "*          *",     "*          *",     "************"};//define vars for snake, notice name of vars in Cint 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) {    gamelife = 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;            }        }    }}
0 0