#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<locale.h>
#include<stdbool.h>
#include<time.h>
enum direction//蛇的方向
{
up,
down,
left,
right
};
//蛇的状态,存活,撞墙,撞自己,正常退出
enum Status
{
ok,
killwall,
killself,
endnormal,
};
//蛇的节点
typedef struct node
{
int x;
int y;
struct node* next;
}node, * pnode;
typedef struct snake
{
pnode phead;//蛇头
pnode pfood;//食物
enum direction dir;//蛇的方向
enum Status status;//游戏的状态
int food_score;//食物的分数
int sleep;
int sum;//总成绩
}Snake, * pSnake;
void setpos(short x, short y);
void gamestart(pSnake psnake);
void initsnake(pSnake psnake);
void creatfood(pSnake psnake);
void gamerun(pSnake psnake);
void killbywall(pSnake psnake);
void killbyself(pSnake psnake);
void gameover(pSnake psnake);
#define she L'●'
#define wall L'■'
#define food L'★'
#define keypress(vk) ((GetAsyncKeyState(vk)&1)?1:0)//判断是否按过某一个按键,1表示按过,0表示没按过
void setpos(short x, short y)//设置光标的位置
{
HANDLE houtput = GetStdHandle(STD_OUTPUT_HANDLE);
COORD pos = { x,y };
SetConsoleCursorPosition(houtput, pos);
}
void initsnake(pSnake psnake)
{
for (int i = 0; i < 6; i++)
{
pnode pcur = (pnode)malloc(sizeof(node));
if (pcur == NULL)
{
perror("malloc");
return;
}
pcur->next = NULL;
pcur->x = 24 + 2 * i;
pcur->y = 5;
if (psnake->phead == NULL)
psnake->phead = pcur;
else
{
pcur->next = psnake->phead;
psnake->phead = pcur;
}
}
pnode pcur = psnake->phead;
while (pcur)
{
setpos(pcur->x, pcur->y);
wprintf(L"%lc", she);
pcur = pcur->next;
}
psnake->dir = right;
psnake->sum = 0;
psnake->food_score = 10;
psnake->sleep = 200;//ms
psnake->status = ok;
}
void creatfood(pSnake psnake)
{
int x = 0;
int y = 0;
again:
do
{
x = rand() % 53 + 2;
y = rand() % 25 + 1;
} while (x % 2 != 0);
//不能与蛇重合
pnode pcur = psnake->phead;
while (pcur)
{
if (x == pcur->x && y == pcur->y)
goto again;
pcur = pcur->next;
}
//创建食物节点
pnode pfood = (pnode)malloc(sizeof(node));
if (pfood == NULL)
{
perror("malloc");
return;
}
pfood->x = x;
pfood->y = y;
pfood->next = NULL;
setpos(x, y);
wprintf(L"%lc", food);
psnake->pfood = pfood;
}
void gamestart(pSnake psnake)
{
system("mode con cols=100 lines=30");
system("title Hungry Snake!");
HANDLE houtput = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO cursorinf;
GetConsoleCursorInfo(houtput, &cursorinf);
cursorinf.bVisible = false;
SetConsoleCursorInfo(houtput, &cursorinf);
// 1.打印欢迎界面,功能介绍
setpos(40, 14);
printf("welcom to hungry snake");
setpos(42, 20);
system("pause");
system("cls");
setpos(25, 13);
wprintf(L"用↑ ↓ ← →来控制蛇的移动方向,按F3加速,F4减速\n");
setpos(35, 14);
wprintf(L"加速能获得更高的分数\n");
setpos(42, 20);
system("pause");
system("cls");
// 3.绘制地图
for (int i = 0; i < 29; i++)
wprintf(L"%lc", L'■');
setpos(0, 26);
for (int i = 0; i < 29; i++)
wprintf(L"%lc", L'■');
for (int i = 1; i <= 25; i++)
{
setpos(0, i);
wprintf(L"%lc", L'■');
}
for (int i = 1; i <= 25; i++)
{
setpos(56, i);
wprintf(L"%lc", L'■');
}
// 4.创建蛇
initsnake(psnake);
// 5.创建食物
creatfood(psnake);
}
void printinfo()
{
setpos(64, 10);
printf("%s", "不能穿墙,不能碰到自己\n");
setpos(64, 11);
printf("用↑ ↓ ← →来控制蛇的移动方向\n");
setpos(64, 12);
printf("按F3加速,F4减速\n");
setpos(64, 13);
printf("按ESC退出游戏,空格暂停游戏\n");
setpos(64, 19);
printf("VE出品必精品\n");
}
void snakemove(pSnake psnake)
{
pnode newnode = (pnode)malloc(sizeof(node));
if (newnode == NULL)
{
perror("malloc");
return;
}
switch (psnake->dir)
{
case up:
newnode->x = psnake->phead->x;
newnode->y = psnake->phead->y - 1;
break;
case down:
newnode->x = psnake->phead->x;
newnode->y = psnake->phead->y + 1;
break;
case right:
newnode->x = psnake->phead->x + 2;
newnode->y = psnake->phead->y;
break;
case left:
newnode->x = psnake->phead->x - 2;
newnode->y = psnake->phead->y;
break;
}
if ((psnake->pfood->x) == newnode->x && (psnake->pfood->y) == newnode->y)//吃到食物
{
psnake->pfood->next = psnake->phead;
psnake->phead = psnake->pfood;
free(newnode);
newnode = NULL;
pnode pcur = psnake->phead;
while (pcur)
{
setpos(pcur->x, pcur->y);
wprintf(L"%lc", she);
pcur = pcur->next;
}
psnake->sum += psnake->food_score;
creatfood(psnake);
}
else
{
newnode->next = psnake->phead;
psnake->phead = newnode;
pnode pcur = psnake->phead;
while (pcur->next->next)
{
setpos(pcur->x, pcur->y);
wprintf(L"%lc", she);
pcur = pcur->next;
}
setpos(pcur->next->x, pcur->next->y);
printf(" ");
free(pcur->next);
pcur->next = NULL;
}
if (psnake->phead->x == 0 || psnake->phead->x == 56 ||
psnake->phead->y == 0 || psnake->phead->y == 26)
{
psnake->status = killwall;
return;
}
else
{
pnode cur = psnake->phead->next;
while (cur)
{
if (cur->x == psnake->phead->x && cur->y == psnake->phead->y)
{
psnake->status = killself;
return;
}
cur = cur->next;
}
}
}
void gamerun(pSnake psnake)
{
printinfo();
do
{
setpos(64, 8);
printf("总分:%d\n", psnake->sum);
setpos(64, 9);
printf("食物的分数:%2d\n", psnake->food_score);
if (keypress(VK_UP) && psnake->dir != down)
psnake->dir = up;
else if (keypress(VK_DOWN) && psnake->dir != up)
psnake->dir = down;
else if (keypress(VK_RIGHT) && psnake->dir != left)
psnake->dir = right;
else if (keypress(VK_LEFT) && psnake->dir != right)
psnake->dir = left;
else if (keypress(VK_SPACE))
{
while (1)
{
Sleep(200);
if (keypress(VK_SPACE))
break;
}
}
else if (keypress(VK_ESCAPE))
psnake->status = endnormal;
else if (keypress(VK_F3))
{
if (psnake->food_score < 22)
{
psnake->sleep -= 30;
psnake->food_score += 2;
}
}
else if (keypress(VK_F4))
{
if (psnake->food_score > 2)
{
psnake->sleep += 30;
psnake->food_score -= 2;
}
}
snakemove(psnake);
Sleep(psnake->sleep);
} while (psnake->status == ok);
}
void gameover(pSnake psnake)
{
setpos(24, 12);
switch (psnake->status)
{
case(endnormal):
printf("主动退出游戏\n");
break;
case(killself):
printf("已经紫砂\n");
break;
case(killwall):
printf("一头撞死了\n");
break;
}
pnode pcur = psnake->phead;
while (pcur)
{
pSnake ret = pcur->next;
free(pcur);
pcur = ret;
}
}
void test()
{
char ch = 0;
do//创建蛇
{
system("cls");
Snake snake = { 0 };
//初始化游戏
gamestart(&snake);
//运行游戏
gamerun(&snake);
//结束游戏
gameover(&snake);
setpos(20, 15);
printf("再来一把,多好玩(Y/N):");
ch = getchar();
getchar();//清理\n
} while (ch == 'Y'||ch=='y');
setpos(0, 27);
}
int main()
{
//设置适配本地环境
setlocale(LC_ALL, "");
srand((unsigned int)time(NULL));
test();
return 0;
}
c语言实现贪吃蛇
最新推荐文章于 2024-10-12 22:54:21 发布