电脑自己做一个贪吃蛇app

贪吃蛇是一款经典的小游戏,是许多人童年的回忆。本文将介绍如何用电脑自己做一个贪吃蛇App。

开发工具和语言

首先要选择一款适合自己的开发工具和编程语言。目前比较流行的开发工具有Android Studio、Xcode等,编程语言则可以选择Java、Kotlin、Swift等。

界面设计

贪吃蛇App的界面应该是简单明了的,包含开始界面、游戏界面、结束界面等。开始界面应该有开始游戏按钮和游戏规则介绍,游戏界面应该有蛇体、食物、得分等元素,结束界面应该有得分、重新开始和返回主界面等选项。

游戏逻辑

蛇的移动方向应该由玩家控制,当蛇头碰到游戏界面的边界或者蛇尾时,游戏结束。当蛇头吃到食物时,蛇的长度增加一节,游戏得分也会增加。食物应该随机生成,并且不能与蛇体重叠。

代码实现

以下是用Java语言实现的贪吃蛇App代码:

1. 定义Snake类

public class Snake {

private LinkedList body;//蛇的身体,LinkedList是Java中的一种队列数据结构

public Snake() {

body = new LinkedList();//蛇初始化时只有一节身体

body.add(new Node(5, 5));//蛇的初始位置

}

public LinkedList getBody() {

return body;

}

public boolean eatFood(Node food) {//判断蛇是否吃到了食物

Node head = body.getFirst();

if (head.getX() == food.getX() && head.getY() == food.getY()) {

body.addFirst(food);//蛇的头部添加一节身体

return true;

}

return false;

}

public void move(int direction) {//蛇的移动

Node head = body.getFirst();

int x = head.getX();

int y = head.getY();

switch (direction) {

case MainActivity.UP:

y--;

break;

case MainActivity.DOWN:

y++;

break;

case MainActivity.LEFT:

x--;

break;

case MainActivity.RIGHT:

x++;

break;

}

Node newHead = new Node(x, y);

body.addFirst(newHead);//加入新的头部

body.removeLast();//移除尾部

}

public boolean isDead() {//判断蛇是否死亡

Node head = body.getFirst();

if (head.getX() < 0 || head.getX() >= MainActivity.COL_NUM) {//超出界限

return true;

}

if (head.getY() < 0 || head.getY() >= MainActivity.ROW_NUM) {//超出界限

return true;

}

for (int i = 1; i < body.size(); i++) {//与身体相撞

if (head.getX() == body.get(i).getX() && head.getY() == body.get(i).getY()) {

return true;

}

}

return false;

}

}

2. 定义Node类

public class Node {

private int x;

private int y;

public Node(int x, int y) {

this.x = x;

this.y = y;

}

public int getX() {

return x;

}

public int getY() {

return y;

}

}

3. 定义Food类

public class Food {

private Node food;

public Food() {

food = new Node(0, 0);//初始化位置

}

public Node genNewFood(LinkedList body) {//生成新的食物

boolean isOverlap = true;//判断是否与蛇体重叠

while (isOverlap) {

int x = (int) (Math.random() * MainActivity.COL_NUM);

int y = (int) (Math.random() * MainActivity.ROW_NUM);

Node newFood = new Node(x, y);

isOverlap = false;

for (int i = 0; i < body.size(); i++) {

if (newFood.getX() == body.get(i).getX() && newFood.getY() == body.get(i).getY()) {

isOverlap = true;

break;

}

}

if (!isOverlap) {

food = newFood;

}

}

return food;

}

}

4. 定义MainActivity类

public class MainActivity extends AppCompatActivity {

public static final int COL_NUM = 15;//游戏界面的列数

public static final int ROW_NUM = 20;//游戏界面的行数

public static final int UP = 0;//方向,用常量表示方便修改

public static final int DOWN = 1;

public static final int LEFT = 2;

public static final int RIGHT = 3;

private Snake snake;

private Food food;

private boolean isRunning = true;//控制游戏是否运行

private int direction = RIGHT;//初始方向为向右

private int score = 0;//得分

private Handler handler = new Handler();//用于UI更新

private Runnable runnable = new Runnable() {

@Override

public void run() {

if (isRunning) {

snake.move(direction);//蛇移动

if (snake.eatFood(food.genNewFood(snake.getBody()))) {//吃到了食物

score++;

}

if (snake.isDead()) {//蛇死亡

isRunning = false;

AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);

builder.setTitle("游戏结束");

builder.setMessage("得分:" + score);

builder.setPositiveButton("重新开始", new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int which) {

restartGame();

}

});

builder.setNegativeButton("返回主界面", new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int which) {

finish();

}

});

builder.setCancelable(false);

builder.show();

return;

}

handler.postDelayed(this, 500);//每500毫秒刷新界面

drawGameView();

}

}

};

private GameView gameView;

private Button startButton;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

gameView = (GameView) findViewById(R.id.game_view);

startButton = (Button) findViewById(R.id.start_button);

startButton.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

startGame();

}

});

snake = new Snake();

food = new Food();

}

private void startGame() {//开始游戏

startButton.setVisibility(View.GONE);//隐藏开始按钮

score = 0;//分数清零

isRunning = true;//游戏开始

direction = RIGHT;//方向重置为向右

handler.postDelayed(runnable, 500);

}

private void restartGame() {//重新开始游戏

startButton.setVisibility(View.VISIBLE);//显示开始按钮

snake = new Snake();//重新创建蛇和食物实例

food = new Food();

gameView.invalidate();//界面重绘

}

private void drawGameView() {//绘制游戏界面

gameView.invalidate();//界面重绘

}

public int getScore() {

return score;

}

public Snake getSnake() {

return snake;

}

public Food getFood() {

return food;

}

public int getDirection() {

return direction;

}

public void setDirection(int direction) {

this.direction = direction;

}

}

5. 定义GameView类

public class GameView extends View {

private MainActivity context;

private Paint paint;

public GameView(Context context, AttributeSet attrs) {

super(context, attrs);

this.context = (MainActivity) context;

paint = new Paint();//绘图工具

paint.setAntiAlias(true);//设置抗锯齿

}

@Override

protected void onDraw(Canvas canvas) {//重写绘制方法

super.onDraw(canvas);

int cellWidth = getWidth() / MainActivity.COL_NUM;//列宽

int cellHeight = getHeight() / MainActivity.ROW_NUM;//行高

drawSnake(cellWidth, cellHeight, canvas);//绘制蛇

drawFood(cellWidth, cellHeight, canvas);//绘制食物

drawScore(canvas);//绘制分数

}

private void drawSnake(int cellWidth, int cellHeight, Canvas canvas) {//绘制蛇

Snake snake = context.getSnake();

LinkedList body = snake.getBody();

paint.setColor(Color.GREEN);

for (int i = 0; i < body.size(); i++) {

int x = body.get(i).getX() * cellWidth;

int y = body.get(i).getY() * cellHeight;

canvas.drawRect(x, y, x + cellWidth, y + cellHeight, paint);

}

}

private void drawFood(int cellWidth, int cellHeight, Canvas canvas) {//绘制食物

Node food = context.getFood().getFood();

paint.setColor(Color.RED);

int x = food.getX() * cellWidth;

int y = food.getY() * cellHeight;

canvas.drawRect(x, y, x + cellWidth, y + cellHeight, paint);

}

private void drawScore(Canvas canvas) {//绘制分数

paint.setColor(Color.BLACK);

paint.setTextSize(30);

int score = context.getScore();

String scoreText = "得分:" + score;

canvas.drawText(scoreText, 10, 30, paint);

}

}

以上就是用Java语言实现的贪吃蛇App的代码,当然你也可以用其他语言和工具完成这个小项目。希望这篇文章能够对有志于开发自己的应用的初学者们有所帮助。


相关知识:
做自媒体比较好用的相机app
随着互联网和社交媒体的发展,自媒体已成为人们获取信息和表达自我的新途径。通过自媒体,个人可以分享自己的经验、知识和技能,建立自己的品牌。为了让自媒体内容更有吸引力,使用好用的相机app可以让你的内容更加全面、精美。在相机app市场上,有很多好用的app,可
2023-06-05
自建商城app免编程
在现今互联网时代,电商市场的火爆和移动互联网的普及使得人们越来越需要一个自主定制的电商平台,而自建商城APP的出现解决了大家的问题。备具商业性的自建商城APP可能需要专业的技术人员进行开发,开发成本也是较高。但其实有不少免编程自建商城APP的工具适用于初创
2023-06-05
自己做天气app
做一款天气App,通常需要考虑以下几个方面:1.数据来源和处理天气数据通常来自于气象局等权威机构,需要使用API来获取相应的数据。在使用API的时候需要考虑到调用次数的限制和使用协议的约束。2.界面设计和交互设计好天气App的UI和交互是很重要的,这也是体
2023-06-05
自媒体账号制作平台app
自媒体账号制作平台app是针对那些想自己创作内容并且在社交网络上进行展示的用户而设计的。其原理主要是通过基于云计算和其他相关技术,提供一个完整的自媒体账号制作平台,使用户可以在这个平台上制作自己的自媒体账号,并能一键分享到各大社交网络。具体来说,这种自媒体
2023-06-05
自己手动开发手机虚拟定位app
手机虚拟定位app的开发需要先了解定位技术。在现代移动通信中,最常用的是GPS技术和基站定位技术,它们使用卫星信号和基站信号来确定设备的位置。但是在某些情况下,我们需要改变设备的位置,以便避免被跟踪或保护隐私等需求,此时就需要使用虚拟定位技术。虚拟定位技术
2023-06-05
自己制作漫画人物app手机版免费
制作漫画人物app需要有以下几个方面的知识储备:程序开发、人物设计、UI设计、数据库设计等。1. 程序开发制作app首先需要具备程序开发的知识。app开发主要分为两种方式:原生开发和混合开发。原生开发是指针对特定平台(如iOS、Android)或特定设备(
2023-06-05
郑爽自己开发的app叫
郑爽开发的app名为“YoYo自拍”。 这个应用程序专为那些喜欢自拍的人而设计。 随着智能手机普及,自拍成为了人们日常生活中的一部分,而YoYo自拍则为用户们提供了一种更好的自拍体验。YoYo自拍应用程序可以让用户在拍摄自拍照时,使用多种不同的滤镜效果。这
2023-06-05
在小米自营城app如何申请开发票
小米自营城是小米公司旗下的一个电商平台,提供了多种商品供用户购买。对于企业或个人用户来说,在购买商品后,有时会需要申请发票以进行账务管理或报销等用途。本文将介绍在小米自营城app中如何申请开发票。1、登录小米自营城app首先,需要打开小米自营城app并登录
2023-06-05
有没有app自己出题自己做
有很多app可以用来自己出题自己做,其中最常见的是题库类app和学习类app。这些app可以让用户自己制定测试内容以及测试难度,以此来帮助他们更好地检验自己的知识水平。下面,我们将从原理以及详细介绍两个方面来介绍这些app的使用方法。一、原理制作题目需要考
2023-06-05
有能自建桌的麻将app吗
麻将是一种十分受欢迎的桌面游戏,既能进行家庭娱乐,也能进行比赛竞技。而在现代社会中,人们越来越倾向于使用手机或电脑等电子设备进行娱乐活动,因此,自建桌的麻将app也开始出现在市场上。那么,有哪些原理和方式可以实现自建桌的麻将app呢?首先,需要了解的是,麻
2023-06-05
如何零基础自己开发app
开发一款app需要有一定的编程技能和相应的开发环境,但是对于零基础的读者来说,这些可能会感到有些困难。在这篇文章中,我们将介绍一些关于开发app的基础知识和步骤,为初学者提供指引。第一步:确定app的目的和功能在开始开发app之前,你需要确定你的app的目
2023-05-30
不用编程也能自己制作app
在过去,制作一个App几乎是程序员或专门公司的专利。但现在,随着技术的进步和市场的需求,制作一个App已经成为一项许多人都可以完成的任务。无需编程的App制作工具为人们提供了一种简单,快捷的方法来创造自己的App。在这篇文章中,我将介绍一些无需编程经验也可
2023-05-30
©2015-2021 自建app开发平台 www.appbyme.cn 蜀ICP备17005078号-1