C++教程-C++贪吃蛇代码
![](https://wx.javatiku.cn/j/j301-t.jpg)
C++贪吃蛇代码
在这篇文章中,我们将使用C++和图形函数创建一个贪吃蛇游戏。我们将使用C++类的概念和计算机图形函数来实现。
什么是贪吃蛇游戏?
贪吃蛇游戏是一款非常著名的游戏,在各种设备上都可以玩,并且可以在任何操作系统上运行。在这个游戏中,蛇可以向各个方向移动,例如左、右、上和下;吃到食物后,蛇的长度会增加。蛇的食物会在一定时间间隔内生成。
什么是C++?
C++是一种面向对象的编程语言,也被称为具有类的C++。它是一种跨平台的语言,可用于创建高级应用程序。它使程序员对系统资源和内存具有较高的控制权。
什么是计算机图形?
计算机图形是以图表、图形、图片和符号的形式显示在视觉显示器或计算机打印输出上的信息。
C++中的图形基元
图形基元是计算机图形系统中的基本不可分割的图形元素,用于输入或输出。我们需要一个名为<graphics.h>的头文件来在屏幕上绘制和创建任何图形。它还可以定义为计算机如何将数据以图像的方式显示和操作。除了绘制各种形状的图形外,所有的动画和多媒体主要都在图形平台上运行。
以下函数用于在贪吃蛇游戏中创建图形:
Initgraph():
要初始化图形函数,我们必须使用initgraph()函数。
语法:
void initgraph(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<iostream.h>
include<conio.h>
include<graphics.h>
include<dos.h>
include<stdlib.h>
include<stdio.h>
include<time.h>
include<string.h>
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<n;i++)
{ if(e1 == pos[i][0] && e2 == pos[i][1])
break;
if(v1 == e1 && v2 == e2)
break;
if((e1 >= 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键来退出游戏。
输出:
以下是这个例子的输出: