2024年9月制作贪吃蛇程序怎么一吃就死?贪吃蛇 C语言 简易程序设计
⑴制作贪吃蛇程序怎么一吃就死?贪吃蛇C语言简易程序设计
⑵完整代码:*/????????///?《summary》??????????///?画一个小方块???????????????????///?《/summary》??????????public?void?DrawShape(int?x,?int?y)????????{????????????Graphics?g?=?this.CreateGraphics();????????????Pen?pen?=?new?Pen(Color.Blue,?);????????????g.DrawRectangle(pen,?x,?y,?,?);????????????g.FillRectangle(Brushes.Green,?x,?y,?,?);????????}????????///?《summary》??????????///?画一个食物???????????????????///?《/summary》??????????public?void?DrawFood(int?x,?int?y)????????{????????????Graphics?g?=?this.CreateGraphics();????????????Pen?pen?=?new?Pen(Color.Red,?);????????????SolidBrush?brush?=?new?SolidBrush(Color.Green);????????????g.DrawRectangle(pen,?x,?y,?,?);????????????g.FillRectangle(brush,?x,?y,?,?);????????}????????///?《summary》??????????///?设置Point数组坐标???????????????????///?《/summary》??????????public?void?Forward(int?drt)????????{????????????Point?temp?=?snakeArr;????????????for?(int?i?=?snakeLen?-?;?i?》?;?i--)????????????{????????????????snakeArr.X;????????????????snakeArr.Y;????????????}????????????switch?(drt)????????????{????????????????case?:?snakeArr.Y?=?temp.Y?-?;?break;?//上???????????????????case?:?snakeArr.Y?=?temp.Y;?break;?//右???????????????????case?:?snakeArr.Y?=?temp.Y?+?;?break;?//下???????????????????case?:?snakeArr.Y?=?temp.Y;?break;?//左???????????????}????????}????????///?《summary》??????????///?时间事件???????????///?《/summary》??????????private?void?timer_Tick(object?sender,?EventArgs?e)????????{????????????Graphics?g?=?this.CreateGraphics();????????????g.Clear(Color.DarkKhaki);//清除整个画面??????????????Forward(snakeDrt);????????????for?(int?i?=?;?i?《?snakeLen;?i++)????????????{????????????????DrawShape(snakeArr.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.timer.Enabled?=?false;????????????????MessageBox.Show(“游戏结束,所以只要判断蛇头坐标是否等于食物坐标就可以了:??????????///?《summary》??????????///?判断是否吃到食物???????????????????///?《/summary》??????????public?bool?EatedFoot(Point?FoodLct)????????{????????????if?(snakeArr.Y?==?FoodLct.Y)????????????{????????????????if?(snakeLen?《?SnakeMaxLength)????????????????{????????????????????snakeLen++;????????????????????snakeArr.X;????????????????????snakeArr.Y;????????????????}????????????????return?true;????????????}????????????else????????????????return?false;????????}????????///?《summary》??????????///?判断是否撞到自己?????????????????///?《/summary》??????????public?bool?CheckSnakeHeadInSnakeBody()????????{????????????return?this.CheckInSnakeBody(this.snakeArr.Y,?);????????}????????///?《summary》??????????///?检查输入的坐标是否在蛇的身上????????///?《/summary》??????????public?bool?CheckInSnakeBody(int?x,?int?y,?int?snkHead)????????{????????????for?(int?i?=?snkHead;?i?《?snakeLen;?i++)????????????{????????????????if?(x?==?this.snakeArr.Y)????????????????{????????????????????return?true;????????????????}????????????}?return?false;????????}????????///?《summary》??????????///?判断是否撞墙????????///?《/summary》??????????///?《returns》《/returns》??????????public?bool?CheckSnakeBodyInFrm()????????{????????????if?(this.snakeArr.Y?《?)????????????????return?true;????????????else????????????????return?false;????????}*/????????/*实现上面的几个步骤,那我们就可以用GDI+这样实现:????????///?《summary》??????????///?画一个小方块??????????///?《/summary》??????????public?void?DrawShape(int?x,?int?y)????????{????????????Graphics?g?=?this.CreateGraphics();????????????Pen?pen?=?new?Pen(Color.Blue,?);????????????g.DrawRectangle(pen,?x,?y,?,?);????????????g.FillRectangle(Brushes.Green,?x,?y,?,?);????????}????????///?《summary》??????????///?画一个食物??????????///?《/summary》??????????public?void?DrawFood(int?x,?int?y)????????{????????????Graphics?g?=?this.CreateGraphics();????????????Pen?pen?=?new?Pen(Color.Red,?);????????????SolidBrush?brush?=?new?SolidBrush(Color.Green);????????????g.DrawRectangle(pen,?x,?y,?,?);????????????g.FillRectangle(brush,?x,?y,?,?);????????}????????Graphics这个类我就不多说,“);????????????}????????}????????///?《summary》??????????///?按下方向键????????///?《/summary》??????????private?void?frmSnake_KeyDown(object?sender,?KeyEventArgs?e)????????{????????????if?(e.KeyCode?==?Keys.Up)?snakeDrt?=?;????????????else?if?(e.KeyCode?==?Keys.Down)????????????????snakeDrt?=?;????????????else?if?(e.KeyCode?==?Keys.Right)????????????????snakeDrt?=?;????????????else?if?(e.KeyCode?==?Keys.Left)????????????????snakeDrt?=?;????????}????????///?《summary》??????????///?判断是否撞到自己????????///?《/summary》??????????public?bool?CheckSnakeHeadInSnakeBody()????????{????????????return?this.CheckInSnakeBody(this.snakeArr.Y,?);????????}????????///?《summary》??????????///?检查输入的坐标是否在蛇的身上????????///?《/summary》??????????public?bool?CheckInSnakeBody(int?x,?int?y,?int?snkHead)????????{????????????for?(int?i?=?snkHead;?i?《?snakeLen;?i++)????????????{????????????????if?(x?==?this.snakeArr.Y)????????????????{????????????????????return?true;????????????????}????????????}????????????return?false;????????}????????///?《summary》??????????///?判断是否撞墙????????///?《/summary》??????????///?《returns》《/returns》??????????public?bool?CheckSnakeBodyInFrm()????????{????????????if?(this.snakeArr.Y?《?)????????????????return?true;????????????else????????????????return?false;????????}????????///?《summary》??????????///?随机显示食物????????///?《/summary》??????????public?void?ShowFood()????????{????????????Random?rmd?=?new?Random();????????????int?x,?y;?x?=?rmd.Next(,?this.Width?/?)?*?;????????????y?=?rmd.Next(,?this.Height?/?)?*?;????????????//while?(this.CheckInSnakeBody(x,?y,?))???????????????//{????????????????????????//????x?=?rmd.Next(,?)?*?;????????????????//????y?=??+?rmd.Next(,?)?*?;???????????????????????//}??????????????FoodLct.X?=?x;????????????FoodLct.Y?=?y;????????}????????///?《summary》??????????///?判断是否吃到食物????????///?《/summary》??????????public?bool?EatedFoot(Point?FoodLct)????????{????????????if?(snakeArr.Y?==?FoodLct.Y)????????????{????????????????if?(snakeLen?《?SnakeMaxLength)????????????????{????????????????????snakeLen++;????????????????????snakeArr.X;?????????????????????snakeArr.Y;????????????????}?return?true;????????????}????????????else????????????????return?false;????????}????}},实现贪吃蛇首先有几个元素:??????????蛇??????????食物??????????然后有几个行为:??????????吃食物和吃不到食物??????????撞墙和撞自己??????????说到这有点oo的意思啊,每次蛇体移动后都会调用?check_eat_food?函数检查是不是吃到了某一个食物,值为表示屏幕上有食物*/intcolor;/*食物颜色*/}food;structSnake/*定义结构体存储蛇的属性*/{intx;/*每一节蛇的坐标*/inty;intcolor;/*存储每一节蛇的颜色*/intnode;/*蛇的节数*/intdirection;/*蛇移动的方向*/intlife;/*蛇的生命,本文目录制作贪吃蛇程序怎么一吃就死贪吃蛇C语言简易程序设计c#编程贪吃蛇制作贪吃蛇程序怎么一吃就死制作贪吃蛇程序一吃就死是因为代码输入错误。
⑶制作贪吃蛇程序怎么一吃就死
⑷制作贪吃蛇程序一吃就死是因为代码输入错误,代码有漏洞,同学们可以用window_size设置蛇可以活动的区域大小。foods?是一个存储着所有食物位置信息的列表,每次蛇体移动后都会调用?check_eat_food?函数检查是不是吃到了某一个食物。
⑸可以发现,检查是不是吃到和吃下去这两个动作我分为了两个函数,以做到每个函数一心一意方便后期修改。但是作为一只能照顾自己的贪吃蛇,同学们还需要能够判断当前自身状态。
⑹贪吃蛇的程序组成思路
⑺贪吃蛇这个游戏可以分为三大块:界面:负责显示相关的所有工作;游戏流程控制:判断游戏输赢、游戏初始化等;蛇和食物:移动自身、判断是否死亡、是否被吃等。
⑻每一块都被做成了单独的对象,通过相互配合实现游戏。对于贪吃蛇游戏里面的蛇来讲,它可以做的事情有三种:移动,死亡(吃到自己,撞墙和吃东西围绕着这三个功能,同学们可以首先写出一个简陋的蛇。
⑼贪吃蛇C语言简易程序设计
⑽#include《graphics.h》#include《stdlib.h》#defineN#defineupx#definedownx#defineleftxb#definerightxd#defineescxb#defineYx#definenxeintgamespeed;/*游戏速度*/inti,key,color;intscore=;/*游戏分数*/charcaiH={x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,xE,x,xC,x,x,x,xC,x,xC,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,xC,xE,x,x,x,x,x,xC,x,x,xE,x,x,xC,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,xE,x,x,xF,x,x,xC,xF,x,xE,x,x,x,xF,x,xC,x,x,x,xFF,x,x,x,x,x,xFF,x,x,x,x,xF,xF,x,xF,x,x,xF,xF,x,xE,x,x,xFF,xFC,x,x,x,x,xC,xFF,x,x,x,x,x,xFF,x,x,x,x,x,xF,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,xE,x,x,x,x,x,xC,x,x,x,x,x,x,x,x,x,x,x,x,x,x,xE,x,x,x,x,x,x,x,x,x,x,x,x,x,x,xE,x,x,x,xF,x,xC,x,x,x,x,x,xC,x,x,x,x,x,x,x,x,x,x,xF,x,x,x,x,x,xE,x,x,x,x,x,xC,x,x,x,x,x,x,x,x,x,x,x,xC,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,};charsheH={x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,xC,x,x,x,x,x,xE,x,x,x,x,x,xE,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,xF,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,xF,x,x,x,x,xF,xFC,x,xC,x,x,xE,xF,x,x,x,x,xFE,xF,x,x,x,x,xE,x,xC,x,x,x,xC,x,x,x,x,x,xC,x,x,x,x,x,xC,xE,x,x,x,x,xF,xE,x,xE,x,x,xF,x,xF,xE,x,x,xE,x,xF,x,x,x,xE,x,xF,x,x,x,x,x,xE,x,x,x,x,xFC,xC,x,x,x,x,xFC,x,x,x,x,xF,xC,x,x,x,x,xC,x,x,x,x,x,xF,x,x,x,x,x,xE,x,x,x,xF,x,x,x,x,x,xF,x,x,x,x,xFF,xF,x,x,x,x,xFF,xF,x,x,x,x,xFF,xE,x,x,x,x,xFF,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,};chartunH={x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,xE,x,x,x,x,x,xE,x,x,x,x,x,xF,x,x,x,x,x,xE,x,x,x,x,x,xC,x,x,x,x,xF,x,x,x,x,x,xC,x,x,x,x,x,xF,x,x,x,x,x,xF,x,x,x,x,x,x,x,xC,x,x,x,x,xFF,xE,x,x,x,x,xFF,xE,x,x,x,xF,xFF,x,x,x,x,xF,xF,x,x,x,xF,xFF,xF,x,x,x,xF,xFF,xF,x,x,x,xF,xFC,xC,x,x,x,xF,xF,xE,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,xC,x,xC,x,x,x,x,x,x,x,x,x,x,xC,x,x,x,x,x,xFF,xC,x,x,xC,xF,xFF,xE,x,x,x,xFF,xFF,xC,x,x,x,xFE,x,x,xE,x,xF,x,x,x,xF,x,xE,x,xE,x,xFE,x,x,x,xE,x,xFE,x,x,xF,xFE,x,xC,x,x,xF,xFE,x,x,x,x,xF,xFE,x,x,x,x,xF,xFE,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,};chardanH={x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,xFC,x,x,x,x,x,xFF,x,x,x,x,xF,xC,x,x,x,x,xFF,x,x,x,x,x,xF,x,x,x,x,x,x,x,xE,x,x,x,x,x,xF,x,x,x,x,xFF,xF,x,x,x,x,xFF,xF,x,x,x,x,xF,x,x,x,x,x,xC,x,x,x,x,x,x,x,x,x,x,xF,x,x,x,x,x,xFF,x,x,x,x,x,xFF,xC,x,x,x,x,xFF,xF,x,x,x,x,x,xFC,x,x,x,x,x,xF,x,x,x,x,x,x,xC,x,x,x,x,x,xC,x,x,xF,x,xF,xF,xC,x,xF,xF,xFE,xF,xF,x,xC,xFF,xF,xF,xF,x,x,xE,xF,xF,xF,x,x,xC,xE,x,x,x,x,x,xFC,x,x,x,x,xC,xF,x,x,x,x,xFF,xF,x,x,x,x,xF,xF,x,x,x,x,xF,x,x,x,x,x,x,x,x,x,x,x,x,xF,x,x,x,x,xF,xF,x,x,x,x,xFF,xFF,xE,x,x,x,xFF,x,xE,x,x,x,xE,x,xE,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,};charzuoH={x,xC,x,xC,x,x,x,xFE,x,xFE,x,xC,xF,xFC,xB,xFC,x,xC,x,xC,x,xFE,x,xFE,x,xC,x,xC,x,xC,x,x,};charzheH={x,x,x,xC,xF,x,xF,xD,x,x,xFF,xFE,xFF,xFE,x,x,xF,xF,xF,xF,xEC,x,xCF,xF,xC,x,xF,xF,xF,xF,x,x,};chartianH={x,x,xF,xFC,xF,xFC,x,xC,x,xC,x,xC,xF,xFC,xF,xFC,x,xC,x,xC,x,xC,xF,xFC,xF,xFC,x,xC,x,x,x,x,};charxueH={x,x,x,x,x,xB,xF,xFC,xF,xFC,x,xC,xF,xF,xF,xF,x,xC,xF,xFC,xF,xFC,x,x,x,x,x,x,x,x,x,x,};charkeH={x,x,xC,x,xFD,x,xF,xD,x,x,xFE,x,xFE,x,x,xD,xC,x,xE,xE,xDB,xFE,xB,xF,x,x,x,x,x,x,x,x,};structFood/*定义结构体存储食物的属性*/{intx;/*食物的坐标*/inty;intyes;/*值为表示屏幕上没有食物,值为表示屏幕上有食物*/intcolor;/*食物颜色*/}food;structSnake/*定义结构体存储蛇的属性*/{intx;/*每一节蛇的坐标*/inty;intcolor;/*存储每一节蛇的颜色*/intnode;/*蛇的节数*/intdirection;/*蛇移动的方向*/intlife;/*蛇的生命,如果为,蛇死,游戏结束*/}snake;voidinit(void)/*图形驱动*/{intdriver=DETECT,mode=;registerbgidriver(EGAVGA_driver);initgraph(&driver,&mode,““);}voiddrawmat(char*mat,intmatsize,intx,inty,intcolor)/*汉字点阵*/{inti,j,k,m;m=(matsize-)/+;for(j=;j《matsize;j++)for(i=;i《m;i++)for(k=;k《;k++)if(mat&(x》》k))putpixel(x+i*+k,y+j,color);}voidshowword(void){/*调用汉字点阵输出程序,显示标题和作者信息*/drawmat(caiH,,,-,);drawmat(sheH,,,-,);drawmat(tunH,,,-,);drawmat(danH,,,-,);drawmat(caiH,,,-,);drawmat(sheH,,,-,);drawmat(tunH,,,-,);drawmat(danH,,,-,);/*作者田学科*/drawmat(zuoH,,,,);drawmat(zheH,,,,);drawmat(tianH,,,,);drawmat(xueH,,,,);drawmat(keH,,,,);}voiddraw(void)/*画出四周的墙*/{if(color==)color=;setcolor(++color);setlinestyle(SOLID_LINE,,);for(i=;i《=;i+=){rectangle(i,,i+,);rectangle(i,,i+,);}for(i=;i《;i+=){rectangle(,i,,i+);rectangle(,i,,i+);}}voidprscore(void){/*打印游戏分数*/charstr;setfillstyle(SOLID_FILL,YELLOW);bar(,,,);setcolor();settextstyle(,,);sprintf(str,“score:%d“,score);outtextxy(,,str);}voidgameover(void){cleardevice();/*清屏函数*/for(i=;i《snake.node;i++)/*画出蛇死时的位置*/{setcolor(snake.color);rectangle(snake.x+);}prscore();/*显示分数*/draw();showword();settextstyle(,,);setcolor();outtextxy(,,“GAMEOVER“);setcolor(RED);outtextxy(,,“GAMEOVER“);}voidgameplay(void)/*玩游戏的具体过程*/{intflag,flag;randomize();prscore();gamespeed=;food.yes=;/*food.yes=表示屏幕上没有食物*/snake.life=;/*snake.life=表示蛇是活着的*/snake.direction=;/*表示蛇的初始方向为向右*/snake.node=;/*蛇的初始化为两节*/snake.color=;/*两节蛇头初始化为绿色*/snake.color=;snake.x=;snake.x=;food.color=random()+;while(){while(){if(food.yes==)/*如果蛇活着*/{while(){flag=;food.yes=;food.x=random()*+;food.y=random()*+;for(i=;i《snake.node;i++){if(food.x==snake.x)flag=;}if(flag)break;}}if(food.yes){setcolor(food.color);rectangle(food.x,food.y,food.x+,food.y+);}for(i=snake.node-;i》;i--){snake.x;snake.y;}switch(snake.direction){case:snake.y-=;break;case:snake.y+=;break;case:snake.x-=;break;case:snake.x+=;break;}for(i=;i《snake.node;i++){if(snake.x){gameover();snake.life=;break;}}if(snake.x》){gameover();snake.life=;}if(snake.life==)break;if(snake.x==food.y)/*蛇吃掉食物*/{setcolor();rectangle(food.x,food.y,food.x+,food.y+);snake.x=-;snake.y=-;snake.color=food.color;snake.node++;food.yes=;food.color=random()+;score+=;prscore();if(score%==&&score!=){for(i=;i《snake.node;i++)/*画出蛇*/{setcolor(snake.color);rectangle(snake.x+);}sound();delay();delay();delay();delay();delay();delay();nosound();gamespeed-=;draw();}else{sound();delay();nosound();}}for(i=;i《snake.node;i++)/*画出蛇*/{setcolor(snake.color);rectangle(snake.x+);}delay(gamespeed);delay(gamespeed);flag=;setcolor();rectangle(snake.x,snake.x+);if(kbhit()&&flag==)/*如果没按有效键就重新开始循环*/{flag=;key=bioskey();if(key==esc)exit();elseif(key==up&&snake.direction!=)snake.direction=;elseif(key==down&&snake.direction!=)snake.direction=;elseif(key==left&&snake.direction!=)snake.direction=;elseif(key==right&&snake.direction!=)snake.direction=;}}if(snake.life==)/*如果蛇死了就退出循环*/break;}}voidmain(void){while(){color=;init();cleardevice();showword();draw();gameplay();setcolor();settextstyle(,,);outtextxy(,,“CONTINUE(Y/N)?“);while(){key=bioskey();if(key==Y||key==n||key==esc)break;}if(key==n||key==esc)break;}closegraph();}
⑾using?System;using?System.Collections.Generic;using?System.ponentModel;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?=?;????????public?const?int?SnakeMaxLength?=?;????????public?Point;????????public?int?snakeDrt?=?;????????public?bool?panDuan?=?true;????????public?frmSnake()????????{????????????Initializeponent();????????????int?temp?=?;????????????for?(int?i?=?snakeLen?-?;?i?》=?;?i--)????????????{????????????????snakeArr.Y?=?;?????????????????temp?+=?;????????????}????????}????????/*????????前言??????????说到贪吃蛇,大家可能小时候都玩过,小菜最近在整理Winfrom的学习系列,那我觉得有兴趣才会有学习,就从这个小游戏讲起吧。??????????其实我刚开始学习编程的时候,感觉写个贪吃蛇的程序会很难,因为涉及到画图什么的,其实现在来看,实现很简单。??????????实现贪吃蛇首先有几个元素:??????????蛇??????????食物??????????然后有几个行为:??????????吃食物和吃不到食物??????????撞墙和撞自己??????????说到这有点oo的意思啊,这篇就不啰嗦,只是简单实现,下篇会优化下。??????????其实整个贪吃蛇的难点就在于画图,可能用其他语言实现有点复杂,但是强大的.提供了GDI+绘图机制,实现起来就很方便了,其次就是细节的处理,比如坐标的定位,蛇的行走路线等。??????????我们简单一点来看,食物可以看成一个小方格,蛇是有N个小方格组成,那我们就可以用GDI+这样实现:????????///?《summary》??????????///?画一个小方块??????????///?《/summary》??????????public?void?DrawShape(int?x,?int?y)????????{????????????Graphics?g?=?this.CreateGraphics();????????????Pen?pen?=?new?Pen(Color.Blue,?);????????????g.DrawRectangle(pen,?x,?y,?,?);????????????g.FillRectangle(Brushes.Green,?x,?y,?,?);????????}????????///?《summary》??????????///?画一个食物??????????///?《/summary》??????????public?void?DrawFood(int?x,?int?y)????????{????????????Graphics?g?=?this.CreateGraphics();????????????Pen?pen?=?new?Pen(Color.Red,?);????????????SolidBrush?brush?=?new?SolidBrush(Color.Green);????????????g.DrawRectangle(pen,?x,?y,?,?);????????????g.FillRectangle(brush,?x,?y,?,?);????????}????????Graphics这个类我就不多说,大家可以看看MSDN上介绍的用法,上面是画蛇的最小单元-方格,和一个食物方格,蛇的方格大小是*,边框颜色是Blue,填充色是Green;食物方格的大小是*,边框颜色是Red,填充色是Green。??????????画好了基本元素,那下面就是用基本元素来表现蛇了,可以用Point数组来存储蛇的坐标,也就是每个方格的坐标,我们先看下代码:?????????///?《summary》??????????///?设置Point数组坐标??????????///?《/summary》??????????public?void?Forward(int?drt)????????{????????????Point?temp?=?snakeArr;????????????for?(int?i?=?snakeLen?-?;?i?》?;?i--)????????????{????????????????snakeArr.X;????????????????snakeArr.Y;????????????}????????????switch?(drt)????????????{????????????????case?:????????????????????snakeArr.X?=?temp.X;????????????????????snakeArr.Y?=?temp.Y?-?;????????????????????break;?//上???????????????????case?:????????????????????snakeArr.X?=?temp.X?+?;????????????????????snakeArr.Y?=?temp.Y;????????????????????break;?//右???????????????????case?:????????????????????snakeArr.X?=?temp.X;????????????????????snakeArr.Y?=?temp.Y?+?;????????????????????break;?//下???????????????????case?:????????????????????snakeArr.X?=?temp.X?-?;????????????????????snakeArr.Y?=?temp.Y;????????????????????break;?//左???????????????}????????}????????drt参数是键盘上上下左右键对应的数字,snakeLen是数组的长度也就是方格的个数,上面那个for循环主要的作用是把前一个数组的坐标赋值给下一个,就像是毛毛虫爬行一样,后一节会按照前一节的路线来爬,下面那个switch的作用是,设置蛇头的行进路线。??????????再下面就是判断蛇是否吃到食物、是否撞到墙和撞到自己,因为蛇和食物都是用坐标存储的,所以只要判断蛇头坐标是否等于食物坐标就可以了:??????????///?《summary》??????????///?判断是否吃到食物???????????????????///?《/summary》??????????public?bool?EatedFoot(Point?FoodLct)????????{????????????if?(snakeArr.Y?==?FoodLct.Y)????????????{????????????????if?(snakeLen?《?SnakeMaxLength)????????????????{????????????????????snakeLen++;????????????????????snakeArr.X;????????????????????snakeArr.Y;????????????????}????????????????return?true;????????????}????????????else????????????????return?false;????????}????????///?《summary》??????????///?判断是否撞到自己?????????????????///?《/summary》??????????public?bool?CheckSnakeHeadInSnakeBody()????????{????????????return?this.CheckInSnakeBody(this.snakeArr.Y,?);????????}????????///?《summary》??????????///?检查输入的坐标是否在蛇的身上????????///?《/summary》??????????public?bool?CheckInSnakeBody(int?x,?int?y,?int?snkHead)????????{????????????for?(int?i?=?snkHead;?i?《?snakeLen;?i++)????????????{????????????????if?(x?==?this.snakeArr.Y)????????????????{????????????????????return?true;????????????????}????????????}?return?false;????????}????????///?《summary》??????????///?判断是否撞墙????????///?《/summary》??????????///?《returns》《/returns》??????????public?bool?CheckSnakeBodyInFrm()????????{????????????if?(this.snakeArr.Y?《?)????????????????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,?);????????????g.DrawRectangle(pen,?x,?y,?,?);????????????g.FillRectangle(Brushes.Green,?x,?y,?,?);????????}????????///?《summary》??????????///?画一个食物???????????????????///?《/summary》??????????public?void?DrawFood(int?x,?int?y)????????{????????????Graphics?g?=?this.CreateGraphics();????????????Pen?pen?=?new?Pen(Color.Red,?);????????????SolidBrush?brush?=?new?SolidBrush(Color.Green);????????????g.DrawRectangle(pen,?x,?y,?,?);????????????g.FillRectangle(brush,?x,?y,?,?);????????}????????///?《summary》??????????///?设置Point数组坐标???????????????????///?《/summary》??????????public?void?Forward(int?drt)????????{????????????Point?temp?=?snakeArr;????????????for?(int?i?=?snakeLen?-?;?i?》?;?i--)????????????{????????????????snakeArr.X;????????????????snakeArr.Y;????????????}????????????switch?(drt)????????????{????????????????case?:?snakeArr.Y?=?temp.Y?-?;?break;?//上???????????????????case?:?snakeArr.Y?=?temp.Y;?break;?//右???????????????????case?:?snakeArr.Y?=?temp.Y?+?;?break;?//下???????????????????case?:?snakeArr.Y?=?temp.Y;?break;?//左???????????????}????????}????????///?《summary》??????????///?时间事件???????????///?《/summary》??????????private?void?timer_Tick(object?sender,?EventArgs?e)????????{????????????Graphics?g?=?this.CreateGraphics();????????????g.Clear(Color.DarkKhaki);//清除整个画面??????????????Forward(snakeDrt);????????????for?(int?i?=?;?i?《?snakeLen;?i++)????????????{????????????????DrawShape(snakeArr.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.timer.Enabled?=?false;????????????????MessageBox.Show(“游戏结束!“);????????????}????????}????????///?《summary》??????????///?按下方向键????????///?《/summary》??????????private?void?frmSnake_KeyDown(object?sender,?KeyEventArgs?e)????????{????????????if?(e.KeyCode?==?Keys.Up)?snakeDrt?=?;????????????else?if?(e.KeyCode?==?Keys.Down)????????????????snakeDrt?=?;????????????else?if?(e.KeyCode?==?Keys.Right)????????????????snakeDrt?=?;????????????else?if?(e.KeyCode?==?Keys.Left)????????????????snakeDrt?=?;????????}????????///?《summary》??????????///?判断是否撞到自己????????///?《/summary》??????????public?bool?CheckSnakeHeadInSnakeBody()????????{????????????return?this.CheckInSnakeBody(this.snakeArr.Y,?);????????}????????///?《summary》??????????///?检查输入的坐标是否在蛇的身上????????///?《/summary》??????????public?bool?CheckInSnakeBody(int?x,?int?y,?int?snkHead)????????{????????????for?(int?i?=?snkHead;?i?《?snakeLen;?i++)????????????{????????????????if?(x?==?this.snakeArr.Y)????????????????{????????????????????return?true;????????????????}????????????}????????????return?false;????????}????????///?《summary》??????????///?判断是否撞墙????????///?《/summary》??????????///?《returns》《/returns》??????????public?bool?CheckSnakeBodyInFrm()????????{????????????if?(this.snakeArr.Y?《?)????????????????return?true;????????????else????????????????return?false;????????}????????///?《summary》??????????///?随机显示食物????????///?《/summary》??????????public?void?ShowFood()????????{????????????Random?rmd?=?new?Random();????????????int?x,?y;?x?=?rmd.Next(,?this.Width?/?)?*?;????????????y?=?rmd.Next(,?this.Height?/?)?*?;????????????//while?(this.CheckInSnakeBody(x,?y,?))???????????????//{????????????????????????//????x?=?rmd.Next(,?)?*?;????????????????//????y?=??+?rmd.Next(,?)?*?;???????????????????????//}??????????????FoodLct.X?=?x;????????????FoodLct.Y?=?y;????????}????????///?《summary》??????????///?判断是否吃到食物????????///?《/summary》??????????public?bool?EatedFoot(Point?FoodLct)????????{????????????if?(snakeArr.Y?==?FoodLct.Y)????????????{????????????????if?(snakeLen?《?SnakeMaxLength)????????????????{????????????????????snakeLen++;????????????????????snakeArr.X;?????????????????????snakeArr.Y;????????????????}?return?true;????????????}????????????else????????????????return?false;????????}????}}