贪吃蛇的代码,在文本文档打开就可以

贪吃蛇的代码,在文本文档打开就可以,第1张

#include<iostream.h>

#include<windows.h>

#include<time.h>

#include<stdlib.h>

#include<conio.h>

#define N 21

void gotoxy(int x,int y)//位置函数

{

COORD pos

pos.X=2*x

pos.Y=y

SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos)

}

void color(int a)//颜色函数

{

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),a)

}

void init(int apple[2])//初始化函数(初始化围墙、显示信息、苹果)

{

int i,j//初始化围墙

int wall[N+2][N+2]={{0}}

for(i=1i<=Ni++)

{

for(j=1j<=Nj++)

wall[i][j]=1

}

color(11)

for(i=0i<N+2i++)

{

for(j=0j<N+2j++)

{

if(wall[i][j])

cout<<"■"

else cout<<"□"

}

cout<<endl

}

gotoxy(N+3,1)//显示信息

color(20)

cout<<"按 W S A D 移动方向"<<endl

gotoxy(N+3,2)

color(20)

cout<<"按任意键暂停"<<endl

gotoxy(N+3,3)

color(20)

cout<<"得分:"<<endl

apple[0]=rand()%N+1//苹果

apple[1]=rand()%N+1

gotoxy(apple[0],apple[1])

color(12)

cout<<"●"<<endl

}

int main()

{

int i,j

int** snake=NULL

int apple[2]

int score=0

int tail[2]

int len=3

char ch='p'

srand((unsigned)time(NULL))

init(apple)

snake=(int**)realloc(snake,sizeof(int*)*len)

for(i=0i<leni++)

snake[i]=(int*)malloc(sizeof(int)*2)

for(i=0i<leni++)

{

snake[i][0]=N/2

snake[i][1]=N/2+i

gotoxy(snake[i][0],snake[i][1])

color(14)

cout<<"★"<<endl

}

while(1)//进入消息循环

{

tail[0]=snake[len-1][0]

tail[1]=snake[len-1][1]

gotoxy(tail[0],tail[1])

color(11)

cout<<"■"<<endl

for(i=len-1i>0i--)

{

snake[i][0]=snake[i-1][0]

snake[i][1]=snake[i-1][1]

gotoxy(snake[i][0],snake[i][1])

color(14)

cout<<"★"<<endl

}

if(kbhit())

{

gotoxy(0,N+2)

ch=getche()

}

switch(ch)

{

case 'w':snake[0][1]--break

case 's':snake[0][1]++break

case 'a':snake[0][0]--break

case 'd':snake[0][0]++break

default: break

}

gotoxy(snake[0][0],snake[0][1])

color(14)

cout<<"★"<<endl

Sleep(abs(200-0.5*score))

if(snake[0][0]==apple[0]&&snake[0][1]==apple[1])//吃掉苹果后蛇分数加1,蛇长加1

{

score++

len++

snake=(int**)realloc(snake,sizeof(int*)*len)

snake[len-1]=(int*)malloc(sizeof(int)*2)

apple[0]=rand()%N+1

apple[1]=rand()%N+1

gotoxy(apple[0],apple[1])

color(12)

cout<<"●"<<endl

gotoxy(N+5,3)

color(20)

cout<<score<<endl

}

if(snake[0][1]==0||snake[0][1]==N||snake[0][0]==0||snake[0][0]==N)//撞到围墙后失败

{

gotoxy(N/2,N/2)

color(30)

cout<<"失败!!!"<<endl

for(i=0i<leni++)

free(snake[i])

Sleep(INFINITE)

exit(0)

}

}

return 0

}

#define N 200

#include <graphics.h>

#include <stdlib.h>

#include <dos.h>

#define LEFT 0x4b00

#define RIGHT 0x4d00

#define DOWN 0x5000

#define UP 0x4800

#define ESC 0x011b

int i,key

int score=0/*得分*/

int gamespeed=50000/*游戏速度自己调整*/

struct Food

{

int x/*食物的横坐标*/

int y/*食物的纵坐标*/

int yes/*判断是否要出现食物的变量*/

}food/*食物的结构体*/

struct Snake

{

int x[N] /*蛇可出现的最大节数*/

int y[N]

int node/*蛇的节数*/

int direction/*蛇移动方向*/

int life/* 蛇的生命,0活着,1死亡*/

}snake

void Init(void)/*图形驱动*/

void Close(void)/*图形结束*/

void DrawK(void)/*开始画面*/

void GameOver(void)/*结束游戏*/

void GamePlay(void)/*玩游戏具体过程*/

void PrScore(void)/*输出成绩*/

/*主函数*/

void main(void)

{

Init()/*图形驱动*/

DrawK()/*开始画面*/

GamePlay()/*玩游戏具体过程*/

Close()/*图形结束*/

}

/*图形驱动*/

void Init(void)

{

int gd=DETECT,gm

initgraph(&gd,&gm,"c:\\tc")

cleardevice()

}

/*开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙*/

void DrawK(void)

{

/*setbkcolor(LIGHTGREEN)*/

setcolor(11)

setlinestyle(SOLID_LINE,0,THICK_WIDTH)/*设置线型*/

for(i=50i<=600i+=10)/*画围墙*/

{

rectangle(i,40,i+10,49)/*上边*/

rectangle(i,451,i+10,460)/*下边*/

}

for(i=40i<=450i+=10)

{

rectangle(50,i,59,i+10)/*左边*/

rectangle(601,i,610,i+10)/*右边*/

}

}

/*玩游戏具体过程*/

void GamePlay(void)

{

randomize()/*随机数发生器*/

food.yes=1/*1表示需要出现新食物,0表示已经存在食物*/

snake.life=0/*活着*/

snake.direction=1/*方向往右*/

snake.x[0]=100snake.y[0]=100/*蛇头*/

snake.x[1]=110snake.y[1]=100

snake.node=2/*节数*/

PrScore()/*输出得分*/

while(1)/*可以重复玩游戏,压ESC键结束*/

{

while(!kbhit())/*在没有按键的情况下,蛇自己移动身体*/

{

if(food.yes==1)/*需要出现新食物*/

{

food.x=rand()%400+60

food.y=rand()%350+60

while(food.x%10!=0)/*食物随机出现后必须让食物能够在整格内,这样才可以让蛇吃到*/

food.x++

while(food.y%10!=0)

food.y++

food.yes=0/*画面上有食物了*/

}

if(food.yes==0)/*画面上有食物了就要显示*/

{

setcolor(GREEN)

rectangle(food.x,food.y,food.x+10,food.y-10)

}

for(i=snake.node-1i>0i--)/*蛇的每个环节往前移动,也就是贪吃蛇的关键算法*/

{

snake.x[i]=snake.x[i-1]

snake.y[i]=snake.y[i-1]

}

/*1,2,3,4表示右,左,上,下四个方向,通过这个判断来移动蛇头*/

switch(snake.direction)

{

case 1:snake.x[0]+=10break

case 2: snake.x[0]-=10break

case 3: snake.y[0]-=10break

case 4: snake.y[0]+=10break

}

for(i=3i<snake.nodei++)/*从蛇的第四节开始判断是否撞到自己了,因为蛇头为两节,第三节不可能拐过来*/

{

if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0])

{

GameOver()/*显示失败*/

snake.life=1

break

}

}

if(snake.x[0]<55||snake.x[0]>595||snake.y[0]<55||

snake.y[0]>455)/*蛇是否撞到墙壁*/

{

GameOver()/*本次游戏结束*/

snake.life=1/*蛇死*/

}

if(snake.life==1)/*以上两种判断以后,如果蛇死就跳出内循环,重新开始*/

break

if(snake.x[0]==food.x&&snake.y[0]==food.y)/*吃到食物以后*/

{

setcolor(0)/*把画面上的食物东西去掉*/

rectangle(food.x,food.y,food.x+10,food.y-10)

snake.x[snake.node]=-20snake.y[snake.node]=-20

/*新的一节先放在看不见的位置,下次循环就取前一节的位置*/

snake.node++/*蛇的身体长一节*/

food.yes=1/*画面上需要出现新的食物*/

score+=10

PrScore()/*输出新得分*/

}

setcolor(4)/*画出蛇*/

for(i=0i<snake.nodei++)

rectangle(snake.x[i],snake.y[i],snake.x[i]+10,

snake.y[i]-10)

delay(gamespeed)

setcolor(0)/*用黑色去除蛇的的最后一节*/

rectangle(snake.x[snake.node-1],snake.y[snake.node-1],

snake.x[snake.node-1]+10,snake.y[snake.node-1]-10)

} /*endwhile(!kbhit)*/

if(snake.life==1)/*如果蛇死就跳出循环*/

break

key=bioskey(0)/*接收按键*/

if(key==ESC)/*按ESC键退出*/

break

else

if(key==UP&&snake.direction!=4)

/*判断是否往相反的方向移动*/

snake.direction=3

else

if(key==RIGHT&&snake.direction!=2)

snake.direction=1

else

if(key==LEFT&&snake.direction!=1)

snake.direction=2

else

if(key==DOWN&&snake.direction!=3)

snake.direction=4

}/*endwhile(1)*/

}

/*游戏结束*/

void GameOver(void)

{

cleardevice()

PrScore()

setcolor(RED)

settextstyle(0,0,4)

outtextxy(200,200,"GAME OVER")

getch()

}

/*输出成绩*/

void PrScore(void)

{

char str[10]

setfillstyle(SOLID_FILL,YELLOW)

bar(50,15,220,35)

setcolor(6)

settextstyle(0,0,2)

sprintf(str,"score:%d",score)

outtextxy(55,20,str)

}

/*图形结束*/

void Close(void)

{

getch()

closegraph()

}

用慧编程做贪吃蛇代码过程如下:

1、我们需要建立四个头文件,然后分别设置蛇的状态,上下左右,这是蛇能够有方向可走的前提,然后我们再设置蛇身的节点,定义一个简单的函数,这样蛇的全身以及他的行走方向就弄完了。

2、贪吃蛇不能穿墙代码。

3、第二步,一个函数这个函数的目的是贪吃蛇不能穿墙,很简单的代码分别设置长宽的最大位移,在内部范围内设置为一即可通过,否则不能穿墙。贪吃蛇随机生成一个食物。

4、设置一个随机函数。这样贪吃蛇代码就做好了。

慧编程是一款面向STEAM教育领域的积木式和代码编程软件,基于图形化编程开发。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/7446460.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-05
下一篇 2023-04-05

发表评论

登录后才能评论

评论列表(0条)

保存