packagecomtarenaeltstest;importjavaawtColor;importjavaawtFont;importjavaawtPoint;importjavaawteventActionEvent;importjavaawteventActionListener;importjavaawteventKeyAdapter;importjavaawteventKeyEvent;importjavautilArrayList;importjavautilHashMap;importjavautilHashSet;importjavautilList;importjavautilMap;importjavautilRandom;importjavautilSet;importjavaxswingJButton;importjavaxswingJFrame;importjavaxswingJLabel;importjavaxswingJPanel;publicclassWormFrameextendsJFrame{privatestaticfinallongserialVersionUID=1L;publicstaticfinalintUP=-10;publicstaticfinalintDOWN=10;publicstaticfinalintLEFT=-200;publicstaticfinalintRIGHT=200;privateintspeed=200;//蛇的移动速度,越小越快privateJPaneljPanel=null;//游戏面板privateJLabeljLabel=null;//显示游戏结束的标签privateJButtonreset=null;//从新开始游戏的按钮privateJButtoncontrol=null;//控制方向的按钮privateListworm=newArrayList();//贪吃蛇//将整个面板划分成节点,蛇走到那里,就那整个节点点亮privateMapnodes=newHashMap();privateintdir=LEFT;//方向privatePointfood;//食物privatebooleanisContinue=false;//判断蛇是否行动的标记publicstaticvoidmain(String[]args){newWormFrame();}publicWormFrame(){initialize();start();}//游戏初始化privatevoidinitialize(){thissetSize(500,500);thissetLocation(250,100);thissetResizable(false);thisadd(getJPanel());//添加面板thissetTitle("贪吃蛇,空格键暂停,回车开始");thissetVisible(true);}//游戏开始privatevoidstart(){isContinue=true;while(true){while(isContinue){try{Pointp=wormget(0);intx=(int)pgetX()+dir/20;inty=(int)pgetY()+dir%100;if(foodequals(newPoint(x,y))){wormadd(0,food);if(wormsize()%1==0){speed-=10;}getFood();continue;}p=newPoint(x,y);if(wormcontains(p)){thrownewException();}nodesget(p)setVisible(false);wormadd(0,p);nodesget(wormremove(wormsize()-1))setVisible(true);Threadsleep(speed);}catch(Exceptione){jLabelsetVisible(true);resetsetVisible(true);//不停止内循环,jLabel和reset不消失isContinue=false;}}try{Threadsleep(1000);}catch(InterruptedExceptione){eprintStackTrace();}}}//游戏从新开始privatevoidreset(){worm=newArrayList();for(Pointp:nodeskeySet()){nodesget(p)setVisible(false);}addWorm();dir=LEFT;getFood();isContinue=true;}//获取游戏面板的方法,面板中有记录游戏时间的标签,//代表游戏角色的按钮和重新开始游戏的按钮privateJPanelgetJPanel(){if(jPanel==null){//显示游戏结束的标签getOver();//从新开始的按钮getReset();//控制按钮getControl();//游戏面板jPanel=newJPanel();jPanelsetLayout(null);//设置面板布局为空//jPanelsetForeground(newColor(255,255,255));//设置面板前景色jPanelsetBackground(newColor(0,0,0));//设置面板背景色jPaneladd(jLabel,null);//面板中添加显示游戏结束的标签jPaneladd(reset,null);//面板中添加从新开始的按钮jPaneladd(control,null);for(inti=0;i<490;i+=10){for(intj=0;j<470;j+=10){JButtonjb=newJButton();Pointp=newPoint(i,j);jbsetBounds(i,j,10,10);jbsetBackground(newColor(255,255,255));jbsetEnabled(false);//jbsetVisible(true);nodesput(p,jb);jPaneladd(jb,null);}}addWorm();//添加一条蛇getFood();//食物按钮jPanelsetVisible(true);//设置面板可见}returnjPanel;}//游戏结束标签privatevoidgetOver(){jLabel=newJLabel();jLabelsetBounds(170,200,200,50);//设置标签大小和位置jLabelsetFont(newFont("Dialog",FontBOLD,24));//设置标签字体jLabelsetForeground(newColor(250,2,2));//设置标签前景颜色jLabelsetText("游戏结束");jLabelsetEnabled(true);//设置此标签可用jLabelsetVisible(false);//设置此标签不可见}//从新开始按钮privatevoidgetReset(){if(reset==null){reset=newJButton();//新建一个按钮resetsetBounds(170,300,164,51);//设置按钮的大小resetsetText("重新开始");//设置按钮的内容resetsetVisible(false);//设置按钮不可见//添加按钮的时间监听器resetaddActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){resetsetVisible(false);//点击重新开始按钮后,按钮消失jLabelsetVisible(false);//记录游戏时间的按钮也消失try{Threadsleep(1000);}catch(InterruptedExceptione1){e1printStackTrace();}reset();}});}}//控制方向的按钮privatevoidgetControl(){if(control==null){control=newJButton();controladdKeyListener(newKeyAdapter(){@OverridepublicvoidkeyPressed(KeyEvente){switch(egetKeyCode()){caseKeyEventVK_LEFT:chDir(LEFT);break;caseKeyEventVK_RIGHT:chDir(RIGHT);break;caseKeyEventVK_UP:chDir(UP);break;caseKeyEventVK_DOWN:chDir(DOWN);break;caseKeyEventVK_ENTER:isContinue=true;break;caseKeyEventVK_SPACE:isContinue=false;break;}}});}}//生成食物privatevoidgetFood(){Randomran=newRandom();//横坐标最大480,纵坐标最大460intx=rannextInt(49)10;inty=rannextInt(47)10;food=newPoint(x,y);Setset=newHashSet(worm);while(setcontains(food)){x=rannextInt(50)10;y=rannextInt(50)10;food=newPoint(x,y);}nodesget(food)setVisible(false);}//改变方向privatevoidchDir(intdir){if(thisdir+dir!=0){thisdir=dir;}}//添加Worm的方法privatevoidaddWorm(){for(inti=250;i<300;i+=10){Pointp=newPoint(i,250);wormadd(p);nodesget(p)setVisible(true);}}}//给分
我实现一个,请笑纳~
值得注意的是,要将EGAVGABGI文件拷到和这个源程序同一个目录下才能正常显示。
EGAVGABGI在C语言软件的安装目录下,你可以在该文件夹搜索找到!
#include "stdioh"
#include "graphicsh"
#include "stdlibh"
#include "dosh"
#define N 200
#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;
}snake;
void Init();
void DrawK();
void GamePlay();
void GameOver();
void PrScore();
void Close();
void main()
{
Init();/图形界面驱动/
DrawK();/作围墙/
GamePlay();
Close();
}
/图形界面驱动模块/
void Init()
{
int gd=DETECT,gm;
initgraph(&gd,&gm,"");
}
/作矩形围墙/
void DrawK()
{
setcolor(11);
setlinestyle(0,0,3);
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);
}
getch();
}
void GamePlay()
{
randomize();
/初始状态/
foodyes=1;
snakelife=0;
snakedirection=1;
snakex[0]=100;
snakey[0]=100;
snakex[1]=110;
snakey[1]=100;
snakenode=2;
PrScore();
/重复玩游戏模块/
while(1)
{
/没有按键情况下蛇的运动/
while(!kbhit())
{
/食物的出现/
if(foodyes==1)
{
foodx=rand()%400+60;
foody=rand()%350+60;
/将食物出现位置控制在整格/
while(foodx%10!=0)
foodx++;
while(foody%10!=0)
foody++;
foodyes=0;/食物位置控制好了就改变状态/
}
/显示食物/
if(foodyes==0)
{
setcolor(GREEN);
rectangle(foodx,foody,foodx+10,foody-10);
}
/蛇的位置变化/
for(i=snakenode-1;i>0;i--)
{
snakex[i]=snakex[i-1];
snakey[i]=snakey[i-1];
}
/按方向键时蛇的位置变化/
switch(snakedirection)
{
case 1:snakex[0]+=10;break;
case 2:snakex[0]-=10;break;
case 3:snakey[0]-=10;break;
case 4:snakey[0]+=10;break;
}
/蛇自己与自己相撞时生命结束/
for(i=3;i<snakenode;i++)
{
if(snakex[i]==snakex[0]&&snakey[0]==snakey[i])
{
GameOver();
snakelife=1;
break;
}
}
/蛇撞墙时死亡/
if(snakex[0]<55||snakex[0]>595||snakey[0]<55||snakey[0]>455)
{
GameOver();
snakelife=1;
}
/蛇的生命状态判断/
if(snakelife==1)
break;
/蛇吃食物/
if(snakex[0]==foodx&&snakey[0]==foody)
{
setcolor(0);
rectangle(foodx,foody,foodx+=10,foody-=10);
snakex[snakenode]=-20;
snakey[snakenode]=-20;
snakenode++;
foodyes=1;
score+=10;
PrScore();
}
/画蛇/
setcolor(4);
for(i=0;i<snakenode;i++)
rectangle(snakex[i],snakey[i],snakex[i]+10,snakey[i]-10);
delay(gamespeed);
/去除最后一节/
setcolor(0);
rectangle(snakex[snakenode-1],snakey[snakenode-1],snakex[snakenode-1]+10,snakey[snakenode-1]-10);
}/end while(!kbhit())/
if(snakelife==1)
break;
key=bioskey(0);
if(key==Esc)
break;
else if(key==UP&&snakedirection!=4)
snakedirection=3;
else if(key==RIGHT&&snakedirection!=2)
snakedirection=1;
else if(key==LEFT&&snakedirection!=1)
snakedirection=2;
else if(key==DOWN&&snakedirection!=3)
snakedirection=4;
}/endwhile(1)/
}
//游戏结束
void GameOver()
{
cleardevice();
PrScore();
setcolor(RED);
settextstyle(0,0,4);
outtextxy(200,200,"GAME OVER");
getch();
}
/打印分数/
void PrScore()
{
char str[10];
setfillstyle(1,14);
bar(50,15,220,35);
setcolor(6);
settextstyle(0,0,2);
sprintf(str,"score:%d",score);
outtextxy(55,20,str);
}
/图形结束/
void Close()
{
getch();
closegraph();
}
用MVC方式实现的贪吃蛇游戏,共有4个类。运行GreedSnake运行即可。主要是观察者模式的使用,我已经添加了很多注释了。
1、
/
程序名称:贪食蛇
原作者:BigF
修改者:algo
说明:我以前也用C写过这个程序,现在看到BigF用Java写的这个,发现虽然作者自称是Java的初学者,
但是明显编写程序的素养不错,程序结构写得很清晰,有些细微得地方也写得很简洁,一时兴起之
下,我认真解读了这个程序,发现数据和表现分开得很好,而我近日正在学习MVC设计模式,
因此尝试把程序得结构改了一下,用MVC模式来实现,对源程序得改动不多。
我同时也为程序增加了一些自己理解得注释,希望对大家阅读有帮助。
/
package mvcTest;
/
@author WangYu
@version 10
Description:
</pre>
Create on :Date :2005-6-13 Time:15:57:16
LastModified:
History:
/
public class GreedSnake {
public static void main(String[] args) {
SnakeModel model = new SnakeModel(20,30);
SnakeControl control = new SnakeControl(model);
SnakeView view = new SnakeView(model,control);
//添加一个观察者,让view成为model的观察者
modeladdObserver(view);
(new Thread(model))start();
}
}
-------------------------------------------------------------
2、
package mvcTest;
//SnakeControljava
import javaawteventKeyEvent;
import javaawteventKeyListener;
/
MVC中的Controler,负责接收用户的 *** 作,并把用户 *** 作通知Model
/
public class SnakeControl implements KeyListener{
SnakeModel model;
public SnakeControl(SnakeModel model){
thismodel = model;
}
public void keyPressed(KeyEvent e) {
int keyCode = egetKeyCode();
if (modelrunning){ // 运行状态下,处理的按键
switch (keyCode) {
case KeyEventVK_UP:
modelchangeDirection(SnakeModelUP);
break;
case KeyEventVK_DOWN:
modelchangeDirection(SnakeModelDOWN);
break;
case KeyEventVK_LEFT:
modelchangeDirection(SnakeModelLEFT);
break;
case KeyEventVK_RIGHT:
modelchangeDirection(SnakeModelRIGHT);
break;
case KeyEventVK_ADD:
case KeyEventVK_PAGE_UP:
modelspeedUp();
break;
case KeyEventVK_SUBTRACT:
case KeyEventVK_PAGE_DOWN:
modelspeedDown();
break;
case KeyEventVK_SPACE:
case KeyEventVK_P:
modelchangePauseState();
break;
default:
}
}
// 任何情况下处理的按键,按键导致重新启动游戏
if (keyCode == KeyEventVK_R ||
keyCode == KeyEventVK_S ||
keyCode == KeyEventVK_ENTER) {
modelreset();
}
}
public void keyReleased(KeyEvent e) {
}
public void keyTyped(KeyEvent e) {
}
}
-------------------------------------------------------------
3、
/
/
package mvcTest;
/
游戏的Model类,负责所有游戏相关数据及运行
@author WangYu
@version 10
Description:
</pre>
Create on :Date :2005-6-13 Time:15:58:33
LastModified:
History:
/
//SnakeModeljava
import javaxswing;
import javautilArrays;
import javautilLinkedList;
import javautilObservable;
import javautilRandom;
/
游戏的Model类,负责所有游戏相关数据及运行
/
class SnakeModel extends Observable implements Runnable {
boolean[][] matrix; // 指示位置上有没蛇体或食物
LinkedList nodeArray = new LinkedList(); // 蛇体
Node food;
int maxX;
int maxY;
int direction = 2; // 蛇运行的方向
boolean running = false; // 运行状态
int timeInterval = 200; // 时间间隔,毫秒
double speedChangeRate = 075; // 每次得速度变化率
boolean paused = false; // 暂停标志
int score = 0; // 得分
int countMove = 0; // 吃到食物前移动的次数
// UP and DOWN should be even
// RIGHT and LEFT should be odd
public static final int UP = 2;
public static final int DOWN = 4;
public static final int LEFT = 1;
public static final int RIGHT = 3;
public SnakeModel( int maxX, int maxY) {
thismaxX = maxX;
thismaxY = maxY;
reset();
}
public void reset(){
direction = SnakeModelUP; // 蛇运行的方向
timeInterval = 200; // 时间间隔,毫秒
paused = false; // 暂停标志
score = 0; // 得分
countMove = 0; // 吃到食物前移动的次数
// initial matirx, 全部清0
matrix = new boolean[maxX][];
for (int i = 0; i < maxX; ++i) {
matrix[i] = new boolean[maxY];
Arraysfill(matrix[i], false);
}
// initial the snake
// 初始化蛇体,如果横向位置超过20个,长度为10,否则为横向位置的一半
int initArrayLength = maxX > 20 10 : maxX / 2;
nodeArrayclear();
for (int i = 0; i < initArrayLength; ++i) {
int x = maxX / 2 + i;//maxX被初始化为20
int y = maxY / 2; //maxY被初始化为30
//nodeArray[x,y]: [10,15]-[11,15]-[12,15]~~[20,15]
//默认的运行方向向上,所以游戏一开始nodeArray就变为:
// [10,14]-[10,15]-[11,15]-[12,15]~~[19,15]
nodeArrayaddLast(new Node(x, y));
matrix[x][y] = true;
}
// 创建食物
food = createFood();
matrix[foodx][foody] = true;
}
public void changeDirection(int newDirection) {
// 改变的方向不能与原来方向同向或反向
if (direction % 2 != newDirection % 2) {
direction = newDirection;
}
}
/
运行一次
@return
/
public boolean moveOn() {
Node n = (Node) nodeArraygetFirst();
int x = nx;
int y = ny;
// 根据方向增减坐标值
switch (direction) {
case UP:
y--;
break;
case DOWN:
y++;
break;
case LEFT:
x--;
break;
case RIGHT:
x++;
break;
}
// 如果新坐标落在有效范围内,则进行处理
if ((0 <= x && x < maxX) && (0 <= y && y < maxY)) {
if (matrix[x][y]) { // 如果新坐标的点上有东西(蛇体或者食物)
if (x == foodx && y == foody) { // 吃到食物,成功
nodeArrayaddFirst(food); // 从蛇头赠长
// 分数规则,与移动改变方向的次数和速度两个元素有关
int scoreGet = (10000 - 200 countMove) / timeInterval;
score += scoreGet > 0 scoreGet : 10;
countMove = 0;
food = createFood(); // 创建新的食物
matrix[foodx][foody] = true; // 设置食物所在位置
return true;
} else // 吃到蛇体自身,失败
return false;
} else { // 如果新坐标的点上没有东西(蛇体),移动蛇体
nodeArrayaddFirst(new Node(x, y));
matrix[x][y] = true;
n = (Node) nodeArrayremoveLast();
matrix[nx][ny] = false;
countMove++;
return true;
}
}
return false; // 触到边线,失败
}
public void run() {
running = true;
while (running) {
try {
Threadsleep(timeInterval);
} catch (Exception e) {
break;
}
if (!paused) {
if (moveOn()) {
setChanged(); // Model通知View数据已经更新
notifyObservers();
} else {
JOptionPaneshowMessageDialog(null,
"you failed",
"Game Over",
JOptionPaneINFORMATION_MESSAGE);
break;
}
}
}
running = false;
}
private Node createFood() {
int x = 0;
int y = 0;
// 随机获取一个有效区域内的与蛇体和食物不重叠的位置
do {
Random r = new Random();
x = rnextInt(maxX);
y = rnextInt(maxY);
} while (matrix[x][y]);
return new Node(x, y);
}
public void speedUp() {
timeInterval = speedChangeRate;
}
public void speedDown() {
timeInterval /= speedChangeRate;
}
public void changePauseState() {
paused = !paused;
}
public String toString() {
String result = "";
for (int i = 0; i < nodeArraysize(); ++i) {
Node n = (Node) nodeArrayget(i);
result += "[" + nx + "," + ny + "]";
}
return result;
}
}
class Node {
int x;
int y;
Node(int x, int y) {
thisx = x;
thisy = y;
}
}
------------------------------------------------------------
4、
package mvcTest;
//SnakeViewjava
import javaxswing;
import javaawt;
import javautilIterator;
import javautilLinkedList;
import javautilObservable;
import javautilObserver;
/
MVC模式中得Viewer,只负责对数据的显示,而不用理会游戏的控制逻辑
/
public class SnakeView implements Observer {
SnakeControl control = null;
SnakeModel model = null;
JFrame mainFrame;
Canvas paintCanvas;
JLabel labelScore;
public static final int canvasWidth = 200;
public static final int canvasHeight = 300;
public static final int nodeWidth = 10;
public static final int nodeHeight = 10;
public SnakeView(SnakeModel model, SnakeControl control) {
thismodel = model;
thiscontrol = control;
mainFrame = new JFrame("GreedSnake");
Container cp = mainFramegetContentPane();
// 创建顶部的分数显示
labelScore = new JLabel("Score:");
cpadd(labelScore, BorderLayoutNORTH);
// 创建中间的游戏显示区域
paintCanvas = new Canvas();
paintCanvassetSize(canvasWidth + 1, canvasHeight + 1);
paintCanvasaddKeyListener(control);
cpadd(paintCanvas, BorderLayoutCENTER);
// 创建底下的帮助栏
JPanel panelButtom = new JPanel();
panelButtomsetLayout(new BorderLayout());
JLabel labelHelp;
labelHelp = new JLabel("PageUp, PageDown for speed;", JLabelCENTER);
panelButtomadd(labelHelp, BorderLayoutNORTH);
labelHelp = new JLabel("ENTER or R or S for start;", JLabelCENTER);
panelButtomadd(labelHelp, BorderLayoutCENTER);
labelHelp = new JLabel("SPACE or P for pause", JLabelCENTER);
panelButtomadd(labelHelp, BorderLayoutSOUTH);
cpadd(panelButtom, BorderLayoutSOUTH);
mainFrameaddKeyListener(control);
mainFramepack();
mainFramesetResizable(false);
mainFramesetDefaultCloseOperation(JFrameEXIT_ON_CLOSE);
mainFramesetVisible(true);
}
void repaint() {
Graphics g = paintCanvasgetGraphics();
//draw background
gsetColor(ColorWHITE);
gfillRect(0, 0, canvasWidth, canvasHeight);
// draw the snake
gsetColor(ColorBLACK);
LinkedList na = modelnodeArray;
Iterator it = naiterator();
while (ithasNext()) {
Node n = (Node) itnext();
drawNode(g, n);
}
// draw the food
gsetColor(ColorRED);
Node n = modelfood;
drawNode(g, n);
updateScore();
}
private void drawNode(Graphics g, Node n) {
gfillRect(nx nodeWidth,
ny nodeHeight,
nodeWidth - 1,
nodeHeight - 1);
}
public void updateScore() {
String s = "Score: " + modelscore;
labelScoresetText(s);
}
public void update(Observable o, Object arg) {
repaint();
}
}
希望采纳
#包括< stdio, h >
#包括< process。H >
#包括< Windows。H >
#包括< conio。H >
#包括<时间。H >
#包括< stdlib。H >
#defineWIDTH40
#defineHEIGH12
枚举方向{//方向
离开了,
对的,
向上
下
};
StructFood{//食品
Intx;
Inty;
};
{//绘制蛇体
intx;
inty;
structNode*next;
};
structSnake{//蛇属性du
intlenth;//长度
enumdirectiondir;//方向
};
structFood*food;//食物
structSnake*snake;//蛇属性
structNode*snode,*tail;//蛇身
intSPEECH=200;
intscore=0;//分数
intsmark=0;//吃食物标zhi记
inttimes=0;
intSTOP=0;
voidInitfood();//产生食物
voidInitsnake();//构造snake
voidEatfood();//头部前进
voidAddnode(intx,inty);//增加蛇身
voiddisplay(structNode*shead);//显示蛇身坐dao标
voidmove();//蛇移动
voiddraw();//画蛇
voidHomepage();//主页
voidkeybordhit();//监控键盘按键
voidAddtail();//吃到食物
voidgotoxy(intx,inty)//定位光标
{
COORDpos;
pos.X=x-1;
pos.Y=y-1;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}
voidInitsnake()//构造snake
{
inti;
snake=(structSnake*)malloc(sizeof(structSnake));
tail=(structNode*)malloc(sizeof(structNode));
food=(structFood*)malloc(sizeof(structFood));
snake->lenth=5;//初始长度 5
snake->dir=RIGHT;//初始蛇头方向 右
for(i=2;i<=snake->lenth+2;i++)//增加 5 个结点
{
Addnode(i,2);
}
}
voidInitfood()//产生食物
{
structNode*p=snode;
intmark=1;
srand((unsigned)time(NULL));//以时间为种子产生随机数
while(1)
{
food->x=rand()%(WIDTH-2)+2;//食物X坐标
food->y=rand()%(HEIGH-2)+2;//食物Y坐标
while(p!=NULL)
{
if((food->x==p->x)&&(food->y==p->y))//如果食物产生在蛇身上
{//则重新生成食物
mark=0;//食物生成无效
break;
}
p=p->next;
}
if(mark==1)//如果食物不在蛇身上,生成食物,否则重新生成食物
{
gotoxy(food->x,food->y);
printf("%c",3);
break;
}
mark=1;
p=snode;
}
}
voidmove()//移动
{
structNode*q,*p=snode;
if(snake->dir==RIGHT)
{
Addnode(p->x+1,p->y);
if(smark==0)
{
while(p->next!=NULL)
{
q=p;
p=p->next;
}
q->next=NULL;
free(p);
}
}
if(snake->dir==LEFT)
{
Addnode(p->x-1,p->y);
if(smark==0)
{
while(p->next!=NULL)
{
q=p;
p=p->next;
}
q->next=NULL;
free(p);
}
}
if(snake->dir==UP)
{
Addnode(p->x,p->y-1);
if(smark==0)
{
while(p->next!=NULL)
{
q=p;
p=p->next;
}
q->next=NULL;
free(p);
}
}
if(snake->dir==DOWN)
{
Addnode(p->x,p->y+1);
if(smark==0)
{
while(p->next!=NULL)
{
q=p;
p=p->next;
}
q->next=NULL;
free(p);
}
}
}
voidAddnode(intx,inty)//增加蛇身
{
structNode*newnode=(structNode*)malloc(sizeof(structNode));
structNode*p=snode;
newnode->next=snode;
newnode->x=x;
newnode->y=y;
snode=newnode;//结点加到蛇头
if(x<2||x>=WIDTH||y<2||y>=HEIGH)//碰到边界
{
STOP=1;
gotoxy(10,19);
printf("撞墙,游戏结束,任意键退出!\n");//失败
_getch();
free(snode);//释放内存
free(snake);
exit(0);
}
while(p!=NULL)//碰到自身
{
if(p->next!=NULL)
if((p->x==x)&&(p->y==y))
{
STOP=1;
gotoxy(10,19);
printf("撞到自身,游戏结束,任意键退出!\n");//失败
_getch();
free(snode);//释放内存
free(snake);
exit(0);
}
p=p->next;
}
}
voidEatfood()//吃到食物
{
Addtail();
score++;
}
voidAddtail()//增加蛇尾
{
structNode*newnode=(structNode*)malloc(sizeof(structNode));
structNode*p=snode;
tail->next=newnode;
newnode->x=50;
newnode->y=20;
newnode->next=NULL;//结点加到蛇头
tail=newnode;//新的蛇尾
}
voiddraw()//画蛇
{
structNode*p=snode;
inti,j;
while(p!=NULL)
{
gotoxy(p->x,p->y);
printf("%c",2);
tail=p;
p=p->next;
}
if(snode->x==food->x&&snode->y==food->y)//蛇头坐标等于食物坐标
{
smark=1;
Eatfood();//增加结点
Initfood();//产生食物
}
if(smark==0)
{
gotoxy(tail->x,tail->y);//没吃到食物清除之前的尾结点
printf("%c",'');//如果吃到食物,不清楚尾结点
}
else
{
times=1;
}
if((smark==1)&&(times==1))
{
gotoxy(tail->x,tail->y);//没吃到食物清除之前的尾结点
printf("%c",'');//如果吃到食物,不清楚尾结点
smark=0;
}
gotoxy(50,12);
printf("食物: %d,%d",food->x,food->y);
gotoxy(50,5);
printf("分数:%d",score);
gotoxy(50,7);
printf("速度:%d",SPEECH);
gotoxy(15,14);
printf("按o键加速");
gotoxy(15,15);
printf("按p键减速");
gotoxy(15,16);
printf("按空格键暂停");
}
voidHideCursor()//隐藏光标
{
CONSOLE_CURSOR_INFOcursor_info={1,0};
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}
voidHomepage()//绘主页
{
intx,y;
HideCursor();//隐藏光标
printf("----------------------------------------\n");
printf("|\t\t\t\t|\n");
printf("|\t\t\t\t|\n");
printf("|\t\t\t\t|\n");
printf("|\t\t\t\t|\n");
printf("|\t\t\t\t|\n");
printf("|\t\t\t\t|\n");
printf("|\t\t\t\t|\n");
printf("|\t\t\t\t|\n");
printf("|\t\t\t\t|\n");
printf("|\t\t\t\t|\n");
printf("----------------------------------------\n");
gotoxy(5,13);
printf("任意键开始游戏!按W.A.S.D控制方向");
_getch();
Initsnake();
Initfood();
gotoxy(5,13);
printf("");
}
voidkeybordhit()//监控键盘
{
charch;
if(_kbhit())
{
ch=getch();
switch(ch)
{
case'W':
case 'w':if(snake->dir==DOWN)//如果本来方向是下,而按相反方向无效
{
break;
}
else
snake->dir=UP;break;
case'A':
case 'a':if(snake->dir==RIGHT)//如果本来方向是右,而按相反方向无效
{
break;
}
else
snake->dir=LEFT;break;
case'S':
case 's':if(snake->dir==UP)//如果本来方向是上,而按相反方向无效
{
break;
}
else
snake->dir=DOWN;break;
case'D':
case 'd':if(snake->dir==LEFT)//如果本来方向是左,而按相反方向无效
{
break;
}
else
snake->dir=RIGHT;break;
case'O':
case'o':
if(SPEECH>=150)//速度加快
{
SPEECH=SPEECH-50;
}
break;
case'P':
case'p':
if(SPEECH<=400)//速度减慢
{
SPEECH=SPEECH+50;
}
break;
case''://暂停
gotoxy(15,18);
printf("游戏已暂停,按任意键恢复游戏");
system("pause>nul");
gotoxy(15,18);
printf("");
break;
default:break;
}
}
}
intmain(void)//程序入口
{
Homepage();
while(!STOP)
{
keybordhit();//监控键盘按键
move();//蛇的坐标变化
draw();//蛇的重绘
Sleep(SPEECH);//暂时挂起线程
}
return0;
}
扩展资料:
注意事项:
1.代码将源信息转换为易于通信或存储的符号。译码(译码)是还原和译码的过程,它将代码符号转换为接受者能够理解的形式。
2.编码的原因之一是为了在普通语言(口头或书面)难以实现的情况下进行交流。例如,一面旗帜可以用一个特定的标记来表达一个特定的信息,而站在远处的另一个人可以解释标记来重现该信息。
以上就是关于求Java 大神给个可以在eclipse上运行的贪吃蛇源代码在线等急全部的内容,包括:求Java 大神给个可以在eclipse上运行的贪吃蛇源代码在线等急、求一个贪吃蛇C语言源代码、求一段JAVA编写的贪吃蛇小程序源代码等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)