前言

本来有好多篇博文想写的,但是目前在做的是这款战棋游戏的开发,所以其他版块只能先咕咕咕了。或者有关注的小伙伴们可以留言希望下一个更新的版块是啥子?postgresql数据库底层原理?网络编程?计算机网络?redis底层原理?Nginx底层原理?Django的各种模块运用?

写这篇博文的原因还有一个是因为百度了一下,全网居然只有一个战棋开发的博文,这让想要学习的我很是苦恼,为了以后广大兴趣战棋开发爱好者有更多的资料可以借鉴,就萌生了这个版块的想法。

正文

战棋游戏首先第一件事就是要有个地图。

第一个想法很简单,就是一个二维的数组。但是制作起来才发现比想象中困难。

遇到的第一个困难就是,如何将二维数组铺在屏幕上。肯定会有小伙伴说很简单呀,遍历数组就好了。

实际上,pygame一次只能布置一个图片在屏幕上,如果只是单纯遍历数组,以数组下标作为布置图片的x,y坐标的话,你会发现,所有的格子都会叠在一起。因为格子的像素远大于1(我是使用宽高32像素的格子图案)

因此每次布置格子的时候,需要用数组下标*像素大小才能铺满整个屏幕。做出来的地图类会像是这样

class Map:def __init__(self):self.map_width,self.map_height = 960, 640self.block = 32self.real_width,self.real_height = self.map_width//self.block, self.map_height//self.blockself.empty_map = [[0 for i in range(self.real_width)] for j in range(self.real_height)]def create(self,screen,b):for i in range(self.real_height):for j in range(self.real_width):screen.blit(b.block, (j*self.block, i*self.block))

这个地图类目前包含两个方法:一个是地图初始化方法,另一个是地图铺满屏幕方法。


我们先来看看初始化方法:

self.map_width,self.map_height = 960, 640
self.block = 32
self.real_width,self.real_height = self.map_width//self.block, self.map_height//self.block
self.empty_map = [[0 for i in range(self.real_width)] for j in range(self.real_height)]

主要有四步:

  1. 设置地图大小
  2. 设置格子大小(这步可以在格子类中设置)
  3. 设置二维数组的下标(用地图宽高/格子宽高)
  4. 初始化二维数组

在第四步初始化二维数组的时候,我一开始是使用下面这种方式初始化的

self.empty_map = [[0]*self.real_width]*self.real_height

一开始没有什么问题,直到改变二维数组某一个下标(x,y)值的时候,整列([:][y])都变成了那个值,推测用这种[0]*num方法创建的数组,每次修改任意下标的值,都会重新生成整个数组。


接着是地图铺满屏幕方法

首先传入两个参数,一个是screen,另一个是b

screen是pygames的场景类,布置精灵都需要它

b是格子类,下面我们看一下格子类

class Block:def __init__(self):self.block = pygame.image.load('images/green.png')

这是最初始的格子类,只有一个加载图片的功能,后面我们会逐步开发格子类的其他功能。

接着就是循环遍历地图数组,为每个下标渲染格子。因为一开始数组都为0,所以只需要加载背景格子就可以了。


场景布置好之后我们就要开始渲染场景了,渲染函数如下:

def main():pygame.init()clock = pygame.time.Clock()             # 设置时钟clock.tick(10)                      # 每秒执行60次m = Map()b = Block()screen = pygame.display.set_mode((m.width,m.height))  # 显示窗口color = (255,255,0)screen.fill(color)while True:# 轮询事件for event in pygame.event.get():if event.type == pygame.QUIT:   # 如果检测到事件是关闭窗口sys.exit()else:m.create(screen,b)pygame.display.update()pygame.quit()

渲染函数主要有以下几个要点

  • pygame初始化,必须的
pygame.init()
  • 时钟设置,一秒钟刷新60次地图
clock = pygame.time.Clock()             # 设置时钟
clock.tick(10)                      # 每秒执行60次
  • 死循环渲染地图
m.create(screen,b)
pygame.display.update()

运行之后效果如下:

说好的格子呢???黑人问号,一脸懵逼。

遇到的第二个问题就是边框问题

原来是因为选择了纯色的格子,无缝铺满之后,看起来就像是设置了背景色一般。这明显不满足我们想要的风格呀。怎么办呢?加边框。


加边框有两种方法,一种直接找一张带边框的图片或者找一种给图片加边框的方法(可惜找了好久没找到),另一种就是用程式加边框。

现在我们修改地图类的地图铺满屏幕方法,添加边框。同时我们添加一个函数用来返回地图大小,这样就不需要每次手动设置窗口大小了

class Map:def __init__(self):self.map_width,self.map_height = 960, 640self.block = 32self.real_width,self.real_height = self.map_width//self.block, self.map_height//self.blockself.empty_map = [[0 for i in range(self.real_width)] for j in range(self.real_height)]@propertydef map_size(self):return (self.map_width,self.map_height)def create(self,screen,b):for i in range(self.real_height):screen.blit(b.block, (j*self.block, i*self.block))pygame.draw.line(screen, (0,0,0), (j*self.block,0), (j*self.block,self.map_height), 1)pygame.draw.line(screen, (0,0,0), (0,i*self.block), (self.map_width,i*self.block), 1)

修改后运行效果如下:


总结

目前完成了基本的地图制作,但是正常来说一个战棋游戏的地图最少要包含各式各样的棋子,但是考虑到功能的分类,就划分到下一篇推文的内容中。

对于地图的制作其实还有很多问题,每次循环都需要重新刷新地图,这样对电脑的消耗会不会很大?如果地图的大小超过屏幕的大小,应该怎么处理?每次刷新地图,其实都是在原有地图的基础上重新铺满一层,等程序运行时间增长,地图就会越铺越多,最后可能会造成内存溢出问题。

但是目前暂时还没有的解决这些问题,打算先把基本的功能都做出来,然后再回头补充。感兴趣的小伙伴可以私聊或者评论我,我们一起交流一下呀。

pygame战棋游戏制作之战棋地图绘制(一)相关推荐

  1. pygame战棋游戏制作之战棋回合切换(五)

    简介 前面我们已经完成了战棋地图的绘制,棋子的设置,光标的设置,接下来我们将要开始实现rpg游戏的灵魂--回合切换. 正文 回合切换主要是通过棋子列表判断,当列表为空时,触发回合切换的函数.因此我们创 ...

  2. pygame战棋游戏制作之战棋光标设置上(三)

    简介 上一篇博文中,我们已经将棋子部署到地图上了,但是还远远不够,我们需要对棋子进行更多的操作. 玩过战棋游戏的小伙伴们应该都清楚,操作棋子有两种方式,一种是用鼠标控制,一种是用键盘控制,本次我们讲解 ...

  3. pygame战棋游戏制作之战棋棋子设置(二)

    简介 在上一篇推文中,我们成功地将地图绘制出来,但是只有一个网格,十分单调,战棋游戏肯定是要有棋子的. 这一篇主要讲解棋子是如何设置的. 正文 棋子本质就是地图二维数组中的一个下标对应的值.在上一篇地 ...

  4. python 战棋游戏代码实现(2):六边形地图寻路和显示

    python 战棋游戏代码实现(2):六边形地图寻路和显示 六边形地图介绍 代码介绍 地图六边形显示 A*算法的六边形寻路修改 判断某个点在哪个六边形中 完整代码 编译运行 六边形地图介绍 之前的文章 ...

  5. HTML5 canvas 实现回合制战棋游戏(1):加载和绘制图形

    HTML5 canvas 实现回合制战棋游戏(1):加载和绘制图形 游戏介绍 完整代码 代码目录 游戏运行 HTML5 canvas 绘制图形 canvas 介绍 绘制函数 加载图片 生物行走动画绘制 ...

  6. 暗棋单机版_中国暗棋游戏下载-中国暗棋下载v1.0.0 安卓版-单机手游网

    中国暗棋游戏去棋牌类象棋手游,游戏玩法是将象棋到放,然后不断的反面获得游戏的进程,玩法市面简单方便可以和线上线下朋友一起玩耍哦!小编也给你们带来了中国暗棋手游下载地址!此版本为安卓最新完整版,感兴趣的 ...

  7. python井字棋游戏人机对战_用Python做一个井字棋小游戏

    井字棋是一个经典的小游戏,在九宫格上玩家轮流画OXO,当每列或每行或是两个对角成一线时便是获胜. 今天就用Python编写一个井字棋小游戏,与电脑对战. 程序执行画面如下图所示: 程序提供了两种人工智 ...

  8. 三子棋游戏(支持多子棋)

    目录 前言 一.创建三子棋的思路过程? 二.游戏模块 1.棋盘初始化 2.开始下棋 3.判断输赢 三.测试模块 四.源码 总结 前言 用c语言实现一个三子棋的游戏,当然也可以实现多子棋,修改一点参数即 ...

  9. 计算机爱恩斯坦棋游戏,爱恩斯坦棋计算机博弈系统的研究与实现

    爱恩斯坦棋计算机博弈系统的研究与实现 [摘要]:计算机博弈,也称机器博弈,是一个极具挑战与发展前景的计算机研究领域,其作为人工智能领域一个极其重要的课题,素有人工智能领域"果蝇"之 ...

最新文章

  1. leetcode:Plus One
  2. ubuntu 无法进入startx_Ubuntu无法进入图形化界面(报错/dev/sda1:clean的解决)
  3. php ftp 创建文件夹失败,phpftp上传多个文件时失败
  4. leetcode98. 验证二叉搜索树
  5. python安装不了jupyter_python学习笔记——Windowns下Python3之安装jupyter
  6. 算法一看就懂之「 堆栈 」
  7. EfficientPS:目前排名第一的高效高精度全景分割算法
  8. python策略模式包含角色_Python 之策略模式
  9. 小米3g刷高格固件_今天小米路由器3G到手就刷 老毛子 固件。
  10. manual 离线手册 韩顺平php_传智播客韩顺平php视频教程(400集全)
  11. Python个人总结(基础+进阶)
  12. DB2用户授权表查询权限
  13. 能够可视化访问和查看H2数据库的工具
  14. linux网络引流工具,gor 引流快速入门
  15. 推荐专业IT电子书下载网站-https://itbook.download/
  16. P4593 [TJOI2018]教科书般的亵渎(拉格朗日插值 + k幂次之和)
  17. db2与mysql编目_关于DB2相同的数据库编目问题
  18. TinyMCE富文本更改默认文字字号、字体
  19. 什么是高防服务器?服务器被攻击了怎么办?
  20. 计算机管理员永久访问权限,win7系统账户怎样永久获取管理员权限?

热门文章

  1. 【原创】赋值法写基础解系中解向量
  2. Fastadmin后台列表外显示额外数据
  3. 防拷贝加密U盘的功能有些
  4. 你不可不知的《哈利波特》秘密(三)
  5. 电脑磁盘右键没有新建文件夹???
  6. Flashed Ball
  7. lammps案例:分子自由落体运动模拟
  8. 计算机无法启动安装程序,win7电脑无法安装程序或安装的程序不能运行怎么办...
  9. win10安装PyPESQ库
  10. 动态规划系列(4)——不相邻数最大和