用JAVA编一个小游戏或其他程序

Snake程序:

GreedSnake.java(也是节目入口):

导入Java . awt . borderlayout;

导入Java . awt . canvas;

导入Java . awt . color;

导入Java . awt . container;

导入Java . awt . graphics;

导入Java . awt . event . key event;

导入Java . awt . event . key listener;

导入Java . util . iterator;

导入Java . util . linked list;

导入javax . swing . jframe;

导入javax . swing . jlabel;

导入javax . swing . jpanel;

公共类GreedSnake实现KeyListener {

JFrame主机;

画布paintCanvas

JLabel labelScore//记分卡

SnakeModel snakeModel = null//蛇

public static final int canvas width = 200;

public static final int canvasHeight = 300;

公共静态final int node width = 10;

public static final int nodeHeight = 10;

// -

//greedsnake():初始化游戏界面。

// -

公共GreedSnake() {

//设置界面元素

mainFrame = new JFrame(" GreedSnake ");

container CP = mainframe . getcontentpane();

labelScore = new JLabel(" Score:");

cp.add(labelScore,BorderLayout。北);

paintCanvas =新画布();

paint canvas . setsize(canvas width+1,canvas height+1);

paint canvas . addkey listener(this);

cp.add(paintCanvas,BorderLayout。中心);

JPanel panel buttom = new JPanel();

panel buttom . set layout(new BorderLayout());

JLabel labelHelp//帮助信息

labelHelp = new JLabel("PageUp,PageDown表示速度;,JLabel。中心);

panel button . add(label help,BorderLayout。北);

labelHelp = new JLabel("ENTER或R或S表示开始;",JLabel。中心);

panel button . add(label help,BorderLayout。中心);

labelHelp = new JLabel("空格或P表示暂停",JLabel。中心);

panel button . add(label help,BorderLayout。南);

CP . add(panel button,BorderLayout。南);

mainframe . addkey listener(this);

大型机. pack();

mainframe . setresizable(false);

mainframe . setdefaultcloseoperation(JFrame。EXIT _ ON _ CLOSE);

mainframe . set visible(true);

begin();

}

// -

// keyPressed():按键检测

// -

公共void按键(按键事件e) {

int key code = e . get key code();

if (snakeModel.running)

开关(键码){

案例关键事件。VK_UP:

snake model . change direction(snake model。UP);

打破;

案例关键事件。VK _唐:

snake model . change direction(snake model。向下);

打破;

案例关键事件。VK _左:

snake model . change direction(snake model。左);

打破;

案例关键事件。VK右:

snake model . change direction(snake model。对);

打破;

案例关键事件。VK _添加:

案例关键事件。VK _第_页起:

snake model . speedup();//加速

打破;

案例关键事件。VK减去:

案例关键事件。VK _下一页:

snake model . speeddown();//慢下来

打破;

案例关键事件。VK _空间:

案例关键事件。VK_P:

snake model . changepousestate();//暂停或继续

打破;

默认值:

}

//重新开始

if (keyCode == KeyEvent。VK_R || keyCode == KeyEvent。VK_S

|| keyCode == KeyEvent。VK _回车){

snakeModel.running = false

begin();

}

}

// -

// keyReleased():空函数

// -

public void key released(key event e){

}

// -

// keyTyped():空函数

// -

公共void键入的(KeyEvent e) {

}

// -

// repaint():绘制游戏界面(包括蛇和食物)

// -

void repaint() {

graphics g = paint canvas . get graphics();

//绘制背景

g.setColor(颜色。白色);

g.fillRect(0,0,canvasWidth,canvas height);

//画蛇

g.setColor(颜色。黑色);

linked list na = snake model . node array;

迭代器it = na . iterator();

while (it.hasNext()) {

节点n =(Node)it . next();

drawNode(g,n);

}

//画出食物

g.setColor(颜色。红色);

Node n = snakeModel.food

drawNode(g,n);

update score();

}

// -

// drawNode():绘制一个节点(蛇或食物)

// -

私有void drawNode(图形g,节点n) {

g.fillRect(n.x *节点宽度,n.y *节点高度,节点宽度- 1,

nodeHeight-1);

}

// -

// updateScore():更改记分卡。

// -

public void updateScore() {

string s = " Score:"+snake model . Score;

labelScore.setText

}

// -

// begin():游戏开始,放蛇。

// -

void begin() {

if (snakeModel == null ||!snakeModel.running) {

snakeModel = new SnakeModel(this,canvasWidth / nodeWidth,

this . canvasheight/nodeHeight);

(新线程(snakeModel))。start();

}

}

// -

// main():主函数

// -

公共静态void main(String[] args) {

GreedSnake GS = new GreedSnake();

}

}

节点. java:

公共类节点{

int x;

int y;

Node(int x,int y) {

this.x = x

this.y = y

}

}

SnakeModel.java:

导入Java . util . arrays;

导入Java . util . linked list;

导入Java . util . random;

导入javax . swing . joptionpane;

公共类SnakeModel实现Runnable {

GreedSnake gs

布尔[][]矩阵;//接口数据保存在数组中。

linked list node array = new linked list();

节点食物;

int maxX//最大宽度

int maxY//最大长度

int direction = 2;//方向

布尔运行=假;

int timeInterval = 200//间隔时间(速度)

double speedChangeRate = 0.75//速度变化程度

布尔暂停=假;//游戏状态

int得分= 0;

int count move = 0;

//上下是偶数,左右是奇数。

public static final int UP = 2;

public static final int DOWN = 4;

public static final int LEFT = 1;

public static final int RIGHT = 3;

// -

// GreedModel():初始化接口

// -

public SnakeModel(GreedSnake gs,int maxX,int maxY) {

this.gs = gs

this.maxX = maxX

this.maxY = maxY

matrix = new boolean[maxX][];

for(int I = 0;我& ltmaxX++i) {

matrix[I]= new boolean[maxY];

Arrays.fill(matrix[i],false);//在没有蛇或食物的区域设置false。

}

//初始化Snake

int initArrayLength = maxX & gt20 ?10:maxX/2;

for(int I = 0;我& ltinitArrayLength++i) {

int x = maxX/2+I;

int y = maxY/2;

nodeArray.addLast(新节点(x,y));

matrix[x][y]= true;//snake处置真

}

food = create food();

matrix[food . x][food . y]= true;//食品处理真

}

// -

// changeDirection():改变运动的方向。

// -

public void change direction(int new direction){

如果(方向% 2!= newDirection% 2)//避免冲突

{

direction = newDirection

}

}

// -

// moveOn():蛇形运动函数

// -

公共布尔moveOn() {

Node n =(Node)Node array . get first();

int x = n.x

int y = n.y

开关(方向){

案例向上:

y-;

打破;

案例向下:

y++;

打破;

案例左侧:

x-;

打破;

案例权利:

x++;

打破;

}

如果((0 & lt= x & amp& ampx & ltmaxX)和amp& amp(0 & lty & amp& ampy & ltmaxY)) {

If (matrix[x][y])//吃食物或者打身体。

{

if(x = = food . x & amp;& ampY == food.y)//吃货。

{

nodeArray.addFirst(食物);//在标头中添加一个节点。

//评分规则与移动长度和速度有关。

int score get =(10000-200 * count move)/time interval;

score+= score get & gt;0 ?score get:10;

count move = 0;

food = create food();

matrix[food . x][food . y]= true;

返回true

}否则

返回false//击中身体

} else//我什么都没碰

{

nodeArray.addFirst(新节点(x,y));//添加头部

matrix[x][y]= true;

n =(Node)Node array . remove last();//移除尾部

matrix[n . x][n . y]= false;

count move++;

返回true

}

}

返回false//越线(撞墙)

}

// -

// run():蛇形运动线程

// -

公共无效运行(){

跑步=真;

(跑步时){

尝试{

Thread.sleep(时间间隔);

} catch(异常e) {

打破;

}

如果(!暂停){

If (moveOn())//未完成

{

GS . repaint();

} else//游戏结束

{

JOptionPane.showMessageDialog(空,“游戏结束”,

“游戏结束”,JOptionPane。信息_消息);

打破;

}

}

}

跑步=假;

}

// -

// createFood():生成食物并放置。

// -

私有节点createFood() {

int x = 0;

int y = 0;

做{

Random r = new Random();

x = r . nextint(maxX);

y = r . nextint(maxY);

} while(matrix[x][y]);

返回新节点(x,y);

}

// -

// speedUp():加快蛇的移动速度。

// -

公共void加速(){

timeInterval * = speedChangeRate

}

// -

// speedDown():减缓蛇的速度。

// -

公共void减速(){

time interval/= speed change rate;

}

// -

// changePauseState():改变游戏状态(暂停或继续)

// -

public void changePauseState() {

暂停了=!暂停;

}

}