大家好c语言游戏源码,我是道友!
下面是一个简单的贪吃蛇游戏的C语言实现:
int x, y, fruit_x, fruit_y, score;
int game_over;
int tail_x[100], tail_y[100];
int tail_len;
void Setup()
{
game_over = 0;
x = INIT_X;
y = INIT_Y;
fruit_x = rand() % MAX_X;
fruit_y = rand() % MAX_Y;
score = 0;
tail_len = 0;
}
void Draw()
{
system("cls");
for (int i = 0; i < MAX_Y; i++)
{
for (int j = 0; j < MAX_X; j++)
{
if (i == y && j == x)
printf("O");
else if (i == fruit_y && j == fruit_x)
printf("F");
else
{
int flag = 0;
for (int k = 0; k < tail_len; k++)
{
if (tail_x[k] == j && tail_y[k] == i)
{
printf("o");
flag = 1;
}
}
if (!flag)
printf(" ");
}
}
printf("n");
}
printf("Score: %dn", score);
}
void Input()
{
if (_kbhit())
{
switch (_getch())
{
case 'a':
x--;
break;
case 'd':
x++;
break;
case 'w':
y--;
break;
case 's':
y++;
break;
case 'x':
game_over = 1;
break;
}
}
}
void Logic()
{
if (x < 0 || x >= MAX_X || y < 0 || y >= MAX_Y)
game_over = 1;
for (int i = 0; i < tail_len; i++)
{
if (tail_x[i] == x && tail_y[i] == y)
game_over = 1;
}
if (x == fruit_x && y == fruit_y)
{
score += 10;
fruit_x = rand() % MAX_X;
fruit_y = rand() % MAX_Y;
tail_len++;
tail_x[tail_len - 1] = x;
tail_y[tail_len - 1] = y;
}
for (int i = 0; i < tail_len; i++)
{
int temp_x = tail_x[i];
int temp_y = tail_y[i];
tail_x[i] = x;
tail_y[i] = y;
x = temp_x;
y = temp_y;
}
}
int main()
{
Setup();
while (!game_over)
{
Draw();
Input();
Logic();
Sleep(100);
}
printf("Game Over!n");
return 0;
}
注意:
本实现使用Windows.h库中的Sleep函数来控制游戏速度c语言游戏源码,并使用conio.h库中的_kbhit和_getch函数来实现按键输入测量。
游戏界面采用命令行窗口,使用printf函数输出游戏界面和游戏得分。
在游戏逻辑中,使用了一个链表来记录蛇尾巴的位置。 每次更新蛇头位置时,将尾部位置链表中的每个元素前移一位,然后将蛇头位置存储在链表的第一位中。
游戏结束后,输出“GameOver!”。
Java实战中的贪吃蛇游戏(源码+笔记)
更新时间:2021年4月23日 11:52:15 作者:Henrik-Yao
本文主要介绍Java中的贪吃蛇游戏(源码+注释)。 文章中有非常详细的代码示例。 对于学习Java的人来说非常有帮助。 有需要的同学可以参考以下
目录
1、工程文件
2.main.java
package com.company; import javax.swing.*; public class Main { public static void main(String[] args) { //创建窗体对象 JFrame frame = new JFrame(); //创建窗体参数() frame.setBounds(10,10,900,720); //设置不允许更改大小 //frame.setResizable(false); //设置关闭方式 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //添加主题逻辑框架 frame.add(new Mpanel()); //设置窗体可见 frame.setVisible(true); } }
3.Mpanel.java
package com.company; import javax.imageio.ImageIO; import javax.sound.sampled.*; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; import java.util.Random; //基本套路,继承JPanel,实现KeyListener, ActionListener接口 public class Mpanel extends JPanel implements KeyListener, ActionListener { //定义所需要的图片元素 //标题 ImageIcon title; //蛇的身体部位 ImageIcon body; //蛇向上方向的头 ImageIcon up; //蛇向下方向的头 ImageIcon down; //蛇向左方向的头 ImageIcon left; //蛇向右方向的头 ImageIcon right; //食物元素 ImageIcon food; //定义初始长度 int len = 3; //定义初始分数 int score = 0; //存放蛇位置坐标的数组 int[] snakex = new int[750]; int[] snakey = new int[750]; //定义方向 String fx = "R"; //定义游戏是否开始 Boolean isStart = false; //定义游戏是否失败 Boolean isFailed = false; //定义游戏时钟,在此可以设置蛇移动速度,默认100ms Timer timer = new Timer(100,this); //定义食物的坐标 int foodx; int foody; //引入随机数,用于生成食物的随机位置 Random random = new Random(); //定义背景音乐 Clip bgm; //构造方法 public Mpanel(){ //加载图片元素 loadImages(); //初始化数据 initSnake(); //设置聚焦 this.setFocusable(true); //设置键盘监听 this.addKeyListener(this); //开始计时 timer.start(); //加载背景音乐 loadBGM(); } //设置绘图元素 public void paintComponent(Graphics g){ //调用父类方法 super.paintComponent(g); //设置背景颜色为白色 this.setBackground(Color.white); //设置标题元素位置 title.paintIcon(this,g,25,11); //设置白色背景填充位置 g.fillRect(25,75,850,600); //设置画笔颜色为白色 g.setColor(Color.white); //设置长度显示 g.drawString("Len: " + len,750,35); //设置分数显示 g.drawString("Score: " + score,750,50); //根据方向调用相应的蛇头元素 if(fx == "R"){ right.paintIcon(this,g,snakex[0],snakey[0]); } else if(fx == "L"){ left.paintIcon(this,g,snakex[0],snakey[0]); } else if(fx == "U"){ up.paintIcon(this,g,snakex[0],snakey[0]); } else if(fx == "D"){ down.paintIcon(this,g,snakex[0],snakey[0]); } for(int i=1;i0;i--){ snakex[i]=snakex[i-1]; snakey[i]=snakey[i-1]; } //向右移动并判断是否撞墙,撞墙则失败 if(fx == "R"){ snakex[0]=snakex[0]+25; if(snakex[0]>825)isFailed=true; } //向左移动并判断是否撞墙,撞墙则失败 else if(fx == "L"){ snakex[0]=snakex[0]-25; if(snakex[0]<50)isFailed=true; } //向上移动并判断是否撞墙,撞墙则失败 else if(fx == "U"){ snakey[0]=snakey[0]-25; if(snakey[0]625)isFailed=true; } //吃到食物的判断 if(snakex[0]==foodx&&snakey[0]==foody){ //身体加长,分加多,并且随机生成新食物 len++; score += 10; foodx = 25 + 25 * random.nextInt(34); foody = 75 + 25 * random.nextInt(24); } //撞到自身的处理 for(int i=1;i<len;i++){ if(snakex[i]==snakex[0] && snakey[i]==snakey[0]){ isFailed = true; } } //重新绘图 repaint(); } //事件刷新 timer.start(); } //加载背景音乐 public void loadBGM(){ try { //从类所在文件引入 bgm = AudioSystem.getClip(); InputStream is = this.getClass().getClassLoader().getResourceAsStream("com/company/sound/bgm.wav"); AudioInputStream ais = AudioSystem.getAudioInputStream(new BufferedInputStream(is)); bgm.open(ais); //bgm.loop(Clip.LOOP_CONTINUOUSLY); } //相应的异常处理 catch (LineUnavailableException e) { e.printStackTrace(); } catch (UnsupportedAudioFileException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } //加载图片 public void loadImages(){ InputStream is; try { //依次添加响应元素 is = getClass().getClassLoader().getResourceAsStream("com/company/img/title.jpg"); title = new ImageIcon(ImageIO.read(is)); is = getClass().getClassLoader().getResourceAsStream("com/company/img/body.png"); body = new ImageIcon(ImageIO.read(is)); is = getClass().getClassLoader().getResourceAsStream("com/company/img/up.png"); up = new ImageIcon(ImageIO.read(is)); is = getClass().getClassLoader().getResourceAsStream("com/company/img/down.png"); down = new ImageIcon(ImageIO.read(is)); is = getClass().getClassLoader().getResourceAsStream("com/company/img/left.png"); left = new ImageIcon(ImageIO.read(is)); is = getClass().getClassLoader().getResourceAsStream("com/company/img/right.png"); right = new ImageIcon(ImageIO.read(is)); is = getClass().getClassLoader().getResourceAsStream("com/company/img/food.png"); food = new ImageIcon(ImageIO.read(is)); } catch (IOException e) { e.printStackTrace(); } } }
4、效果
Java实战中的贪吃蛇游戏(源码+注释)这篇文章到此结束。 想了解更多关于Java贪吃蛇游戏的内容,请搜索之前的文章或者继续浏览下面的相关文章。 文章希望大家以后多多支持脚本之家!