贪吃蛇小游戏(数组实现)
新手而言,学c的过程确实蛮枯燥的,偶然间看到了之前写过的贪吃蛇的代码,分享给大家作为参考,给大家添点乐趣(能添一点是一点)。//满满的无奈感
#include<stdio.h>
#include<windows.h>
#include<stdlib.h>
#include<conio.h>//conio.h和windows.h两个头文件不太了解的可以搜一下,网上说的很清楚
int wall[30][30];//建造围墙,30行30列
int snake[15][2];//15是蛇的最大长度,snake[0][0]用于保存蛇头x坐标值,snake[0][1]则是y坐标,后面类推
int apple[2];//保存苹果的x与y坐标
int len = 3;//初始化蛇长为3
int score = 0;//初始化得分
char ch;//保存输入的按键
void color(int a)//color函数用于改变控制台接下来要输出的内容的颜色,比如color(12)为黑底红色
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), a);
}
void gotoxy(int x, int y)//改变光标位置,你想在控制台哪个地方输出,可以使用
{
COORD pos;
pos.X = 2 * x;
pos.Y = y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}
void background()//初始化围墙和地图
{
int i, j;
for (i = 1; i >= 1 && i < 29; i++) {
for (j = 1; j >= 1 && j < 29; j++) {
wall[i][j] = 1;
}
}
color(11);
for (i = 0; i >= 0 && i < 30; i++) {
for (j = 0; j >= 0 && j < 30; j++) {
if (wall[i][j] == 1)
printf("■");
else
printf("□");
}
printf("\n");//这个不要漏
}
color(14);//黑底黄色
gotoxy(32, 2);
printf("按w、s、a、d(或“↑ ↓ ← → ”)改变方向\n");
gotoxy(32, 3);
printf("得分:%d\n", score);
}
void start()
{
srand((unsigned)time(NULL));//初始化随机数发生器
apple[0] = rand() % 28 + 1;//取[1,28]的随机数(0和29都是围墙)
apple[1] = rand() % 28 + 1;
gotoxy(apple[0], apple[1]);
color(12);
printf("●");//产生苹果
snake[0][0] = 14;
snake[0][1] = 14;
//初始蛇头位置
color(14);
gotoxy(snake[0][0], snake[0][1]);
printf("¤");
//输出蛇头
for (int i = 1; i < len; i++) {
snake[i][0] = snake[0][0];
snake[i][1] = snake[0][1] + i;
color(14);
gotoxy(snake[i][0], snake[i][1]);
printf("★");//输出蛇身
}
}
void movesnake()
{
int i;
int Tsnake[15][2];
eat_apple();
for (i = 0; i < len; i++)
{
Tsnake[i][0] = snake[i][0];
Tsnake[i][1] = snake[i][1];
}
srand((unsigned)time(NULL));
if (_kbhit()) {
ch = _getch();
if (ch == -32)
{
ch = _getch();
}
//这里有必要解释一下为什么有可能用2次_getch()函数
//如果输入的是w,s,a,d,变量ch可以直接接收
//但是如果是方向键,第一次_getch()函数返回的是-32(ch为char类型变量),第二次才可以正常接收
}
switch (ch) {
case 'w':case 'W':case 72:
snake[0][1]--; break;
case 's':case 'S':case 80:
snake[0][1]++; break;
case 'a':case 'A':case 75:
snake[0][0]--; break;
case 'd':case 'D':case 77:
snake[0][0]++; break;
default: break;
}
gotoxy(snake[0][0], snake[0][1]);
color(14);
printf("¤");
for (i = 1; i <= len - 1; i++) {
snake[i][0] = Tsnake[i - 1][0];
snake[i][1] = Tsnake[i - 1][1];
gotoxy(snake[i][0], snake[i][1]);
color(14);
printf("★");
gotoxy(snake[i + 1][0], snake[i + 1][1]);
color(11);
printf("■");
gotoxy(0, 0);
printf("□");
}
Sleep(abs(200 - 0.5 * score));
}
eat_apple()
{
if (snake[0][0] == apple[0] && snake[0][1] == apple[1])
{
score++;
len++;
color(11);
gotoxy(apple[0], apple[1]);
printf("■");
srand((unsigned)time(NULL));
apple[0] = rand() % 28 + 1;
apple[1] = rand() % 28 + 1;
gotoxy(apple[0], apple[1]);
color(12);
printf("●");
color(14);
gotoxy(32, 3);
printf("得分:%d\n", score);
}
}
if_wall()
{
if (snake[0][0] == 0 || snake[0][1] == 0 || snake[0][0] == 29 || snake[0][1] == 29)
{
color(15);
gotoxy(15, 15);
printf("您失败了");
Sleep(INFINITE);
}
}
int main()
{
ch = 'a';//初始化方向为左
background();
start();
while (1) {
Sleep(180);
movesnake();
if (len == 15)
{
gotoxy(15, 15);
color(4);
printf("通关");
Sleep(INFINITE);
}
if_wall();
}
return 0;
}
很简单的贪吃蛇雏形,你甚至可以向后跑,吃到自己也无所谓,大家如果想完善的话可以自己思考一下如何实现你想要的的功能。