精华内容
下载资源
问答
  • python能开发游戏

    千次阅读 2020-06-18 18:38:24
    python可以游戏,但不适合。下面我们来分析一下具体原因。 用锤子能造汽车吗? 谁也没法说不能吧?历史上也确实曾经有些汽车,是用锤子造出来的。但一般来说,还是用工业机器人更合适对吗? 比较大型的,...

    python能开发游戏吗

    更多python视频教程请到菜鸟教程https://www.piaodoo.com/

    python可以写游戏,但不适合。下面我们来分析一下具体原因。

    用锤子能造汽车吗? 谁也没法说不能吧?历史上也确实曾经有些汽车,是用锤子造出来的。但一般来说,还是用工业机器人更合适对吗?

    比较大型的,使用Python的游戏有两个,一个是《EVE》,还有一个是《文明》。但这仅仅是个例,没有广泛意义。
    一般来说,用来做游戏的语言,有两种。一是C++。。一是C#。。

    Python理论上,不仅不适合做游戏,而是只要大型的程序,都不适合。只适合写比较小型的东西,比如一个计算器,一个爬虫等。

    主要有2个方面,一是速度慢,二是语法缺陷。

    也许你一定觉得,Python的语法又干净,又优雅,怎么还有缺陷?但仔细想想,为什么别的语言没有这么干净?没有这么优雅?明明可以直接a=123 干嘛非要写成 int a=123;呢?难道是其他语言的设计者,都有强迫症吗?道理很简单,有得必有失。
    如果数据类型,只有字符串和数字,省略掉声明变量的过程,当然不是问题。但只要逻辑一复杂,情况就完全不同了。。。游戏中,你用C#或C++写起来,大概会是这样。

    技能 a=xxxx;
    武器 b=xxxx;
    角色 c=xxxx;
    药水 d=xxxx;
    音乐 e=xxxx;

    而Python呢?大概是这个样子

    a=xxxx
    b=xxxx
    c=xxxx
    d=xxxx

    如果你的代码很少,显然是Python比较方便。但如果你创建几百个对象,代码超过1万行。。。写到几千行的时候,遇到一个叫x的对象,你还知道它到底是个啥吗?是一把武器?还是一瓶药水?还是一张图片?一段音频?一盏灯光?一座房子?
    不要以为1万行代码很多。。。。1万行连个《斗地主》都写不完。。

    用Python写大程序的感觉就是,当你第一天,只写了50行代码,创建了3个类,5个对象。你会觉得太爽了,这绝对是世界上最好的语言。。。第二天,你又创建了2个类,5个对象的时候,就觉得有点晕晕的了。第三天,又创建了2个类之后,你会发现自己必须非常仔细的看一遍注释,否则就不会写了。第四天,你一整天都在看注释。。。。

    这就是动态语言的劣根性。一开始代码量少,看不出任何缺点,各种省事,各种爽。代码量越多,脑子越乱。一般500行以上,效率就会被JAVA,C#之类的语言反超。。1000行,就必须要各种加注释才能看懂了。。2000行,注释就比代码多了。。5000行,注释已经完全不管用了,自己根本看不懂自己的代码,需要准备弃坑了。

    总结一下,python不是不能开发游戏,只是并不合适。每种语言都有各自的优缺点,开发游戏这一块或许就是python的缺点吧。

    python游戏实例补充:

    发牌游戏

    1. 游戏介绍

    四名牌手打牌,电脑随机將52张牌(不合大、小王)发给四名牌手,并在屏幕上显示每位牌手的牌。

    2. 面向对象程序设计

    3. 程序设计步骤

    设计类,发牌程序设计出三个类: Card类、Hand类和Poke类。

    Card类:Card类代表一张牌,其中,FaceNum字段指的是牌面数字1~13,Suit字段指的是花色,”梅”为梅花,”方”为方块,”红”为红桃,”黑”为黑桃。

    Hand类:Hand类代表手牌(一个玩家手里拿的牌),可以认为是一位牌手手里的牌,其中,cards列表变量存储牌手手中的牌。可以增加牌、清空手里的牌、把一张牌给别的牌手等操作。

    Poke类:Poke类代表一副牌,我们可以将一副牌看作是有52张牌的牌手,所以继承Hand类。由于其中cards列表变量要存储52张牌,而且要进行发牌、洗牌操作,所以增加如下的方法。

    主程序:主程序比较简单,因为有四个牌手,所以生成players列表存储初始化的四位牌手。生成一副牌的对象实例poke1,调用populate()方法生成有52张牌的一副牌,调用huffle()方法洗牌打乱顺序,调用deal(players,13)方法分别给每位玩家发13张牌,最后示四位牌手所有的牌。

    class Card():
     """ A playing card. """
     RANKS=["A","2","3","4","5","6","7","8","9","10","J","Q","K"] #牌面数字1-13
     SUITS=["梅","方","红","黑"]
    #梅为梅花,方为方钻,红为红心,黑为黑桃
    

    def init(self,rank,suit,face_up=True):
    self.rank=rank #指的是牌面数字1-13
    self.suit=suit #suit指的是花色
    self.is_face_up=face_up #是否显示牌正面,True为正面,False为牌背面

    def str(self): #print()
    if self.is_face_up:
    rep=self.suit+self.rank #+" "+str(self.pic_order())
    else:
    rep=“XX”
    return rep

    def flip(self): #翻牌方法
    self.is_face_up=not self.is_face_up

    def pic_order(self): #牌的顺序号
    if self.rank==“A”:
    FaceNum=1
    elif self.rank==“J”:
    FaceNum=11
    elif self.rank==“Q”:
    FaceNum=12
    elif self.rank==“K”:
    FaceNum=13
    else:
    FaceNum=int(self.rank)
    if self.suit==“梅”:
    Suit=1
    elif self.suit==“方”:
    Suit=2
    elif self.suit==“红”:
    Suit=3
    else:
    Suit=4
    return (Suit-1)*13+FaceNum
    class Hand( ):
    “”" A hand of playing cards. “”"
    def init(self):
    self.cards=[]
    def str(self):
    if self.cards:
    rep=""
    for card in self.cards:
    rep+=str(card)+"\t"
    else:
    rep=“无牌”
    return rep
    def clear(self):
    self.cards=[]
    def add(self,card):
    self.cards.append(card)
    def give(self,card,other_hand):
    self.cards.remove(card)
    other_hand.add(card)
    class Poke(Hand):
    “”" A deck of playing cards. “”"
    def populate(self): #生成一副牌
    for suit in Card.SUITS:
    for rank in Card.RANKS:
    self.add(Card(rank,suit))
    def shuffle(self): #洗牌
    import random
    random.shuffle(self.cards) #打乱牌的顺序
    def deal(self,hands,per_hand=13):
    for rounds in range(per_hand):
    for hand in hands:

    top_card=self.cards[0]
    self.cards.remove(top_card)
    hand.add(top_card)
    

    if name==“main”:
    print(“This is a module with classed for playing cards.”)
    #四个玩家
    players=[Hand(),Hand(),Hand(),Hand()]
    poke1=Poke()
    poke1.populate() #生成一副牌
    poke1.shuffle() #洗牌
    poke1.deal(players,13) #发给玩家每人13张
    #显示四位牌手的牌
    n=1
    for hand in players:
    print(“牌手”,n,end="😊
    print(hand)
    n=n+1
    input("\nPress the enter key to exit.")

    到此这篇关于python能开发游戏吗的文章就介绍到这了,更多相关python能写游戏吗内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多

    茂名论坛https://www.hnthzk.com/

    化州橘红http://www.sfkyty.com/

    茂名论坛http://www.nrso.net/

    源码搜藏网http://www.cntkd.net/

    展开全文
  • 这里介绍一个python开发游戏的库(平台)—pygame,pygame是python的一个跨平台模块,专门为设计电子游戏而开发,建立在SDL基础上,允许开发者快速的开发出自己的游戏而又不被低级语言束缚,下面我介绍一下这个库的...

    转自:https://www.wukong.com/answer/6583841084365865224/?iid=39055545733&app=news_article&share_ansid=6583841084365865224&app_id=13&tt_from=mobile_qq&utm_source=mobile_qq&utm_medium=toutiao_ios&utm_campaign=client_share

     

    这里介绍一个python开发游戏的库(平台)—pygame,pygame是python的一个跨平台模块,专门为设计电子游戏而开发,建立在SDL基础上,允许开发者快速的开发出自己的游戏而又不被低级语言束缚,下面我介绍一下这个库的安装和简单使用,实验环境win10,python版本为python3.6,主要内容如下:

    1.下载安装,这里直接在cmd窗口输入“pip install pygame”就行,如下:

    2.安装完成后,我们就可以测试一下官方自带的示例examples,这些例子在pygame的安装目录examples目录下边,如下:

    下面测试一下这些例子,直接cmd窗口输入“pip -m pygame.examples.游戏脚本名”就行,程序就会正常启动,如下:

    • 测试一下aliens.py外星人这个小例子,测试命令如下:

    程序运行截图如下:

    • 测试一下3d立方图,也就是glcude.py这个脚本,不过这里需要先安装opengl,之后测试脚本才能正常运行,如下:

    程序运行截图如下:

    • 测试一下liquid.py这个脚本,是一个波动的“liquid pygame”,测试命令如下:

    程序运行截图如下:

    官方还提供了许多小的游戏工程,可以供初学者深入学习和使用,有源码可以拿来学习,地址https://www.pygame.org/tags/all,如下:

    至此,就介绍完了pygame的安装和简单测试。总的来说,pygame使用起来挺方便的,写个小游戏自己玩玩是可以的,简单方便,至于大型游戏,还是用c++这些语言比较好,感兴趣的可以了解一下pygame,网上也有相关教程,希望以上分享的内容能对你有所帮助吧。

    展开全文
  • Python开发一个滑雪小游戏

    万次阅读 多人点赞 2021-06-09 14:27:01
    Python开发小游戏

    大家好,我是Lex 喜欢欺负超人那个Lex

    擅长领域:Python开发一个小游戏

    今日重点:一步步分析and越过亚马逊的反爬虫机制

     不一会,游戏写好了

    效果是这样的

    一、如何搭建开发环境环境

    一起来学pygame吧 游戏开发30例(开篇词)——环境搭建+游戏效果展示

    windows系统,python3.6+  pip21+

    安装游戏依赖模块
    
    pip install pygame

    二、完整开发流程

    1、代码结构

    首先,先整理一下项目的主结构,其实看一下主结构,基本就清晰了

    modules:自己定义的模块
    ——game.py:主程序
    
    res:存放引用到的图片和音频等等
    ——music: 音频 资源
    ——imgs: 图片 资源
    ——fonts: 字体
    
    cfg.py:为主配置文件
    
    skiing.py:主程序文件
    
    requirements.txt:需要引入的python依赖包

    2、详细配置

    cfg.py

    配置文件中,需要引入os模块,并且配置打开游戏的屏幕大小。将我们需要用到的图片、音频和字体文件全部引入到项目中。

    '''配置文件'''
    import os
    
    
    '''FPS'''
    FPS = 40
    '''游戏屏幕大小'''
    SCREENSIZE = (640, 640)
    '''图片路径'''
    SKIER_IMAGE_PATHS = [
        os.path.join(os.getcwd(), 'res/imgs/game_forward.png'),
        os.path.join(os.getcwd(), 'res/imgs/game_right1.png'),
        os.path.join(os.getcwd(), 'res/imgs/game_right2.png'),
        os.path.join(os.getcwd(), 'res/imgs/game_left2.png'),
        os.path.join(os.getcwd(), 'res/imgs/game_left1.png'),
        os.path.join(os.getcwd(), 'res/imgs/game_fall.png')
    ]
    OBSTACLE_PATHS = {
        'tree': os.path.join(os.getcwd(), 'res/imgs/tree.png'),
        'flag': os.path.join(os.getcwd(), 'res/imgs/flag.png')
    }
    '''背景音乐路径'''
    BGMPATH = os.path.join(os.getcwd(), 'res/music/bgm.mp3')
    '''字体路径'''
    FONTPATH = os.path.join(os.getcwd(), 'res/font/FZSTK.TTF')

    3、动画中引用到的图片

    4、资源文件

    包括游戏背景音频、图片和字体设计

    res

    music:游戏背景音乐

    fonts:记分牌呀、显示呀的 相关字体

    imgs:游戏动画里的静态图片,所谓动画都是图片

    5、主程序

    skiing.py

    在主程序中,通过读取配置文件,引入项目资源:包括图片、音频等,并从我们的modules里引入所有我们的模块。

    ''' 类'''
    class lexGame():
        def __init__(self, screen, sounds, font, lex_imgs, cfg, **kwargs):
            self.info = 'Gemlex —— hacklex'
            self.screen = screen
            self.sounds = sounds
            self.font = font
            self.lex_imgs = lex_imgs
            self.cfg = cfg
            self.reset()
        '''开始 '''
        def start(self):
            clock = gamepy.time.Clock()
            # 遍历整个 界面更新位置
            overall_moving = True
            # 指定某些对象个体更新位置
            individual_moving = False
            # 定义一些必要的变量
            lex_selected_xy = None
            lex_selected_xy2 = None
            swap_again = False
            add_score = 0
            add_score_showtimes = 10
            time_pre = int(time.time())
            #  主循环
            while True:
                for event in gamepy.event.get():
                    if event.type == gamepy.QUIT or (event.type == gamepy.KEYUP and event.key == gamepy.K_ESCAPE):
                        gamepy.quit()
                        sys.exit()
                    elif event.type == gamepy.MOUSEBUTTONUP:
                        if (not overall_moving) and (not individual_moving) and (not add_score):
                            position = gamepy.mouse.get_pos()
                            if lex_selected_xy is None:
                                lex_selected_xy = self.checkSelected(position)
                            else:
                                lex_selected_xy2 = self.checkSelected(position)
                                if lex_selected_xy2:
                                    if self.swapGem(lex_selected_xy, lex_selected_xy2):
                                        individual_moving = True
                                        swap_again = False
                                    else:
                                        lex_selected_xy = None
                if overall_moving:
                    overall_moving = not self.dropGems(0, 0)
                    # 移动一次可能可以拼出多个3连块
                    if not overall_moving:
                        res_match = self.isMatch()
                        add_score = self.removeMatched(res_match)
                        if add_score > 0:
                            overall_moving = True
                if individual_moving:
                    lex1 = self.getGemByPos(*lex_selected_xy)
                    lex2 = self.getGemByPos(*lex_selected_xy2)
                    lex1.move()
                    lex2.move()
                    if lex1.fixed and lex2.fixed:
                        res_match = self.isMatch()
                        if res_match[0] == 0 and not swap_again:
                            swap_again = True
                            self.swapGem(lex_selected_xy, lex_selected_xy2)
                            self.sounds['mismatch'].play()
                        else:
                            add_score = self.removeMatched(res_match)
                            overall_moving = True
                            individual_moving = False
                            lex_selected_xy = None
                            lex_selected_xy2 = None
                self.screen.fill((154, 206, 235))
                self.drawGrids()
                self.lexs_group.draw(self.screen)
                if lex_selected_xy:
                    self.drawBlock(self.getGemByPos(*lex_selected_xy).rect)
                if add_score:
                    if add_score_showtimes == 10:
                        random.choice(self.sounds['match']).play()
                    self.drawAddScore(add_score)
                    add_score_showtimes -= 1
                    if add_score_showtimes < 1:
                        add_score_showtimes = 10
                        add_score = 0
                self.remaining_time -= (int(time.time()) - time_pre)
                time_pre = int(time.time())
                self.showRemainingTime()
                self.drawScore()
                if self.remaining_time <= 0:
                    return self.score
                gamepy.display.update()
                clock.tick(self.cfg.FPS)
    			
        '''初始化'''
        def reset(self):
            # 随机生成各个块
            while True:
                self.all_lexs = []
                self.lexs_group = gamepy.sprite.Group()
                for x in range(self.cfg.NUMGRID):
                    self.all_lexs.append([])
                    for y in range(self.cfg.NUMGRID):
                        lex = lexSprite(img_path=random.choice(self.lex_imgs), size=(self.cfg.GRIDSIZE, self.cfg.GRIDSIZE), position=[self.cfg.XMARGIN+x*self.cfg.GRIDSIZE, self.cfg.YMARGIN+y*self.cfg.GRIDSIZE-self.cfg.NUMGRID*self.cfg.GRIDSIZE], downlen=self.cfg.NUMGRID*self.cfg.GRIDSIZE)
                        self.all_lexs[x].append(lex)
                        self.lexs_group.add(lex)
                if self.isMatch()[0] == 0:
                    break
            # 得分
            self.score = 0
            # 拼出一个的奖励
            self.reward = 10
            # 时间
            self.remaining_time = 300
        '''显示剩余时间'''
        def showRemainingTime(self):
            remaining_time_render = self.font.render('CountDown: %ss' % str(self.remaining_time), 1, (85, 65, 0))
            rect = remaining_time_render.get_rect()
            rect.left, rect.top = (self.cfg.SCREENSIZE[0]-201, 6)
            self.screen.blit(remaining_time_render, rect)
        '''显示得分'''
        def drawScore(self):
            score_render = self.font.render('SCORE:'+str(self.score), 1, (85, 65, 0))
            rect = score_render.get_rect()
            rect.left, rect.top = (10, 6)
            self.screen.blit(score_render, rect)
        '''显示加分'''
        def drawAddScore(self, add_score):
            score_render = self.font.render('+'+str(add_score), 1, (255, 99, 99))
            rect = score_render.get_rect()
            rect.left, rect.top = (250, 250)
            self.screen.blit(score_render, rect)
        '''生成新的 块'''
        def generateNewGems(self, res_match):
            if res_match[0] == 1:
                start = res_match[2]
                while start > -2:
                    for each in [res_match[1], res_match[1]+1, res_match[1]+2]:
                        lex = self.getGemByPos(*[each, start])
                        if start == res_match[2]:
                            self.lexs_group.remove(lex)
                            self.all_lexs[each][start] = None
                        elif start >= 0:
                            lex.target_y += self.cfg.GRIDSIZE
                            lex.fixed = False
                            lex.direction = 'down'
                            self.all_lexs[each][start+1] = lex
                        else:
                            lex = lexSprite(img_path=random.choice(self.lex_imgs), size=(self.cfg.GRIDSIZE, self.cfg.GRIDSIZE), position=[self.cfg.XMARGIN+each*self.cfg.GRIDSIZE, self.cfg.YMARGIN-self.cfg.GRIDSIZE], downlen=self.cfg.GRIDSIZE)
                            self.lexs_group.add(lex)
                            self.all_lexs[each][start+1] = lex
                    start -= 1
            elif res_match[0] == 2:
                start = res_match[2]
                while start > -4:
                    if start == res_match[2]:
                        for each in range(0, 3):
                            lex = self.getGemByPos(*[res_match[1], start+each])
                            self.lexs_group.remove(lex)
                            self.all_lexs[res_match[1]][start+each] = None
                    elif start >= 0:
                        lex = self.getGemByPos(*[res_match[1], start])
                        lex.target_y += self.cfg.GRIDSIZE * 3
                        lex.fixed = False
                        lex.direction = 'down'
                        self.all_lexs[res_match[1]][start+3] = lex
                    else:
                        lex = lexSprite(img_path=random.choice(self.lex_imgs), size=(self.cfg.GRIDSIZE, self.cfg.GRIDSIZE), position=[self.cfg.XMARGIN+res_match[1]*self.cfg.GRIDSIZE, self.cfg.YMARGIN+start*self.cfg.GRIDSIZE], downlen=self.cfg.GRIDSIZE*3)
                        self.lexs_group.add(lex)
                        self.all_lexs[res_match[1]][start+3] = lex
                    start -= 1
        '''移除匹配的lex'''
        def removeMatched(self, res_match):
            if res_match[0] > 0:
                self.generateNewGems(res_match)
                self.score += self.reward
                return self.reward
            return 0
        ''' 界面的网格绘制'''
        def drawGrids(self):
            for x in range(self.cfg.NUMGRID):
                for y in range(self.cfg.NUMGRID):
                    rect = gamepy.Rect((self.cfg.XMARGIN+x*self.cfg.GRIDSIZE, self.cfg.YMARGIN+y*self.cfg.GRIDSIZE, self.cfg.GRIDSIZE, self.cfg.GRIDSIZE))
                    self.drawBlock(rect, color=(0, 0, 255), size=1)
        '''画矩形block框'''
        def drawBlock(self, block, color=(255, 0, 255), size=4):
            gamepy.draw.rect(self.screen, color, block, size)
        '''下落特效'''
        def dropGems(self, x, y):
            if not self.getGemByPos(x, y).fixed:
                self.getGemByPos(x, y).move()
            if x < self.cfg.NUMGRID - 1:
                x += 1
                return self.dropGems(x, y)
            elif y < self.cfg.NUMGRID - 1:
                x = 0
                y += 1
                return self.dropGems(x, y)
            else:
                return self.isFull()
        '''是否每个位置都有 块了'''
        def isFull(self):
            for x in range(self.cfg.NUMGRID):
                for y in range(self.cfg.NUMGRID):
                    if not self.getGemByPos(x, y).fixed:
                        return False
            return True
        '''检查有无 块被选中'''
        def checkSelected(self, position):
            for x in range(self.cfg.NUMGRID):
                for y in range(self.cfg.NUMGRID):
                    if self.getGemByPos(x, y).rect.collidepoint(*position):
                        return [x, y]
            return None
        '''是否有连续一样的三个块(无--返回0/水平--返回1/竖直--返回2)'''
        def isMatch(self):
            for x in range(self.cfg.NUMGRID):
                for y in range(self.cfg.NUMGRID):
                    if x + 2 < self.cfg.NUMGRID:
                        if self.getGemByPos(x, y).type == self.getGemByPos(x+1, y).type == self.getGemByPos(x+2, y).type:
                            return [1, x, y]
                    if y + 2 < self.cfg.NUMGRID:
                        if self.getGemByPos(x, y).type == self.getGemByPos(x, y+1).type == self.getGemByPos(x, y+2).type:
                            return [2, x, y]
            return [0, x, y]
        '''根据坐标获取对应位置的 对象'''
        def getGemByPos(self, x, y):
            return self.all_lexs[x][y]
        '''交换 '''
        def swapGem(self, lex1_pos, lex2_pos):
            margin = lex1_pos[0] - lex2_pos[0] + lex1_pos[1] - lex2_pos[1]
            if abs(margin) != 1:
                return False
            lex1 = self.getGemByPos(*lex1_pos)
            lex2 = self.getGemByPos(*lex2_pos)
            if lex1_pos[0] - lex2_pos[0] == 1:
                lex1.direction = 'left'
                lex2.direction = 'right'
            elif lex1_pos[0] - lex2_pos[0] == -1:
                lex2.direction = 'left'
                lex1.direction = 'right'
            elif lex1_pos[1] - lex2_pos[1] == 1:
                lex1.direction = 'up'
                lex2.direction = 'down'
            elif lex1_pos[1] - lex2_pos[1] == -1:
                lex2.direction = 'up'
                lex1.direction = 'down'
            lex1.target_x = lex2.rect.left
            lex1.target_y = lex2.rect.top
            lex1.fixed = False
            lex2.target_x = lex1.rect.left
            lex2.target_y = lex1.rect.top
            lex2.fixed = False
            self.all_lexs[lex2_pos[0]][lex2_pos[1]] = lex1
            self.all_lexs[lex1_pos[0]][lex1_pos[1]] = lex2
            return True
        '''info'''
        def __repr__(self):
            return self.info

    四、如何启动游戏

    1、开发工具

    如果你有配置了工具的环境VScode、sublimeText、notepad+、pycharm什么的,可以直接在工具中,运行游戏。

    如果没配置,可以使用命令启动。

    2、命令行

    【两种方法获取完整源码】

    1、资源下载:【pygame开发实战开发30例 完整源码】

    https://download.csdn.net/download/weixin_42350212/15836285

    2、订阅专栏:【获取完整源码+教程】

    一起来学pygame吧 游戏开发30例(二)——塔防游戏

    一起来学pygame吧 游戏开发30例(四)——俄罗斯方块小游戏

    推荐阅读

    python实战

    【python实战】前女友婚礼,python破解婚礼现场的WIFI,把名称改成了

    【python实战】前女友发来加密的 “520快乐.pdf“,我用python破解开之后,却发现

    【python实战】昨晚,我用python帮隔壁小姐姐P证件照 自拍,然后发现...

    【python实战】女友半夜加班发自拍 python男友用30行代码发现惊天秘密

    【python实战】python你TM太皮了——区区30行代码就能记录键盘的一举一动

    python实战】女神相册密码忘记了,我只用Python写了20行代码~~~

    pygame系列文章【订阅专栏,获取完整源码】

    一起来学pygame吧 游戏开发30例(二)——塔防游戏

    一起来学pygame吧 游戏开发30例(四)——俄罗斯方块小游戏

    渗透测试实战专栏

    Windows AD/Exchange管理专栏

    Linux高性能服务器搭建 

    PowerShell自动化专栏

    CSDN官方学习推荐 ↓ ↓ ↓

    CSDN出的Python全栈知识图谱,太强了,推荐给大家!

     ​

    展开全文
  • pygame开发小游戏,附录完整代码。【建议收藏】

    大家好,我是Lex 喜欢欺负超人那个Lex

    划重点:马上就到毕业季了,你心中的那个学姐,你真的放下了吗?

    今天跟着lex,用pygame为你的学姐,定制开发一个拼图游戏【完整项目代码】

    代码干货满满,建议收藏+实操!!!有问题及需要,请留言哦~~

    事情是这样的

    马上就快到毕业季了,大四的学姐们快要离校了

    你心中那个没有说出口的学姐,你还记得吗

    跟着博主,用pygame给你心中那个学姐

    做一款专属于她的拼图游戏

    万一有什么意外收获呢?

    先上效果

    我用隔壁诗诗学姐的照片,给她做了一个拼图游戏

    结果,我自己的拼不出来了

    配置环境

    安装pygame模块

    #pip install pygame
    
    PS C:\Users\lex> pip install pygame Looking in indexes: 
    http://mirrors.aliyun.com/pypi/simple Requirement already satisfied:
     pygame in f:\develop\python36\lib\site-packages (2.0.1)
    
    PS C:\Users\lex>

    配置文件

    cfg.py

    配置需要读取的学姐的照片路径、引入游戏引用到的字体及颜色。

    '''配置文件'''
    import os
    
    '''屏幕大小'''
    SCREENSIZE = (640, 640)
    '''读取学姐照片'''
    PICTURE_ROOT_DIR = os.path.join(os.getcwd(), 'resources/pictures')
    '''字体路径'''
    FONTPATH = os.path.join(os.getcwd(), 'resources/font/FZSTK.TTF')
    '''定义一些颜色'''
    BACKGROUNDCOLOR = (255, 255, 255)
    RED = (255, 0, 0)
    BLUE = (0, 0, 255)
    BLACK = (0, 0, 0)
    '''FPS'''
    FPS = 40
    '''随机打乱拼图次数'''
    NUMRANDOM = 100

    引入资源

    将诗诗学姐的照片,添加到resources/pictures路径下,

    游戏启动时,根据我们在cfg.py中的配置,会自动将该路径的照片

    加载成为我们拼图的原材料。

     主函数代码

    pintu.py

    代码结构搞的简单一点。一个配置文件cfg,一个资源路径resources,存放字体和图片。

    主函数代码放在这里:

    1、定义四个可移动函数,在存在空格的情况下,允许向空格的方向移动。

    2、createboard:随机将图片拆分,并且打乱。

    3、开始时,随机从图片文件夹获取一张图片:如果想给整个宿舍的学姐做游戏,

    就把所有人的照片放进去,这样每次打开,会随机生成一个学姐的照片作为游戏背景。

    '''
    Function:
        拼图小游戏
    作者:
        LexSaints
    '''
    import os
    import sys
    import cfg
    import random
    import pygame
    
    
    '''判断游戏是否结束'''
    def isGameOver(board, size):
        assert isinstance(size, int)
        num_cells = size * size
        for i in range(num_cells-1):
            if board[i] != i: return False
        return True
    
    
    '''将空白Cell左边的Cell右移到空白Cell位置'''
    def moveR(board, blank_cell_idx, num_cols):
        if blank_cell_idx % num_cols == 0: return blank_cell_idx
        board[blank_cell_idx-1], board[blank_cell_idx] = board[blank_cell_idx], board[blank_cell_idx-1]
        return blank_cell_idx - 1
    
    
    '''将空白Cell右边的Cell左移到空白Cell位置'''
    def moveL(board, blank_cell_idx, num_cols):
        if (blank_cell_idx+1) % num_cols == 0: return blank_cell_idx
        board[blank_cell_idx+1], board[blank_cell_idx] = board[blank_cell_idx], board[blank_cell_idx+1]
        return blank_cell_idx + 1
    
    
    '''将空白Cell上边的Cell下移到空白Cell位置'''
    def moveD(board, blank_cell_idx, num_cols):
        if blank_cell_idx < num_cols: return blank_cell_idx
        board[blank_cell_idx-num_cols], board[blank_cell_idx] = board[blank_cell_idx], board[blank_cell_idx-num_cols]
        return blank_cell_idx - num_cols
    
    
    '''将空白Cell下边的Cell上移到空白Cell位置'''
    def moveU(board, blank_cell_idx, num_rows, num_cols):
        if blank_cell_idx >= (num_rows-1) * num_cols: return blank_cell_idx
        board[blank_cell_idx+num_cols], board[blank_cell_idx] = board[blank_cell_idx], board[blank_cell_idx+num_cols]
        return blank_cell_idx + num_cols
    
    
    '''获得打乱的拼图'''
    def CreateBoard(num_rows, num_cols, num_cells):
        board = []
        for i in range(num_cells): board.append(i)
        # 去掉右下角那块
        blank_cell_idx = num_cells - 1
        board[blank_cell_idx] = -1
        for i in range(cfg.NUMRANDOM):
            # 0: left, 1: right, 2: up, 3: down
            direction = random.randint(0, 3)
            if direction == 0: blank_cell_idx = moveL(board, blank_cell_idx, num_cols)
            elif direction == 1: blank_cell_idx = moveR(board, blank_cell_idx, num_cols)
            elif direction == 2: blank_cell_idx = moveU(board, blank_cell_idx, num_rows, num_cols)
            elif direction == 3: blank_cell_idx = moveD(board, blank_cell_idx, num_cols)
        return board, blank_cell_idx
    
    
    '''随机选取一张图片'''
    def GetImagePath(rootdir):
        imagenames = os.listdir(rootdir)
        assert len(imagenames) > 0
        return os.path.join(rootdir, random.choice(imagenames))
    
    
    '''显示游戏结束界面'''
    def ShowEndInterface(screen, width, height):
        screen.fill(cfg.BACKGROUNDCOLOR)
        font = pygame.font.Font(cfg.FONTPATH, width//15)
        title = font.render('恭喜! 你成功完成了拼图!', True, (233, 150, 122))
        rect = title.get_rect()
        rect.midtop = (width/2, height/2.5)
        screen.blit(title, rect)
        pygame.display.update()
        while True:
            for event in pygame.event.get():
                if (event.type == pygame.QUIT) or (event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE):
                    pygame.quit()
                    sys.exit()
            pygame.display.update()
    
    
    '''显示游戏开始界面'''
    def ShowStartInterface(screen, width, height):
        screen.fill(cfg.BACKGROUNDCOLOR)
        tfont = pygame.font.Font(cfg.FONTPATH, width//4)
        cfont = pygame.font.Font(cfg.FONTPATH, width//20)
        title = tfont.render('拼图游戏', True, cfg.RED)
        content1 = cfont.render('按H或M或L键开始游戏', True, cfg.BLUE)
        content2 = cfont.render('H为5*5模式, M为4*4模式, L为3*3模式', True, cfg.BLUE)
        trect = title.get_rect()
        trect.midtop = (width/2, height/10)
        crect1 = content1.get_rect()
        crect1.midtop = (width/2, height/2.2)
        crect2 = content2.get_rect()
        crect2.midtop = (width/2, height/1.8)
        screen.blit(title, trect)
        screen.blit(content1, crect1)
        screen.blit(content2, crect2)
        while True:
            for event in pygame.event.get():
                if (event.type == pygame.QUIT) or (event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE):
                    pygame.quit()
                    sys.exit()
                elif event.type == pygame.KEYDOWN:
                    if event.key == ord('l'): return 3
                    elif event.key == ord('m'): return 4
                    elif event.key == ord('h'): return 5
            pygame.display.update()
    
    
    '''主函数'''
    def main():
        # 初始化
        pygame.init()
        clock = pygame.time.Clock()
        # 加载图片
        game_img_used = pygame.image.load(GetImagePath(cfg.PICTURE_ROOT_DIR))
        game_img_used = pygame.transform.scale(game_img_used, cfg.SCREENSIZE)
        game_img_used_rect = game_img_used.get_rect()
        # 设置窗口
        screen = pygame.display.set_mode(cfg.SCREENSIZE)
        pygame.display.set_caption('拼图游戏 —— Linux黑客小课堂')
        # 游戏开始界面
        size = ShowStartInterface(screen, game_img_used_rect.width, game_img_used_rect.height)
        assert isinstance(size, int)
        num_rows, num_cols = size, size
        num_cells = size * size
        # 计算Cell大小
        cell_width = game_img_used_rect.width // num_cols
        cell_height = game_img_used_rect.height // num_rows
        # 避免初始化为原图
        while True:
            game_board, blank_cell_idx = CreateBoard(num_rows, num_cols, num_cells)
            if not isGameOver(game_board, size):
                break
        # 游戏主循环
        is_running = True
        while is_running:
            # --事件捕获
            for event in pygame.event.get():
                # ----退出游戏
                if (event.type == pygame.QUIT) or (event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE):
                    pygame.quit()
                    sys.exit()
                # ----键盘操作
                elif event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_LEFT or event.key == ord('a'):
                        blank_cell_idx = moveL(game_board, blank_cell_idx, num_cols)
                    elif event.key == pygame.K_RIGHT or event.key == ord('d'):
                        blank_cell_idx = moveR(game_board, blank_cell_idx, num_cols)
                    elif event.key == pygame.K_UP or event.key == ord('w'):
                        blank_cell_idx = moveU(game_board, blank_cell_idx, num_rows, num_cols)
                    elif event.key == pygame.K_DOWN or event.key == ord('s'):
                        blank_cell_idx = moveD(game_board, blank_cell_idx, num_cols)
                # ----鼠标操作
                elif event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:
                    x, y = pygame.mouse.get_pos()
                    x_pos = x // cell_width
                    y_pos = y // cell_height
                    idx = x_pos + y_pos * num_cols
                    if idx == blank_cell_idx-1:
                        blank_cell_idx = moveR(game_board, blank_cell_idx, num_cols)
                    elif idx == blank_cell_idx+1:
                        blank_cell_idx = moveL(game_board, blank_cell_idx, num_cols)
                    elif idx == blank_cell_idx+num_cols:
                        blank_cell_idx = moveU(game_board, blank_cell_idx, num_rows, num_cols)
                    elif idx == blank_cell_idx-num_cols:
                        blank_cell_idx = moveD(game_board, blank_cell_idx, num_cols)
            # --判断游戏是否结束
            if isGameOver(game_board, size):
                game_board[blank_cell_idx] = num_cells - 1
                is_running = False
            # --更新屏幕
            screen.fill(cfg.BACKGROUNDCOLOR)
            for i in range(num_cells):
                if game_board[i] == -1:
                    continue
                x_pos = i // num_cols
                y_pos = i % num_cols
                rect = pygame.Rect(y_pos*cell_width, x_pos*cell_height, cell_width, cell_height)
                img_area = pygame.Rect((game_board[i]%num_cols)*cell_width, (game_board[i]//num_cols)*cell_height, cell_width, cell_height)
                screen.blit(game_img_used, rect, img_area)
            for i in range(num_cols+1):
                pygame.draw.line(screen, cfg.BLACK, (i*cell_width, 0), (i*cell_width, game_img_used_rect.height))
            for i in range(num_rows+1):
                pygame.draw.line(screen, cfg.BLACK, (0, i*cell_height), (game_img_used_rect.width, i*cell_height))
            pygame.display.update()
            clock.tick(cfg.FPS)
        # 游戏结束界面
        ShowEndInterface(screen, game_img_used_rect.width, game_img_used_rect.height)
    
    
    '''run'''
    if __name__ == '__main__':
        main()

     游戏运行方法

    1、开发工具启动

    如果你有python开发环境VScode、sublimeText、notepad+、pycharm等等这些环境,可以直接在工具中,运行游戏。

    2、命令行运行游戏

    如下图:

    【两种方法获取完整源码】

    1、资源下载:【pygame开发实战开发30例 完整源码】

    https://download.csdn.net/download/weixin_42350212/15836285

    2、订阅专栏:【获取完整源码+教程】

    一起来学pygame吧 游戏开发30例(二)——塔防游戏

    一起来学pygame吧 游戏开发30例(四)——俄罗斯方块小游戏

    推荐阅读

    python实战

    【python实战】前女友发来加密的 “520快乐.pdf“,我用python破解开之后,却发现。。。

    【python实战】昨晚,我用python帮隔壁小姐姐P证件照 自拍,然后发现...

    【python实战】女友半夜加班发自拍 python男友用30行代码发现惊天秘密

    【python实战】python你TM太皮了——区区30行代码就能记录键盘的一举一动

    python实战】女神相册密码忘记了,我只用Python写了20行代码~~~

    渗透测试

    【渗透案例】上班摸鱼误入陌生网址——结果被XSS劫持了

    【渗透测试】密码暴力破解工具——九头蛇(hydra)使用详解及实战

    【渗透学习】Web安全渗透详细教程+学习线路+详细笔记【全网最全+建议收藏】

    【渗透案例】如何用ssh工具连接前台小姐姐的“小米手机”——雷总看了直呼内行!!!

    【渗透测试】密码暴力破解工具——九头蛇(hydra)使用详解及实战

    pygame系列文章

    一起来学pygame吧 游戏开发30例(二)——塔防游戏

    一起来学pygame吧 游戏开发30例(三)——射击外星人小游戏

    一起来学pygame吧 游戏开发30例(四)——俄罗斯方块小游戏

    一起来学pygame吧 游戏开发30例(五)——消消乐 小游戏

    一起来学pygame吧 游戏开发30例(六)——高山滑雪 小游戏

    CSDN官方学习推荐 ↓ ↓ ↓

    CSDN出的Python全栈知识图谱,太强了,推荐给大家!

    展开全文
  • python大型游戏的潜力吗?

    千次阅读 2019-06-14 01:42:29
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 岂止是有潜力,简直是很合适!猪厂两大游戏客户端引擎,...也就是说,程序绝大部分时间都可以专注用 Python 写逻辑,保持创造力。还有就是...
  • python可以做那些工作

    千次阅读 2019-03-03 18:48:27
    1,python游戏开发师。游戏不用说,很多人都玩的。游戏后端的的逻辑代码的开发和处理,对数据库的操作等,都可以用到这个语言。 2,web网站方向:需要熟悉django,flask等python框架来开发网站和oa系统等等。然后.....
  • Python实现迷宫游戏

    千次阅读 多人点赞 2020-07-07 15:27:35
    本次实验设计了一款迷宫小游戏,采用用Python开发技术实现。以往经典的的游戏中有魂斗罗,拳皇,超级玛丽,贪吃蛇,俄罗斯方块等;...该迷宫小游戏使用几个模块绘制呈现,并实现可以自由操作的功能。
  • 一步步教你怎么用python写贪吃蛇游戏

    万次阅读 多人点赞 2019-06-27 18:17:52
    目录 0 引言 1 环境 2 需求分析 3 代码实现 4 后记 0 引言 前几天,星球有人提到贪吃蛇,一下子就勾起了我的兴趣,毕竟在那个Nokia称霸的年代,这款游戏可是经典中的...而用Python(蛇)玩Snake(贪吃蛇),那再合适不过了
  • Python可以做什么?

    千次阅读 2017-11-27 22:51:35
    Python可以做什么? 1)网站后端程序员:使用它单间网站,后台服务比较容易维护。如:Gmail、Youtube、知乎、豆瓣  2)自动化运维:自动化处理大量的运维任务 3)数据分析师:快速开发...
  • 很多人认为Python只适合用来大数据,或者是爬虫之类,而对于写游戏,他们认为Python实在是个loser,然而这几个游戏,你们玩过吗? 第一种游戏:这是一款基于Python的战争游戏,在国外的名字不亚于国内的某些策略...
  • Python、PyGame游戏项目

    万次阅读 多人点赞 2020-10-08 20:09:54
    还在为期末项目而烦恼吗? 英文打字小游戏项目,提高打字速度,练习英语单词。不妨来玩玩
  • 猪厂两大游戏客户端引擎,NeoX 和 Messiah,都使用 Python 作为脚本语言。 你最近所了解的比较火的挂着猪厂旗号的,也都是 Python 写的。 一些项目组甚至不需要分出人力去维护引擎部分,因为引擎本身比较稳。 ...
  • python实现扫雷游戏

    千次阅读 2019-12-05 10:15:12
    前面我们用python实现了贪吃蛇、坦克大战、飞船大战、五子棋等游戏 今天我们用python来实现一下扫雷游戏游戏代码量和源文件较多 可以从我的GitHub地址中获取 GitHub地址 构建地雷区 import random from enum ...
  • Python实现“小兔子和Bun”游戏 Python实现八音符小游戏 Python实现拼图小游戏 Python实现滑雪小游戏 Python实现经典90坦克大战 Python实现FlappyBird的小游戏 Python实恐龙跳一跳小游戏Python实现塔防小游戏 ...
  • Python实现经典吃豆豆小游戏 Python实现“小兔子和Bun”游戏 Python实现八音符小游戏 Python实现拼图小游戏 Python实现滑雪小游戏 Python实现经典90坦克大战 Python实现FlappyBird的小游戏 Python实恐龙跳一跳小游戏...
  • 1、Python猜拳小游戏代码:2、import random #导入随机模块3、4、num = 15、yin_num = 06、shu_num = 07、while num 2:12、 print('不能出大于2的值')13、 else:14、 data = ['石头', '剪刀', '布']15、 ...
  • 手把手教你用python游戏

    万次阅读 多人点赞 2018-01-17 21:41:10
    最近python语言大火,除了在科学计算领域python有用武之地之外,在游戏、后台等方面,python也大放异彩,本篇博文将按照正规的项目开发流程,手把手教大家写个python游戏,项目来自《Python编程从入门到实践》...
  • python猜数字游戏

    千次阅读 2019-10-13 20:05:21
    python猜数字游戏猜字谜游戏功能介绍游戏设计思路代码实现后续扩展 python学习少不了勤加练习,而编写有些有意思的代码则是保持兴趣的关键。其中,编写小游戏是一个不错的方法。今天我们就用python来编写一个猜数字...
  • python2048游戏设计

    万次阅读 2016-11-05 23:34:55
    python 2048游戏 pygame
  • python pygame制作游戏

    千次阅读 2019-02-26 15:17:58
    Python和Pygame写游戏-从入门到精通(目录) python中pygame游戏打包为exe文件 资料: gameobjects python3.x
  • Python3在Python2的基础之上做了非常多的改进,比如字符串编码,在Python3中默认字符使用的是unicode...首先对捕鱼达人这款游戏做个简单了解。捕鱼达人是前几年特别火的一款游戏,他是一款以深海狩猎为题材的休闲竞技游
  • Python 实现扫雷小游戏

    万次阅读 多人点赞 2020-10-21 08:00:00
    文 |野客来源:Python 技术「ID: pythonall」扫雷是一款益智类小游戏,最早于 1992 年由微软在 Windows 上发行,游戏适合于全年龄段,规则简单,即在最短的时...
  • demo:飞机大战游戏 python小项目

    万次阅读 多人点赞 2020-11-30 19:22:50
    主要python代码三、说明:代码功能都在注释里面,我就不过多解释了;与本项目有关的图片数据我传到资源里面了,大家可以免费下载,我把代码和数据都打包到一起了,大家下载下来导入库就可以直接一些了。 一、项目...
  • Python和Pygame游戏1

    千次阅读 2020-02-18 14:15:49
    ​掌握一门语言最好的办法就是写个小游戏,这样又有趣味性,又可以学到很多这门语言的知识。因为游戏对性能要求比较高,你就必须找出各种方式去优化。基本上一个复杂点的游戏写完后, 就基本算掌握了这门语言 pygame...
  • python游戏开发——简单弹球游戏

    千次阅读 多人点赞 2019-04-25 11:09:28
    撸码枯燥,扫码关注 案例介绍 本案例采用 python 实现了一个简单的弹球游戏。...玩家一共有四条生命,即可以玩四次游戏,当生命大于等于“ 0 ”时,可以继续游戏,当生命小于“ 0 ”时,游戏结束。 学习目标 本案例...
  • Python实现“小兔子和Bun”游戏 Python实现八音符小游戏 Python实现拼图小游戏 Python实现滑雪小游戏 Python实现经典90坦克大战 Python实现FlappyBird的小游戏 Python实恐龙跳一跳小游戏Python实现塔防小游戏 ...
  • 前言 本系列文章将会以通俗易懂的...有问题也可以在评论区留言,也可以私聊我加我好友共同交流一起进步~ 我的其它教程 教程点击进去将会有目录 《看聊天记录都学不会C语言?太菜了吧(1)我在大佬群里问基础问题没人
  •   互联网浪潮来袭,人们已经进入数字化时代,科技的进步离不开一批批程序员的创意Idea,如果说过去一年编程语言界最流行的语言是什么,毫无疑问python首当其冲。如果你经常关注互联网相关新闻,你会看到如下几条...
  • Python之初级RPG小游戏

    千次阅读 多人点赞 2019-08-22 00:30:13
    在国外网站上找到一个练习Python的小游戏感觉不错,自己实现了一下。 通过该练习你能学到: 元组 字典 简单定义函数和封装 条件控制语句 游戏说明 以下是3个房间和1个花园: Hall 客厅 有一把钥匙,Kitchen...
  • [Python] 用python做一个游戏辅助脚本,完整思路

    万次阅读 多人点赞 2019-06-17 09:01:15
    [Python] 用python做一个游戏辅助脚本,完整思路 一、说明  简述:本文将以4399小游戏《宠物连连看经典版2》作为测试案例,通过识别小图标,模拟鼠标点击,快速完成配对。对于有兴趣学习游戏脚本的同学有一定的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 175,767
精华内容 70,306
关键字:

python可以做游戏吗

python 订阅