来看看C++贪吃蛇完整代码吧。
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>//windows±à³ÌÍ·Îļþ
#include <time.h>
#include <conio.h>//¿ØÖÆÌ¨ÊäÈëÊä³öÍ·Îļþ
#ifndef __cplusplus
typedef char bool;
#define false 0
#define true 1
#endif
//½«¹â±êÒÆ¶¯µ½¿ØÖÆÌ¨µÄ(x,y)×ø±êµã´¦
void gotoxy(int x, int y)
{
COORD coord;
coord.X = x;
coord.Y = y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}
#define SNAKESIZE 100//ÉßµÄÉíÌå×î´ó½ÚÊý
#define MAPWIDTH 78//¿í¶È
#define MAPHEIGHT 24//¸ß¶È
//ʳÎïµÄ×ø±ê
struct {
int x;
int y;
}food;
//ÉßµÄÏà¹ØÊôÐÔ
struct {
int speed;//ÉßÒÆ¶¯µÄËÙ¶È
int len;//Éߵij¤¶È
int x[SNAKESIZE];//×é³ÉÉßÉíµÄÿһ¸öС·½¿éÖÐxµÄ×ø±ê
int y[SNAKESIZE];//×é³ÉÉßÉíµÄÿһ¸öС·½¿éÖÐyµÄ×ø±ê
}snake;
//»æÖÆÓÎÏ·±ß¿ò
void drawMap();
//Ëæ»úÉú³ÉʳÎï
void createFood();
//°´¼ü²Ù×÷
void keyDown();
//ÉßµÄ״̬
bool snakeStatus();
//´Ó¿ØÖÆÌ¨Òƶ¯¹â±ê
void gotoxy(int x, int y);
int key = 72;//±íʾÉßÒÆ¶¯µÄ·½Ïò£¬72Ϊ°´Ï¡°¡ü¡±Ëù´ú±íµÄÊý×Ö
//ÓÃÀ´ÅжÏÉßÊÇ·ñ³ÔµôÁËʳÎÕâÒ»²½ºÜÖØÒª£¬Éæ¼°µ½ÊÇ·ñ»áÓÐÉßÉíÒÆ¶¯µÄЧ¹ûÒÔ¼°ÉßÉíÔö³¤µÄЧ¹û
int changeFlag = 0;
int sorce = 0;//¼ÇÂ¼Íæ¼ÒµÄµÃ·Ö
int i;
void drawMap()
{
//´òÓ¡ÉÏϱ߿ò
for (i = 0; i <= MAPWIDTH; i += 2)//i+=2ÊÇÒòΪºáÏòÕ¼ÓõÄÊÇÁ½¸öλÖÃ
{
//½«¹â±êÒÆ¶¯ÒÀ´Îµ½(i,0)´¦´òÓ¡Éϱ߿ò
gotoxy(i, 0);
printf("¡ö");
//½«¹â±êÒÆ¶¯ÒÀ´Îµ½(i,MAPHEIGHT)´¦´òӡϱ߿ò
gotoxy(i, MAPHEIGHT);
printf("¡ö");
}
//´òÓ¡×óÓұ߿ò
for (i = 1; i < MAPHEIGHT; i++)
{
//½«¹â±êÒÆ¶¯ÒÀ´Îµ½(0,i)´¦´òÓ¡×ó±ß¿ò
gotoxy(0, i);
printf(" ¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£");
//½«¹â±êÒÆ¶¯ÒÀ´Îµ½(MAPWIDTH, i)´¦´òÓ¡×ó±ß¿ò
gotoxy(MAPWIDTH, i);
printf("¡ö");
}
//Ëæ»úÉú³É³õÊÔʳÎï
while (1)
{
srand((unsigned int)time(NULL));
food.x = rand() % (MAPWIDTH - 4) + 2;
food.y = rand() % (MAPHEIGHT - 2) + 1;
//Éú³ÉµÄʳÎïºá×ø±êµÄÆæÅ¼±ØÐëºÍ³õÊÔʱÉßÍ·ËùÔÚ×ø±êµÄÆæÅ¼Ò»Ö£¬ÒòΪһ¸ö×Ö·ûÕ¼Á½¸ö×Ö½ÚλÖã¬Èô²»Ò»ÖÂ
//»áµ¼Ö³ÔʳÎïµÄʱºòÖ»³Ôµ½Ò»°ë
if (food.x % 2 == 0)
break;
}
//½«¹â±êÒÆµ½Ê³ÎïµÄ×ø±ê´¦´òӡʳÎï
gotoxy(food.x, food.y);
printf("*");
//³õʼ»¯ÉßµÄÊôÐÔ
snake.len = 3;
snake.speed = 200;
//ÔÚÆÁÄ»ÖмäÉú³ÉÉßÍ·
snake.x[0] = MAPWIDTH / 2 + 1;//x×ø±êΪżÊý
snake.y[0] = MAPHEIGHT / 2;
//´òÓ¡ÉßÍ·
gotoxy(snake.x[0], snake.y[0]);
//printf("¡ö-------------------------------------------------");
//Éú³É³õÊÔµÄÉßÉí
for (i = 1; i < snake.len; i++)
{
//ÉßÉíµÄ´òÓ¡£¬×Ý×ø±ê²»±ä£¬ºá×ø±êΪÉÏÒ»½ÚÉßÉíµÄ×ø±êÖµ+2
snake.x[i] = snake.x[i - 1] + 2;
snake.y[i] = snake.y[i - 1];
gotoxy(snake.x[i], snake.y[i]);
printf("#");
}
//´òÓ¡ÍêÉßÉíºó½«¹â±êÒÆµ½ÆÁÄ»×îÉÏ·½£¬±ÜÃâ¹â±êÔÚÉßÉí´¦Ò»Ö±ÉÁ˸
gotoxy(MAPWIDTH - 2, 0);
return;
}
void keyDown()
{
int pre_key = key;//¼Ç¼ǰһ¸ö°´¼üµÄ·½Ïò
if (_kbhit())//Èç¹ûÓû§°´ÏÂÁ˼üÅÌÖеÄij¸ö¼ü
{
fflush(stdin);//Çå¿Õ»º³åÇøµÄ×Ö·û
//getch()¶ÁÈ¡·½Ïò¼üµÄʱºò£¬»á·µ»ØÁ½´Î£¬µÚÒ»´Îµ÷Ó÷µ»Ø0»òÕß224£¬µÚ¶þ´Îµ÷Ó÷µ»ØµÄ²ÅÊÇʵ¼ÊÖµ
key = _getch();//µÚÒ»´Îµ÷Ó÷µ»ØµÄ²»ÊÇʵ¼ÊÖµ
key = _getch();//µÚ¶þ´Îµ÷Ó÷µ»ØÊµ¼ÊÖµ
}
/*
*ÉßÒÆ¶¯Ê±ºòÏȲÁÈ¥ÉßβµÄÒ»½Ú
*changeFlagΪ0±íÃ÷´ËʱûÓгԵ½Ê³ÎÒò´Ëÿ×ßÒ»²½¾ÍÒª²Á³ýµôÉß⣬ÒÔ´ËÓªÔìÒ»¸öÒÆ¶¯µÄЧ¹û
*Ϊ1±íÃ÷³Ôµ½ÁËʳÎ¾Í²»ÐèÒª²Á³ýÉß⣬ÒÔ´ËÓªÔìÒ»¸öÉßÉíÔö³¤µÄЧ¹û
*/
if (changeFlag == 0)
{
gotoxy(snake.x[snake.len - 1], snake.y[snake.len - 1]);
printf(" ");//ÔÚÉßβ´¦Êä³ö¿Õ¸ñ¼´²ÁÈ¥Éßβ
}
//½«ÉßµÄÿһ½ÚÒÀ´ÎÏòÇ°ÒÆ¶¯Ò»½Ú£¨ÉßÍ·³ýÍ⣩
for (i = snake.len - 1; i > 0; i--)
{
snake.x[i] = snake.x[i - 1];
snake.y[i] = snake.y[i - 1];
}
//Éßµ±Ç°Òƶ¯µÄ·½Ïò²»ÄܺÍǰһ´ÎµÄ·½ÏòÏà·´£¬±ÈÈçÉßÍù×ó×ßµÄʱºò²»ÄÜÖ±½Ó°´ÓÒ¼üÍùÓÒ×ß
//Èç¹ûµ±Ç°Òƶ¯·½ÏòºÍǰһ´Î·½ÏòÏà·´µÄ»°£¬°Ñµ±Ç°Òƶ¯µÄ·½Ïò¸ÄΪǰһ´ÎµÄ·½Ïò
if (pre_key == 72 && key == 80)
key = 72;
if (pre_key == 80 && key == 72)
key = 80;
if (pre_key == 75 && key == 77)
key = 75;
if (pre_key == 77 && key == 75)
key = 77;
/**
*¿ØÖÆÌ¨°´¼üËù´ú±íµÄÊý×Ö
*¡°¡ü¡±£º72
*¡°¡ý¡±£º80
*¡°¡û¡±£º75
*¡°¡ú¡±£º77
*/
//ÅжÏÉßÍ·Ó¦¸ÃÍùÄĸö·½ÏòÒÆ¶¯
switch (key)
{
case 75:
snake.x[0] -= 2;
break;
case 77:
snake.x[0] += 2;
break;
case 72:
snake.y[0]--;
break;
case 80:
snake.y[0]++;
break;
}
gotoxy(snake.x[0], snake.y[0]);
printf("O");
gotoxy(MAPWIDTH - 2, 0);
changeFlag = 0;
return;
}
void createFood()
{
if (snake.x[0] == food.x && snake.y[0] == food.y)
{
while (1)
{
int flag = 1;
srand((unsigned int)time(NULL));
food.x = rand() % (MAPWIDTH - 4) + 2;
food.y = rand() % (MAPHEIGHT - 2) + 1;
for (i = 0; i < snake.len; i++)
{
if (snake.x[i] == food.x && snake.y[i] == food.y)
{
flag = 0;
break;
}
}
if (flag && food.x % 2 == 0)
break;
}
gotoxy(food.x, food.y);
printf("*");
snake.len++;
sorce += 10;
snake.speed -= 5;
changeFlag = 1;
}
return;
}
bool snakeStatus()
{
if (snake.y[0] == 0 || snake.y[0] == MAPHEIGHT)
return false;
if (snake.x[0] == 0 || snake.x[0] == MAPWIDTH)
return false;
for (i = 1; i < snake.len; i++)
{
if (snake.x[i] == snake.x[0] && snake.y[i] == snake.y[0])
return false;
}
return true;
}
int main()
{
drawMap();
while (1)
{
keyDown();
if (!snakeStatus())
break;
createFood();
Sleep(snake.speed);
}
gotoxy(MAPWIDTH / 2, MAPHEIGHT / 2);
printf("Game Over!\n");
gotoxy(MAPWIDTH / 2, MAPHEIGHT / 2 + 1);
printf("±¾´ÎÓÎÏ·µÃ·ÖΪ£º%d\n", sorce);
if(sorce>=100&&sorce<200)
{
printf("\n");
gotoxy(MAPWIDTH / 2, MAPHEIGHT / 2 + 2);
printf("Good,Mission accomplished.");
}else if(sorce>=200)
{
printf("\n");
gotoxy(MAPWIDTH / 2, MAPHEIGHT / 2 + 2);
printf("You is NB boy.");
}else if(sorce<50&&sorce>=1)
{
printf("\n");
gotoxy(MAPWIDTH / 2, MAPHEIGHT / 2 + 2);
printf("Mission out.");
}else if(sorce==0)
{
printf("\n");
gotoxy(MAPWIDTH / 2, MAPHEIGHT / 2 + 2);
printf("Are you ok?");
}else if(sorce>=50&&sorce<100)
{
printf("\n");
gotoxy(MAPWIDTH / 2, MAPHEIGHT / 2 + 2);
printf("just so so.");
}
Sleep(5000);
return 0;
}