㈠ 贪吃蛇编程
这里有我以前敲过的贪吃蛇,不介意可以参考一下,(ps:需要建一了application而不是console application)
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <time.h>
#define speed 200
#define left 100
#define top 50
#define right 500
#define bottom 350
struct snake
{
POINT pos;
snake *front,*next;
};
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
bool InitWindow(HINSTANCE,int);
void items(HDC,int,int);
void MoveSnake(int);
void remove();
void destroy();
void inf(int,int,int,int);
void inf(const char*,int,int,int,int);
void inf(const char*,int,int,int);
bool is_fail();
void eat();
void wall();
void show_fruit();
UINT ShowMode;
PAINTSTRUCT ps;
bool onoff;
HFONT hf;
char judge[20];
int dir;
HDC hdc;
HWND hwnd;
HBRUSH BlackBrush,MainBrush,NULLBrush;
HPEN MainPen,BlackPen;
snake *head,*tail,*temp;
POINT fruit;
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
)
{
onoff=1;
int i;
dir=-2;
tail=NULL;
InitWindow(hInstance,nCmdShow);
for(i=0;i<5;i++)
{
if(!tail)
{
head=new snake;
tail=head;
head->pos.x=300+i*10;
head->pos.y=200;
items(hdc,head->pos.x,head->pos.y);
}
else
{
tail->next=new snake;
tail->next->front=tail;
tail=tail->next;
tail->pos.x=300+i*10;
tail->pos.y=200;
tail->next=NULL;
items(hdc,tail->pos.x,tail->pos.y);
}
}
hf=CreateFont(20,0,0,0,400,0,0,0,GB2312_CHARSET,
OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_DONTCARE,"华文行楷");
SelectObject(hdc,hf);
SetBkColor(hdc,RGB(124,146,131));
SelectObject(hdc,MainBrush);
wall();
show_fruit();
inf("得分:",260,0,0);
MSG msg;
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
destroy();
return 0;
}
LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
static int seed=15;
switch(msg)
{
case WM_TIMER:
MoveSnake(dir);
if(!is_fail())
{
KillTimer(hwnd,1);
MessageBox(hwnd,"you are lost","caption",0);
}
eat();
break;
case WM_PAINT:
hdc=BeginPaint(hwnd,&ps);
wall();
EndPaint(hwnd,&ps);
hdc=GetDC(hwnd);
case WM_KEYDOWN:
switch(wParam)
{
case VK_UP:dir=(dir!=1?-1:dir);break;
case VK_DOWN:dir=(dir!=-1?1:dir);break;
case VK_RIGHT:dir=(dir!=-2?2:dir);break;
case VK_LEFT:dir=(dir!=2?-2:dir);break;
}
break;
case WM_CLOSE:
if(MessageBox(hwnd,"确定退出?","caption",MB_YESNO)==IDYES)
DestroyWindow(hwnd);
break;
case WM_DESTROY:
ReleaseDC(hwnd,hdc);
KillTimer(hwnd,1);
PostQuitMessage(0);
break;
default:return DefWindowProc(hwnd,msg,wParam,lParam);
}
return 1;
}
bool InitWindow(HINSTANCE hInstance,int nCmdShow)
{
WNDCLASS wc;
wc.style=CS_HREDRAW | CS_VREDRAW;
wc.lpszClassName="test";
wc.lpszMenuName=NULL;
wc.cbClsExtra=0;
wc.cbWndExtra=0;
wc.hbrBackground=CreateSolidBrush(RGB(124,146,131));
wc.hIcon=NULL;
wc.hCursor=LoadCursor(NULL,IDC_ARROW);
wc.hInstance=hInstance;
wc.lpfnWndProc=WndProc;
MainBrush=CreateSolidBrush(RGB(124,146,131));
BlackBrush=(HBRUSH)GetStockObject(BLACK_BRUSH);
NULLBrush=(HBRUSH)GetStockObject(NULL_BRUSH);
MainPen=CreatePen(PS_SOLID,1,RGB(124,146,131));
BlackPen=CreatePen(PS_SOLID,1,RGB(0,0,0));
if(!RegisterClass(&wc)) return false;
hwnd=CreateWindow("test","贪吃蛇",WS_SYSMENU,400,150,616,400,NULL,NULL,hInstance,NULL);
hdc=BeginPaint(hwnd,&ps);
if(!hwnd) return false;
ShowWindow(hwnd,SW_SHOWNORMAL);
UpdateWindow(hwnd);
SetTimer(hwnd,1,speed,NULL);
return true;
}
void items(HDC hdc,int x,int y)
{
SelectObject(hdc,BlackPen);
SelectObject(hdc,NULLBrush);
Rectangle(hdc,x,y,x+10,y+10);
SelectObject(hdc,BlackBrush);
Rectangle(hdc,x+2,y+2,x+8,y+8);
// DeleteObject(BlackPen);
// DeleteObject(BlackBrush);
}
void MoveSnake(int dir)
{
static int i=0;
remove();
tail=tail->front;
delete tail->next;
tail->next=NULL;
temp=new snake;
temp->next=head;
head->front=temp;
temp->pos.x=head->pos.x+(dir/2)*10;
temp->pos.y=head->pos.y+(dir%2)*10;
head=temp;
i++;
items(hdc,head->pos.x,head->pos.y);
}
void remove()
{
SelectObject(hdc,MainBrush);
SelectObject(hdc,MainPen);
Rectangle(hdc,tail->pos.x,tail->pos.y,tail->pos.x+10,tail->pos.y+10);
// DeleteObject(MainBrush);
// DeleteObject(MainPen);
}
void destroy()
{
while(head->next)
{
head=head->next;
delete head->front;
}
delete tail;
}
void inf(int x,int y,int px,int py)
{
inf("",x,y,px,py);
}
void inf(const char*str,int x,int y,int scores)
{
sprintf(judge,"%s%d",str,scores);
TextOut(hdc,x,y,judge,strlen(judge));
}
void inf(const char*str,int x,int y,int px,int py)
{
sprintf(judge,"%s(%d,%d) ",str,px,py);
TextOut(hdc,x,y,judge,strlen(judge));
}
bool is_fail()
{
temp=head;
int px=head->pos.x,py=head->pos.y;
if(px<left||px>=right||py<top||py>=bottom)
return 0;
while(temp->next)
{
temp=temp->next;
if(px==temp->pos.x&&py==temp->pos.y)
return 0;
}
return 1;
}
void show_fruit()
{
srand((UINT)time(NULL));
fruit.x=10*((rand()%(right-left-10))/10)+left;
fruit.y=10*((rand()%(bottom-top-10))/10)+top;
items(hdc,fruit.x,fruit.y);
}
void eat()
{
inf("食物:",0,25,fruit.x,fruit.y);
inf("蛇头:",0,0,head->pos.x,head->pos.y);
static int scores=0;
if(head->pos.x==fruit.x&&head->pos.y==fruit.y)
{
scores++;
inf("得分:",260,0,scores);
KillTimer(hwnd,1);
temp=new snake;
temp->next=head;
head->front=temp;
temp->pos.x=head->pos.x+(dir/2)*10;
temp->pos.y=head->pos.y+(dir%2)*10;
head=temp;
items(hdc,head->pos.x,head->pos.y);
SetTimer(hwnd,1,speed,NULL);
show_fruit();
}
}
void wall()
{
SelectObject(hdc,MainBrush);
Rectangle(hdc,left-1,top-1,right+1,bottom+1);
// DeleteObject(MainBrush);
}
㈡ 在dos环境下c语言编程编一个贪吃蛇游戏
程序设计及说明
1
、边墙(
Wall
)
该类规定游戏的范围大小。
2
、蛇类(
Snake
)
用该类生成一个实例蛇
snake
。
3
、移动(
Move
)
该类用于实现对蛇的操作控制,即蛇头方向的上下左右的移动操作。
4
、食物类(
Food
)
该类是游戏过程中食物随机产生的控制和显示。
5
、判断死亡(
Dead
)
该类是对游戏过程中判断玩家操作是否导致蛇的死亡,其中包括蛇头咬食自己身体和蛇头是否触
及游戏“边墙”。
6
、蛇结点(
SnakeNode
)
该类是蛇吃下随机产生的食物从而增加长度的控制类,其中包括蛇长度增加和尾部的变化。
7
、计分统计(
Score
)
该类由于玩家的游戏成绩记录,及游戏结束时的得分输出。
...
部分函数及说明
1.Char menu();
/*
用于玩家选择的游戏速度,返回一个
char
值
*/
2.DELAY(char ch1);
/*
用于控制游戏速度
*/
3.void drawmap();
/*
绘制游戏地图函数
*
4
、
void menu()
/*
游戏帮助信息的输出
*
...
部分类细节解说
1
、蛇的构建
—
Snake
class Snake{
public:
int x[n]
;
int y[n];
int node;
//
蛇身长度
int direction;//
蛇运动方向
int
life;//
蛇生命,判断死亡
}
2
、随机食物
Food
利用
rand(
)函数进行随机数产生,然后就行坐标定位
void Food(void){
...
int pos_x = 0;
int pos_y = 0;
pos_x = rand() % length;//x
坐标的确定
pos_y = rand() % (width-1);//y
坐标的确定
...
}
3
、蛇头方向确定
利用
switch
语句进行方向确定
...
switch(){
case VK_UP:{
OutChar2.Y--;
y--;
break;
}
case VK_LEFT:{
OutChar2.Y++;
y++;
break;
}
case VK_DOWN:{
OutChar2.X---;
x--;
break;
}
case 'VK_RIGHT:{
OutChar2.X++;
x++;
break;
}
}
代码
#include <iostream>
#include <ctime>
#include <conio.h>
#include <windows.h>
#include <time.h>
using namespace std;
int score=0,t=300,f=1;//
得分与时间间隔
/ms
(控制贪吃蛇的速度)
double ss=0,tt=0;//
统计时间所用参数
class Node
{
Node(): x(0), y(0), prior(0), next(0) { }
int x;
int y;
Node *prior;
Node *next;
friend class Snake;
};
class Snake
{
public:
Snake();
~Snake();
void output();
void move();
void change_point(char);
private:
Node *head;
Node *tail;
enum p{ UP
, RIGHT, DOWN, LEFT }point; //
方向
int food_x, food_y; //
食物的坐标
static const int N = 23;
int game[N][N];
void add_head(int, int); //
添加坐标为
a,b
的结点
void delete_tail(); //
删除最后一个结点
void greate_food(); //
产生食物
void gotoxy(int, int);
};
void menu();
//
游戏操作菜单
int main()
{
system("color a");
//
初始
cmd
窗口颜色为黑(背景)淡绿(文字)
cout<<"\n\n\n\n\n\n
";
for(int i=0;i<23;i++)
{char star[]={"Welcome To Snake Game!"};
cout<<star[i];
Sleep(170);}
cout<<"\n\n
祝你好运!
"<<endl;
Sleep(3000);
if(kbhit()){char kk=getch();if(kk==9)f=5;} //
如果执行,吃一颗星加
5
分
system("cls");
Snake s;
menu();
system("color 1a");
s.output();
while (true)
{
char keydown = getch();
if(keydown==32)getch();
if(keydown==27)return 0;
s.change_point(keydown);
while (!kbhit())
{clock_t start,end;start=clock();
s.move();
s.output();
Sleep(t);
end=clock();tt=(double)(end-start)/CLOCKS_PER_SEC;ss+=tt;
cout<<"
时间:
"<<(int)ss;
㈢ 用QT编程:编写一个贪吃蛇游戏(写明构思)
用链表来存储蛇身体的位置,有一个指向蛇头的指针。根据蛇的移动方向,在蛇头前加一节蛇身,去掉蛇的最后一节,这样就实现了蛇的移动了。
定一个Timer,每秒重画一次,根据蛇的位置将其画出即可。
㈣ 如何自己编写一个贪吃蛇的游戏软件
贪吃蛇—类编程.rar第一步:“蛇”类初始化 新建fla文件,同目录下新建as文件,取名Snake.as,类名必须和文件名相同。fla文件中新建蛇节点元件,链接名为node,第一帧和类中写入相应代码。
第一步:“蛇”类初始化.rar第二步:蛇的移动写个move方法,在init方法中设置时间间隔。
第二步:蛇的移动.rar第三步: 键盘改变移动方向写个changeDirection方法,在主场景第一帧用键盘事件调用该方法,控制蛇的方向。
第三步:键盘改变移动方向.rar第四步:增加节点写个addNode方法,新节点产生在蛇尾即nodes[length - 1]的位置上,暂时加个按钮调用addNode方法,观察结果。
第四步:增加节点.rar第五步:碰撞判断修改move方法,假如头节点与蛇身其他部位重合,clearInterval删除move的定时调用。同时changeDirection也要加多个判断,不能让头节点和第二节点重合,加多这个判断是为了防止一个Bug的产生,一些贪吃蛇程序并没有注意到这点。这个Bug产生原因如下:
假设蛇向右移动,是不能进行向左改变方向,但由于move方法是定时调用的,比如每300毫秒一次,所以在这300毫秒内可能进行了多次快速按键。第一次按向下,蛇的xDirection和yDirection改变为向下,但move的执行时间没到,又紧接着按左,因为蛇方向在数据上已经改变,所以捕捉不到不能向左的判断,快速按键造成蛇反向移动的Bug就产生了,加个上述判断就好了。
第五步:碰撞判断.rar第六步:食物类编写新建Food类,注意用extends继承MovieClip,这样元件才能链接它,在主场景中新建食物元件,链接Food类,实例名为food,拖入场景。在Food中写入appear和disappear方法,做两个临时按键调用它们观察效果。
第六步:食物类编写.rar最终完成:吃食物Food中定时调用appear,并通过setSnake引入Snake实例snake,判断蛇身坐标不让新食物与之重合。Snake中通过setFood引入Food实例food,判断是否吃到食物,做出相应处理,如食物消失,增加蛇节点,改变setSnake。场景第一帧也要setSnake引入蛇头。以后还要增加新功能,如阻碍物设置等,都可以通过改变as文件完成。虽然类编程比直接控制影片较为繁琐,但由于使用了面向对象,以后再对程序进行完善时都可依照对象行为思考,每个方法就是对象的每个行为,什么行为需要改变就找对应的方法修改,思路清晰。
㈤ 求贪吃蛇的程序代码(c语言)
贪吃蛇游戏的代码
#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=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;i>0;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;i<snake.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.x&&snake.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;i<snake.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==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();
}
程序结束,请采纳
㈥ c#编程贪吃蛇
usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Windows.Forms;
namespaceSnakeGame
{
publicpartialclassfrmSnake:Form
{
publicPointFoodLct=newPoint();//缓存食物的坐标
publicintsnakeLen=6;
publicconstintSnakeMaxLength=500;
publicPoint[]snakeArr=newPoint[SnakeMaxLength];
publicintsnakeDrt=2;
publicboolpanDuan=true;
publicfrmSnake()
{
InitializeComponent();
inttemp=0;
for(inti=snakeLen-1;i>=0;i--)
{
snakeArr[i].X=temp;snakeArr[i].Y=0;
temp+=15;
}
}
/*
前言
说到贪吃蛇,大家可能小时候都玩过,小菜最近在整理Winfrom的学习系列,那我觉得有兴趣才会有学习,就从这个小游戏讲起吧。
其实我刚开始学习编程的时候,感觉写个贪吃蛇的程序会很难,因为涉及到画图什么的,其实现在来看,实现很简单。
实现贪吃蛇首先有几个元素:
蛇
食物
然后有几个行为:
吃食物和吃不到食物
撞墙和撞自己
说到这有点oo的意思啊,这篇就不啰嗦,只是简单实现,下篇会优化下。
其实整个贪吃蛇的难点就在于画图,可能用其他语言实现有点复杂,但是强大的.net提供了GDI+绘图机制,实现起来就很方便了,其次就是细节的处理,比如坐标的定位,蛇的行走路线等。
我们简单一点来看,食物可以看成一个小方格,蛇是有N个小方格组成,那我们就可以用GDI+这样实现:
///<summary>
///画一个小方块
///</summary>
publicvoidDrawShape(intx,inty)
{
Graphicsg=this.CreateGraphics();
Penpen=newPen(Color.Blue,2);
g.DrawRectangle(pen,x,y,15,15);
g.FillRectangle(Brushes.Green,x,y,15,15);
}
///<summary>
///画一个食物
///</summary>
publicvoidDrawFood(intx,inty)
{
Graphicsg=this.CreateGraphics();
Penpen=newPen(Color.Red,2);
SolidBrushbrush=newSolidBrush(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>
publicvoidForward(intdrt)
{
Pointtemp=snakeArr[0];
for(inti=snakeLen-1;i>0;i--)
{
snakeArr[i].X=snakeArr[i-1].X;
snakeArr[i].Y=snakeArr[i-1].Y;
}
switch(drt)
{
case1:
snakeArr[0].X=temp.X;
snakeArr[0].Y=temp.Y-15;
break;//上
case2:
snakeArr[0].X=temp.X+15;
snakeArr[0].Y=temp.Y;
break;//右
case3:
snakeArr[0].X=temp.X;
snakeArr[0].Y=temp.Y+15;
break;//下
case4:
snakeArr[0].X=temp.X-15;
snakeArr[0].Y=temp.Y;
break;//左
}
}
drt参数是键盘上上下左右键对应的数字,snakeLen是数组的长度也就是方格的个数,上面那个for循环主要的作用是把前一个数组的坐标赋值给下一个,就像是毛毛虫爬行一样,后一节会按照前一节的路线来爬,下面那个switch的作用是,设置蛇头的行进路线。
再下面就是判断蛇是否吃到食物、是否撞到墙和撞到自己,因为蛇和食物都是用坐标存储的,所以只要判断蛇头坐标是否等于食物坐标就可以了:
///<summary>
///判断是否吃到食物
///</summary>
publicboolEatedFoot(PointFoodLct)
{
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;
}
returntrue;
}
else
returnfalse;
}
///<summary>
///判断是否撞到自己
///</summary>
()
{
returnthis.CheckInSnakeBody(this.snakeArr[0].X,this.snakeArr[0].Y,1);
}
///<summary>
///检查输入的坐标是否在蛇的身上
///</summary>
publicboolCheckInSnakeBody(intx,inty,intsnkHead)
{
for(inti=snkHead;i<snakeLen;i++)
{
if(x==this.snakeArr[i].X&&y==this.snakeArr[i].Y)
{
returntrue;
}
}returnfalse;
}
///<summary>
///判断是否撞墙
///</summary>
///<returns></returns>
publicboolCheckSnakeBodyInFrm()
{
if(this.snakeArr[0].X>=594||this.snakeArr[0].Y>=399-32||this.snakeArr[0].X<0||this.snakeArr[0].Y<0)
returntrue;
else
returnfalse;
}*/
/*实现上面的几个步骤,简单版的贪吃蛇基本上就完成了,再加上一个timer控件,这样蛇就会“动”起来了,就这么简单。
完整代码:*/
///<summary>
///画一个小方块
///</summary>
publicvoidDrawShape(intx,inty)
{
Graphicsg=this.CreateGraphics();
Penpen=newPen(Color.Blue,2);
g.DrawRectangle(pen,x,y,15,15);
g.FillRectangle(Brushes.Green,x,y,15,15);
}
///<summary>
///画一个食物
///</summary>
publicvoidDrawFood(intx,inty)
{
Graphicsg=this.CreateGraphics();
Penpen=newPen(Color.Red,2);
SolidBrushbrush=newSolidBrush(Color.Green);
g.DrawRectangle(pen,x,y,15,15);
g.FillRectangle(brush,x,y,15,15);
}
///<summary>
///设置Point数组坐标
///</summary>
publicvoidForward(intdrt)
{
Pointtemp=snakeArr[0];
for(inti=snakeLen-1;i>0;i--)
{
snakeArr[i].X=snakeArr[i-1].X;
snakeArr[i].Y=snakeArr[i-1].Y;
}
switch(drt)
{
case1:snakeArr[0].X=temp.X;snakeArr[0].Y=temp.Y-15;break;//上
case2:snakeArr[0].X=temp.X+15;snakeArr[0].Y=temp.Y;break;//右
case3:snakeArr[0].X=temp.X;snakeArr[0].Y=temp.Y+15;break;//下
case4:snakeArr[0].X=temp.X-15;snakeArr[0].Y=temp.Y;break;//左
}
}
///<summary>
///时间事件///</summary>
privatevoidtimer1_Tick(objectsender,EventArgse)
{
Graphicsg=this.CreateGraphics();
g.Clear(Color.DarkKhaki);//清除整个画面
Forward(snakeDrt);
for(inti=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>
privatevoidfrmSnake_KeyDown(objectsender,KeyEventArgse)
{
if(e.KeyCode==Keys.Up)snakeDrt=1;
elseif(e.KeyCode==Keys.Down)
snakeDrt=3;
elseif(e.KeyCode==Keys.Right)
snakeDrt=2;
elseif(e.KeyCode==Keys.Left)
snakeDrt=4;
}
///<summary>
///判断是否撞到自己
///</summary>
()
{
returnthis.CheckInSnakeBody(this.snakeArr[0].X,this.snakeArr[0].Y,1);
}
///<summary>
///检查输入的坐标是否在蛇的身上
///</summary>
publicboolCheckInSnakeBody(intx,inty,intsnkHead)
{
for(inti=snkHead;i<snakeLen;i++)
{
if(x==this.snakeArr[i].X&&y==this.snakeArr[i].Y)
{
returntrue;
}
}
returnfalse;
}
///<summary>
///判断是否撞墙
///</summary>
///<returns></returns>
publicboolCheckSnakeBodyInFrm()
{
if(this.snakeArr[0].X>=594||this.snakeArr[0].Y>=399-32||this.snakeArr[0].X<0||this.snakeArr[0].Y<0)
returntrue;
else
returnfalse;
}
///<summary>
///随机显示食物
///</summary>
publicvoidShowFood()
{
Randomrmd=newRandom();
intx,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>
publicboolEatedFoot(PointFoodLct)
{
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;
}returntrue;
}
else
returnfalse;
}
}
}
㈦ 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;
}
(7)编程怎样做贪吃蛇编程脚本扩展阅读:
实现逻辑
1,可以设置光标,就能实现制定位置打印制定符号。
2,涉及一个结构体,包含两个元素坐标元素和一个结构体指针。
3,结构体串联形成链表,遍历获取成员坐标,打印符号得到蛇身。
4,不断的加头,去尾,重新遍历坐标,再打印形成蛇的移动。
5,食物产生的位置判定,不能越界,也不能与蛇身体重合。
6,蛇的转向判定,一条规则,不允许倒退。
7,转向的实现,跟行进方向决定新的关节坐标(当前头的上下左右)
8,死亡检测,是否头节点坐标是否与墙壁重合,是否与身体其他关节重合。
9,加速减速,设置刷新休眠时间实现。
㈧ 编程初学者应该怎么做一个贪吃蛇的游戏
PK版有新增迅速结婚的的方法
史实或登录武将都可以,但对象无法选择
方法是先找一人结一级绊,然后拼命访问便可触发
(此为伪随机,这天没有的话就是没有,要换另一天去试)
不需要拉入同道也不需要同一座城,无关身分或在野
也无关性别,直接拜访即可
对象会介绍他的孩子/朋友/养子(虚构武将)给你问要不要结
头像是从登录武将当中任选,能力方面与他相仿但较低
头像方面不满意的话得找van修改器来改
能力方面可找曹操这种超强武将跟他结伴来获得有力对象
但特技方面会比较贫乏,目前不知增加的方法
如果想要3个强力对象可一直找曹操
但从第二个开始似乎最快要等下个月才会有
㈨ C语言的贪吃蛇源代码
#include <bits/stdc++.h>
#include <windows.h>
#include <conio.h>
using namespace std;
void gotoxy(int x,int y) {COORD pos={x,y}; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);}//光标定位
class Food {//食物类
private: int m_x; int m_y;
public:
void randfood() {//随机产生一个食物
srand((int)time(NULL));//利用时间添加随机数种子,需要ctime头文件
L1:{m_x=rand()%(85)+2;//2~86
m_y=rand()%(25)+2;//2~26
if(m_x%2) goto L1;//如果食物的x坐标不是偶数则重新确定食物的坐标
gotoxy(m_x,m_y);//在确认好的位置输出食物
cout << "★";}}
int getFoodm_x() {return m_x;}//返回食物的x坐标
int getFoodm_y() {return m_y;}};//返回食物的y坐标
class Snake {
private:
struct Snakecoor {int x; int y;};//定义一个蛇的坐标机构
vector<Snakecoor> snakecoor;//将坐标存入vector容器中
//判断并改变前进方向的函数
void degdir(Snakecoor&nexthead) {//定义新的蛇头变量
static char key='d';//静态变量防止改变移动方向后重新改回来
if(_kbhit()) {
char temp=_getch();//定义一个临时变量储存键盘输入的值
switch(temp) {//如果临时变量的值为wasd中的一个,则赋值给key
default: break;//default是缺省情况,只有任何条件都不匹配的情况下才会执行 必须写在前面!不然蛇无法转向
case'w': case'a': case's': case'd':
//如果temp的方向和key的方向不相反则赋值 因为两次移动方向不能相反 将蛇设置为初始向右走
if(key=='w' && temp!='s' || key=='s' && temp!='w' || key=='a' && temp!='d' || key=='d' && temp!='a') key=temp;}}
switch (key) {//根据key的值来确定蛇的移动方向
case'd': nexthead.x=snakecoor.front().x+2; nexthead.y=snakecoor.front().y; break;
//新的蛇头的头部等于容器内第一个数据(旧蛇头)x坐标+2 因为蛇头占两个坐标,移动一次加2
case'a': nexthead.x=snakecoor.front().x-2; nexthead.y=snakecoor.front().y; break;
case'w': nexthead.x=snakecoor.front().x; nexthead.y=snakecoor.front().y-1; break;
//因为控制台的x长度是y的一半,所以用两个x做蛇头,需要的坐标是二倍
case's': nexthead.x=snakecoor.front().x; nexthead.y=snakecoor.front().y+1;}}
//游戏结束时设计一个界面输出“游戏结束”以及分数
void finmatt(const int score) {
system("cls"); gotoxy(40, 14);//清屏然后输出
cout << "游戏结束"; gotoxy(40, 16);
cout << "得分:" << score; gotoxy(0, 26);
exit(0);}//exit为C++的退出函数 exit(0)表示程序正常退出,非0表示非正常退出
void finishgame(const int score) {//游戏结束
if(snakecoor[0].x>=88 || snakecoor[0].x<0 || snakecoor[0].y>=28 || snakecoor[0].y<0) finmatt(score);//撞墙
for(int i=1;i<snakecoor.size();i++) if(snakecoor[0].x==snakecoor[i].x && snakecoor[0].y==snakecoor[i].y) finmatt(score);}//撞到自身
public://构造初始化蛇的位置
Snake() { Snakecoor temp;//临时结构变量用于创建蛇
for(int i=5;i>=0;i--) {//反向创建初始蛇身,初始蛇头朝右
temp.x=16+(i<<1); temp.y=8;//偶数 在蛇头左移生成蛇身
snakecoor.push_back(temp);}}//在蛇尾尾插入临时变量
void move(Food&food, int& score) {//蛇运动的函数
Snakecoor nexthead;//新蛇头变量
degdir(nexthead);//判断和改变蛇前进的方向
snakecoor.insert(snakecoor.begin(), nexthead);//将蛇头插入容器的头部
gotoxy(0, 0); cout << "得分:" << score;//每次移动都在左上角刷新得分
gotoxy(0, 2); cout << "蛇的长度为:" << snakecoor.size();//长度用来测试
finishgame(score);//判断游戏结束,输出分数
//吃到食物蛇的变化
if(snakecoor[0].x==food.getFoodm_x() && snakecoor[0].y==food.getFoodm_y()) {//蛇头与食物重合
gotoxy(snakecoor[0].x, snakecoor[0].y); cout << "●";//吃到食物时这次蛇没有移动,所以蛇会卡顿一下
gotoxy(snakecoor[1].x, snakecoor[1].y); cout << "■";//重新输出一下蛇头和第一节蛇身让蛇不卡顿
score++; food.randfood(); return;}//吃到食物得分+1,如果蛇头坐标和食物坐标重合则重新产生一个食物并直接结束本次移动
for(int i=0;i<snakecoor.size();i++) {//遍历容器,判断食物与蛇身是否重合并输出整条蛇
gotoxy(snakecoor[i].x, snakecoor[i].y);
if (!i) cout << "●"; else cout << "■";//头部输出圆形否则输出方块
if (snakecoor[i].x==food.getFoodm_x() && snakecoor[i].y==food.getFoodm_y())food.randfood();}//如果食物刷新到了蛇身上,则重新产生一个
gotoxy(snakecoor.back().x,snakecoor.back().y);cout << " ";snakecoor.pop_back();}};
//数据与画面是分开,的在容器尾部的地方输出空格 清除画面上的蛇尾,删除容器中最后一个数据 清除数据上的蛇尾
void HideCursor() {CONSOLE_CURSOR_INFO cursor_info={1,0};SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);}//隐藏光标
int main() {system("mode con cols=88 lines=28"); system("title 贪吃蛇"); HideCursor();//光标隐藏,设置控制台窗口大小、标题
int score=0; Food food; food.randfood(); Snake snake;//得分变量,食物对象,开局随机产生一个食物,蛇对象
while(true) {snake.move(food, score);Sleep(150);}return 0;}//蛇移动,游戏速度