具体的实现方法,及相应的函数,程序中也有详细的讲解,代码可直接复制运行。(此次运行实在VS2013下完成)
贪吃蛇运行结果:
代码实现: #include <stdio.h> #include <Windows.h> #include <time.h> #include <conio.h> #define MAX_WIDE 60 #define MAX_HIGH 20 //蛇身结构体 包含蛇体长度len 和 蛇身数组 struct snake{ short len; short body[MAX_WIDE*MAX_HIGH]; }snake; short dx = 1, dy = 0, randxy, score = 0; //dx为横坐标 dy为纵坐标 COORD coord; //定位光点坐标 void draw() { for (short i = 0; i < snake.len; i++) { coord.X = snake.body[i] & 127; //横坐标取body[i]的低八位 coord.Y = snake.body[i] >> 8; //纵坐标取body[i]的高八位 SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord); //找到蛇身所有光点坐标 putchar('@'); //给蛇身光点坐标处放@显示 } coord.X = randxy & 127; // coord.Y = randxy >> 8; //随机放置一个光点*作为食物 SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord); putchar('*'); //显示随机放置的光点 } void run() { char key='t'; short i, j; while (snake.body[0] > 0 && ((snake.body[0] & 127) < MAX_WIDE) && (snake.body[0] >> 8 < MAX_HIGH))//蛇头的横纵临界值 { draw(); //画蛇添足 for (; _kbhit();) key = _getch(); //循环得到键值控制方向 switch (key) { case 'w' : dx = 0, dy = -1; break; case 's' : dx = 0, dy = 1; break; case 'a' : dx = -1, dy = 0; break; case 'd' : dx = 1, dy = 0; break; } for (j = 1; j < snake.len;j++) if (snake.body[j] == snake.body[0]) //蛇头和蛇身相碰就 GG return; if (randxy == snake.body[0]) //随机光点和蛇头相碰则加长蛇身 { snake.len++,score += 10; //蛇身加一 得分加十 randxy = ((rand() % 16 + 0) << 8) | (rand() % 50 + 0); //随机在矩形范围内产生光点的坐标 } for (i = snake.len - 1; i > 0; i--) snake.body[i] = snake.body[i - 1]; //蛇身整体向前挪动一位 snake.body[0] = ((snake.body[0] & 127) + dx) | ((snake.body[0] >> 8) + dy) << 8; //新的蛇头的位置 Sleep(300); //延时 system("cls"); //屏幕刷新 } } int main() { while (1) { snake.body[MAX_WIDE*MAX_HIGH] = 0; snake.body[0] = (MAX_HIGH / 2) << 8 | MAX_WIDE / 2; //初始化蛇头 snake.len = 1; //初始化蛇身长度 srand((unsigned)time(NULL)); //随机值计时 即以后不会出现重复的随机值 randxy = ((rand() % 16 + 0) << 8) | (rand() % 50 + 0); //第一次随机产生一个光点 SMALL_RECT rect; rect.Top = 0, rect.Left = 0; // 定义一个矩形框 左上为0 0 下右为 MAX_HIGH 高 MAX_WIDE 宽 rect.Bottom = MAX_HIGH, rect.Right = MAX_WIDE; SetConsoleWindowInfo(GetStdHandle(STD_OUTPUT_HANDLE), true, &rect); run(); printf("Your Score:%d", score); printf("continue? y/n \n"); char ch; ch = getchar(); if (ch == 'n') break; } return 0; }