C尝试写的贪吃蛇项目(数组实现)
以后会更新用链表实现贪吃蛇
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <stdio.h>
#include <conio.h>
#include <time.h>
#include <string.h>
using namespace std;
#include <windows.h>
#include <mmsystem.h>
#pragma comment(lib,"winmm.lib")
#define DEF_SNAKE_LENGTH 20
char c_arrBackground[20][48] =
{
"■■■■■■■■■■■■■■■■■■■■■■■\n",
"■ ■\n",
"■ ■\n",
"■ ■\n",
"■ ■\n",
"■ ■\n",
"■ ■\n",
"■ ■\n",
"■ ■\n",
"■ ■\n",
"■ ■\n",
"■ ■\n",
"■ ■\n",
"■ ■\n",
"■ ■\n",
"■ ■\n",
"■ ■\n",
"■ ■\n",
"■ ■\n",
"■■■■■■■■■■■■■■■■■■■■■■■\n"
};
int g_arrSnake[DEF_SNAKE_LENGTH][3] = { 0 };
enum {to_east=2,to_west=-2,to_north=-1,to_south=1};
int g_Snakedir = to_west;
int food_Line;
int food_Lie;
int g_lengthSnake = 2;
bool isfood = true;
int g_score = 0;
void firstPage();
void MyplaySound();
void TestPace();
void ShowWallGame();
void ShowWallGame2();
void SetSnakepose();
void DrawSnake();
void SnakeMove();
void desary();
void Changedir();
void Changedir1();
bool isSnakedie();
void food();
void groupSnake();
void grade();
int main()
{
firstPage();
MyplaySound();
TestPace();
system("cls");
ShowWallGame2();
SetSnakepose();
while(1)
{
system("cls");
Changedir();
food();
groupSnake();
if (false == isSnakedie())
{
printf("蛇死亡\n");
break;
}
SnakeMove();
ShowWallGame2();
grade();
Sleep(500);
}
system("pause");
return 0;
}
void firstPage()
{
printf("\n\n\n\n\n");
printf(" 《《欢迎进入贪吃蛇的界面》》\n");
printf(" 按空格开始游戏\n");
printf(" 按w s a d控制蛇\n");
}
void MyplaySound()
{
}
void TestPace()
{
char chinput;
while (1)
{
chinput = _getch();
if (' ' == chinput)
{
break;
}
}
}
void ShowWallGame()
{
int i = 0, j = 0;
int g_arrBackground[20][23] =
{
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
};
while (1)
{
system("cls");
for (i = 0; i < 20; i++)
{
for (j = 0; j < 23; j++)
{
if (1 == g_arrBackground[i][j])
{
printf("■");
}
else
printf(" ");
}
printf("\n");
}
Sleep(1000);
}
}
void ShowWallGame2()
{
int i;
for (i = 0; i < 20; i++)
{
printf(c_arrBackground[i]);
}
}
void SetSnakepose()
{
int nx=-1;
int ny=-1;
srand((unsigned int)time(NULL));
nx = rand() % 18 + 1;
ny = rand() % 17 + 1;
g_arrSnake[0][0]=ny;
g_arrSnake[0][1]=nx*2;
g_arrSnake[0][2]= to_west;
g_arrSnake[1][0] = ny;
g_arrSnake[1][1] = nx * 2+2;
g_arrSnake[1][2] = to_west;
g_arrSnake[2][0] = ny;
g_arrSnake[2][1] = nx * 2+4;
g_arrSnake[2][2] = to_west;
DrawSnake();
}
void DrawSnake()
{
int i;
for (i = 0; g_arrSnake[i][0] != 0; i++)
{
strncpy(&c_arrBackground[g_arrSnake[i][0]][g_arrSnake[i][1]], "■", 2);
}
}
void SnakeMove()
{
int i = DEF_SNAKE_LENGTH - 1;
desary();
for (i; i >= 1; i--)
{
if (0 == g_arrSnake[i][0])
{
continue;
}
g_arrSnake[i][0] = g_arrSnake[i - 1][0];
g_arrSnake[i][1] = g_arrSnake[i - 1][1];
g_arrSnake[i][2] = g_arrSnake[i - 1][2];
}
g_arrSnake[0][2] = g_Snakedir;
if (to_west == g_arrSnake[0][2] || to_east == g_arrSnake[0][2])
{
g_arrSnake[0][1] += g_arrSnake[0][2];
}
else
{
g_arrSnake[0][0] += g_arrSnake[0][2];
}
DrawSnake();
}
void desary()
{
int i;
for ( i = 0; g_arrSnake[i][0] != 0; i++)
{
strncpy(&c_arrBackground[g_arrSnake[i][0]][g_arrSnake[i][1]], " ", 2);
}
}
void Changedir()
{
if (GetAsyncKeyState('W'))
{
if (g_arrSnake[0][2] != to_south)
{
g_Snakedir = to_north;
}
}
else if (GetAsyncKeyState('S'))
{
if (g_arrSnake[0][2] != to_north)
{
g_Snakedir = to_south;
}
}
else if (GetAsyncKeyState('A'))
{
if (g_arrSnake[0][2] != to_east)
{
g_Snakedir = to_west;
}
}
else if (GetAsyncKeyState('D'))
{
if (g_arrSnake[0][2] != to_west)
{
g_Snakedir = to_east;
}
}
}
void Changedir1()
{
_getch();
}
bool isSnakedie()
{
if (to_west == g_arrSnake[0][2] || to_east == g_arrSnake[0][2])
{
if (0==strncmp(&c_arrBackground[g_arrSnake[0][0]][g_arrSnake[0][1] + g_arrSnake[0][2]],"■",2))
{
return false;
}
}
else if (0 == strncmp(&c_arrBackground[g_arrSnake[0][0] + g_arrSnake[0][2]][g_arrSnake[0][1] ], "■", 2))
{
return false;
}
return true;
}
void food()
{
srand((unsigned int)time(NULL));
int i = 0;
if (isfood == false)
{
return;
}
while (1)
{
bool flog = true;
food_Line = rand() % 17 + 1;
food_Lie = rand() % 20 + 1;
for (i = 0; g_arrSnake[i][0] != 0; i++)
{
if (food_Line == g_arrSnake[i][0] && food_Lie == g_arrSnake[i][1])
{
flog = false;
break;
}
}
if (flog == true)
{
break;
}
}
strncpy(&c_arrBackground[food_Line][food_Lie*2], "☆", 2);
isfood = false;
}
void groupSnake()
{
if (food_Line == g_arrSnake[0][0] && food_Lie * 2 == g_arrSnake[0][1])
{
if (g_arrSnake[g_lengthSnake][2] == to_east)
{
g_arrSnake[g_lengthSnake + 1][0] = g_arrSnake[g_lengthSnake][0];
g_arrSnake[g_lengthSnake + 1][1] = g_arrSnake[g_lengthSnake][1]-2;
g_arrSnake[g_lengthSnake + 1][2] = g_arrSnake[g_lengthSnake][2];
}
else if (g_arrSnake[g_lengthSnake][2] == to_west)
{
g_arrSnake[g_lengthSnake + 1][0] = g_arrSnake[g_lengthSnake][0];
g_arrSnake[g_lengthSnake + 1][1] = g_arrSnake[g_lengthSnake][1] + 2;
g_arrSnake[g_lengthSnake + 1][2] = g_arrSnake[g_lengthSnake][2];
}
else if (g_arrSnake[g_lengthSnake][2] == to_north)
{
g_arrSnake[g_lengthSnake + 1][0] = g_arrSnake[g_lengthSnake][0]+1;
g_arrSnake[g_lengthSnake + 1][1] = g_arrSnake[g_lengthSnake][1];
g_arrSnake[g_lengthSnake + 1][2] = g_arrSnake[g_lengthSnake][2];
}
else if (g_arrSnake[g_lengthSnake][2] == to_south)
{
g_arrSnake[g_lengthSnake + 1][0] = g_arrSnake[g_lengthSnake][0]-1;
g_arrSnake[g_lengthSnake + 1][1] = g_arrSnake[g_lengthSnake][1];
g_arrSnake[g_lengthSnake + 1][2] = g_arrSnake[g_lengthSnake][2];
}
g_lengthSnake++;
isfood = true;
g_score++;
}
}
void grade()
{
COORD rd;
rd.X = 55;
rd.Y = 8;
printf("分数:");
rd.X = 56;
rd.Y = 9;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), rd);
printf("%d",g_score);
}