数组初学者向导:使用Python从零开始制作经典战舰游戏
引言
战舰游戏,一个广受欢迎的经典游戏,为玩家提供了策略与猜测的完美结合。这个游戏的核心思想是通过猜测敌方船只的位置并尝试击沉它们来赢得比赛。在这篇文章中,我们将使用Python语言和数组来构建这款游戏,让你更加了解数组的操作和实用性。
1. 游戏概述
在战舰游戏中,每位玩家都有一个10 x 10的网格,可以放置5艘船只。这些船只有不同的长度,并且可以横向或纵向放置。玩家和计算机轮流猜测对方网格上的坐标,并尝试“攻击”。如果某个坐标上有船,那么这个坐标就被标记为“被击中”。如果某艘船的所有坐标都被击中,那么这艘船就被认为是“被击沉”。当一个玩家的所有船只都被击沉时,游戏结束。
2. 游戏设置
我们首先需要为玩家和计算机设置10 x 10的游戏网格。在Python中,我们可以使用列表的列表(即数组)来实现这个网格。
def create_board():"""创建一个10x10的游戏网格"""return [["O"] * 10 for _ in range(10)]
这里,每个"O"代表一个空的网格位置。我们会在后续过程中更新这些位置来显示船只或攻击的结果。
3. 船只的放置
我们需要为玩家和电脑放置船只。为简单起见,我们假设每艘船的长度为3。这意味着每艘船都需要3个连续的网格位置。
import randomdef place_ships(board, num_ships=5, ship_length=3):"""在指定的游戏板上放置船只"""for _ in range(num_ships):while True:direction = random.choice(["horizontal", "vertical"])if direction == "horizontal":row = random.randint(0, 9)col = random.randint(0, 10 - ship_length)else: # verticalrow = random.randint(0, 10 - ship_length)col = random.randint(0, 9)# 检查该位置是否可用if direction == "horizontal":if all([board[row][col + i] == "O" for i in range(ship_length)]):for i in range(ship_length):board[row][col + i] = "S"breakelse:if all([board[row + i][col] == "O" for i in range(ship_length)]):for i in range(ship_length):board[row + i][col] = "S"break
在这里,我们首先随机选择放置船只的方向(横向或纵向)。然后,我们随机选择一个起始坐标,并检查这个坐标及其连续位置是否都为空。如果都为空,我们就在这些位置放置船只。
注意:为了简洁和清晰,本文中的代码可能不是最优的或最完整的实现。为了获得完整的项目和更多的优化技巧,请下载完整项目
4. 游戏循环与攻击
在游戏开始之前,玩家和电脑都已经部署了他们的船只。现在,我们需要设置一个游戏循环,其中玩家和电脑轮流进行攻击。
首先,我们定义一个函数来让玩家输入他想要攻击的坐标:
def player_attack():"""让玩家选择攻击的坐标"""while True:try:row, col = map(int, input("请输入你要攻击的坐标(例如: 5,3): ").split(','))if 0 <= row < 10 and 0 <= col < 10:return row, colprint("坐标必须在0-9之间。")except ValueError:print("请输入有效的坐标,例如: 5,3。")
接下来,我们定义一个函数让电脑随机选择一个攻击坐标:
def computer_attack():"""电脑随机选择攻击坐标"""return random.randint(0, 9), random.randint(0, 9)
现在,我们可以定义一个函数来执行实际的攻击:
def attack(board, row, col):"""在指定的坐标上执行攻击"""if board[row][col] == "S":board[row][col] = "H" # Hitreturn "H"elif board[row][col] == "O":board[row][col] = "M" # Missreturn "M"else:return None # 已经攻击过的位置
最后,我们需要一个游戏循环来处理玩家和电脑的轮流攻击:
def game_loop(player_board, computer_board):"""主游戏循环"""while True:# 玩家攻击row, col = player_attack()result = attack(computer_board, row, col)if result == "H":print("命中!")if all(cell == "M" or cell == "H" for row in computer_board for cell in row):return "Player Wins"elif result == "M":print("失误!")else:print("你已经攻击过这个位置了!")# 电脑攻击row, col = computer_attack()result = attack(player_board, row, col)if result == "H":print(f"电脑命中了坐标 {row},{col}!")if all(cell == "M" or cell == "H" for row in player_board for cell in row):return "Computer Wins"elif result == "M":print(f"电脑在坐标 {row},{col} 失误!")
5. 游戏结果展示
游戏结束时,我们需要告诉玩家谁赢得了比赛。
def display_result(winner):"""展示游戏结果"""if winner == "Player Wins":print("恭喜你击败了电脑!")else:print("电脑赢得了比赛!")
6. 辅助功能:展示游戏板
为了让玩家知道他们的游戏进度和船只的状态,我们需要一个函数来展示游戏板。
def display_board(board):"""展示指定的游戏板"""for row in board:print(" ".join(row))print("\n" + "-" * 20 + "\n")
这个函数会打印游戏板上的每一行,使其看起来更加整齐。
7. 启动游戏
现在,我们需要一个启动游戏的函数,将之前定义的所有函数组合起来:
def start_game():"""开始战舰游戏"""# 创建游戏板player_board = create_board()computer_board = create_board()# 放置船只place_ships(player_board)place_ships(computer_board)# 游戏主循环winner = game_loop(player_board, computer_board)# 展示结果display_result(winner)# 展示完整的电脑游戏板,以便玩家知道船只的位置print("电脑的游戏板:")display_board(computer_board)
8. 总结
通过本教程,我们使用Python和数组构建了一个简单的战舰游戏。在这个过程中,我们学习了如何创建和操作数组,如何随机放置船只,如何管理游戏循环,以及如何展示结果。
这款游戏可以进一步完善和扩展。例如,你可以增加不同长度的船只,为电脑玩家添加更复杂的策略,或者增加更丰富的用户界面。
我们鼓励你使用这篇文章作为起点,探索更多的功能和创新,从而进一步提高你的编程和问题解决能力。
9. 扩展思路
- 增加不同类型的船只:船只可以有不同的大小,如航空母舰(5个单位长度)、战列舰(4个单位长度)等。
- 增加障碍物:在游戏板上添加障碍物,增加游戏的策略性和复杂性。
- 更智能的电脑玩家:你可以为电脑玩家设计更复杂的策略,比如基于前几次攻击的结果进行猜测等。
- 图形用户界面:使用Python的图形库,如Tkinter或Pygame,为游戏添加一个图形用户界面。
这就是我们的完整战舰游戏教程!希望这篇文章能帮助你更加熟悉数组的概念,并鼓励你进一步探索编程的乐趣。
注意:为了简洁和清晰,本文中的代码可能不是最优的或最完整的实现。为了获得完整的项目和更多的优化技巧,请下载完整项目
相关文章:
数组初学者向导:使用Python从零开始制作经典战舰游戏
引言 战舰游戏,一个广受欢迎的经典游戏,为玩家提供了策略与猜测的完美结合。这个游戏的核心思想是通过猜测敌方船只的位置并尝试击沉它们来赢得比赛。在这篇文章中,我们将使用Python语言和数组来构建这款游戏,让你更加了解数组的…...
【STM32】IAP升级 预备知识
IAP(In Application Programming)简介 Flash够大的情况下,上电后的程序通过修改 MSP 的方式,可以在一块Flash上存在多个功能差异的程序。 IAP是为了在执行正常功能前,为了升级功能,提前运行的一段程序。这…...
asp.net网站的建立及运行
点击创建新项目 在输入框中输入asp.net,并选择图中的 点击下一步 点击创建 然后,右键,添加,新建项 选择web窗体 点击添加 点击视图,工具箱 选择一个label,记住这个id 空白处右键,查看代码 添…...
怎么把webm转换成mp4?
怎么把webm转换成mp4?与MP4这位视频格式大哥相比,Webm这种视频格式还有很多小伙伴对它不太熟悉,因为大家平时也是偶尔才能接触到,属于不常用的视频格式。Webm是一种开放、免费的媒体文件格式,尽管如今它的应用范围比以…...
RabbitMQ 消息应答
每日一句 物是人非事事休,欲语泪先流。 概述 为了保证消息在发送过程中不丢失,RabbitMQ引入了消息应答机制, 消费者在接收到消息并且处理该消息后,告诉RabbitMQ它已经处理了,RabbitMQ可以把消息删除了。 自动应答 消息发送后立即被认为已经传送成功,这种模式需要在…...
【C++】C++ 类中的 this 指针用法 ③ ( 全局函数 与 成员函数 相互转化 | 有参构造函数设置默认参数值 | 返回匿名对象与返回引用 )
文章目录 一、全局函数 与 成员函数 相互转化1、成员函数转为全局函数 - 多了一个参数2、全局函数转为成员函数 - 通过 this 指针隐藏操作数 二、有参构造函数设置默认参数值三、返回匿名对象与返回引用四、完整代码示例 一、全局函数 与 成员函数 相互转化 1、成员函数转为全局…...
游戏遇到的问题
天涯明月刀 就是天刀的假全屏,很多天刀玩家可能玩其他游戏比较少或者对电脑了解不多,不在意帧数,但是肯定还是有一部分玩家发现了这个问题,就是“我使命召唤12都能跑到60帧的机器跑个破天刀40帧甚至30帧?”问题何在呢࿱…...
高性能系统的性能优化技巧:从专家的经验中学习 | 开源日报 No.40
binhnguyennus/awesome-scalability Stars: 48.3k License: MIT 这个项目是一个阅读列表,用于说明可扩展、可靠和高性能大规模系统的模式。该项目通过知名工程师的文章和可信参考资料来解释概念,并从为数以百万计甚至十亿用户提供服务的经过实战验证的系…...
Linux系统编程——进程间通信的学习
学习参考博文: 进程间的五种通信方式介绍Linux 信号介绍 Linux系统编程学习相关博文 Linux系统编程——文件编程的学习Linux系统编程——进程的学习Linux系统编程——线程的学习Linux系统编程——网络编程的学习 Linux系统编程——进程间通信的学习 一、概述1. 无…...
人工智能AI 全栈体系(六)
第一章 神经网络是如何实现的 这些年神经网络的发展越来越复杂,应用领域越来越广,性能也越来越好,但是训练方法还是依靠 BP 算法。也有一些对 BP 算法的改进算法,但是大体思路基本是一样的,只是对 BP 算法个别地方的一…...
NPDP是什么?考了有用吗?
1)NPDP是什么? NPDP,全称为New Product Development Professional,即新产品开发专业人员。NPDP认证是由世界产品开发协会(PDMA)推出的一项专业认证。它旨在评估和认可个人在新产品开发领域的专业知识和技能…...
关于安卓SVGA浅尝(二)加载数据
关于安卓SVGA浅尝(二)加载数据 相关链接 SVGA官网 SVGA-github说明文档 背景 项目开发,都会和动画打交道,动画的方案选取,就有很多选择。如Json动画,svga动画,gif等等。各有各的优势。目前项…...
使用matlab产生二维动态曲线视频文件具体举例
使用matlab产生二维动态曲线视频文件举例 在进行有些函数变化过程时候,需要用到直观的动态显示,本博文将举例说明利用Matlab编程进行二维动态曲线的生成视频文件。 一、问题描述 利用matlab编程实现 y 1 s i n ( t ) , y 2 c o s ( t ) , y 3 s i …...
Selenium自动化测试框架常见异常分析及解决方法
01 pycharm中导入selenium报错 现象: pycharm中输入from selenium import webdriver, selenium标红 原因1: pycharm使用的虚拟环境中没有安装selenium, 解决方法: 在pycharm中通过设置或terminal面板重新安装selenium 原因2: 当前项目下有selenium.py,和系统包名冲突导致, …...
[TI] [Textual Inversion] An image is worth an word
自己的理解: 根据几个图像,找出来一个关键字可以代表它们,然后我们可以再用这个关键字去生成新的东西。 提出关键字 1 Introduction word->token->embedding Textual Inversion过程 需要: ① a fixed, pre-trained text…...
remote: The project you were looking for could not be found
git拉取公司项目时报错: remote: The project you were looking for could not be found 发生这个问题的原因,在于git账号可能并未真正登录。 我们可以通过打开电脑的凭据管理器,查看git当前的登录是否正常。 参考链接:参考...
https跳过SSL认证时是不是就是不加密的,相当于http?
https跳过SSL认证时是不是就是不加密的,相当于http?,其实不是,HTTPS跳过SSL认证并不相当于HTTP,也不意味着没有加密。请注意以下几点: HTTPS(Hypertext Transfer Protocol Secure)本质上是在HTTP的基础上…...
linux下链接
linux下链接用法 ln链接格式与介绍 linux下链接用法一、链接的使用格式二、链接的介绍 一、链接的使用格式 链接: 格式: ln 源文件 链接文件 硬链接 ln -s 源文件 链接文件 软连接 硬链接文件占磁盘空间 但是删除源文件不会影响硬链接文件 软链接文件不…...
OpenCV项目开发实战--主成分分析(PCA)的特征脸应用(附C++/Python实现源码)
什么是主成分分析? 这是理解这篇文章的先决条件。 图 1:使用蓝线和绿线显示 2D 数据的主要组成部分(红点)。 快速回顾一下,我们了解到第一个主成分是数据中最大方差的方向。第二主成分是空间中与第一主成分垂直(正交)的最大方差方向,依此类推。第一和第二主成分红点(2…...
多层感知机——MLP
源代码在此处:https://github.com/wepe/MachineLearning/tree/master/DeepLearning Tutorials/mlp 一、多层感知机(MLP)原理简介 多层感知机(MLP,Multilayer Perceptron)也叫人工神经网络(ANN&…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...
如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...
【LeetCode】算法详解#6 ---除自身以外数组的乘积
1.题目介绍 给定一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O…...
vue3 daterange正则踩坑
<el-form-item label"空置时间" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"开始日期" end-placeholder"结束日期" clearable :editable"fal…...
AxureRP-Pro-Beta-Setup_114413.exe (6.0.0.2887)
Name:3ddown Serial:FiCGEezgdGoYILo8U/2MFyCWj0jZoJc/sziRRj2/ENvtEq7w1RH97k5MWctqVHA 注册用户名:Axure 序列号:8t3Yk/zu4cX601/seX6wBZgYRVj/lkC2PICCdO4sFKCCLx8mcCnccoylVb40lP...
