当前位置: 首页 > article >正文

用AI写游戏3——deepseek实现kotlin android studio greedy snake game 贪吃蛇游戏

项目下载

https://download.csdn.net/download/AnalogElectronic/90421306
在这里插入图片描述

项目结构

在这里插入图片描述
就是通过android studio 建空项目,改下MainActivity.kt的内容就完事了

ctrl+shift+alt+s 看项目结构如下
在这里插入图片描述

核心代码

MainActivity.kt

package com.example.snakegame1// MainActivity.kt
import android.content.ContentValues.TAG
import android.view.KeyEvent
import android.os.Bundle
import android.util.Log
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.Canvas
import androidx.compose.foundation.background
import androidx.compose.foundation.focusable
import androidx.compose.foundation.gestures.detectDragGestures
import androidx.compose.foundation.layout.*
import androidx.compose.material3.Button
import androidx.compose.material3.Text
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.input.key.*
import androidx.compose.ui.unit.dp
import kotlinx.coroutines.delay
import java.util.*
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.graphics.drawscope.Stroke
import androidx.compose.ui.input.pointer.pointerInput
import kotlin.math.abs
import kotlin.math.roundToInt// 游戏配置常量
const val CELL_SIZE = 30f      // 每个网格单元大小
const val GRID_SIZE = 20       // 网格行列数
const val GAME_SPEED = 150L    // 游戏刷新速度(毫秒)// 方向枚举类
enum class Direction { UP, DOWN, LEFT, RIGHT }// 坐标数据类
data class Point(val x: Int, val y: Int)class MainActivity : ComponentActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContent {SnakeGame()}}
}@Composable
fun SnakeGame() {// 游戏状态控制var isPlaying by remember { mutableStateOf(true) }var score by remember { mutableStateOf(0) }Log.d(TAG, "游戏是否启动: $isPlaying")// 蛇的初始状态val snake = remember {mutableStateOf(Snake(body = listOf(Point(GRID_SIZE/2, GRID_SIZE/2)),direction = Direction.RIGHT))}// 食物位置var food by remember { mutableStateOf(generateFood(snake.value.body)) }// 游戏循环控制LaunchedEffect(key1 = isPlaying) {while (isPlaying) {delay(GAME_SPEED)snake.value = snake.value.move()// 检测是否吃到食物if (snake.value.body.first() == food) {score += 10food = generateFood(snake.value.body)snake.value = snake.value.grow()}// 检测碰撞if (checkCollision(snake.value.body)) {isPlaying = false}}}Column(modifier = Modifier.fillMaxSize().background(Color(0xFF2B2B2B)).pointerInput(Unit) {// 处理触摸或鼠标事件detectDragGestures { _, dragAmount ->// 根据拖动方向改变蛇的方向if (abs(dragAmount.x) > abs(dragAmount.y)) {if (dragAmount.x > 0) {snake.value = snake.value.turn(Direction.RIGHT)} else {snake.value = snake.value.turn(Direction.LEFT)}} else {if (dragAmount.y > 0) {snake.value = snake.value.turn(Direction.DOWN)} else {snake.value = snake.value.turn(Direction.UP)}}}}.focusable(),verticalArrangement = Arrangement.Center,horizontalAlignment = Alignment.CenterHorizontally) {// 游戏画布Canvas(modifier = Modifier.size((CELL_SIZE * GRID_SIZE).dp).background(Color.Black)) {// 绘制网格线for (i in 0..GRID_SIZE) {drawLine(color = Color.Gray.copy(alpha = 0.3f),start = Offset(i * CELL_SIZE, 0f),end = Offset(i * CELL_SIZE, size.height),strokeWidth = 1f)drawLine(color = Color.Gray.copy(alpha = 0.3f),start = Offset(0f, i * CELL_SIZE),end = Offset(size.width, i * CELL_SIZE),strokeWidth = 1f)}// 绘制食物drawCircle(color = Color.Red,center = Offset(food.x * CELL_SIZE + CELL_SIZE / 2,food.y * CELL_SIZE + CELL_SIZE / 2),radius = CELL_SIZE / 3)// 绘制蛇身snake.value.body.forEachIndexed { index, point ->val color = if (index == 0) Color.Green else Color(0xFF4CAF50)drawCircle(color = color,center = Offset(point.x * CELL_SIZE + CELL_SIZE / 2,point.y * CELL_SIZE + CELL_SIZE / 2),radius = CELL_SIZE / 2.5f,style = Stroke(width = 3f))}}// 重新开始按钮if (!isPlaying) {Button(onClick = {// 重置游戏状态isPlaying = truescore = 0snake.value = Snake(body = listOf(Point(GRID_SIZE/2, GRID_SIZE/2)),direction = Direction.RIGHT)food = generateFood(snake.value.body)},modifier = Modifier.padding(8.dp)) {Text("重新开始")}}}
}// 蛇类定义
class Snake(val body: List<Point>,val direction: Direction
) {// 移动方法fun move(): Snake {val head = body.first()val newHead = when (direction) {Direction.UP -> head.copy(y = head.y - 1)Direction.DOWN -> head.copy(y = head.y + 1)Direction.LEFT -> head.copy(x = head.x - 1)Direction.RIGHT -> head.copy(x = head.x + 1)}return copy(body = listOf(newHead) + body.dropLast(1))}// 转向方法fun turn(newDirection: Direction): Snake {// 禁止反向移动if ((direction == Direction.UP && newDirection == Direction.DOWN) ||(direction == Direction.DOWN && newDirection == Direction.UP) ||(direction == Direction.LEFT && newDirection == Direction.RIGHT) ||(direction == Direction.RIGHT && newDirection == Direction.LEFT)) {return this}return copy(direction = newDirection)}// 增长方法fun grow(): Snake {val tail = body.last()val newTail = when (direction) {Direction.UP -> tail.copy(y = tail.y + 1)Direction.DOWN -> tail.copy(y = tail.y - 1)Direction.LEFT -> tail.copy(x = tail.x + 1)Direction.RIGHT -> tail.copy(x = tail.x - 1)}return copy(body = body + newTail)}private fun copy(body: List<Point> = this.body,direction: Direction = this.direction) = Snake(body, direction)
}// 生成食物位置
fun generateFood(snakeBody: List<Point>): Point {val random = Random()while (true) {val newFood = Point(random.nextInt(GRID_SIZE),random.nextInt(GRID_SIZE))if (newFood !in snakeBody) return newFood}
}// 碰撞检测
fun checkCollision(body: List<Point>): Boolean {val head = body.first()return head.x < 0 || head.x >= GRID_SIZE ||head.y < 0 || head.y >= GRID_SIZE ||head in body.drop(1)
}

实现效果
在这里插入图片描述

相关文章:

用AI写游戏3——deepseek实现kotlin android studio greedy snake game 贪吃蛇游戏

项目下载 https://download.csdn.net/download/AnalogElectronic/90421306 项目结构 就是通过android studio 建空项目&#xff0c;改下MainActivity.kt的内容就完事了 ctrlshiftalts 看项目结构如下 核心代码 MainActivity.kt package com.example.snakegame1// MainA…...

Python 错误和异常处理

目录 try-except块 例子&#xff1a; 输出&#xff1a; 捕获多种异常 例子&#xff1a; else和finally 例子&#xff1a; 输出&#xff1a; 自定义异常 例子&#xff1a; 输出&#xff1a; 好的&#xff0c;简单来说&#xff0c;错误和异常处理是编程中用来处理程序…...

论文解读 | AAAI'25 Cobra:多模态扩展的大型语言模型,以实现高效推理

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 点击 阅读原文 观看作者讲解回放&#xff01; 个人信息 作者&#xff1a;赵晗&#xff0c;浙江大学-西湖大学联合培养博士生 内容简介 近年来&#xff0c;在各个领域应用多模态大语言模型&#xff08;MLLMs&…...

DPVS-3: 双臂负载均衡测试

测试拓扑 双臂模式&#xff0c; 使用两个网卡&#xff0c;一个对外&#xff0c;一个对内。 Client host是物理机&#xff0c; RS host都是虚拟机。 LB host是物理机&#xff0c;两个CX5网卡分别在两个子网。 配置文件 用dpvs.conf.sample作为双臂配置文件&#xff0c;其中…...

Qt 中集成mqtt协议

一&#xff0c;引入qmqtt 库 我是将整个头文件/源文件都添加到了工程中进行编译&#xff0c;这样 跨平台时 方便&#xff0c;直接编译就行了。 原始仓库路径&#xff1a;https://github.com/emqx/qmqtt/tree/master 二&#xff0c;使用 声明一个单例类&#xff0c;将订阅到…...

C语言图结构学习笔记

1. 图的定义 图&#xff08;Graph&#xff09;是一种数据结构&#xff0c;由顶点&#xff08;Vertex&#xff09;和边&#xff08;Edge&#xff09;组成&#xff0c;用于表示对象及其相互关系。图可以是有向图&#xff08;Directed Graph&#xff09;或无向图&#xff08;Undi…...

记一次复杂分页查询的优化历程:从临时表到普通表的架构演进

1. 问题背景 在项目开发中&#xff0c;我们需要实现一个复杂的分页查询功能&#xff0c;涉及大量 IP 地址数据的处理和多表关联。在我接手这个项目的时候,代码是这样的 要知道代码里面的 ipsList 数据可能几万条甚至更多,这样拼接的sql,必然是要内存溢出的,一味地扩大jvm参数不…...

架构师面试(六):熔断和降级

问题 在千万日活的电商系统中&#xff0c;商品列表页服务通过 RPC 调用广告服务&#xff1b;经过统计发现&#xff0c;在最近10秒的时间里&#xff0c;商品列表页服务在对广告服务的调用中有 98% 的调用是超时的&#xff1b; 针对这个场景&#xff0c;下面哪几项的说法是正确的…...

细说 Java 引用(强、软、弱、虚)和 GC 流程(二)

一、前文回顾 在 细说Java 引用&#xff08;强、软、弱、虚&#xff09;和 GC 流程&#xff08;一&#xff09; 我们对Java 引用有了总体的认识&#xff0c;本文将继续深入分析 Java 引用在 GC 时的一些细节。 还是从我们在前文中提到的引用流程图里说起&#xff0c;这里不清…...

【深度学习】Unet的基础介绍

U-Net是一种用于图像分割的深度学习模型&#xff0c;特别适合医学影像和其他需要分割细节的任务。如图&#xff1a; Unet论文原文 为什么叫U-Net&#xff1f; U-Net的结构像字母“U”&#xff0c;所以得名。它的结构由两个主要部分组成&#xff1a; 下采样&#xff08;编码…...

Python--函数进阶(下)

3. 返回值与print​的辨析 3.1 返回值的作用 ​return​&#xff1a;将结果传递给调用者&#xff0c;可后续处理。​print​&#xff1a;仅输出到控制台&#xff0c;不保留数据。 def add(a, b):return a bresult add(3, 4) # 结果存储在result中 print(result) # …...

ROS2机器人开发--服务通信与参数通信

服务通信与参数通信 在 ROS 2 中&#xff0c;服务&#xff08;Services&#xff09;通信和参数&#xff08;Parameters&#xff09;通信是两种重要的通信机制。服务是基于请求和响应的双向通信机制。参数用于管理节点的设置&#xff0c;并且参数通信是基于服务通信实现的。 1 …...

DeepSeek写贪吃蛇手机小游戏

DeepSeek写贪吃蛇手机小游戏 提问 根据提的要求&#xff0c;让DeepSeek整理的需求&#xff0c;进行提问&#xff0c;内容如下&#xff1a; 请生成一个包含以下功能的可运行移动端贪吃蛇H5文件&#xff1a; 要求 蛇和食物红点要清晰&#xff0c;不超过屏幕外 下方有暂停和重新…...

【开源项目】分布式文本多语言翻译存储平台

分布式文本多语言翻译存储平台 地址&#xff1a; Gitee&#xff1a;https://gitee.com/dreamPointer/zza-translation/blob/master/README.md 一、提供服务 分布式文本翻译服务&#xff0c;长文本翻译支持流式回调&#xff08;todo&#xff09;分布式文本多语言翻译结果存储服…...

代码随想录刷题day29|(栈与队列篇:队列)225.用队列实现栈

目录 一、队列基本知识 二、队列在Java中的实现 1.Queue 2.Deque ①实现普通队列 ②实现栈 ③实现双端队列 3.基于底层数据结构 4.组合模式 三、相关算法题目 思路 代码 四、栈和队列总结 一、队列基本知识 队列只能在队尾添加元素&#xff0c;在队头删除元素&a…...

Python安全之反序列化——pickle/cPickle

一&#xff0e; 概述 Python中有两个模块可以实现对象的序列化&#xff0c;pickle和cPickle&#xff0c;区别在于cPickle是用C语言实现的&#xff0c;pickle是用纯python语言实现的&#xff0c;用法类似&#xff0c;cPickle的读写效率高一些。使用时一般先尝试导入cPickle&…...

Deepin(Linux)安装MySQL指南

1.下载 地址&#xff1a;https://downloads.mysql.com/archives/community/ 2.将文件解压到 /usr/local 目录下 先cd到安装文件所在目录再解压&#xff0c;本机是cd /home/lu01/Downloads sudo tar -xvJf mysql-9.2.0-linux-glibc2.28-x86_64.tar.xz -C /usr/local3.创建软链…...

vue-fastapi-admin 部署心得

vue-fastapi-admin 部署心得 这两天需要搭建一个后台管理系统&#xff0c;找来找去 vue-fastapi-admin 这个开源后台管理框架刚好和我的技术栈所契合。于是就浅浅的研究了一下。 主要是记录如何基于原项目提供的Dockerfile进行调整&#xff0c;那项目文件放在容器外部&#xf…...

计算机视觉算法实战——三维重建(主页有源码)

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​ 1. 三维重建领域简介 三维重建&#xff08;3D Reconstruction&#xff09;是计算机视觉的核心任务之一&#xff0c;旨在通过多视角图像、视频…...

先进制造aps专题三十 用免费生产排程软件isuperaps进行长期生产计划制定

isuperaps是生产排产软件&#xff0c;同时也可以用来制定长期生产计划 通过isuperaps制定长期生产计划&#xff0c;一个指导原则就是大bom, 单工序&#xff0c;大bom的意思是bom中只包含主要的半成品和原料&#xff0c;单工序的意思是半成品/产品生产以工厂或车间为基本生产单…...

DeepSeek使用从入门到精通

1. DeepSeek概述 - DeepSeek是国产大模型&#xff0c;提供网页版和App版。因其强大功能&#xff0c;遭受网络攻击&#xff0c;但国内用户可直接使用。 2. 入门技巧 - 忘掉复杂提示词&#xff1a;用简洁明了的需求指令&#xff0c;AI能自我思考并生成优质内容 - 明确需求&#…...

迎接DeepSeek开源周[Kimi先开为敬]发布开源最新Muon优化器可替代 AdamW计算效率直接翻倍

Muon优化器在小规模语言模型训练中表现出色&#xff0c;但在大规模模型训练中的可扩展性尚未得到证实。月之暗面通过系统分析和改进&#xff0c;成功将 Muon 应用于 3B/16B 参数的 MoE 模型训练&#xff0c;累计训练 5.7 万亿 token。结果表明&#xff0c;Muon 可以替代 AdamW …...

【工作流】Spring Boot 项目与 Camunda 的整合

【工作流】Spring Boot 项目与 Camunda 的整合 【一】Camunda 和主流流程引擎的对比【二】概念介绍【1】Camunda 概念&#xff1a;【2】BPMN 概念 【三】环境准备【1】安装流程设计器CamundaModeler【画图工具】&#xff08;1&#xff09;下载安装 【2】CamundaModeler如何设计…...

Grouped-Query Attention(GQA)详解: Pytorch实现

Grouped-Query Attention&#xff08;GQA&#xff09;详解 Grouped-Query Attention&#xff08;GQA&#xff09; 是 Multi-Query Attention&#xff08;MQA&#xff09; 的改进版&#xff0c;它通过在 多个查询头&#xff08;Query Heads&#xff09;之间共享 Key 和 Value&am…...

docker基操

docker基操 首先就是安装docker使用docker:创建容器-制作一个镜像-加载镜像首先就是安装docker 随便找一个教程安装就可以,安装过程中主要是不能访问谷歌,下面这篇文章写了镜像的一些问题: 安装docker的网络问题 使用docker:创建容器-制作一个镜像-加载镜像 主要是参考:这篇…...

SF-HCI-SAP问题收集1

最近在做HCI的集成&#xff0c;是S4的环境&#xff0c;发现很多东西都跑不通&#xff0c;今天开始收集一下错误点 如果下图冲从0001变成0010&#xff0c;sfiom_rprq_osi表就会存数据&#xff0c;系统检查到此表就会报错&#xff0c;这个选项的作用就是自定义信息类型也能更新&a…...

当 OpenAI 不再 open,DeepSeek 如何掀起 AI 开源革命?

开源与闭源的路线之争成为了行业瞩目的焦点&#xff0c;DeepSeek掀起的 AI 开源风暴&#xff01; 一、硅谷“斯普特尼克时刻” 1957年&#xff0c;苏联将人类首颗人造卫星“斯普特尼克”送上太空&#xff0c;美国举国震动。 这颗“篮球”般的卫星&#xff0c;刺痛了自诩科技霸…...

理解 logits_to_keep = logits_to_keep + 1 在 _get_per_token_logps 中的作用

理解 logits_to_keep logits_to_keep 1 在 _get_per_token_logps 中的作用 source: anaconda3/envs/xxx/lib/python3.10/site-packages/trl/trainer/grpo_trainer.py def _get_per_token_logps(self, model, input_ids, attention_mask, logits_to_keep):# We add 1 to logi…...

论文笔记-WSDM2025-ColdLLM

论文笔记-WSDM2025-Large Language Model Simulator for Cold-Start Recommendation ColdLLM&#xff1a;用于冷启动推荐的大语言模型模拟器摘要1.引言2.前言3.方法3.1整体框架3.1.1行为模拟3.1.2嵌入优化 3.2耦合漏斗ColdLLM3.2.1过滤模拟3.2.2精炼模拟 3.3模拟器训练3.3.1LLM…...

DeepSeek与AI幻觉

AI幻觉&#xff08;AI Hallucination&#xff09; 是指人工智能系统&#xff08;尤其是生成式模型&#xff0c;如大型语言模型或图像生成模型&#xff09;在输出内容时&#xff0c;生成与事实不符、逻辑混乱或完全虚构的信息的现象。这种现象类似于人类的“幻觉”&#xff0c;即…...