#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<time.h>
#include<windows.h>
enum snakePosition { up, down, left, right };
typedef struct Point {
int x, y;
int sum;
char position;
int point;
}MYPOINT;
//初始化边界坐标
void initside(MYPOINT *sidexy) {
int i, j, sum = 0;
for (i = 0; i <= 15; i++) {
sidexy[sum].x = 0;
sidexy[sum].y = i * 2;
sum++;
}
for (i = 0; i <= 15; i++) {
sidexy[sum].x = 15;
sidexy[sum].y = i * 2;
sum++;
}
for (i = 0; i <= 14; i++) {
sidexy[sum].x = i;
sidexy[sum].y = 0;
sum++;
}
for (i = 0; i <= 14; i++) {
sidexy[sum].x = i;
sidexy[sum].y = 30;
sum++;
}
}
//定义位置
void gotoxy(int x, int y){
COORD position = { y,x };
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), position);
}
//打印首页
void menu() {
printf("□□□□□□□□□□□□□□□□\n");
printf("□ □\n");
printf("□ 欢迎运行 贪吃蛇 游戏程序 □\n");
printf("□ □\n");
printf("□ 制作:2019020171 JHZ □\n");
printf("□ □\n");
printf("□ 操作方法: 上:w 下:s □\n");
printf("□ 左:a 右:d □\n");
printf("□ 难度:1简单 2中等 3巨难 □\n");
printf("□ □\n");
printf("□ 规则:头碰身、墙则游戏失败 □\n");
printf("□ □\n");
printf("□ ※ 数字键选择“难度” ※ □\n");
printf("□ □\n");
printf("□ 注:Ctrl+滚轮 放大游戏窗口 □\n");
printf("□ □\n");
printf("□□□□□□□□□□□□□□□□\n");
gotoxy(17, 2);
printf("※ ※ 祝您玩的愉快 ※ ※");
}
//隐藏光标
void HideCursor() {//隐藏光标
CONSOLE_CURSOR_INFO cursor_info = { 1, 0 };
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}
//刷新游戏边界
void game_side(MYPOINT *sidexy) {
int i;
for (i = 0; i < 63; i++) {
gotoxy(sidexy[i].x, sidexy[i].y);
printf("□");
}
}
//创建第一只蛇
void firstsnake(MYPOINT *body) {
body[0].x = 1;
body[0].y = 8;
body[1].x = 1;
body[1].y = 6;
body[2].x = 1;
body[2].y = 4;
body[3].x = 1;
body[3].y = 2;
body->sum = 4;
body->position = right;
}
//按键反应
void keyboard(MYPOINT *body) {
char poz = _getch();
switch (poz)
{
case VK_UP:
case'w':
case'W':
if (body->position != down)
body->position = up;
break;
case VK_DOWN:
case's':
case'S':
if (body->position != up)
body->position = down;
break;
case VK_LEFT:
case'a':
case'A':
if (body->position != right)
body->position = left;
break;
case VK_RIGHT:
case'd':
case'D':
if (body->position != left)
body->position = right;
break;
}
}
//蛇的移动
void snakemove(MYPOINT *body) {
//身体
int i;
for (i = body->sum - 1; i > 0; i--)
{
body[i].x = body[i - 1].x;
body[i].y = body[i - 1].y;
}
//蛇头
switch (body->position)
{
case up:
body[i].x -= 1;
break;
case down:
body[i].x += 1;
break;
case right:
body[i].y += 2;
break;
case left:
body[i].y -= 2;
break;
}
}
//游戏结束
int gameover(MYPOINT *body, MYPOINT *sidexy, MYPOINT *egg) {
int i;
int flag = 0;
if (body[0].x == egg->x&&body[0].y == egg->y) return 1;
for (i = 0; i < 63; i++) {
if (body[0].x == sidexy[i].x&&body[0].y == sidexy[i].y)return 1;
}
for (i = 1; body[i].x != '\0' && body[i].y != '\0'; i++) {
if (body[0].x == body[i].x&&body[0].y == body[i].y) return 1;
}
return 0;
}
//分数总结目录
void point_summary(MYPOINT *body) {
system("color 0B");
if(body->sum<=10)printf("□□□□□□□□□□□□□□□□□\n");
else printf("□□□□□□□□□□□□□□□□\n");
printf("□ □\n");
printf("□ 贪吃蛇 □\n");
printf("□ □\n");
printf("□ 游戏结束 □\n");
printf("□ □\n");
printf("□ 您最后的分数是: □\n");
printf(" > %4d < \n",body->point);
printf("□ □\n");
printf("□ 蛇最后的长度为: □\n");
printf(" > %4d < \n",body->sum);
printf("□ □\n");
printf("□ ※ 任意键关闭窗口 ※ □\n");
printf("□ □\n");
printf("□ 制作:2019020171 JHZ □\n");
printf("□ □\n");
printf("□□□□□□□□□□□□□□□□\n");
gotoxy(18, 0);
printf(" 现在时间: ");
system("date /T");
_getch();
}
int main() {
//x是行,,y是列
int flag , lon;
int limit[14] = { 2,4,6,8,10,12,14,16,18,20,22,24,26,28 };
int level;
MYPOINT sidexy[63];
MYPOINT body[196] = {'\0'};
MYPOINT egg;
initside(sidexy);
HideCursor();
srand((unsigned int)time(NULL));//产生随机数
system("mode con cols=32 lines=19");//初始化界面 宽 、高
system("color 0B");//首页前景背景颜色
menu(); //目录
level = _getch();
switch (level) {
case '1':level = 150; break;
case '2':level = 100; break;
case '3':level = 50; break;
default:level = 100;
}
system("cls");
system("color 3F");//游戏界面前景背景颜色
egg.x = rand() % 14 + 1;
egg.y = (rand() % 14)*2 + 2;
body->point = 0;
firstsnake(body);
while (1) {
flag = 0;
snakemove(body);
for (lon = 0; body[lon].x != '\0'&&body[lon].y != '\0'; lon++) {
gotoxy(body[lon].x, body[lon].y);
printf("■");
}
gotoxy(egg.x, egg.y);
printf("■");
game_side(sidexy);
if (_kbhit()) {
keyboard(body);
}
if (egg.x == body[0].x&&egg.y == body[0].y)
{
body->point += 10;
body->sum++;
flag = 1;
}
gotoxy(17, 2);
printf(" ※ 蛇的长度:%d 分数:%d ※ ", body->sum, body->point);
if (flag) {
egg.x = rand() % 13 + 1;
egg.y = limit[rand()%14];
}
flag = 0;
if (gameover(body,sidexy,&egg))break;
Sleep(level);
system("cls");
}
point_summary(body);
return 0;
}
贪吃蛇
最新推荐文章于 2024-09-20 10:40:49 发布