如何在电脑上编程贪吃蛇(如何编写贪吃蛇代码)

http://www.itjxue.com  2023-04-10 22:44  来源:未知  点击次数: 

C语言课程设计,贪吃蛇应该怎么做?

2.1程序功能介绍

贪吃蛇游戏是一个经典小游戏,一条蛇在封闭围墙里,围墙里随机出现一个食物,通过按键盘四个光标键控制蛇向上下左右四个方向移动,蛇头撞倒食物,则食物被吃掉,蛇身体长一节,同时记10分,接着又出现食物,等待蛇来吃,如果蛇在移动中撞到墙或身体交叉蛇头撞倒自己身体游戏结束。

2.2程序整体设计说明

一个游戏要有开始部分,运行部分,结束部分(实际上开始部分与运行部分是一体的)。

2.2.1设计思路

这个程序的关键是表示蛇的图形以及蛇的移动。用一个小矩形表示蛇的一节身体,身体每长一节,增加一个矩形块,蛇头用两节表示。移动时必须从蛇头开始,所以蛇不能向相反方向移动,也就是蛇尾不能改作蛇头。如果不按任何键,蛇自行在当前方向上前移,当游戏者按了有效的方向键后,蛇头朝着指定的方向移动,一步移动一节身体,所以当按了有效的方向键后,先确定蛇头的位置,然后蛇身体随着蛇头移动,图形的实现是从蛇头的新位置开始画出蛇,这时由于没有庆平的原因,原来蛇的位置和新蛇的位置差一个单位,所以看起来社会多一节身体,所以将蛇的最后一节用背景色覆盖。食物的出现和消失也是画矩形块和覆盖矩形块

2.2.2数据结构设计及用法说明

开始部分:

游戏是运行在图形模式下的,所以第一步一定是初始化图形模式,接着要有开始的界面,就像书有封面一样,我设置了一个游戏的标题画面,除了游戏标题画面我还设置了一个欢迎画面。标题画面以后,还要为游戏的运行部分作初始化,包括绘制游戏运行时的背景,对游戏某些重 要变量的初始化。

运行部分:

作为游戏的核心部分,这里包括的函数比较多,也就是模块比较多,首先让我模拟一下贪吃蛇的游戏模式:某个世界上突然出现一条蛇,它很短,它的运动神经异常,它没法停止自己的多动症在它的世界里就只有食物,它很饿,也很贪吃;同样在不明原因的情况下,食物从天而降,可惜的是没有落到嘴边;饥饿的主人公,不管它有没有毒,也不问食物的来历,径直向食物爬去;它吃到食物啦,它超出想象的同化能力让食物很快的成为自己身体的一部分,它的身子变长啦。当它吃到第一颗食物时,上帝有给它第二颗,于是它吃了第二颗,于是又变长了,于是又有第三颗……它的身子是一直的加长,它不管自己过长身体的麻烦——转身不便,继续吃下去,现在它是直接把巴张大,好让食物有个绿色通道。但是在某天的下午,它咬到了自己,它才想起自己是一条毒蛇,于是晕死过去(不是毒死);又或者它往食物冲锋的时候,它失去控制,撞到了墙上。

第一轮循环:第一步,出现食物;第二步,蛇不停运动;第三步,检查蛇是撞到自己或墙壁;由第四步起游戏有两条支线(A、B):

A :第四步,蛇没有碰到自己或墙壁,蛇继续前进,绘制蛇的动作;第五步,判断蛇是否吃到食物,如果蛇吃到食物,身子变长,原来的食物消失;第六步,让玩家输入控制指令,让蛇在下一轮循环的第二步改变运动方向;第七步,第二轮循环的第一步,重复第一轮的步骤;

B:第四步,蛇碰到自己或墙壁,终止游戏。

结束部分:

游戏结束时,显示“GAME OVER”,已经是约定俗成的规律了,我的游戏也不例外。除了游戏结束画面外,我还设置了一个游戏退出画面,“善始善终”嘛。

有了上述的大致划分,我把整个程序划分成(13+2)个模块(其实就是函数)

2.2.3程序结构(流程图)

图2.1流程图

依据所需要处理的任务要求,规划输入数据和输出结果,决定存放数据的数据结构。

C语言中数据结构集中体现在数据类型上,因此在进行C语言程序设计时,应统筹规划程序中所使用的变量,数组,指针等,以及它们的类型等。这点是很重要的,如果在此期间选择不合适的变量或者数组,将来修改就十分困难。

现在分析一下贪吃蛇游戏中的元素,继而得出与它们对应的在程序中的描述:

蛇:

基本描述:长度,颜色,位置。

对应数据与数据类型:长度—虽然可以用坐标表示,但是这样的话,运算量将很大,所以换算成较大的单位—节数,以固定长度的每节描述;坐标--整型;颜色--整型; 位置--X,Y坐标。

增加的描述:蛇运动的方向,蛇的生命。

对应数据与数据类型:这些描述是为了与程序的按键的输入部分与判断游戏结束部分相联系而设的。方向只有四个方向:上下左右。可以设置与之对应的四个整型数:3、4、2、1。生命就只有两种情况:死或生,对应0或1。

食物:

基本描述:颜色,位置。

对应数据与数据类型:由于颜色设成固定的,所以不再讨论。位置—X、Y坐标。

增加的描述:食物的存在。

对应数据与数据类型:这是为了避免重复出现食物而设置的,与绘制食物的函数有联系。只有两个值:0或1(没有食物或有食物)

其他的元素:墙,由于它在显示上是作为背景而存在的,所以并没有什么说明实际的墙壁就是四条直线组成的边框,由坐标描述。

还需要的变量:键盘键入的键值(作为全局变量,整型);经常要使用的循环变量;自定义的填充图案;说明文字的字符数组;游戏的记分;游戏的速度(蛇的速度)。

图2.2蛇的不停运动的关键算法的流程图

2.2.4各模块的功能及程序说明

主要模块的实现思路和算法的流程图说明:

关键所在——蛇不停移动的Snakemove():

蛇的不停移动,就是蛇的下一节取代前一节的位置,在计算机中就是蛇下一节的位置坐标变成前一节的位置坐标。在上文中,已定义蛇的位置坐标为数组类型,一组坐标对应一节的位置,假设有i+1节,由0到i节,第i节的坐标取第i-1节的坐标,第i-1节的坐标取第i-2节的坐标……直到第1节取第0节的坐标。而第0节的坐标,即蛇头的坐标要往某个方向变化,变化量为蛇每节的长度。蛇的这种坐标轮换需要循环语句使其继续下去。

2.2.5程序结果

运行程序得到如下初始界面图:

图2.3程序结果图

用一个小矩形表示蛇的一节身体,身体每长一节,增加一个矩形块,蛇头用两节表示:

图2.4程序结果图

蛇没有碰到自己或墙壁,蛇继续前进:

图2.5程序结果图

游戏结束时,显示“GAME OVER”

图2.6程序结果图

2.3程序源代码及注释

#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;

registerbgidriver(EGAVGA_driver);

initgraph(gd,gm,"c:\\program files\\winyes\\tc20h\\bgi");

cleardevice();}

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

void DrawK(void){

/*setbkcolor(LIGHTGREEN);*/

setcolor(11);

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

for(i=50;i=600;i+=10)/*画围墙*/ ? {

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

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

for(i=40;i=450;i+=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]=100;snake.y[0]=100;/*蛇头*/

snake.x[1]=110;snake.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-1;i0;i--)/*蛇的每个环节往前移动,也就是贪吃蛇的关键算法*/ ? ? ? ? {

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]+=10;break;

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

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

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

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

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.xsnake.y[0]==food.y)/*吃到食物以后*/ ? ?{

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

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

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

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

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

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

score+=10;

PrScore();/*输出新得分*/ ? ?}

setcolor(4);/*画出蛇*/

for(i=0;isnake.node;i++)

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==UPsnake.direction!=4)

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

snake.direction=3;

else

if(key==RIGHTsnake.direction!=2)

snake.direction=1;

else

if(key==LEFTsnake.direction!=1)

snake.direction=2;

else

if(key==DOWNsnake.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();

}

c语言 贪吃蛇 程序

基本思路:

蛇每吃一个食物蛇身子就增加一格,用UP, DOWN, LEFT, RIGHT控制蛇头的运动,而蛇身子跟着蛇头走,每后一格蛇身子下一步走到上一格蛇身子的位置,以此类推。

#include stdio.h

#include conio.h

#include windows.h

#define BEG_X 2

#define BEG_Y 1

#define WID 20

#define HEI 20

HANDLE hout;

typedef enum {UP, DOWN, LEFT, RIGHT} DIR;

typedef struct Snake_body

{

COORD pos;//蛇身的位置

struct Snake_body *next;//下一个蛇身

struct Snake_body *prev;//前一个蛇身

}SNAKE, *PSNAKE;

PSNAKE head = NULL;//蛇头

PSNAKE tail = NULL;//蛇尾

//画游戏边框的函数

void DrawBorder()

{

int i, j;

COORD pos = {BEG_X, BEG_Y};

for(i = 0; i HEI; ++i)

{

SetConsoleCursorPosition(hout, pos);

for(j = 0; j WID; ++j)

{

if(i == 0)//第一行

{

if(j == 0)

printf("┏");

else if(j == WID - 1)

printf("┓");

else

printf("━");

}

else if(i == HEI - 1)//最后一行

{

if(j == 0)

printf("┗");

else if(j == WID - 1)

printf("┛");

else

printf("━");

}

else if(j == 0 || j == WID - 1)//第一列或最后一列

printf("┃");

else

printf(" ?");

}

++pos.Y;

}

}

//添加蛇身的函数

void AddBody(COORD pos)

{

PSNAKE pnew = (PSNAKE)calloc(1, sizeof(SNAKE));

pnew-pos = pos;

if(!head)

{

head = tail = pnew;

}

else

{

pnew-next = head;//新创建蛇身的next指向原先的蛇头

head-prev = pnew;//原先的蛇头的prev指向新创建的蛇身

head = pnew;//把新创建的蛇身作为新的蛇头

}

SetConsoleCursorPosition(hout, head-pos);

printf("◎");

}

//蛇身移动的函数

void MoveBody(DIR dir)

{

PSNAKE ptmp;

COORD pos = head-pos;

switch(dir)

{

case UP:

if(head-pos.Y BEG_Y + 1)

--pos.Y;

else

return;

break;

case DOWN:

if(head-pos.Y BEG_Y + HEI - 2)

++pos.Y;

else

return;

break;

case LEFT:

if(head-pos.X BEG_X + 2)

pos.X -= 2;

else

return;

break;

case RIGHT:

if(head-pos.X BEG_X + (WID - 2) * 2)

pos.X += 2;

else

return;

break;

}

AddBody(pos);//添加了一个新的蛇头

ptmp = tail;//保存当前的蛇尾

tail = tail-prev;

if(tail)

tail-next = NULL;

SetConsoleCursorPosition(hout, ptmp-pos);

printf(" ?");

free(ptmp);

}

int main()

{

int ctrl;

DIR dir = RIGHT;//初始蛇的方向是向右的

COORD pos = {BEG_X + 2, BEG_Y + HEI / 2};

system("color 0E");

system("mode con cols=90 lines=30");

hout = GetStdHandle(STD_OUTPUT_HANDLE);

printf(" ? ?------------贪吃蛇的移动------------");

DrawBorder();

//自定义几个蛇的身体

AddBody(pos);

pos.X += 2;

AddBody(pos);

pos.X += 2;

AddBody(pos);

pos.X += 2;

AddBody(pos);

pos.X += 2;

AddBody(pos);

pos.X += 2;

AddBody(pos);

pos.X += 2;

AddBody(pos);

//控制蛇的移动

while(ctrl = getch())

{

switch(ctrl)

{

case 'w':

if(dir == DOWN)

continue;

dir = UP;

break;

case 's':

if(dir == UP)

continue;

dir = DOWN;

break;

case 'a':

if(dir == RIGHT)

continue;

dir = LEFT;

break;

case 'd':

if(dir == LEFT)

continue;

dir = RIGHT;

break;

case 'q':

return 0;

}

MoveBody(dir);

}

return 0;

}

扩展资料:

实现逻辑

1,可以设置光标,就能实现制定位置打印制定符号。

2,涉及一个结构体,包含两个元素坐标元素和一个结构体指针。

3,结构体串联形成链表,遍历获取成员坐标,打印符号得到蛇身。

4,不断的加头,去尾,重新遍历坐标,再打印形成蛇的移动。

5,食物产生的位置判定,不能越界,也不能与蛇身体重合。

6,蛇的转向判定,一条规则,不允许倒退。

7,转向的实现,跟行进方向决定新的关节坐标(当前头的上下左右)

8,死亡检测,是否头节点坐标是否与墙壁重合,是否与身体其他关节重合。

9,加速减速,设置刷新休眠时间实现。

参考资料来源:百度百科-C语言

怎样用vb编写贪吃蛇游戏

1、向上前进的时候,对代码进行一个详解。

2、向上前进时,x坐标不动,y坐标-1,如果下一个有食物 下一个位置的坐标和食物的坐标相同。把食物转化成蛇的身体。

3、如果蛇吃到了食物,就开始加速,并且食物的得分+2。

4、如果没有吃到食物,蛇可以正常往前走,恢复原来的方块。

5、向下前进时,x坐标不动,y坐标+1。

6、如果有食物就把食物转化为身体。

7、如果没有吃到食物,蛇可以正常往前走,恢复原来的方块。

如何用慧编程做贪吃蛇代码

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

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

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

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

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

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

c#编程贪吃蛇

using?System;using?System.Collections.Generic;using?System.ComponentModel;using?System.Data;using?System.Drawing;using?System.Linq;using?System.Text;using?System.Windows.Forms;

namespace?SnakeGame

{

????public?partial?class?frmSnake?:?Form

????{

????????public?Point?FoodLct?=?new?Point();//缓存食物的坐标??

????????public?int?snakeLen?=?6;

????????public?const?int?SnakeMaxLength?=?500;

????????public?Point[]?snakeArr?=?new?Point[SnakeMaxLength];

????????public?int?snakeDrt?=?2;

????????public?bool?panDuan?=?true;

????????public?frmSnake()

????????{

????????????InitializeComponent();

????????????int?temp?=?0;

????????????for?(int?i?=?snakeLen?-?1;?i?=?0;?i--)

????????????{

????????????????snakeArr[i].X?=?temp;?snakeArr[i].Y?=?0;?

????????????????temp?+=?15;

????????????}

????????}

????????/*

????????前言??

????????说到贪吃蛇,大家可能小时候都玩过,小菜最近在整理Winfrom的学习系列,那我觉得有兴趣才会有学习,就从这个小游戏讲起吧。??

????????其实我刚开始学习编程的时候,感觉写个贪吃蛇的程序会很难,因为涉及到画图什么的,其实现在来看,实现很简单。??

????????实现贪吃蛇首先有几个元素:??

????????蛇??

????????食物??

????????然后有几个行为:??

????????吃食物和吃不到食物??

????????撞墙和撞自己??

????????说到这有点oo的意思啊,这篇就不啰嗦,只是简单实现,下篇会优化下。??

????????其实整个贪吃蛇的难点就在于画图,可能用其他语言实现有点复杂,但是强大的.net提供了GDI+绘图机制,实现起来就很方便了,其次就是细节的处理,比如坐标的定位,蛇的行走路线等。??

????????我们简单一点来看,食物可以看成一个小方格,蛇是有N个小方格组成,那我们就可以用GDI+这样实现:

????????///?summary??

????????///?画一个小方块??

????????///?/summary??

????????public?void?DrawShape(int?x,?int?y)

????????{

????????????Graphics?g?=?this.CreateGraphics();

????????????Pen?pen?=?new?Pen(Color.Blue,?2);

????????????g.DrawRectangle(pen,?x,?y,?15,?15);

????????????g.FillRectangle(Brushes.Green,?x,?y,?15,?15);

????????}

????????///?summary??

????????///?画一个食物??

????????///?/summary??

????????public?void?DrawFood(int?x,?int?y)

????????{

????????????Graphics?g?=?this.CreateGraphics();

????????????Pen?pen?=?new?Pen(Color.Red,?2);

????????????SolidBrush?brush?=?new?SolidBrush(Color.Green);

????????????g.DrawRectangle(pen,?x,?y,?15,?15);

????????????g.FillRectangle(brush,?x,?y,?15,?15);

????????}

????????Graphics这个类我就不多说,大家可以看看MSDN上介绍的用法,上面是画蛇的最小单元-方格,和一个食物方格,蛇的方格大小是15*15,边框颜色是Blue,填充色是Green;食物方格的大小是15*15,边框颜色是Red,填充色是Green。??

????????画好了基本元素,那下面就是用基本元素来表现蛇了,可以用Point数组来存储蛇的坐标,也就是每个方格的坐标,我们先看下代码:?

????????///?summary??

????????///?设置Point数组坐标??

????????///?/summary??

????????public?void?Forward(int?drt)

????????{

????????????Point?temp?=?snakeArr[0];

????????????for?(int?i?=?snakeLen?-?1;?i??0;?i--)

????????????{

????????????????snakeArr[i].X?=?snakeArr[i?-?1].X;

????????????????snakeArr[i].Y?=?snakeArr[i?-?1].Y;

????????????}

????????????switch?(drt)

????????????{

????????????????case?1:

????????????????????snakeArr[0].X?=?temp.X;

????????????????????snakeArr[0].Y?=?temp.Y?-?15;

????????????????????break;?//上???

????????????????case?2:

????????????????????snakeArr[0].X?=?temp.X?+?15;

????????????????????snakeArr[0].Y?=?temp.Y;

????????????????????break;?//右???

????????????????case?3:

????????????????????snakeArr[0].X?=?temp.X;

????????????????????snakeArr[0].Y?=?temp.Y?+?15;

????????????????????break;?//下???

????????????????case?4:

????????????????????snakeArr[0].X?=?temp.X?-?15;

????????????????????snakeArr[0].Y?=?temp.Y;

????????????????????break;?//左???

????????????}

????????}

????????drt参数是键盘上上下左右键对应的数字,snakeLen是数组的长度也就是方格的个数,上面那个for循环主要的作用是把前一个数组的坐标赋值给下一个,就像是毛毛虫爬行一样,后一节会按照前一节的路线来爬,下面那个switch的作用是,设置蛇头的行进路线。??

????????再下面就是判断蛇是否吃到食物、是否撞到墙和撞到自己,因为蛇和食物都是用坐标存储的,所以只要判断蛇头坐标是否等于食物坐标就可以了:??

????????///?summary??

????????///?判断是否吃到食物???????????

????????///?/summary??

????????public?bool?EatedFoot(Point?FoodLct)

????????{

????????????if?(snakeArr[0].X?==?FoodLct.X??snakeArr[0].Y?==?FoodLct.Y)

????????????{

????????????????if?(snakeLen??SnakeMaxLength)

????????????????{

????????????????????snakeLen++;

????????????????????snakeArr[snakeLen].X?=?snakeArr[snakeLen?-?1].X;

????????????????????snakeArr[snakeLen].Y?=?snakeArr[snakeLen?-?1].Y;

????????????????}

????????????????return?true;

????????????}

????????????else

????????????????return?false;

????????}

????????///?summary??

????????///?判断是否撞到自己?????????

????????///?/summary??

????????public?bool?CheckSnakeHeadInSnakeBody()

????????{

????????????return?this.CheckInSnakeBody(this.snakeArr[0].X,?this.snakeArr[0].Y,?1);

????????}

????????///?summary??

????????///?检查输入的坐标是否在蛇的身上

????????///?/summary??

????????public?bool?CheckInSnakeBody(int?x,?int?y,?int?snkHead)

????????{

????????????for?(int?i?=?snkHead;?i??snakeLen;?i++)

????????????{

????????????????if?(x?==?this.snakeArr[i].X??y?==?this.snakeArr[i].Y)

????????????????{

????????????????????return?true;

????????????????}

????????????}?return?false;

????????}

????????///?summary??

????????///?判断是否撞墙

????????///?/summary??

????????///?returns/returns??

????????public?bool?CheckSnakeBodyInFrm()

????????{

????????????if?(this.snakeArr[0].X?=?594?||?this.snakeArr[0].Y?=?399?-?32?||?this.snakeArr[0].X??0?||?this.snakeArr[0].Y??0)

????????????????return?true;

????????????else

????????????????return?false;

????????}*/

????????/*实现上面的几个步骤,简单版的贪吃蛇基本上就完成了,再加上一个timer控件,这样蛇就会“动”起来了,就这么简单。??

????????完整代码:*/

????????///?summary??

????????///?画一个小方块???????????

????????///?/summary??

????????public?void?DrawShape(int?x,?int?y)

????????{

????????????Graphics?g?=?this.CreateGraphics();

????????????Pen?pen?=?new?Pen(Color.Blue,?2);

????????????g.DrawRectangle(pen,?x,?y,?15,?15);

????????????g.FillRectangle(Brushes.Green,?x,?y,?15,?15);

????????}

????????///?summary??

????????///?画一个食物???????????

????????///?/summary??

????????public?void?DrawFood(int?x,?int?y)

????????{

????????????Graphics?g?=?this.CreateGraphics();

????????????Pen?pen?=?new?Pen(Color.Red,?2);

????????????SolidBrush?brush?=?new?SolidBrush(Color.Green);

????????????g.DrawRectangle(pen,?x,?y,?15,?15);

????????????g.FillRectangle(brush,?x,?y,?15,?15);

????????}

????????///?summary??

????????///?设置Point数组坐标???????????

????????///?/summary??

????????public?void?Forward(int?drt)

????????{

????????????Point?temp?=?snakeArr[0];

????????????for?(int?i?=?snakeLen?-?1;?i??0;?i--)

????????????{

????????????????snakeArr[i].X?=?snakeArr[i?-?1].X;

????????????????snakeArr[i].Y?=?snakeArr[i?-?1].Y;

????????????}

????????????switch?(drt)

????????????{

????????????????case?1:?snakeArr[0].X?=?temp.X;?snakeArr[0].Y?=?temp.Y?-?15;?break;?//上???

????????????????case?2:?snakeArr[0].X?=?temp.X?+?15;?snakeArr[0].Y?=?temp.Y;?break;?//右???

????????????????case?3:?snakeArr[0].X?=?temp.X;?snakeArr[0].Y?=?temp.Y?+?15;?break;?//下???

????????????????case?4:?snakeArr[0].X?=?temp.X?-?15;?snakeArr[0].Y?=?temp.Y;?break;?//左???

????????????}

????????}

????????///?summary??

????????///?时间事件???????????///?/summary??

????????private?void?timer1_Tick(object?sender,?EventArgs?e)

????????{

????????????Graphics?g?=?this.CreateGraphics();

????????????g.Clear(Color.DarkKhaki);//清除整个画面??

????????????Forward(snakeDrt);

????????????for?(int?i?=?0;?i??snakeLen;?i++)

????????????{

????????????????DrawShape(snakeArr[i].X,?snakeArr[i].Y);

????????????}

????????????if?(panDuan)

????????????{

????????????????ShowFood();//DrawFood(FoodLct.X,?FoodLct.Y);??

????????????????panDuan?=?false;

????????????}

????????????if?(EatedFoot(FoodLct))

????????????{

????????????????ShowFood();

????????????????DrawFood(FoodLct.X,?FoodLct.Y);

????????????}

????????????else

????????????{

????????????????DrawFood(FoodLct.X,?FoodLct.Y);

????????????}

????????????if?(CheckSnakeHeadInSnakeBody()?||?CheckSnakeBodyInFrm())

????????????{

????????????????this.timer1.Enabled?=?false;

????????????????MessageBox.Show("游戏结束!");

????????????}

????????}

????????///?summary??

????????///?按下方向键

????????///?/summary??

????????private?void?frmSnake_KeyDown(object?sender,?KeyEventArgs?e)

????????{

????????????if?(e.KeyCode?==?Keys.Up)?snakeDrt?=?1;

????????????else?if?(e.KeyCode?==?Keys.Down)

????????????????snakeDrt?=?3;

????????????else?if?(e.KeyCode?==?Keys.Right)

????????????????snakeDrt?=?2;

????????????else?if?(e.KeyCode?==?Keys.Left)

????????????????snakeDrt?=?4;

????????}

????????///?summary??

????????///?判断是否撞到自己

????????///?/summary??

????????public?bool?CheckSnakeHeadInSnakeBody()

????????{

????????????return?this.CheckInSnakeBody(this.snakeArr[0].X,?this.snakeArr[0].Y,?1);

????????}

????????///?summary??

????????///?检查输入的坐标是否在蛇的身上

????????///?/summary??

????????public?bool?CheckInSnakeBody(int?x,?int?y,?int?snkHead)

????????{

????????????for?(int?i?=?snkHead;?i??snakeLen;?i++)

????????????{

????????????????if?(x?==?this.snakeArr[i].X??y?==?this.snakeArr[i].Y)

????????????????{

????????????????????return?true;

????????????????}

????????????}

????????????return?false;

????????}

????????///?summary??

????????///?判断是否撞墙

????????///?/summary??

????????///?returns/returns??

????????public?bool?CheckSnakeBodyInFrm()

????????{

????????????if?(this.snakeArr[0].X?=?594?||?this.snakeArr[0].Y?=?399?-?32?||?this.snakeArr[0].X??0?||?this.snakeArr[0].Y??0)

????????????????return?true;

????????????else

????????????????return?false;

????????}

????????///?summary??

????????///?随机显示食物

????????///?/summary??

????????public?void?ShowFood()

????????{

????????????Random?rmd?=?new?Random();

????????????int?x,?y;?x?=?rmd.Next(0,?this.Width?/?15)?*?15;

????????????y?=?rmd.Next(0,?this.Height?/?15)?*?15;

????????????//while?(this.CheckInSnakeBody(x,?y,?1))???

????????????//{????????????

????????????//????x?=?rmd.Next(0,?32)?*?15;????

????????????//????y?=?32?+?rmd.Next(0,?30)?*?15;???????????

????????????//}??

????????????FoodLct.X?=?x;

????????????FoodLct.Y?=?y;

????????}

????????///?summary??

????????///?判断是否吃到食物

????????///?/summary??

????????public?bool?EatedFoot(Point?FoodLct)

????????{

????????????if?(snakeArr[0].X?==?FoodLct.X??snakeArr[0].Y?==?FoodLct.Y)

????????????{

????????????????if?(snakeLen??SnakeMaxLength)

????????????????{

????????????????????snakeLen++;

????????????????????snakeArr[snakeLen].X?=?snakeArr[snakeLen?-?1].X;?

????????????????????snakeArr[snakeLen].Y?=?snakeArr[snakeLen?-?1].Y;

????????????????}?return?true;

????????????}

????????????else

????????????????return?false;

????????}

????}

}

(责任编辑:IT教学网)

更多

推荐淘宝营销文章