案例中用到得知识点
比较长的代码SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord);
注意这个的头文件是windows.h
控制移动的代码
_getch是识别你键盘的输入,而_kbhit()是识别是否输入字符
隐藏光标
CONSOLE_CURSOR_INFO cci;
cci.dwSize = sizeof(cci);
cci.bVisible = FALSE;
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci);不要问为什么?打上就对了
代码区
1.创建一个测试文件test.c,里面含有菜单界面就ok
#include<stdio.h>
#include<windows.h>
#include"贪吃蛇.h"
void menu()
{
printf("***************************************\n");
printf("************ 贪吃蛇 *************\n");
printf("***************************************\n");
printf("********* 1. 开始游戏 ************\n");
printf("********* 2. 查看游戏规则 ************\n");
printf("********* 0. 退出游戏 ************\n");}
void game()
{
start_game();
}
void yinchangguangbiao()
{
CONSOLE_CURSOR_INFO cci;
cci.dwSize = sizeof(cci);
cci.bVisible = FALSE;
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci);
}
int main()
{
//隐藏光标
yinchangguangbiao();
srand((unsigned int)time(NULL));
menu();
printf("请输入要选择的选项\n");
int input=0;
scanf("%d", &input);
switch (input)
{
case 1:
{
system("cls");
//设置光标位置
COORD b; b.X = 25; b.Y = 10;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), b);
printf("游戏开始喽\n");
//Sleep(5000);//这个要不要都行,就是停止操作5000ms
system("cls");//清空屏幕操作
game();
break;
}
case 2:
{
printf("游戏规则\n");
break;
}
case 0:
{
printf("退出游戏\n");
break;
}
}
}
2.建立一个贪吃蛇.h文件,里面含有函数声明等,还有结构体变量声明
我这里没有补全函数声明
#pragma once
#include<stdio.h>
#include<windows.h>
#include<stdlib.h>
#include<time.h>
#include<conio.h>#define width 25
#define leng 60
typedef struct place
{
int x;
int y;
}place;
typedef struct snack
{
place body[width * leng];
place food;
int size;
COORD coord;
int dx;
int dy;
int score;
place transmit;
place destination;
}snack;void init_game();
void creatfood();
void move();
void start_game();
3.建立一个贪吃蛇.c文件
#include"贪吃蛇.h"
//画边界
void kuang()
{
for (int i = 0; i <= width+1; i++)
{
for (int j = 0; j <= leng+1 ; j++)
{
if (j == 0 || j == leng+1 || i == 0 || i == width+1 )
printf("+");
else printf(" ");
}
printf("\n");
}
}
//画蛇
void huashe(snack*s1)
{
int i = 0;
while(i<s1->size)
{
s1->coord.X = s1->body[i].x;
s1->coord.Y = s1->body[i].y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), s1->coord);if (i == 0)
{
printf("@");
}
else
{
printf("*");
}
i++;
}
}
//初始化游戏界面
void init_game(snack*s1)
{
s1->destination.x = leng / 2;
s1->destination.y = width / 2;
s1->size = 2;
s1->body[0].x = leng / 2;
s1->body[0].y = width / 2;
s1->body[1].x = leng / 2+1;
s1->body[1].y = width / 2;
s1->dx = 1;
s1->dy = 0;
s1->score = 0;
//1.打印边框
kuang();
//2.画起始位置的蛇
huashe(s1);
//
creatfood(s1);
return s1;
}
//创造食物
void creatfood(snack*s1)
{
s1->food.x = rand() % (leng - 2) + 1;
s1->food.y = rand() % (width - 2) + 1;
s1->coord.X = s1->food.x;
s1->coord.Y = s1->food.y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), s1->coord);
//判断食物是否长在体内
printf("#");int i = 0;
for(i=0;i<s1->size;i++)
{
if (s1->food.x == s1->body[i].x &&
s1->food.y == s1->body[i].y)
{
creatfood(s1);
break;
}
}
}
//吃食物
void eat_food(snack* s1)
{
if (s1->body[0].x == s1->food.x &&
s1->body[0].y == s1->food.y)
{
creatfood(s1);
s1->size++;
s1->score += 10;
}
}
//蛇的移动
void snack_move(snack* s1)
{
s1->coord.X = s1->body[s1->size-1].x;
s1->coord.Y = s1->body[s1->size-1].y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), s1->coord);
printf(" ");
for (int i = s1->size - 1; i > 0; i--)
s1->body[i] = s1->body[i - 1];
s1->body[0].x += s1->dx;
s1->body[0].y += s1->dy;
if(s1->body[0].x==s1->transmit.x&&
s1->body[0].y==s1->transmit.y)
{
s1->body[0].x = s1->destination.x;
s1->body[0].y = s1->destination.y;
}
}
//搭建传送点
void chaunsong(snack* s1)
{
s1->transmit.x = 23;
s1->transmit.y = 10;
s1->coord.X = s1->transmit.x;
s1->coord.Y = s1->transmit.y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), s1->coord);
printf("T");
}
//控制方向
void control_snack(snack* s1)
{
char key = 0;
while (_kbhit())
{
key = _getch();
}
switch (key)
{
case 'a':
{
if(s1->dx!=1)
{
s1->dx = -1;
s1->dy = 0;
}
break;
}
case 'w':
{
if(s1->dy!=1)
{
s1->dx = 0;
s1->dy = -1;
}
break;
}
case 's':
{
if(s1->dy!=-1)
{
s1->dx = 0;
s1->dy = 1;
}
break;
}
case 'd':
{
if(s1->dx!=-1)
{
s1->dx = 1;
s1->dy = 0;
}
break;
}
}
}
//结束游戏界面
void end_game(snack* s1)
{
s1->coord.X = leng/2;
s1->coord.Y = width/2;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), s1->coord);
printf("游戏结束\n");
s1->coord.X = leng / 2;
s1->coord.Y = width / 2+1;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), s1->coord);
printf("你的成绩是:%d", s1->score);
Sleep(3000);
exit(0);
}
//判断是否结束
void is_end(snack* s1)
{
if (s1->body[0].x > leng || s1->body[0].x < 1 ||
s1->body[0].y > width || s1->body[0].y < 1)
end_game(s1);
for (int i = 1; i < s1->size; i++)
{
if (s1->body[0].x == s1->body[i].x &&
s1->body[0].y == s1->body[i].y)
end_game(s1);
}
}
//开始游戏
void start_game()
{
//初始化界面
snack* s1 = (snack*)malloc(sizeof(snack));
init_game(s1);
while (1)
{
chaunsong(s1);
//改变蛇的方向
control_snack(s1);
//蛇的移动
snack_move(s1);
//画蛇
huashe(s1);
//蛇吃食物
eat_food(s1);
//判断结束
//1.越界
//2.咬到自己
is_end(s1);
Sleep(100);
}
}
如果要其他玩法,可以自行补齐。