#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<conio.h>
#include<time.h>
#define wide 80
#define high 24
int speed=150;
struct Food { //食物
int x;
int y;
} food;
void gotoxy(int x, int y) {
//光标跳转
COORD pos;
pos.X = x;
pos.Y = y;
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(handle, pos);
}
void HideCursor() {
//隐藏光标
CONSOLE_CURSOR_INFO cursor_info = {1,0};
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}
void map() {
//地图
for(int i=1; i<wide; i+=2) {
gotoxy(i+1,1);
printf("\033[33m■\033[0m");
gotoxy(i+1,high-1);
printf("\033[33m■\033[0m");
}
for(int i=1; i<high; i++) {
gotoxy(0,i);
printf("\033[33m■\033[0m");
gotoxy(wide,i);
printf("\033[33m■\033[0m");
}
}
void intfood() {
//食物生成
srand((unsigned int)time(NULL));
while(1) {
food.x=rand()%(wide-3)+2;
food.y=rand()%(high-3)+2;
if(food.x%2==0)
break;
}
gotoxy(food.x,food.y);
printf("\033[32m●\033[0m");
}
struct Snake { //蛇
int x[66666];
int y[66666];
int len;
} snake;
void intsnake() { //初始化蛇位置
snake.len=2;
snake.x[0]=wide/2-20;
snake.y[0]=high/2;
for(int i=1; i<snake.len; i++) {
snake.x[i]=snake.x[i-1]+2;
snake.y[i]=snake.y[i-1];
}
}
void creatfood() { //随机食物
if(snake.x[0]==food.x&&snake.y[0]==food.y) { //蛇头吃食物 加长
snake.len++;
srand((unsigned int)time(NULL));
while(1) {
int flag = 1;//是否需要生成食物
food.x=rand()%(wide-3)+2;
food.y=rand()%(high-3)+2;
//食物不能在蛇身上
for (int i = 0; i < snake.len; i++) {
if (snake.x[i] == food.x && snake.y[i] == food.y) {
flag = 0;
break;
}
}
if(flag!=0&&food.x%2==0) {
break;
}
}
gotoxy(food.x,food.y);
printf("\033[32m●\033[0m");
}
}
int key='w' ;
void move() { //3.按键
int i, temp;
if (_kbhit()) { //kbhit函数检查当前是否有键盘输入,若有则返回一个非0值,否则返回0
fflush(stdin);// 清空输入缓冲区,通常是为了确保不影响后面的数据读取
temp = _getch();//getch:从控制台读取一个字符,但不显示在屏幕上
if ((temp == 'a' || temp == 'A') && (key != 'D' && key != 'd')) { //解决了按反方向键蛇自杀的问题
key = temp;
}
if ((temp == 'w' || temp == 'W') && (key != 's' && key != 'S')) {
key = temp;
}
if ((temp == 's' || temp == 'S') && (key != 'W' && key != 'w')) {
key = temp;
}
if ((temp == 'D' || temp == 'd') && (key != 'a' && key != 'A')) {
key = temp;
}
}
//擦除最后一节
gotoxy(snake.x[snake.len - 1], snake.y[snake.len - 1]);
printf(" ");
for (i = snake.len - 1; i > 0; i--) {
snake.x[i] = snake.x[i - 1];
snake.y[i] = snake.y[i - 1];
gotoxy(snake.x[i], snake.y[i]);
printf("\033[32m□\033[0m");
}
switch (key) {
case'w':
case'W':
snake.y[0]--;
break;
case's':
case'S':
snake.y[0]++;
break;
case'a':
case'A':
snake.x[0] -= 2;
break;
case'd':
case'D':
snake.x[0] += 2;
break;
}
gotoxy(snake.x[0], snake.y[0]);
printf("\033[32m■\033[0m");
}
int snakedie() { //蛇死亡状态
if ((snake.x[0] == 0 || snake.x[0] == wide) || (snake.y[0] == 1 || snake.y[0] == high-1)) {
return 1;//判断是否撞墙
}
for (int i = 1; i < snake.len; i++) {
if (snake.x[0] == snake.x[i] && snake.y[0] == snake.y[i])
return 1;//蛇是否撞自己
}
return 0;
}
int main() {
HideCursor();
map();
intfood();
intsnake();
while(1) {
creatfood();
move();
Sleep(speed);
if(snakedie()) {
gotoxy(wide/2-5,high/2);
printf("Game Over! \n\n\n\n\n\n\n\n\n\n\n\n");
exit(0) ;
}
}
}
c语言贪吃蛇基本框架,超简短不到200行
于 2023-09-10 23:09:18 首次发布