用python可以编写一款游戏模拟器么?
python 项目:DIY 街机游戏
这个练习是一个小游戏程序,如果要是给它起个名字的话,应该叫:快躲,香蕉。 主要的游戏内容就是,游戏开始会从屏幕上方不断随便的掉一些铁块,在屏幕下 方有一个小香蕉是受你控制的,你需要不断的左右移动来躲避铁块。在你躲避完 一定数量的铁块之后,就会进入下一关。下一关依然是让你躲铁块,不过铁块下 降的速度就快了很多。在游戏中你可以按下任意键暂停,再次按则继续,按下 ESC 键退出。这就是全部的功能了,下面大家来看游戏的实现。
首先对所有代码分类:
1、整体上代码有一个配置模块,来对游戏的速度、屏幕 的宽度、香蕉移动速度、字体大小、各个物体的图片等进行配置。
2、然后是有 一个元素模块,即游戏中的两个元素落下来的铁块以及被砸的香蕉,其中还要包 含他们具有的行为。
3、然后还有游戏中的各种状态模块,状态模块中的类继承 关系稍微多一些,处于家谱最上方的就是 state 类,由它来衍生其他的所有状态, 它的直接子类是 Level 和 Pause,其中 Pause 有衍生出子类 Info、levelCleared、 GameOver、StartUp。
4、最后就是游戏的主模块,用来让其他模块协调工作 的。
然后再来看一个整体图:
有了上面整体的认识,下面就要细揪一下了。偶自己看代码的方法是这样的,首先整体分析,然后在从程序的入口点开始分析。偶估计大多数人也是这么做的。
首先是 squish.py 文件中的 game 类:
class Game:
def init (self,*args):
path = os.path.abspath(args[0])
dir = os.path.split(path)[0]
os.chdir(dir)
self.state = None
self.nextState = StartUp()
def run(self):
pygame.init()
flag = 0
if config.full_screen:
flag = FULLSCREEN
screen_size = config.screen_size
screen = pygame.display.set_mode(screen_size,flag)
pygame.display.set_caption(‘Fruit Self Defense’)
pygame.mouse.set_visible(False)
while True:
if self.state != self.nextState:
self.state = self.nextState
self.state.firstDisplay(screen)
for event in pygame.event.get():
self.state.handle(event)
self.state.update(self)
self.state.display(screen)
if name == ‘ main ‘:
game = Game(*sys.argv)
game.run()
忽略掉 init 中的设置代码,在 run 中,该管理类首先调用 pygame 初始化并启动游戏界面,然后在一个 whileTrue 的死循环中不断的进行状态判断,事件处理,然后根据事件更新当前状态,并且绘制界面。
让大家把焦点放在那个死循环中,因为他就是整个程序的流程所在。 其中状态和事件的关系就是,当发生某一事件之后,状态就会发生变化,比如点击事件、过关事件、死亡事件。这些事件的来源分别是:用户操作、系统判断、系统判断。要继续深入分析就需要再拿一部分代码出来。
依然是来自 squish.py 文件中剩余的所有代码:
import os, sys, pygame
from pygame.locals import *
import objects, config
class State:
def handle(self,event):
if event.type == QUIT:
sys.exit()
if event.type == KEYDOWN and event.key == K_ESCAPE:
sys.exit()
def firstDisplay(self, screen):
screen.fill(config.background_color)
pygame.display.flip()
def display(self, screen):
pass
class Level(State):
def init (self,number=1):
self.number = number
self.remaining = config.weights_per_level
speed = config.drop_speed
speed += (self.number – 1) * config.speed_increase
self.weight = objects.Weight(speed)
self.banana = objects.Banana()
both = self.weight,self.banana
self.sprites = pygame.sprite.RenderUpdates(both)
def update(self, game):
self.sprites.update()
if self.banana.touches(self.weight):
game.nextState = GameOver()
elif self.weight.landed:
self.weight.reset()
self.remaining -= 1
if self.remaining == 0:
game.nextState = LevelCleared(self.number)
def display(self, screen):
screen.fill(config.background_color)
updates = self.sprites.draw(screen)
pygame.display.update(updates)
class Paused(State ):
finished = 0
image = None
text = ”
def handle(self, event):
State.handle(self, event)
if event.type in [MOUSEBUTTONDOWN,KEYDOWN]:
self.finished = 1
def update(self, game):
if self.finished:
game.nextState = self.nextState()
def firstDisplay(self, screen):
screen.fill(config.background_color)
font = pygame.font.Font(None, config.font_size)
lines = self.text.strip().splitlines()
height = len(lines) * font.get_linesize()
center,top = screen.get_rect().center
top -= height // 2
if self.image:
image = pygame.image.load(self.image).convert()
r = image.get_rect()
top += r.height // 2
r.midbottom = center, top -20
screen.blit(image, r)
antialias = 1
black = 0,0,0
for line in lines:
text = font.render(line.strip(),antialias,black)
r = text.get_rect()
r.midtop = center,top
screen.blit(text, r)
top += font.get_linesize()
pygame.display.flip()
class Info(Paused):
nextState = Level
text = ”’
In this game you are a banana,
trying to survive a course in
self-defense against fruit,where the
participants will ‘defend’ themselves
against you with a 16 ton weight.”’
class StartUp(Paused):
nextState = Info
image = config.splash_image
text = ”’
Welcome to Squish.
the game of Fruit Self-Defense”’
class LevelCleared(Paused):
def init (self, number):
self.number = number
self.text = ”’Level %i cleared
Click to start next level”’ % self.number
def nextState(self):
return Level(self.number + 1)
class GameOver(Paused):
nextState = Level
text = ”’
Game Over
Click to Restart, Esc to Quit”’
其中用户判断部分就是 Paused 类中的 update 方法和 handle 方法,而系统判断就是 Level 类中的 update 方法。还有一个要注意的地方就是 Level 类中update 方法中的第一行代码:self.sprites.update(),这是让铁块不断下落的关键代码。用户判断部分的代码已经有了,下面需要贴上系统判断时用到的代码.
objects.py 中的代码:
import pygame,config,os
from random import randrange
class SquishSprite(pygame.sprite.Sprite):
def init (self, image):
pygame.sprite.Sprite. init (self)
self.image = pygame.image.load(image).convert()
self.rect = self.image.get_rect()
screen = pygame.display.get_surface()
shrink = -config.margin*2
self.area = screen.get_rect().inflate(shrink,shrink)
class Weight(SquishSprite):
def init (self, speed):
SquishSprite. init (self,config.weight_image)
self.speed = speed
self.reset()
def reset(self):
x = randrange(self.area.left, self.area.right)
self.rect.midbottom = x, 0
def update(self):
self.rect.top += self.speed
self.landed = self.rect.top >= self.area.bottom
class Banana(SquishSprite):
def init (self):
SquishSprite. init (self, config.banana_image)
self.rect.bottom = self.area.bottom
self.pad_top = config.banana_pad_top
self.pad_side = config.banana_pad_side
def update(self):
self.rect.centerx = pygame.mouse.get_pos()[0]
self.rect = self.rect.clamp(self.area)
def touches(self, other):
bounds = self.rect.inflate(-self.pad_side,-self.pad_top)
bounds.bottom = self.rect.bottom
return bounds.colliderect(other.rect)
在类 Banana 和 Weight 中的 update 和 touches 方法,用于进行系统判断。好了,到这主要的东西都分析完了,剩下的只需要稍看一下就能够懂得了。 最后还有一个配置模块的代码 config.py:banana_image = ‘banana.png’weight_image = ‘weight.png’splash_image = ‘weight.png’screen_size = 800,600background_color = 255,255,255margin = 30full_screen = 1font_size = 48drop_speed = 1banana_speed = 10speed_increase = 1weights_per_level = 10banana_pad_top = 40banana_pad_side = 20
到此为止,《python 基础教程》中的十个项目都已经分析了一遍,下一步要做的就是做几个实用软件出来,然后把 python 再好好深入研究下。
应晓勇要求,上几个运行图:
有哪些模拟类游戏比较好玩?
模拟游戏堪称杀时间神器,沈迷时不玩个三天三夜不会过瘾啊,因为在游戏的主题下你想做任何事都可以。试试在《模拟飞行》中开着飞机降落在启德机场上 (当然要摔得很惨),或者在《模拟市民》中过过看围栏内的美国梦生活!要讲还真的讲不完!
1、《模拟城市》系列
开发商:Maxis 如果你喜欢都市计划和建筑类型的游戏,那《模拟城市》一定可以让你玩得很爽。这款游戏就像是《模拟市民》,但模拟的不是角色的一生,而是要自己打造一个城市。想要写实的玩还是天马行空 (尤其是要用天灾来袭的功能) 的玩都可以!
2、《大都会》系列
开发商:Colossal Order 对于那些厌倦了《模拟城市》还有自大的 Maxis 制作团队的玩家而言,《大都会:天际》是他们的最佳选择。跟《模拟城市》一样,玩家必需处理各种大都市的问题,从教育到交通都不能漏掉。
3、《总统万岁》
开发商:Haemimont Games 总统万岁!带领你刚成立的小岛国发展成你想要的样子。要当美国或苏联的同盟国,还是要像南斯拉夫一样走自己的路线都可以。从冷战时代到未来所面对的重重危机都一一击破吧!
4、《航海新世纪1701》
开发商:Blue Byte 在这个游戏中,你的任务是在新世界里发展你的领地,最终完成殖民地霸业。一开始你只有小港口和有限的资源,同时要面对庞大的竞争。你可以跟这些AI控制的敌人合作,或者是被他们击垮。
5、《模拟实况主》
开发商:U-Play Online 《模拟实况主》这款游戏,嗯,内容完全就如游戏名称一样,就是模拟实况主如何变成网红的过程。随着每次硬件/软件技能的升级,你的人气也会越来越高,追踪人数也会越来越多…。此外,这款游戏还有其他的附加仿真功能,让你可以去跑趴也可以跟朋友一起去看电影!
6、《云霄飞车之星》
开发商: Frontier Developments 来体验建造云霄飞车的快感吧!游戏设定在有精美3D图像的翠绿主题乐园里,你可以打造属于自己的迪斯尼乐园,当然要在里面建造云霄飞车还有一堆游乐设施来让虚拟的游客玩耍。
你玩过最好玩的网络游戏是什么?
1.天涯明月刀
《天涯明月刀》是腾讯北极光工作室自主研发的一款武侠题材的3D大型多人在线角色扮演电脑客户端游戏,该游戏改编自古龙先生的小说《天涯明月刀》,游戏之中为大家展现了非比寻常的国风,已经令人向往的江湖武林。
游戏之中分别有太白,神威,唐门,天香,五毒,神刀,移花,真武等门派,并称八荒弟子,每个门派都有着不同的玩法,游戏之中的画面非常的精美,虽然是一款网游,但是在壮观的画面上丝毫不输给其他游戏,开封宏伟壮丽的黄河美景,巴蜀高山一览而下的阵阵白云。
而游戏之中的建模也是非常精美的,完美将中国女侠英姿飒爽的气质体现得淋漓尽致,游戏中的PVP玩法和有趣的PVE玩法更是吸引了不少玩家们前来游玩,不过萌新在加入游戏的时候,一定要注意一点,进团的时候要说出偶是老手这句话,不过在打副本之前,一定要去看一看攻略,不要真的等着别人去教,除非你有一个好的师傅!
2.九阴真经
《九阴真经》是蜗牛公司开发的一款大型mmoRPG网游,游戏以中国武侠文化为背景,表现出中国武侠的核心元素:内外兼修的神奇武功、秀美壮观的古代山河、有情有义的江湖外传、正邪英雄的武林争霸,荣获“度CGWR中国游戏排行榜年度国产网游精品奖。
最高效果下的《九阴真经》着实美轮美奂游戏人物的服饰无论是纹理细节还是配饰造型都非常出色。游戏整体高效画面在保持相当的镜头距离下,给人一种视觉上面的冲击感,而且游戏之中的轻功系统更是让人眼前一亮。
3.剑网3
《剑侠情缘网络版叁》(简称《剑网3》)是由金山软件西山居开发,金山运营的3D武侠角色扮演电脑客户端游戏,展现给玩家一个气势恢弘、壮丽华美的大唐世界。同时,《剑网3》通过物理引擎打造的ACT新轻功玩法,为玩家带来新的游戏体验。
《剑网3》的角色DIY系统实现了特效动画向骨骼动画的跨越升级,在个性化诠释东方唯美风格的同时大幅提升面部精度,让侠士的每一根睫毛纤毫毕现。该系统采用虚拟面部骨骼技术,这个特点被不少捏脸大佬们所关注,在游戏之中建造出了各种各样精致的脸模。
《剑网3》的品质跟它的期望值是成正比的,各个方面都具有独特的中国古典武侠特色,操作上手非常容易,并且非常符合大陆玩家的操作习惯,可以说是国内自主研发网游中的成功之作。
4.梦幻西游
《梦幻西游》的制作公司可以说非常知名了,作为目前国内知名厂商,网易制作出来的游戏可以说是深受玩家们的喜欢了,而梦幻西游可以说是网易最为经典的一个网游了,《梦幻西游》拥有注册用户超过3.1亿,一共开设收费服务器达472组,最高同时在线人数达271万,是当时中国大陆同时在线人数最高的网络游戏。
以网易充值一卡通的方式支付游戏费用,收费方式以点计算进行,每小时6点(1点=0.1元),每10分钟计算一次,计算时间精确到秒,很多人当时没有玩这款游戏的主要原因还是因为年纪小,对于这种点卡付费的游戏很难以支付,而且当时不像现在一样充值那么方便,还要专门的去买点卡。
而且现在梦幻西游这款游戏可以说里面都是土豪级别的人物了,随便一个装备能卖出几十万上下都是不成问题的!
有哪些好用的代码编辑器值得推荐?
从事十几年,涉及到的编程语言差不多有十几种,但真正常用的差不多三种,C/C++ java三种编程语言,不同的编程语言可能涉及使用的编辑器也会有所差异,其实编辑器的好坏主要是个人习惯问题,以及接触的第一门编程语言有很大的关系,毕竟在第一门编程语言留给自己第一印象最深刻,现在就把自己经历过的编程语言编辑器在这作为过来人在这总结下。
1.linux vim
主要在学习C语言的时候,安装linux系统学习的,在使用之前看到很多书上讲linux 多么神圣,结果在第一次安装linux就把windows系统盘给破坏掉了,第一次印象非常的不美好,既然已经坏了就索性搞到低,最后安装成功发现在vim下编辑东西太费劲了,后来坚持去学习一些常见的用法使用起来也是非常快,主要是快捷键用熟练了效率会提升很多。
前前后后用了差不多十几年了,除非特别复杂的代码修改可能会借助IDE工具调试一下,正常都会在vim下开发,主要进行字符串的查找和替换非常方便。
2.sourceInsight
基本上开发C/C++都会用到这个编辑器,安装包非常小,但查看代码并且看代码的关联非常方便,这款编辑器的神奇之处在于这么复杂的功能,安装包这么小,并且版本迭代非常少,几乎是基本功能一次性到位,这算是软件编辑器里面的一个奇葩。
从事C++开发,开发文件数目比较多的工具使用的比较多,最喜欢还是里面代码调用关联,容易很短时间内梳理清楚一个非常复杂的功能模块。
3.Eclispe
开发java必备软件,虽然里面很多人切换到新的IDE,但还是舍不得切换,有个不知道是优点还是缺点,一旦使用习惯一个编辑器再想切换觉得特别别扭,除非必须项目强制需要,对于工具的使用首先要习惯的是快捷键,工具效率的提升主要体现在工具快捷键上。
几乎是一款专门为java打造的IDE,从代码的编写检查错误上体现了非常多的,可定制插件方便功能扩展,开发自由免费,重要的很有很大大公司鼎力支持,但也有一些不太好的地方,用的时间长了容易卡死就是假死状态,有时候版本更新太快了导致有很多不兼容的地方,但对于开发java而言没有毛病。
常见的编辑器还是多少也会接触一些,UltraEdit这个倒也经常用,主要UltraEdit有个SourceInsight比不了的功能可以竖行选择代码,这点对于编辑代码以及整理字符串非常有用。
这些都是编程过程中经常使用的,每个人喜欢什么样子的编辑器,和自身的条件以及习惯都有很大的关系,主要和编程语言息息相关。
希望能够帮到你。