求"贪吃蛇"小游戏JAVA源代码一份

JavaScript08

求"贪吃蛇"小游戏JAVA源代码一份,第1张

贪吃蛇

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=0j<20j++)

{

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=0i<20i++)

{

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){}

}

}

}

//package main

import java.awt.Color

import java.awt.event.ActionEvent

import java.awt.event.ActionListener

import java.awt.event.KeyEvent

import java.awt.event.KeyListener

import java.awt.event.WindowAdapter

import java.awt.event.WindowEvent

import java.io.BufferedReader

import java.io.FileInputStream

import java.io.FileOutputStream

import java.io.InputStreamReader

import javax.swing.ImageIcon

import javax.swing.JFrame

import javax.swing.JLabel

import javax.swing.JMenu

import javax.swing.JMenuBar

import javax.swing.JMenuItem

import javax.swing.JOptionPane

import javax.swing.JPanel

public class TanChiShe implements KeyListener,ActionListener{

/**

* @param args

*/

int max = 300//蛇长最大值

final int JianJu = 15 //设定蛇的运动网格间距(窗口最大32*28格)

byte fangXiang = 4 //控制蛇的运动方向,初始为右

int time = 500 //蛇的运动间隔时间

int jianTime = 2//吃一个减少的时间

int x,y//蛇的运动坐标,按网格来算

int x2,y2//暂存蛇头的坐标

int jiFenQi = 0//积分器

boolean isRuned = false//没运行才可设级别

boolean out = false//没开始运行?

boolean run = false//暂停运行

String JiBie = "中级"

JFrame f = new JFrame("贪吃蛇 V1.0")

JPanel show = new JPanel()

JLabel Message = new JLabel("级别:中级蛇长:5 时间500ms 分数:00")

// JButton play = new JButton("开始")

JLabel sheTou

JLabel shiWu

JLabel sheWei[] = new JLabel[max]

static int diJi = 4//第几个下标的蛇尾要被加上

ImageIcon shang = new ImageIcon("tuPian\\isSheTouUp.png")//产生四个上下左右的蛇头图案

ImageIcon xia = new ImageIcon("tuPian\\isSheTouDown.png")

ImageIcon zhuo = new ImageIcon("tuPian\\isSheTouLeft.png")

ImageIcon you = new ImageIcon("tuPian\\isSheTouRight.png")

JMenuBar JMB = new JMenuBar()

JMenu file = new JMenu("开始游戏")

JMenuItem play = new JMenuItem(" 开始游戏 ")

JMenuItem pause = new JMenuItem(" 暂停游戏 ")

JMenu hard = new JMenu("游戏难度")

JMenuItem gao = new JMenuItem("高级")

JMenuItem zhong = new JMenuItem("中级")

JMenuItem di = new JMenuItem("低级")

JMenu about = new JMenu(" 关于 ")

JMenuItem GF = new JMenuItem("※高分榜")

JMenuItem ZZ = new JMenuItem("关于作者")

JMenuItem YX = new JMenuItem("关于游戏")

JMenuItem QK = new JMenuItem("清空记录")

static TanChiShe tcs = new TanChiShe()

public static void main(String[] args) {

// TanChiShe tcs = new TanChiShe()

tcs.f()

}

public void f(){

f.setBounds(250,100,515,530)

f.setLayout(null)

f.setAlwaysOnTop(true)//窗口始终保持最前面

f.setBackground(new Color(0,0,0))

f.setDefaultCloseOperation(0)

f.setResizable(false)

f.setVisible(true)

// f.getContentPane().setBackground(Color.BLACK)

f.addWindowListener(new WindowAdapter(){

public void windowClosing(WindowEvent e){

System.exit(0)//退出程序

}

})

f.setJMenuBar(JMB)

JMB.add(file)

file.add(play)

file.add(pause)

JMB.add(hard)

hard.add(gao)

hard.add(zhong)

hard.add(di)

JMB.add(about)

about.add(GF)

GF.setForeground(Color.blue)

about.add(ZZ)

about.add(YX)

about.add(QK)

QK.setForeground(Color.red)

f.add(show)

show.setBounds(0,f.getHeight()-92,f.getWidth(),35)

// show.setBackground(Color.green)

// f.add(play)

// play.setBounds(240,240,80,25)

play.addActionListener(this)

pause.addActionListener(this)

gao.addActionListener(this)

zhong.addActionListener(this)

di.addActionListener(this)

GF.addActionListener(this)

ZZ.addActionListener(this)

YX.addActionListener(this)

QK.addActionListener(this)

show.add(Message)

Message.setForeground(Color.blue)

f.addKeyListener(this)

// show.addKeyListener(this)

play.addKeyListener(this)

sheChuShi()

}

public void sheChuShi(){//蛇初始化

sheTou = new JLabel(you)//用向右的图来初始蛇头

f.add(sheTou)

sheTou.setBounds(JianJu*0,JianJu*0,JianJu,JianJu)

// System.out.println("ishere")

shiWu = new JLabel("■")

f.add(shiWu)

shiWu.setBounds(10*JianJu,10*JianJu,JianJu,JianJu)

for(int i=0i<=diJii++) {

sheWei[i] = new JLabel("■")

f.add(sheWei[i])

sheWei[i].setBounds(-1*JianJu,0*JianJu,JianJu,JianJu)

}

while(true){

if(out == true){

yunXing()

break

}

try{

Thread.sleep(200)

}catch(Exception ex){

ex.printStackTrace()

}

}

}

public void sheJiaChang(){//蛇的长度增加

if(diJi <max){

sheWei[++diJi] = new JLabel(new ImageIcon("tuPian\\isSheWei.jpg"))

f.add(sheWei[diJi])

sheWei[diJi].setBounds(sheWei[diJi-1].getX(),sheWei[diJi-1].getY(),JianJu,JianJu)

// System.out.println("diJi "+diJi)

}

}

public void pengZhuanJianCe(){//检测蛇的碰撞情况

if(sheTou.getX()<0 || sheTou.getY()<0 ||

sheTou.getX()>f.getWidth()-15 || sheTou.getY()>f.getHeight()-105 ){

gameOver()

// System.out.println("GameOVER")

}

if(sheTou.getX() == shiWu.getX() &&sheTou.getY() == shiWu.getY()){

out: while(true){

shiWu.setLocation((int)(Math.random()*32)*JianJu,(int)(Math.random()*28)*JianJu)

for(int i=0i<=diJii++){

if(shiWu.getX()!= sheWei[i].getX() &&shiWu.getY()!=sheWei[i].getY()

&&sheTou.getX()!=shiWu.getX() &&sheTou.getY()!= shiWu.getY()){//如果食物不在蛇身上则退出循环,产生食物成功

break out

}

}

}

sheJiaChang()

// System.out.println("吃了一个")

if(time>100 ){

time -= jianTime

}

else{}

Message.setText("级别:"+JiBie+" 蛇长:"+(diJi+2)+"时间:"+time+"ms 分数:"+(jiFenQi+=10)+"")

}

for(int i=0i<=diJii++){

if(sheTou.getX() == sheWei[i].getX() &&sheTou.getY() == sheWei[i].getY()){

gameOver()

// System.out.println("吃到尾巴了")

}

}

}

public void yunXing(){

while(true){

while(run){

if(fangXiang == 1){//上

y-=1

}

if(fangXiang == 2){//下

y+=1

}

if(fangXiang == 3){//左

x-=1

}

if(fangXiang == 4){//右

x+=1

}

x2 = sheTou.getX()

y2 = sheTou.getY()

sheTou.setLocation(x*JianJu,y*JianJu)//设置蛇头的坐标 网格数*间隔

for(int i=diJii>=0i--){

if(i==0){

sheWei[i].setLocation(x2,y2)

// System.out.println(i+" "+sheTou.getX()+" "+sheTou.getY())

}

else{

sheWei[i].setLocation(sheWei[i-1].getX(),sheWei[i-1].getY())

//System.out.println(i+" "+sheWei[i].getX()+" "+sheWei[i].getY())

}

}

pengZhuanJianCe()

try{

Thread.sleep(time)

}catch(Exception e){

e.printStackTrace()

}

}

Message.setText("级别:"+JiBie+" 蛇长:"+(diJi+2)+"时间:"+time+"ms 分数:"+(jiFenQi+=10)+"")

try{

Thread.sleep(200)

}catch(Exception e){

e.printStackTrace()

}

}

}

public void gameOver(){//游戏结束时处理

int in = JOptionPane.showConfirmDialog(f,"游戏已经结束!\n是否要保存分数","提示",JOptionPane.YES_NO_OPTION)

if(in == JOptionPane.YES_OPTION){

// System.out.println("YES")

String s = JOptionPane.showInputDialog(f,"输入你的名字:")

try{

FileInputStream fis = new FileInputStream("GaoFen.ini")//先把以前的数据读出来加到写的数据前

InputStreamReader isr = new InputStreamReader(fis)

BufferedReader br = new BufferedReader(isr)

String s2,setOut = ""

while((s2=br.readLine())!= null){

setOut =setOut+s2+"\n"

}

FileOutputStream fos = new FileOutputStream("GaoFen.ini")//输出到文件流

s = setOut+s+":"+jiFenQi+"\n"

fos.write(s.getBytes())

}catch(Exception e){}

}

System.exit(0)

}

public void keyTyped(KeyEvent arg0) {

// TODO 自动生成方法存根

}

public void keyPressed(KeyEvent arg0) {

// System.out.println(arg0.getSource())

if(arg0.getKeyCode() == KeyEvent.VK_UP){//按上下时方向的值相应改变

if(fangXiang != 2){

fangXiang = 1

// sheTou.setIcon(shang)//设置蛇的方向

}

//System.out.println("UP")

}

if(arg0.getKeyCode() == KeyEvent.VK_DOWN){

if(fangXiang != 1){

fangXiang = 2

// sheTou.setIcon(xia)

}

//System.out.println("DOWN")

}

if(arg0.getKeyCode() == KeyEvent.VK_LEFT){//按左右时方向的值相应改变

if(fangXiang != 4){

fangXiang = 3

//sheTou.setIcon(zhuo)

}

// System.out.println("LEFT")

}

if(arg0.getKeyCode() == KeyEvent.VK_RIGHT){

if(fangXiang != 3){

fangXiang = 4

//sheTou.setIcon(you)

}

// System.out.println("RIGHT")

}

}

public void keyReleased(KeyEvent arg0) {

// TODO 自动生成方法存根

}

public void actionPerformed(ActionEvent arg0) {

// TODO 自动生成方法存根

JMenuItem JI = (JMenuItem)arg0.getSource()

if(JI == play){

out = true

run = true

isRuned = true

gao.setEnabled(false)

zhong.setEnabled(false)

di.setEnabled(false)

}

if(JI == pause){

run = false

}

if(isRuned == false){//如果游戏还没运行,才可以设置级别

if(JI == gao){

time = 200

jianTime = 1

JiBie = "高级"

Message.setText("级别:"+JiBie+" 蛇长:"+(diJi+2)+"时间:"+time+"ms 分数:"+jiFenQi)

}

if(JI == zhong){

time = 400

jianTime = 2

JiBie = "中级"

Message.setText("级别:"+JiBie+" 蛇长:"+(diJi+2)+"时间:"+time+"ms 分数:"+jiFenQi)

}

if(JI == di){

time = 500

jianTime = 3

JiBie = "低级"

Message.setText("级别:"+JiBie+" 蛇长:"+(diJi+2)+"时间:"+time+"ms 分数:"+jiFenQi)

}

}

if(JI == GF){

try{

FileInputStream fis = new FileInputStream("GaoFen.ini")

InputStreamReader isr = new InputStreamReader(fis)

BufferedReader br = new BufferedReader(isr)

String s,setOut = ""

while((s=br.readLine())!= null){

setOut =setOut+s+"\n"

}

if(setOut.equals("")){

JOptionPane.showMessageDialog(f,"暂无保存记录!","高分榜",JOptionPane.INFORMATION_MESSAGE)

}

else{

JOptionPane.showMessageDialog(f,setOut)

}

}catch(Exception e){

e.printStackTrace()

}

}

if(JI == ZZ){//关于作者

JOptionPane.showMessageDialog(f,"软件作者:申志飞\n地址:四川省绵阳市\nQQ:898513806\nE-mail:[email protected]","关于作者",JOptionPane.INFORMATION_MESSAGE)

}

if(JI == YX){//关于游戏

JOptionPane.showMessageDialog(f,"贪吃蛇游戏\n游戏版本 V1.0","关于游戏",JOptionPane.INFORMATION_MESSAGE)

}

if(JI == QK){

try{

int select = JOptionPane.showConfirmDialog(f,"确实要清空记录吗?","清空记录",JOptionPane.YES_OPTION)

if(select == JOptionPane.YES_OPTION){

String setOut = ""

FileOutputStream fos = new FileOutputStream("GaoFen.ini")//输出到文件流

fos.write(setOut.getBytes())

}

}catch(Exception ex){}

}

}

}

//是我自己写的,本来里面有图片的,但无法上传,所以把图片去掉了,里面的ImageIcon等语句可以去掉。能正常运行。

#include<iostream.h>

#include<windows.h>

#include<time.h>

#include<stdlib.h>

#include<conio.h>

#define N 21

void gotoxy(int x,int y)//位置函数

{

COORD pos

pos.X=2*x

pos.Y=y

SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos)

}

void color(int a)//颜色函数

{

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),a)

}

void init(int apple[2])//初始化函数(初始化围墙、显示信息、苹果)

{

int i,j//初始化围墙

int wall[N+2][N+2]={{0}}

for(i=1i<=Ni++)

{

for(j=1j<=Nj++)

wall[i][j]=1

}

color(11)

for(i=0i<N+2i++)

{

for(j=0j<N+2j++)

{

if(wall[i][j])

cout<<"■"

else cout<<"□"

}

cout<<endl

}

gotoxy(N+3,1)//显示信息

color(20)

cout<<"按 W S A D 移动方向"<<endl

gotoxy(N+3,2)

color(20)

cout<<"按任意键暂停"<<endl

gotoxy(N+3,3)

color(20)

cout<<"得分:"<<endl

apple[0]=rand()%N+1//苹果

apple[1]=rand()%N+1

gotoxy(apple[0],apple[1])

color(12)

cout<<"●"<<endl

}

int main()

{

int i,j

int** snake=NULL

int apple[2]

int score=0

int tail[2]

int len=3

char ch='p'

srand((unsigned)time(NULL))

init(apple)

snake=(int**)realloc(snake,sizeof(int*)*len)

for(i=0i<leni++)

snake[i]=(int*)malloc(sizeof(int)*2)

for(i=0i<leni++)

{

snake[i][0]=N/2

snake[i][1]=N/2+i

gotoxy(snake[i][0],snake[i][1])

color(14)

cout<<"★"<<endl

}

while(1)//进入消息循环

{

tail[0]=snake[len-1][0]

tail[1]=snake[len-1][1]

gotoxy(tail[0],tail[1])

color(11)

cout<<"■"<<endl

for(i=len-1i>0i--)

{

snake[i][0]=snake[i-1][0]

snake[i][1]=snake[i-1][1]

gotoxy(snake[i][0],snake[i][1])

color(14)

cout<<"★"<<endl

}

if(kbhit())

{

gotoxy(0,N+2)

ch=getche()

}

switch(ch)

{

case 'w':snake[0][1]--break

case 's':snake[0][1]++break

case 'a':snake[0][0]--break

case 'd':snake[0][0]++break

default: break

}

gotoxy(snake[0][0],snake[0][1])

color(14)

cout<<"★"<<endl

Sleep(abs(200-0.5*score))

if(snake[0][0]==apple[0]&&snake[0][1]==apple[1])//吃掉苹果后蛇分数加1,蛇长加1

{

score++

len++

snake=(int**)realloc(snake,sizeof(int*)*len)

snake[len-1]=(int*)malloc(sizeof(int)*2)

apple[0]=rand()%N+1

apple[1]=rand()%N+1

gotoxy(apple[0],apple[1])

color(12)

cout<<"●"<<endl

gotoxy(N+5,3)

color(20)

cout<<score<<endl

}

if(snake[0][1]==0||snake[0][1]==N||snake[0][0]==0||snake[0][0]==N)//撞到围墙后失败

{

gotoxy(N/2,N/2)

color(30)

cout<<"失败!!!"<<endl

for(i=0i<leni++)

free(snake[i])

Sleep(INFINITE)

exit(0)

}

}

return 0

}