#include <graphics.h>
#include <stdlib.h>
#include <dos.h>
#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/* 蛇的生命,0活着,1死亡*/
}snake
void Init(void)/*图形驱动*/
void Close(void)/*图形结束*/
void DrawK(void)/*开始画面*/
void GameOver(void)/*结束游戏*/
void GamePlay(void)/*玩游戏具体过程*/
void PrScore(void)/*输出成绩*/
/*主函数*/
void main(void)
{
Init()/*图形驱动*/
DrawK()/*开始画面*/
GamePlay()/*玩游戏具体过程*/
Close()/*图形结束*/
}
/*图形驱动*/
void Init(void)
{
int gd=DETECT,gm
initgraph(&gd,&gm,"c:\\tc")
cleardevice()
}
/*开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙*/
void DrawK(void)
{
/*setbkcolor(LIGHTGREEN)*/
setcolor(11)
setlinestyle(SOLID_LINE,0,THICK_WIDTH)/*设置线型*/
for(i=50i<=600i+=10)/*画围墙*/
{
rectangle(i,40,i+10,49)/*上边*/
rectangle(i,451,i+10,460)/*下边*/
}
for(i=40i<=450i+=10)
{
rectangle(50,i,59,i+10)/*左边*/
rectangle(601,i,610,i+10)/*右边*/
}
}
/*玩游戏具体过程*/
void GamePlay(void)
{
randomize()/*随机数发生器*/
food.yes=1/*1表示需要出现新食物,0表示已经存在食物*/
snake.life=0/*活着*/
snake.direction=1/*方向往右*/
snake.x[0]=100snake.y[0]=100/*蛇头*/
snake.x[1]=110snake.y[1]=100
snake.node=2/*节数*/
PrScore()/*输出得分*/
while(1)/*可以重复玩游戏,压ESC键结束*/
{
while(!kbhit())/*在没有按键的情况下,蛇自己移动身体*/
{
if(food.yes==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.yes=0/*画面上有食物了*/
}
if(food.yes==0)/*画面上有食物了就要显示*/
{
setcolor(GREEN)
rectangle(food.x,food.y,food.x+10,food.y-10)
}
for(i=snake.node-1i>0i--)/*蛇的每个环节往前移动,也就是贪吃蛇的关键算法*/
{
snake.x[i]=snake.x[i-1]
snake.y[i]=snake.y[i-1]
}
/*1,2,3,4表示右,左,上,下四个方向,通过这个判断来移动蛇头*/
switch(snake.direction)
{
case 1:snake.x[0]+=10break
case 2: snake.x[0]-=10break
case 3: snake.y[0]-=10break
case 4: snake.y[0]+=10break
}
for(i=3i<snake.nodei++)/*从蛇的第四节开始判断是否撞到自己了,因为蛇头为两节,第三节不可能拐过来*/
{
if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0])
{
GameOver()/*显示失败*/
snake.life=1
break
}
}
if(snake.x[0]<55||snake.x[0]>595||snake.y[0]<55||
snake.y[0]>455)/*蛇是否撞到墙壁*/
{
GameOver()/*本次游戏结束*/
snake.life=1/*蛇死*/
}
if(snake.life==1)/*以上两种判断以后,如果蛇死就跳出内循环,重新开始*/
break
if(snake.x[0]==food.x&&snake.y[0]==food.y)/*吃到食物以后*/
{
setcolor(0)/*把画面上的食物东西去掉*/
rectangle(food.x,food.y,food.x+10,food.y-10)
snake.x[snake.node]=-20snake.y[snake.node]=-20
/*新的一节先放在看不见的位置,下次循环就取前一节的位置*/
snake.node++/*蛇的身体长一节*/
food.yes=1/*画面上需要出现新的食物*/
score+=10
PrScore()/*输出新得分*/
}
setcolor(4)/*画出蛇*/
for(i=0i<snake.nodei++)
rectangle(snake.x[i],snake.y[i],snake.x[i]+10,
snake.y[i]-10)
delay(gamespeed)
setcolor(0)/*用黑色去除蛇的的最后一节*/
rectangle(snake.x[snake.node-1],snake.y[snake.node-1],
snake.x[snake.node-1]+10,snake.y[snake.node-1]-10)
} /*endwhile(!kbhit)*/
if(snake.life==1)/*如果蛇死就跳出循环*/
break
key=bioskey(0)/*接收按键*/
if(key==ESC)/*按ESC键退出*/
break
else
if(key==UP&&snake.direction!=4)
/*判断是否往相反的方向移动*/
snake.direction=3
else
if(key==RIGHT&&snake.direction!=2)
snake.direction=1
else
if(key==LEFT&&snake.direction!=1)
snake.direction=2
else
if(key==DOWN&&snake.direction!=3)
snake.direction=4
}/*endwhile(1)*/
}
/*游戏结束*/
void GameOver(void)
{
cleardevice()
PrScore()
setcolor(RED)
settextstyle(0,0,4)
outtextxy(200,200,"GAME OVER")
getch()
}
/*输出成绩*/
void PrScore(void)
{
char str[10]
setfillstyle(SOLID_FILL,YELLOW)
bar(50,15,220,35)
setcolor(6)
settextstyle(0,0,2)
sprintf(str,"score:%d",score)
outtextxy(55,20,str)
}
/*图形结束*/
void Close(void)
{
getch()
closegraph()
}
//package mainimport 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:shenzhifeiok@126.com","关于作者",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等语句可以去掉。能正常运行。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)