C++ 贪吃蛇游戏
在这篇文章中,我们将使用C++和图形函数创建一个贪吃蛇游戏。在这个游戏中,我们将使用C++类的概念和计算机图形函数。
什么是贪吃蛇游戏
贪吃蛇游戏是一款非常著名的游戏,可在各种设备上使用,并在每个操作系统上运行。在这个游戏中,蛇可以在所有方向上移动,例如左、右、上和下;吃到食物后,蛇的长度会增加。蛇的食物将在一定的时间间隔内生成。
C++ 是什么意思
C++ 是一种面向对象的编程语言。它也被称为具有类的C++。它是一个跨平台的语言,可以用来创建高级应用程序。它给程序员对系统资源和内存具有很高的控制能力。
什么是计算机图形学
计算机图形学的术语是在视觉显示单元或计算机打印输出上显示的信息,以图表、图形、图片和符号的形式。
C++ 中的图形原语
图形原语是计算机图形系统中的一个基本不可分的图形元素,用于输入或输出。我们需要一个名为<graphics.h>的头文件来在屏幕上绘制和创建任何图形。它还可以定义为计算机如何以图像方式显示数据并进行操作。除了绘制各种形状的图形外,所有动画和多媒体主要在图形平台上工作。
以下函数用于在贪吃蛇游戏中创建图形:
Initgraph():
为了初始化图形函数,我们必须使用initgraph()函数。
语法:
void Intergraph(int *graph driver, int *graph mode, char *path);
Initgraph函数使用三个参数:
- gd: 用于图形驱动程序。
- gm: 用于图形模式。
- path: 指定图形文件所在的路径。
closegraph():
用于关闭图形函数。
语法:
void closegraph();
输出文本:
在C图形中,可以使用outtext()函数和outtextxy()函数输出文本。
outtext():
用于在当前位置显示文本。
语法:
void outtext(char *str);
outtextxy():
用于在指定位置显示文本。
语法:
void outtextxy(int x, int y, char *str);
让我们以C++中的贪吃蛇游戏为例。
示例1
#include
#include
#include
#include
#include
#include
#include
#include
class Snake
{
int p1,p2,v1,v2,v3,e1,e2,prev,now,n,colr,dsp,cnt,dly,m;
int stp, egGen;
int xr, yr;
void caught();
public:
long scr;
int strtX,strtY,endX,endY;
int pos[100][2];
void show();
void init();
void egg();
void transpose();
void gnrtCond();
void gnrtUnCond();
void check();
void checkEgg();
void move();
void chngDir();
void sndEt();
void sndCgt();
int test();
void score();
Snake();
Snake(Snake*);
~Snake();
};
Snake::Snake()
{
}
Snake::~Snake()
{
}
void Snake::checkEgg()
{
if((e1 == p1) && (e2 == p2))
{ sndEt();
egg();
dly--;
score();
n++;
}
}
void Snake::sndEt()
{ nosound();
sound(2500);
delay(2);
nosound();
}
void Snake::sndCgt()
{ nosound();
for(int x=1000;x>0;x--)
{ sound(x);
delay(1);
}
nosound();
}
void Snake::score()
{ char *p;
ltoa(scr,p,10);
settextstyle(8,0,1);
setcolor(0);
outtextxy(585,40,p);
if(egGen != 1){
scr = scr + dly / 10;
}
ltoa(scr,p,10);
setcolor(10);
outtextxy(585,40,p);
}
void Snake::gnrtCond()
{ if(n < 367)
{ if(now == 8 && (prev != 8 && prev != 2))
{ pos[0][0] = p1;
pos[0][1] = p2 - dsp;
prev = now;
}
if(now == 4 && (prev != 4 && prev != 1))
{ pos[0][0] = p1 + dsp;
pos[0][1] = p2;
prev = now;
}
if(now == 2 && (prev != 8 && prev != 2))
{ pos[0][0] = p1;
pos[0][1] = p2 + dsp;
prev = now;
}
if(now == 1 && (prev != 1 && prev != 4))
{pos[0][0] = p1 - dsp;
pos[0][1] = p2;
prev = now;
}
}
}
void Snake::gnrtUnCond()
{
if( prev == 8 )
{ pos[0][0] = p1;
pos[0][1] = p2 - dsp;
}
if( prev == 4 )
{pos[0][0] = p1 + dsp;
pos[0][1] = p2;
}
if( prev == 2 )
{ pos[0][0] = p1;
pos[0][1] = p2 + dsp;
}
if( prev == 1 )
{pos[0][0] = p1 - dsp;
pos[0][1] = p2;
}
p1 = pos[0][0];
p2 = pos[0][1];
}
void Snake::check()
{
if(p1 > endX)
{p1 = strtX;}
else if(p1 < strtX)
{ p1 = endX;}
if(p2 > endY)
{ p2 = strtY;}
else if(p2 < strtY)
{ p2 = endY;}
pos[0][0] = p1;
pos[0][1] = p2;
for(int i = 1;i < n;i++)
{ if(p1 == pos[i][0] && p2 == pos[i][1])
{ caught();
break;
}
}
}
void Snake::show()
{
int x = getcolor();
if(egGen != 1)
{
setcolor(getbkcolor());
setfillstyle(1,getbkcolor());
fillellipse(v1,v2,yr,yr);
}
else
egGen = 0;
if(egGen == 2)
egGen--;
setcolor(colr);
setfillstyle(1,9);
if(now == 8 || now == 2)
fillellipse(pos[0][0],pos[0][1],xr,yr);
else if(now == 4 || now == 1)
fillellipse(pos[0][0],pos[0][1],yr,xr);
setcolor(x);
}
void Snake::transpose()
{ int i,j,x,y;
p1 = pos[0][0];
p2 = pos[0][1];
if(!egGen){
v1 = pos[n-1][0];
v2 = pos[n-1][1];
}
else
egGen = 0;
for(i = n-1;i >= 1;i--)
{pos[i][0] = pos[i-1][0];
pos[i][1] = pos[i-1][1];
}
}
void Snake::move()
{ int st = 0;
do{
if(!kbhit())
{ checkEgg();
if(!st)
show();
else
st = 0;
delay(dly/4);
transpose();
delay(dly/4);
gnrtUnCond();
delay(dly/4);
check();
delay(dly/4);
}
else if(stp){
chngDir();
gnrtCond();
check();
show();
st = 1;
}
} while(stp);
}
void Snake::init()
{time_t tm;
srand(time(&tm));
dsp = 20;
n = 5;
prev = 4;
for(int i = 4;i >= 0;i--)
{ pos[i][0] = 201 + (n - i - 1) * dsp;
pos[i][1] = 301;
}
strtX = 21;
strtY = 21;
endX = 481;
endY = 361;
colr = 14;
now = prev;
dsp = 20;
stp = 111;
cnt = -1;
scr = 0;
dly = 150;
xr = 3;
yr = 9;
egg();
egGen = 1;
score();
int x = getcolor();
setlinestyle(0,1,3);
setcolor(15);
rectangle(strtX-15,strtY-15,endX+15,endY+15);
rectangle(endX+25,strtY-15,getmaxx()-15,endY+15);
rectangle(strtX-15,endY+25,getmaxx()-15,getmaxy()-5);
line(endX+25,strtY+75,getmaxx()-15,strtY+75);
line(endX+25,strtY+200,getmaxx()-15,strtY+200);
line(endX+25,strtY+275,getmaxx()-15,strtY+275);
setlinestyle(0,1,1);
settextstyle(8,0,1);
setcolor(11);
outtextxy(514,40,"SCORE");
setcolor(14);
settextstyle(11,0,5);
outtextxy(524,110," CONTROLS ");
outtextxy(522,135,"p = PAUSE");
outtextxy(522,155,"g = RESUME");
outtextxy(522,175,"e = EXIT");
outtextxy(513,195,"ARROWS");
outtextxy(512,205," -MOVEMENT");
setcolor(14);
settextstyle(4,0,9);
outtextxy(getmaxx()-500,getmaxy()-110,"SNAKE");
settextstyle(8,0,1);
setcolor(x);
}
void Snake::caught()
{
stp = 0;
sndCgt();
for(int i=0;i<=7;i++)
{ if(i%2)
{ setcolor(10);
outtextxy(512,250,"GAME OVER");
delay(900);
}
else
{setcolor(0);
outtextxy(512,250,"GAME OVER");
delay(500);
}
}
sleep(1);
}
void Snake::chngDir()
{ int clr;
fillsettingstype *p;
char x = getch();
if(x == 72)
now = 8;
else if(x == 77)
now = 4;
else if(x == 80)
now = 2;
else if(x == 75)
now = 1;
else if(x == 'e')
caught();
else if(x == 'p')
{ //int y = getcolor();
int twnkl = 1;
settextstyle(11,0,9);
while(1)
{if(kbhit())
{ int c = getch();
if(c == 'g')
{ clr = getcolor();
setcolor(0);
rectangle(endX+40,endY-10,getmaxx()-35,getmaxy()-160);
outtextxy(endX+60,endY-29,"PAUSE");
break;
}
}
else
{ if(twnkl%2)
{ clr = getcolor();
setcolor(10);
rectangle(endX+40,endY-10,getmaxx()-35,getmaxy()-160);
outtextxy(endX+60,endY-29,"PAUSE");
setcolor(clr);
delay(1000);
}
else
{
clr = getcolor();
setcolor(0);
rectangle(endX+40,endY-10,getmaxx()-35,getmaxy()-160);
outtextxy(endX+60,endY-29,"PAUSE");
delay(1000);
}
}
twnkl++;
}
settextstyle(8,0,1);
}
}
Snake::Snake(Snake *p)
{
*p=NULL;
}
void Snake::egg()
{ do
{ e1 = (rand() % 100) * dsp + strtX;
e2 = (rand() % 100) * dsp + strtY;
} while(test());
int x = getcolor();
setcolor(7);
setfillstyle(1,random(15)+1);
fillellipse(e1,e2,xr+2,xr+2);
setcolor(x);
egGen = 2;
}
int Snake::test()
{
for(int i=0;i= endX+1) || (e2 >= endY+1))
break;
}
if(i != n)
return 1;
else
return 0;
}
void main()
{
Snake snk;
int gd=DETECT,gm,i,j,k,x,y;
clrscr();
initgraph(&gd,&gm,"C:\\Turboc3\\bgi");
snk.init();
snk.move();
closegraph();
restorecrtmode();
}
说明:
在上面的示例中,我们实现了一个基本的 贪吃蛇游戏 。在这个游戏中,我们使用了类的概念和一些计算机图形函数。
这个游戏的基本功能如下所示。
- 使用图形函数创建蛇。
- 使用计算机图形的rand()函数生成蛇的果实。
- 蛇可以通过键盘的方向键( 右、上和下 )在任何方向上移动。
- 当蛇吃掉一个果实时,得分将增加14分。
- 在这个游戏中,我们可以创建基本的控制:
- p 控制用于暂停游戏。我们可以点击键盘上的 p 字符来暂停游戏。
- g 控制用于恢复游戏。我们可以点击键盘上的 g 字符来恢复游戏。
- e 控制用于退出游戏。我们可以点击键盘上的 e 字符来退出游戏。
输出:
以下是此示例的输出: