求贪吃蛇小程序

bianmazi 2007-08-23 06:09:32
谁能给贴出个贪吃蛇的小例子,为了学习学习。呵呵。多谢。
用一个线程的。一个Midlet扩展类就可以了。呵呵。
好着急啊。。。。
...全文
436 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
xueyong1203 2007-09-06
  • 打赏
  • 举报
回复
WTK 2.5.1 app目录下就有一个完整的demo, 你先运行下, 然后看代码好了
semsun0 2007-09-04
  • 打赏
  • 举报
回复
WTK2.1的demo里不是也有一个吗~
renjunjie20051758 2007-08-27
  • 打赏
  • 举报
回复
#include <stdlib.h>
#include <graphics.h>
#include <bios.h>
#include <dos.h>
#include <conio.h>
#define Enter 7181
#define ESC 283
#define UP 18432
#define DOWN 20480
#define LEFT 19200
#define RIGHT 19712
void Initgra(void);
void Initsnake(void);
void Initfood(void);
void Snake_Headmv(void);
void Flag(int,int,int,int);
void GameOver(void);
void Snake_Bodymv(void);
void Snake_Bodyadd(void);
void Food(void);
void Dsnkorfd(int,int,int);
void Delay(int);
struct Snake
{int x;int y;int color;}Snk[200];
struct Food
{int x;int y;int color;}Fd;
int flag1=1,flag2=0,flag3=0,flag4=0,flag5=0,flag6=0,
checkx,checky,num=2,key=0;
void main()
{ Initgra();
Initsnake();
Initfood();
while(1)
{Snake_Headmv();
GameOver();
if(key==ESC)
break;
if(key==Enter)
{cleardevice();
Initsnake();
Initfood();
key=0;
}
Snake_Bodymv();
Snake_Bodyadd();
Food();
Delay(10);
}
closegraph();
}
void Initgra()
{int gd=DETECT,gm;
initgraph(&gd,&gm,"d:\\tc");
}
void Initsnake()
{randomize();
num=2;
Snk[0].x=random(540);
Snk[0].x=Snk[0].x-Snk[0].x%20+50;
Snk[0].y=random(380);
Snk[0].y=Snk[0].y-Snk[0].y%20+50;
Snk[0].color=4;
Snk[1].x=Snk[0].x;
Snk[1].y=Snk[0].y+20;
Snk[1].color=4;
}
void Initfood()
{randomize();
Fd.x=random(580);
Fd.x=Fd.x-Fd.x%20+30;
Fd.y=random(420);
Fd.y=Fd.y-Fd.y%20+30;
Fd.color=random(14)+1;
}
void Snake_Headmv()
{if(bioskey(1))
{key=bioskey(0);
switch(key)
{case UP:Flag(1,0,0,0);break;
case DOWN:Flag(0,1,0,0);break;
case LEFT:Flag(0,0,1,0);break;
case RIGHT:Flag(0,0,0,1);break;
default:break;
}
}
if(flag1)
{checkx=Snk[0].x;
checky=Snk[0].y;
Dsnkorfd(Snk[0].x,Snk[0].y,0);
Snk[0].y-=20;
Dsnkorfd(Snk[0].x,Snk[0].y,Snk[0].color);
}
if(flag2)
{checkx=Snk[0].x;
checky=Snk[0].y;
Dsnkorfd(Snk[0].x,Snk[0].y,0);
Snk[0].y+=20;
Dsnkorfd(Snk[0].x,Snk[0].y,Snk[0].color);
}
if(flag3)
{checkx=Snk[0].x;
checky=Snk[0].y;
Dsnkorfd(Snk[0].x,Snk[0].y,0);
Snk[0].x-=20;
Dsnkorfd(Snk[0].x,Snk[0].y,Snk[0].color);
}
if(flag4)
{checkx=Snk[0].x;
checky=Snk[0].y;
Dsnkorfd(Snk[0].x,Snk[0].y,0);
Snk[0].x+=20;
Dsnkorfd(Snk[0].x,Snk[0].y,Snk[0].color);
}
}
void Flag(int a,int b,int c,int d)
{flag1=a;flag2=b;flag3=c;flag4=d;}
void GameOver()
{int i;
if(Snk[0].x<10||Snk[0].x>630||Snk[0].y<10||Snk[0].y>470)
{cleardevice();
setcolor(11);
settextstyle(0,0,4);
outtextxy(160,220,"Game Over");
key=bioskey(0);
}
else for(i=3;i<num;i++)
{if(Snk[0].x==Snk[i].x&&Snk[0].y==Snk[i].y)
{cleardevice();
setcolor(11);
settextstyle(0,0,4);
outtextxy(160,220,"Game Over");
key=bioskey(0);
}
}
}
void Snake_Bodymv()
{int i,s,t;
for(i=1;i<num;i++)
{Dsnkorfd(checkx,checky,Snk[i].color);
Dsnkorfd(Snk[i].x,Snk[i].y,0);
s=Snk[i].x;
t=Snk[i].y;
Snk[i].x=checkx;
Snk[i].y=checky;
checkx=s;
checky=t;
}
}
void Food()
{if(flag5)
{randomize();
Fd.x=random(580);
Fd.x=Fd.x-Fd.x%20+30;
Fd.y=random(420);
Fd.y=Fd.y-Fd.y%20+30;
Fd.color=random(14)+1;
flag5=0;
}
Dsnkorfd(Fd.x,Fd.y,Fd.color);
}
void Snake_Bodyadd()
{if(Snk[0].x==Fd.x&&Snk[0].y==Fd.y)
{if(Snk[num-1].x>Snk[num-2].x)
{num++;
Snk[num-1].x=Snk[num-2].x+20;
Snk[num-1].y=Snk[num-2].y;
Snk[num-1].color=Fd.color;
}
else
if(Snk[num-1].x<Snk[num-2].x)
{num++;
Snk[num-1].x=Snk[num-2].x-20;
Snk[num-1].y=Snk[num-2].y;
Snk[num-1].color=Fd.color;
}
else
if(Snk[num-1].y>Snk[num-2].y)
{num++;
Snk[num-1].x=Snk[num-2].x;
Snk[num-1].y=Snk[num-2].y+20;
Snk[num-1].color=Fd.color;
}
else
if(Snk[num-1].y<Snk[num-2].y)
{num++;
Snk[num-1].x=Snk[num-2].x;
Snk[num-1].y=Snk[num-2].y-20;
Snk[num-1].color=Fd.color;
}
flag5=1;
}
}
void Dsnkorfd(int x,int y,int color)
{setcolor(color);
setfillstyle(1,color);
circle(x,y,10);
floodfill(x,y,color);
}
void Delay(int times)
{int i;
for(i=1;i<=times;i++)
delay(15000);
}

wormwormwormworm 2007-08-25
  • 打赏
  • 举报
回复
有利息的啊
bianmazi 2007-08-25
  • 打赏
  • 举报
回复
我的邮箱:wanglu0923@yahoo.com.cn
Thanks!

ls的人是什么意思?分数?不明白你的意思。。。解释下
网络咖啡 2007-08-25
  • 打赏
  • 举报
回复
package snake;
import java.util.*;
import javax.microedition.lcdui.*;

/**
* 贪吃蛇游戏
*/
public class SnakeCanvas extends Canvas implements Runnable {
/** 存储贪吃蛇节点坐标,其中第二维下标为0的代表x坐标,第二维下标是1的代表y坐标 */
int[][] snake = new int[200][2];
/** 已经使用的节点数量 */
int snakeNum;
/** 贪吃蛇运动方向,0代表向上,1代表向下,2代表向左,3代表向右 */
int direction;
/* 移动方向 */
/** 向上 */
private final int DIRECTION_UP = 0;
/** 向下 */
private final int DIRECTION_DOWN = 1;
/** 向左 */
private final int DIRECTION_LEFT = 2;
/** 向右 */
private final int DIRECTION_RIGHT = 3;
/** 游戏区域宽度 */
int width;
/** 游戏区域高度 */
int height;
/** 蛇身单元宽度 */
private final byte SNAKEWIDTH = 4;
/** 是否处于暂停状态,true代表暂停 */
boolean isPaused = false;
/** 是否处于运行状态,true代表运行 */
boolean isRun = true;
/** 时间间隔 */
private final int SLEEP_TIME = 300;
/** 食物的X坐标 */
int foodX;
/** 食物的Y坐标 */
int foodY;
/** 食物的闪烁控制 */
boolean b = true;
/** Random对象 */
Random random = new Random();

public SnakeCanvas() {
// 初始化
init();
width = this.getWidth();
height = this.getHeight();
// 启动线程
new Thread(this).start();
}

/**
* 初始化开始数据
*/
private void init() {
// 初始化节点数量
snakeNum = 7;
// 初始化节点数据
for (int i = 0; i < snakeNum; i++) {
snake[i][0] = 100 - SNAKEWIDTH * i;
snake[i][1] = 40;
}
// 初始化移动方向
direction = DIRECTION_RIGHT;
// 初始化食物坐标
foodX = 100;
foodY = 100;
}

protected void paint(Graphics g) {
// 清屏
g.setColor(0xffffff);
g.fillRect(0, 0, width, height);
g.setColor(0);
// 绘制蛇身
for (int i = 0; i < snakeNum; i++) {
g.fillRect(snake[i][0], snake[i][1], SNAKEWIDTH, SNAKEWIDTH);
}
// 绘制食物
if (b) {
g.fillRect(foodX, foodY, SNAKEWIDTH, SNAKEWIDTH);
}
}

private void move(int direction) {
// 蛇身移动
for (int i = snakeNum; i > 0; i--) {
snake[i][0] = snake[i - 1][0];
snake[i][1] = snake[i - 1][1];
}
// 第一个单元格移动
switch (direction) {
case DIRECTION_UP:
snake[0][1] = snake[0][1] - SNAKEWIDTH;
break;
case DIRECTION_DOWN:
snake[0][1] = snake[0][1] + SNAKEWIDTH;
break;
case DIRECTION_LEFT:
snake[0][0] = snake[0][0] - SNAKEWIDTH;
break;
case DIRECTION_RIGHT:
snake[0][0] = snake[0][0] + SNAKEWIDTH;
break;
}
}

/**
* 吃掉食物,自身增长
*/
private void eatFood() {
// 判别蛇头是否和食物重叠
if (snake[0][0] == foodX && snake[0][1] == foodY) {
snakeNum++;
generateFood();
}
}

/**
* 产生食物 说明:食物的坐标必须位于屏幕内,且不能和蛇身重合
*/
private void generateFood() {
while (true) {
foodX = Math.abs(random.nextInt() % (width - SNAKEWIDTH + 1))
/ SNAKEWIDTH * SNAKEWIDTH;
foodY = Math.abs(random.nextInt() % (height - SNAKEWIDTH + 1))
/ SNAKEWIDTH * SNAKEWIDTH;
boolean b = true;
for (int i = 0; i < snakeNum; i++) {
if (foodX == snake[i][0] && snake[i][1] == foodY) {
b = false;
break;
}
}
if (b) {
break;
}
}
}

/**
* 判断游戏是否结束 结束条件: 1、蛇头超出边界 2、蛇头碰到自身
*/
private boolean isGameOver() {
// 边界判别
if (snake[0][0] < 0 || snake[0][0] > (width - SNAKEWIDTH)
|| snake[0][1] < 0 || snake[0][1] > (height - SNAKEWIDTH)) {
return true;
}
// 碰到自身
for (int i = 4; i < snakeNum; i++) {
if (snake[0][0] == snake[i][0] && snake[0][1] == snake[i][1]) {
return true;
}
}
return false;
}

/**
* 事件处理
*/
public void keyPressed(int keyCode) {
int action = this.getGameAction(keyCode);
// 改变方向
switch (action) {
case UP:
if (direction != DIRECTION_DOWN) {
direction = DIRECTION_UP;
}
break;
case DOWN:
if (direction != DIRECTION_UP) {
direction = DIRECTION_DOWN;
}
break;
case LEFT:
if (direction != DIRECTION_RIGHT) {
direction = DIRECTION_LEFT;
}
break;
case RIGHT:
if (direction != DIRECTION_LEFT) {
direction = DIRECTION_RIGHT;
}
break;
case FIRE:
// 暂停和继续
isPaused = !isPaused;
break;
}
}

/**
* 线程方法 使用精确延时
*/
public void run() {
try {
while (isRun) {
// 开始时间
long start = System.currentTimeMillis();
if (!isPaused) {
// 吃食物
eatFood();
// 移动
move(direction);
// 结束游戏
if (isGameOver()) {
break;
}
// 控制闪烁
b = !b;
}
// 重新绘制
repaint();
long end = System.currentTimeMillis();
// 延时
if (end - start < SLEEP_TIME) {
Thread.sleep(SLEEP_TIME - (end - start));
}
}
} catch (Exception e) {
}
}
}
skyinfo 2007-08-25
  • 打赏
  • 举报
回复
給我也發一個吧,謝謝!

skyinfo@gmail.com
yanhan0615 2007-08-24
  • 打赏
  • 举报
回复
我靠,楼主的分咋涨的这么快??
古月一刀2005 2007-08-23
  • 打赏
  • 举报
回复
hubing20082008@163.com谢谢了
sylar 2007-08-23
  • 打赏
  • 举报
回复
给你邮箱我 我发给你

13,100

社区成员

发帖
与我相关
我的任务
社区描述
Java J2ME
社区管理员
  • J2ME社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧