赞
踩
snake.h
- #ifndef __SNAKE_H__
- #define __SNAKE_H__
-
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #include <math.h>
- #include <time.h>
- #include <conio.h>
- #include <Windows.h>
-
-
- #define WIDE 60 // 宽度
- #define HIGH 20 // 高度
-
- // 一个身体的对象
- struct BODY {
- int X;
- int Y;
- };
-
- // 定义蛇对象
- struct SNAKE {
- struct BODY body[WIDE*HIGH];
- int size;
- }snake; // 一个蛇对象
-
- // 定义食物对象
- struct FOOD {
- int X;
- int Y;
- }food; // 一个食物对象
-
- int score = 0; // 分数
-
- int kx = 0; // 用户按下 asdw 任意一个按键所得到的 坐标值。
- int ky = 0;
-
- int lastX = 0; // 蛇尾的坐标。
- int lastY = 0;
-
- int sleepSecond = 400;
-
- // 声明函数
- void initSnake(void);
- void initFood(void);
- void initUI(void);
- void playGame(void);
- void initWall(void);
- void showScore(void);
-
- #endif
main.c
- #define _CRT_SECURE_NO_WARNINGS
-
- #include "snake.h" // 引入自定义头文件
-
- int main(void)
- {
- // 去除光标。
- CONSOLE_CURSOR_INFO cci; /*CONSOLE_CURSOR_INFO 是一个结
- 构体类型,它定义在 wincon.h 头
- 文件中,用来描述控制台窗口光标的
- 信息。
- dwSize:表示光标的大小,取值范围为 1 到 100。
- bVisible:表示光标是否可见,如果为 TRUE,则光标可见;
- 如果为 FALSE,则光标不可见。
- */
- cci.dwSize = sizeof(cci);
- cci.bVisible = FALSE; // TRUE :
- SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci); 设置控制台窗口光标大小和可见性
-
- srand(time(NULL)); // 播种随机数种子。
-
- initSnake(); // 初始化蛇
- initFood(); // 初始化食物
-
- initWall(); // 画墙
- initUI(); // 画蛇和食物
-
- playGame(); // 启动游戏
-
- showScore(); // 打印分数
-
- system("pause");
- return EXIT_SUCCESS;
- }
-
- void showScore(void)
- {
- // 将光标默认位置移动至 不干扰游戏的任意位置。
- COORD coord;
-
- coord.X = 0;
- coord.Y = HIGH + 2;
- SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
-
- printf("Game Over!!!\n");
- printf("成绩为:%d\n\n\n", score);
- }
-
- /*
- 这段代码使用嵌套的循环,分别遍历每一行和每一列,
- 根据位置情况输出相应的字符。如果到了最后一列,输出一条竖线 |;
- 如果到了最后一行,输出一条横线 _;其他情况下,输出一个空格。
- 最后,每输出一行,就换一次行。
- */
- void initWall(void)
- {
- for (size_t i = 0; i <= HIGH; i++) // 多行
- {
- for (size_t j = 0; j <= WIDE; j++) // 一行中的多列
- {
- if (j == WIDE) // 如果到了最后一列,输出一条竖线
- {
- printf("|");
- }
- else if (i == HIGH) // 如果到了最后一行,输出一条横线
- {
- printf("_");
- }
- else // 其他情况下,输出一个空格
- {
- printf(" ");
- }
- }
- printf("\n"); // 每输出一行,换行一次
- }
- }
-
- void playGame(void)
- {
- char key = 'd'; // 定义一个字符变量 key,表示用户的按键输入,默认是向右移动。
-
- while (snake.body[0].X >= 0 && snake.body[0].X < WIDE
- && snake.body[0].Y >= 0 && snake.body[0].Y < HIGH) // 判断蛇是否撞墙
- {
- initUI(); // 更新蛇的位置,打印出贪吃蛇和食物
-
- if (_kbhit()) // 检测用户是否有按键输入
- {
- key = _getch(); // 获取用户按下的按键
- }
- switch (key)
- {
- case 'w': kx = 0; ky = -1; break; // 如果用户按下 'w',向上移动
- case 's': kx = 0; ky = +1; break; // 如果用户按下 's',向下移动
- case 'd': kx = +1; ky = 0; break; // 如果用户按下 'd',向右移动
- case 'a': kx = -1; ky = 0; break; // 如果用户按下 'a',向左移动
- default: break; // 如果用户按下其他键,不进行移动
- }
-
- // 碰撞
- // 判断蛇头是否撞到身体
- for (size_t i = 1; i < snake.size; i++)
- {
- if (snake.body[0].X == snake.body[i].X
- && snake.body[0].Y == snake.body[i].Y)
- {
- return; // 如果蛇头撞到身体,游戏结束
- }
- }
-
- // 判断蛇头是否撞到食物
- if (snake.body[0].X == food.X && snake.body[0].Y == food.Y)
- {
- initFood(); // 食物被吃掉了,重新生成一个食物
- snake.size++; // 蛇的长度增加
- score += 10; // 得分增加
-
- sleepSecond -= 100; // 加速游戏
- }
-
-
- // 记录蛇尾的位置
- lastX = snake.body[snake.size - 1].X;
- lastY = snake.body[snake.size - 1].Y;
-
- // 更新蛇的位置
- for (size_t i = snake.size - 1; i > 0; i--)
- {
- snake.body[i].X = snake.body[i - 1].X; // 后一节身体部位的 X 坐标等于前一节身体部位的 X 坐标
- snake.body[i].Y = snake.body[i - 1].Y; // 后一节身体部位的 Y 坐标等于前一节身体部位的 Y 坐标
- }
- snake.body[0].X += kx; // 蛇头的 X 坐标根据用户按键修改
- snake.body[0].Y += ky; // 蛇头的 Y 坐标根据用户按键修改
-
- Sleep(sleepSecond); // 控制游戏速度,让游戏不会太快。
- }
- return;
- }
-
-
- // 定义初始化蛇函数
- void initSnake(void)
- {
- snake.size = 2;
-
- snake.body[0].X = WIDE / 2; //蛇头初始化
- snake.body[0].Y = HIGH / 2;
-
- snake.body[1].X = WIDE / 2 - 1; // 蛇一节身体初始化
- snake.body[1].Y = HIGH / 2;
-
- return;
- }
-
- // 初始化界面控件
- void initUI(void)
- {
- COORD coord = { 0 }; // 定义一个 COORD 类型的结构体变量,用来表示光标移动的位置。
-
- // 画蛇
- for (size_t i = 0; i < snake.size; i++) // 遍历贪吃蛇的每个身体部位
- {
- coord.X = snake.body[i].X; // 获取当前身体部位的 X 坐标
- coord.Y = snake.body[i].Y; // 获取当前身体部位的 Y 坐标
- SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord); // 将光标移动到当前身体部位所在的位置
-
- if (i == 0) // 如果当前身体部位是蛇头
- putchar('@'); // 打印出蛇头
- else
- putchar('*'); // 否则打印出蛇身
- }
-
- // 去除蛇尾
- coord.X = lastX; // 获取蛇尾的 X 坐标
- coord.Y = lastY; // 获取蛇尾的 Y 坐标
- SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord); // 将光标移动到蛇尾所在的位置
- putchar(' '); // 打印一个空格,相当于去除了蛇尾
-
- // 画食物
- coord.X = food.X; // 获取食物的 X 坐标
- coord.Y = food.Y; // 获取食物的 Y 坐标
- SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord); // 将光标移动到食物所在的位置
- putchar('#'); // 打印出食物
- }
-
-
- // 食物的初始化函数
- void initFood(void)
- {
- food.X = rand() % WIDE; // 0-59
- food.Y = rand() % HIGH; // 0-59
- return;
- }
-
-
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。