Ⅰ 求贪吃蛇的c语言代码,觉得挺好玩的
。。4555555555555
Ⅱ 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;}//蛇移动,游戏速度
Ⅲ 求"贪吃蛇"小游戏java源代码一份
贪吃蛇
import
java.awt.*;
import
java.awt.event.*;
public
class
GreedSnake
//主类
{
/**
*
@param
args
*/
public
static
void
main(String[]
args)
{
//
TODO
Auto-generated
method
stub
new
MyWindow();
}
}
class
MyPanel
extends
Panel
implements
KeyListener,Runnable//自定义面板类,继承了键盘和线程接口
{
Button
snake[];
//定义蛇按钮
int
shu=0;
//蛇的节数
int
food[];
//食物数组
boolean
result=true;
//判定结果是输
还是赢
Thread
thread;
//定义线程
static
int
weix,weiy;
//食物位置
boolean
t=true;
//判定游戏是否结束
int
fangxiang=0;
//蛇移动方向
int
x=0,y=0;
//蛇头位置
MyPanel()
{
setLayout(null);
snake=new
Button[20];
food=new
int
[20];
thread=new
Thread(this);
for(int
j=0;j<20;j++)
{
food[j]=(int)(Math.random()*99);//定义20个随机食物
}
weix=(int)(food[0]*0.1)*60;
//十位*60为横坐标
weiy=(int)(food[0]%10)*40;
//个位*40为纵坐标
for(int
i=0;i<20;i++)
{
snake[i]=new
Button();
}
add(snake[0]);
snake[0].setBackground(Color.black);
snake[0].addKeyListener(this);
//为蛇头添加键盘监视器
snake[0].setBounds(0,0,10,10);
setBackground(Color.cyan);
}
public
void
run()
//接收线程
{
while(t)
{
if(fangxiang==0)//向右
{
try
{
x+=10;
snake[0].setLocation(x,
y);//设置蛇头位置
if(x==weix&&y==weiy)
//吃到食物
{
shu++;
weix=(int)(food[shu]*0.1)*60;
weiy=(int)(food[shu]%10)*40;
repaint();
//重绘下一个食物
add(snake[shu]);
//增加蛇节数和位置
snake[shu].setBounds(snake[shu-1].getBounds());
}
thread.sleep(100);
//睡眠100ms
}
catch(Exception
e){}
}
else
if(fangxiang==1)//向左
{
try
{
x-=10;
snake[0].setLocation(x,
y);
if(x==weix&&y==weiy)
{
shu++;
weix=(int)(food[shu]*0.1)*60;
weiy=(int)(food[shu]%10)*40;
repaint();
add(snake[shu]);
snake[shu].setBounds(snake[shu-1].getBounds());
}
thread.sleep(100);
}
catch(Exception
e){}
}
else
if(fangxiang==2)//向上
{
try
{
y-=10;
snake[0].setLocation(x,
y);
if(x==weix&&y==weiy)
{
shu++;
weix=(int)(food[shu]*0.1)*60;
weiy=(int)(food[shu]%10)*40;
repaint();
add(snake[shu]);
snake[shu].setBounds(snake[shu-1].getBounds());
}
thread.sleep(100);
}
catch(Exception
e){}
}
else
if(fangxiang==3)//向下
{
try
{
y+=10;
snake[0].setLocation(x,
y);
if(x==weix&&y==weiy)
{
shu++;
weix=(int)(food[shu]*0.1)*60;
weiy=(int)(food[shu]%10)*40;
repaint();
add(snake[shu]);
snake[shu].setBounds(snake[shu-1].getBounds());
}
thread.sleep(100);
}
catch(Exception
e){}
}
int
num1=shu;
while(num1>1)//判断是否咬自己的尾巴
{
if(snake[num1].getBounds().x==snake[0].getBounds().x&&snake[num1].getBounds().y==snake[0].getBounds().y)
{
t=false;
result=false;
repaint();
}
num1--;
}
if(x<0||x>=this.getWidth()||y<0||y>=this.getHeight())//判断是否撞墙
{
t=false;
result=false;
repaint();
}
int
num=shu;
while(num>0)
//设置蛇节位置
{
snake[num].setBounds(snake[num-1].getBounds());
num--;
}
if(shu==15)
//如果蛇节数等于15则胜利
{
t=false;
result=true;
repaint();
}
}
}
public
void
keyPressed(KeyEvent
e)
//按下键盘方向键
{
if(e.getKeyCode()==KeyEvent.VK_RIGHT)//右键
{
if(fangxiang!=1)//如果先前方向不为左
fangxiang=0;
}
else
if(e.getKeyCode()==KeyEvent.VK_LEFT)
{
if(fangxiang!=0)
fangxiang=1;
}
else
if(e.getKeyCode()==KeyEvent.VK_UP)
{
if(fangxiang!=3)
fangxiang=2;
}
else
if(e.getKeyCode()==KeyEvent.VK_DOWN)
{
if(fangxiang!=2)
fangxiang=3;
}
}
public
void
keyTyped(KeyEvent
e)
{
}
public
void
keyReleased(KeyEvent
e)
{
}
public
void
paint(Graphics
g)
//在面板上绘图
{
int
x1=this.getWidth()-1;
int
y1=this.getHeight()-1;
g.setColor(Color.red);
g.fillOval(weix,
weiy,
10,
10);//食物
g.drawRect(0,
0,
x1,
y1);
//墙
if(t==false&&result==false)
g.drawString("GAME
OVER!",
250,
200);//输出游戏失败
else
if(t==false&&result==true)
g.drawString("YOU
WIN!",
250,
200);//输出游戏成功
}
}
class
MyWindow
extends
Frame
implements
ActionListener//自定义窗口类
{
MyPanel
my;
Button
btn;
Panel
panel;
MyWindow()
{
super("GreedSnake");
my=new
MyPanel();
btn=new
Button("begin");
panel=new
Panel();
btn.addActionListener(this);
panel.add(new
Label("begin后请按Tab键选定蛇"));
panel.add(btn);
panel.add(new
Label("按上下左右键控制蛇行动"));
add(panel,BorderLayout.NORTH);
add(my,BorderLayout.CENTER);
setBounds(100,100,610,500);
setVisible(true);
validate();
addWindowListener(new
WindowAdapter()
{
public
void
windowClosing(WindowEvent
e)
{
System.exit(0);
}
});
}
public
void
actionPerformed(ActionEvent
e)//按下begin按钮
{
if(e.getSource()==btn)
{
try
{
my.thread.start();
//开始线程
my.validate();
}
catch(Exception
ee){}
}
}
}
Ⅳ 跪求c++贪吃蛇源代码!!!高手救命啊!!!可以用的话追加5分。复制别人的不要来了,我搜过好多不可以用
/*贪吃蛇游戏代码*/
#include <graphics.h>
#include <stdlib.h>
#include <time.h>
#include <dos.h>
#define MAX_JOINTS 200
#define LEFT 0x4b00
#define RIGHT 0x4d00
#define DOWN 0x5000
#define UP 0x4800
#define ESC 0x011b
#define MV_RIGHT 1
#define MV_LEFT 2
#define MV_UP 3
#define MV_DOWN 4
void InitGraph(void) ; /*图形驱动初始化函数*/
void DrawFence(void); /*绘制游戏场景*/
void GameOver(int score); /*结束游戏*/
void GamePlay(void); /*玩游戏具体过程*/
void PrScore(int score); /*输出成绩*/
struct Food /*食物的结构体定义*/
{
int x; /*食物的横坐标*/
int y; /*食物的纵坐标*/
int addFood; /*判断是否要出现食物的变量*/
};
struct Snake /*蛇的结构体定义*/
{
int x[MAX_JOINTS]; /*保存蛇身第一节位于屏幕上的列坐标*/
int y[MAX_JOINTS]; /*保存蛇身第一节位于屏幕上的行坐标*/
int joint; /*蛇的节数*/
int direction; /*蛇移动方向*/
int life; /*蛇的生命,0活着,1死亡*/
};
/*主函数*/
main()
{
IntGraph(); /*图形驱动*/
DrawFence(); /*游戏场景*/
GamePlay(); /*玩游戏具体过程*/
closegraph(); /*图形结束*/
}
/*图形驱动初始化函数*/
void InitGraph(void)
{
int gd = DETECT, gm;
initgraph(&gd, &gm, "");
cleardeviece();
setbkcolor(BLUE);
cleardeviece();
setcolor(WHITE);
settextstyle(DEFAULT_FONT,HORIZ_DIR,3);
outtextxy(170,150,"Greedy Snake");
outtextxy(219,254,"ready");
setcolor(BLUE);
cleardevice();
}
/*游戏开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙*/
void Drawfence(void)
{
int i;
setbkcolor(LIGHTGREEN);
setcolor(11);
setlinrstyle(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)
{
int i,key;
int gamespeed=22000; /*控制游戏速度*/
int score=0; /*记录游戏得分*/
struct Food food; /*食物结构体变量*/
struct Snake snake; /*蛇结构体变量*/
food.addFood=1; /*1表示需要出现新食物,0表示已经存在食物*/
snake.life=0; /*置蛇的生命状态为活着*/
snake.direction=MV_RIGHT; /*置蛇头方向为向右*/
snake.x[0]=100;snake.y[0]=100; /*置蛇头初始位置*/
snake.x[1]=110;snake.y[1]=100;
snake.joint=2; /*置蛇的初始节数为2*/
Prscore(score);
/*重复玩游戏,直到按Esc键结束*/
srand(time(NULL));
while(1)
{
while(!kbhit())
{ if(food.addfood==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.addFood==0; /*画面上有食物*/
}
if(food.addFood==0) /*画面上有食物,则显示*/
{
setcolor(GREEN);
rectangle(food.x,food.y,food.x+10,food.x-10);
}
for(i=snake.joint-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 MV_RIGHT:snake.x[0]+=10;break;
case MV_LEFT:snake.x[0]-=10;break;
case MV_UP:snake.y[0]-=10;break;
case MV_DOWN:snake.y[0]+=10;break;
}
/*从蛇的第四节开始判断是否撞到自己,因为蛇头为两节,第三节不可能拐过来*/
for(i=3;i<snake.joint;i++)
{
if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0])
{
GameOver(score); /*显示失败*/
snake.life=1; /*蛇死亡*/
break;
}
}
/*判断蛇是否撞到墙壁*/
if(snake.x[0]<55||snake.x[0]>595||snake.y[0]<55||snake.y[0]>455)
{
GameOver(score); /*本次游戏结束*/
snake.life=1; /*蛇死亡*/
break;
}
/*以上两种判断后,如果蛇死就跳出内循环,重新开始*/
if(snake.life==1) break;
if(snake.x[0]==food.x&&snake.y[0]==food.y) /*吃到食物后*/
{
/*把画面上的食物清除*/
setcolor(o);
rectangle(food.x,food.y,food.x+10,food.y-10);
/*新的一节先放在看不见的位置,下次循环就取前一节的位置*/
snake.joint++; /*蛇的身体长一节*/
food.addFood=1; /*画面上出现新食物*/
score+=10;
Prscore(score); /*输出新得分*/
}
/*画蛇*/
setcolor(4);
for(i=0;i<snake.joint;i++)
(
rectangle(snake.x[i],snake.y[i],
snake.x[i]+10,snake.y[i]-10);
}
delay(gamespeed); /*延迟控制蛇的速度*/
/*去除蛇的最后一节*/
setcolor(0);
rectangle(snake.x[snake.joint-1],snake.y[joint-1],
snake.x[snake.joint-1]+10,snake.y[snake.joint-1]+10);
} /*end of while(!kbhit)*/
if(snake.life==1)break; /*如果蛇死,则跳出循环*/
key=bioskey(); /*按接收键*/
/*判断按键,是否向相反方向移动,按Esc键则退出*/
if(key==Esc)break;
else if(key==UP&&snake.dierction!=4)
snake.direction=MV_UP;
else if(key==RIGHT&&snake.direction!=MV_LEFT)
snake.direction=MV_RIGHT;
else if(key==LEFT&&snake.direction!=MV_RIGHT)
snake.direction=MV_LEFT;
else if(key==DOWN&&snake.direction!=MV_UP)
snake.direction==MV_DOWN;
} /*end of while(1)*/
}/*结束游戏*/
void GameOver(int score)
{
cleardeviece();
Prscore(score);
setcolor(RED);
settextxy(0,0,4);
outtextxy(200,200,"GAMEOVER");
getch()
}
/*输出成绩*/
void Prscore(int score)
{
char str[10];
setfillstyle(SOILD_FILL,YELLON);
bar(50,15,220,35);
setcolor(6);
settextstyle(0,0,2);
sprintf(str,"score:%d",score);
outtextxy(55,20,str);
}