返回顶部
首页 > 资讯 > 后端开发 > Python >Python如何实现简单扫雷游戏
  • 343
分享到

Python如何实现简单扫雷游戏

2023-07-02 00:07:35 343人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

本篇内容介绍了“python如何实现简单扫雷游戏”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!具体代码如下#coding: utf

本篇内容介绍了“python如何实现简单扫雷游戏”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

具体代码如下

#coding: utf-8__note__ = """* 扫雷小游戏* 需要python3.x以上* 需要安装PyQt5* pip install PyQt5""" import sys try:    import PyQt5except ImportError:    import tkinter    from tkinter import messagebox    err_str = "请安装PyQt5后再打开: pip install PyQt5"    messagebox.showerror("模块错误!", err_str)    raise ImportError(err_str)    sys.exit()  from random import randintfrom PyQt5.QtWidgets import \    QApplication,           \    QWidget,                \    QPushButton,            \    QLCDNumber,             \    QDesktopWidget,         \    QMessageBoxfrom PyQt5.QtCore import Qt  class Mine(object):    mine = 9    no_mine = 0    n_mine = 10    width = 10    height = 10     def __init__(self, width=10, height=10, nMines=10):        self.map = []        for _ in range(height):            t_line = []            for _ in range(width):                t_line.append(self.no_mine)            self.map.append(t_line)                 self.width = width        self.height = height        self.n_mine = nMines         self.remix()         # 打乱布局重新随机编排    def remix(self):         for y in range(self.height):            for x in range(self.width):                self.map[y][x] = self.no_mine         def add_mark(x, y):            # 如果不是雷的标记就+1            if self.map[y][x]+1 < self.mine:                self.map[y][x] += 1                 mine_count = 0         while mine_count < self.n_mine:            x = randint(0, self.width-1)            y = randint(0, self.height-1)             if self.map[y][x] != self.mine:                self.map[y][x] = self.mine                                 mine_count += 1                 # 雷所在的位置的8个方位的数值+1                ## 上下左右                if y-1 >= 0: add_mark(x, y-1)                if y+1 < self.height: add_mark(x, y+1)                if x-1 >= 0: add_mark(x-1, y)                if x+1 < self.width: add_mark(x+1, y)                ## 四个角: 左上角、左下角、右上角、右下角                if x-1 >= 0 and y-1 >=1: add_mark(x-1, y-1)                if x-1 >= 0 and y+1 < self.height: add_mark(x-1, y+1)                if x+1 < self.width and y-1 >= 1: add_mark(x+1, y-1)                if x+1 < self.width and y+1 < self.height: add_mark(x+1, y+1)         def __getitem__(self, key):        return self.map[key]     def __str__(self):        fORMat_str = ""        for y in range(self.height):            format_str += str(self[y]) + "\n"        return format_str    __repr__ = __str__ class LCDCounter(QLCDNumber):    __counter = 0    def __init__(self, start=0, parent=None):        super().__init__(4, parent)        self.setSegmentStyle(QLCDNumber.Flat)        self.setStyleSheet("background: black; color: red")        self.counter = start         @property    def counter(self):        return self.__counter    @counter.setter    def counter(self, value):        self.__counter = value        self.display(str(self.__counter))         def inc(self):        self.counter += 1    def dec(self):        self.counter -= 1 class MineButton(QPushButton):    # 按钮类型    MINE = Mine.mine        # 雷    NOTMINE = Mine.no_mine  # 不是雷    m_type = None     # 按钮状态    mark = False    # 是否是标记状态(默认: 未被标记)     s_flag = '&#9873;'   # 标记    s_mine = '&#9760;'  # 雷    s_success = '&#128076;'     # 按钮是否按下(默认False: 未按下)    __pushed = False     # 按钮对应map的位置    m_x = 0    m_y = 0     def __init__(self, map_pos, m_type, parent):        super().__init__(parent)        self.m_type = m_type        self.pushed = False        self.m_x = map_pos[0]        self.m_y = map_pos[1]         @property    def pushed(self):        return not self.__pushed    @pushed.setter    def pushed(self, value):        self.__pushed = not value        self.setEnabled(self.__pushed)     ## 按钮上的鼠标按下事件    def mousePressEvent(self, e):        #print("m_x:%d"%self.m_x, "m_y:%d"%self.m_y, "m_type:%d"%self.m_type)         p = self.parent()        # 记录鼠标单击次数        p.nwap_lcd_clicked.counter += 1         # 左键扫雷        if e.buttons() == Qt.LeftButton:            # 踩中雷, 全部雷都翻起来            if self.m_type == self.MINE:                for t_line_btn in p.btn_map:                    for btn in t_line_btn:                        if btn.m_type == btn.MINE:                            btn.setText(btn.s_mine)                        else:                            if btn.mark != True:                                if btn.m_type != btn.NOTMINE:                                    btn.setText(str(btn.m_type))                        btn.pushed = True                # 苦逼脸                p.RestartBtn.setText('&#128547;')                QMessageBox.critical(self, "失败!", "您不小心踩到了雷! " + self.s_mine)                return None            elif self.m_type == self.NOTMINE:                self.AutoSwap(self.m_x, self.m_y)            else:                self.setText(str(self.m_type))                         p.mine_counter -= 1            self.pushed = True        # 右键添加标记        elif e.buttons() == Qt.RightButton:            if self.mark == False:                self.setText(self.s_flag)                self.mark = True            else:                self.setText("")                self.mark = False                 self.setFocus(False)          ## 当按下的位置是NOTMINE时自动扫雷    def AutoSwap(self, x, y):        p = self.parent()        map_btn = p.btn_map                 def lookup(t_line, index):            # 向左扫描            i = index            while i >= 0 and not t_line[i].pushed and t_line[i].m_type != MineButton.MINE:                if t_line[i].m_type != MineButton.NOTMINE:                    t_line[i].setText(str(t_line[i].m_type))                t_line[i].pushed = True                p.mine_counter -= 1                p.nwap_lcd_counter.counter = p.mine_counter                i -= 1                if t_line[i].m_type != MineButton.NOTMINE:                    break            # 向右扫描            i = index + 1            while i < p.mine_map.width and not t_line[i].pushed and t_line[i].m_type != MineButton.MINE:                if t_line[i].m_type != MineButton.NOTMINE:                    t_line[i].setText(str(t_line[i].m_type))                t_line[i].pushed = True                p.mine_counter -= 1                p.nwap_lcd_counter.counter = p.mine_counter                i += 1                if t_line[i].m_type != MineButton.NOTMINE:                    break                 # 向上扫描        j = y        while j >= 0:            lookup(map_btn[j], x)            j -= 1        # 向下扫描        j = y + 1        while j < p.mine_map.height:            lookup(map_btn[j], x)            j += 1                    class MineWindow(QWidget):     def __init__(self):        super().__init__()        self.mine_map = Mine(nMines=16)        self.InitGUI()        #print(self.mine_map)             def InitGUI(self):                 w_width = 304        w_height = 344         self.resize(w_width, w_height)        self.setFixedSize(self.width(), self.height())        self.setWindowTitle("扫雷")         ## 窗口居中于屏幕        qr = self.frameGeometry()        cp = QDesktopWidget().availableGeometry().center()        qr.moveCenter(cp)        self.move(qr.x(), qr.y())          l_start_x = 2        l_start_y = 40        l_x = l_start_x        l_y = l_start_y        l_width = 30        l_height = 30         # 雷区按钮        self.btn_map = []        for h in range(self.mine_map.height):            l_x = l_start_x            self.btn_map.append(list())            for w in range(self.mine_map.width):                self.btn_map[h].append(MineButton([w, h], self.mine_map[h][w], self))                self.btn_map[h][w].resize(l_width, l_height)                self.btn_map[h][w].move(l_x, l_y)                self.btn_map[h][w].show()                l_x += l_width            l_y += l_height         r_width = 30        r_height = 30         # 恢复按钮        self.RestartBtn = QPushButton('&#128522;', self)        self.RestartBtn.clicked.connect(self.restart_btn_event)        self.RestartBtn.resize(r_width, r_height)        self.RestartBtn.move((w_width-r_width)//2, 6)         ## 计数器        self.__mine_counter = self.mine_map.width * self.mine_map.height - self.mine_map.n_mine         ## 两个LCD显示控件        # 操作次数        self.nwap_lcd_clicked = LCDCounter(0, self)        self.nwap_lcd_clicked.move(44, 8)         # 无雷块个数        self.nwap_lcd_counter = LCDCounter(self.mine_counter, self)        self.nwap_lcd_counter.move(204, 8)             def restart_btn_event(self):        self.mine_map.remix()        #QMessageBox.information(self, "look up", str(self.mine_map))        for y in range(len(self.btn_map)):            for x in range(len(self.btn_map[y])):                self.btn_map[y][x].pushed = False                self.btn_map[y][x].setText("")                self.btn_map[y][x].m_type = self.mine_map[y][x]                 self.mine_counter = self.mine_map.width * self.mine_map.height - self.mine_map.n_mine        self.RestartBtn.setText('&#128522;')        self.nwap_lcd_clicked.counter = 0        self.nwap_lcd_counter.counter = self.mine_counter         ### 计数器    @property    def mine_counter(self):        return self.__mine_counter    @mine_counter.setter    def mine_counter(self, value):        self.__mine_counter = value        self.nwap_lcd_counter.dec()        if self.mine_counter == 0:            for t_line_btn in self.btn_map:                for btn in t_line_btn:                    if btn.m_type == btn.MINE:                        btn.setText(btn.s_success)                        btn.pushed = True            QMessageBox.information(self, "恭喜!", "您成功扫雷! " + MineButton.s_success)  if __name__ == '__main__':    app = QApplication(sys.argv)    w = MineWindow()    w.show()    sys.exit(app.exec_())

Python如何实现简单扫雷游戏

Python如何实现简单扫雷游戏”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: Python如何实现简单扫雷游戏

本文链接: https://lsjlt.com/news/338726.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Python如何实现简单扫雷游戏
    本篇内容介绍了“Python如何实现简单扫雷游戏”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!具体代码如下#coding: utf...
    99+
    2023-07-02
  • Python实现简单扫雷游戏
    本文实例为大家分享了Python实现简单扫雷游戏的具体代码,供大家参考,具体内容如下 #coding: utf-8 __note__ = """ * 扫雷小游戏 * 需要pytho...
    99+
    2024-04-02
  • java实现简单的扫雷小游戏
    使用java制作一款简单的扫雷游戏,供大家参考,具体内容如下 import java.util.*; public class nephelokokkygia { ...
    99+
    2024-04-02
  • C语言如何实现简单扫雷小游戏
    本篇内容主要讲解“C语言如何实现简单扫雷小游戏”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言如何实现简单扫雷小游戏”吧!前言今天学习了制作简易扫雷游戏,代码如下提示:以下是本篇文章正文内容...
    99+
    2023-06-20
  • 用C语言实现简单扫雷游戏
    前言 本文写的是用C语言实现扫雷,用递归实现周围一圈无雷时,自动继续判断下一圈是否有雷,直到四周有地雷的信息。 最终结果展示 初始游戏界面 四周无地雷继续向外展开,直到出现地雷信息...
    99+
    2024-04-02
  • C语言扫雷游戏的简单实现
    今天来用c语言做一个扫雷功能的简单实现,首先创建一个test.c来用于在写代码的途中测试扫雷代码,game.h来存放实现扫雷函数需要用到的头文件,game.c来存放最终的成品。 首先...
    99+
    2024-04-02
  • 用C语言简单实现扫雷小游戏
    本文实例为大家分享了C语言简单实现扫雷小游戏的具体代码,供大家参考,具体内容如下 设计思路 1. 定义两个二维数组,一个存放炸弹信息,一个隐藏信息后向玩家展示。 2. 玩家每一次选择...
    99+
    2024-04-02
  • C语言实现扫雷小游戏简单版
    本文实例为大家分享了C语言实现扫雷小游戏的具体代码,供大家参考,具体内容如下 在vs2019创建新项目,然后添加两个源文件test.c和game.c,接着创建一个头文件game.h。...
    99+
    2024-04-02
  • 用C语言实现简单扫雷小游戏
    前言 今天学习了制作简易扫雷游戏,代码如下 提示:以下是本篇文章正文内容,下面案例可供参考 一、函数头文件(函数声明) 代码如下(示例): #pragma once #defin...
    99+
    2024-04-02
  • 基于C语言实现简单扫雷游戏
    在每一个电脑里总有一个固定的小游戏-扫雷,那今天就让我们一起来实现下扫雷。 1.主函数的构建 int main() { int input = 0; do { me...
    99+
    2024-04-02
  • Easyx如何实现扫雷游戏
    今天给大家介绍一下Easyx如何实现扫雷游戏。文章的内容小编觉得不错,现在给大家分享一下,觉得有需要的朋友可以了解一下,希望对大家有所帮助,下面跟着小编的思路一起来阅读吧。代码:#include<stdio.h>#include...
    99+
    2023-06-26
  • C#如何实现扫雷游戏
    今天小编给大家分享一下C#如何实现扫雷游戏的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、实验目的:掌握c#窗体和控件的常...
    99+
    2023-07-02
  • C语言如何实现简易扫雷游戏
    这篇文章主要介绍C语言如何实现简易扫雷游戏,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!具体内容如下一、想要达到的游戏功能:大家如果想编写一个游戏,应具备以下的步骤:了解游戏的规则   知道游戏应...
    99+
    2023-06-20
  • C++实现简易版扫雷游戏
    目录一、菜单栏二、创建棋盘数组三、初始化棋盘四、打印棋盘五、布置雷六、排查雷七、全部代码总结一、菜单栏 1.先用printf函数制作一个简易版的菜单,并附上选项提示,玩游戏或者退出游...
    99+
    2024-04-02
  • 使用 python 实现单人AI 扫雷游戏
    AI玩扫雷 很高兴又见面了!😊 扫雷是一款单人益智游戏,相信大部分人都在以前上微机课的时候玩过。游戏的目标是借助每个区域中相邻地雷数量的线索,清除包含隐藏的“地雷”或炸弹的单元格,但不引爆其中任何一...
    99+
    2022-06-02
    python扫雷游戏 python AI 扫雷游戏
  • C语言版简单扫雷游戏
    本文实例为大家分享了C语言版的简单扫雷游戏,供大家参考,具体内容如下 思想 我们在设计的时候,首先将其分为三个部分,分别为头文件game.h游戏界面及主要实现的功能函数部分test....
    99+
    2024-04-02
  • 基于C语言实现简单的扫雷游戏
    目录效果展示开始的界面选择标记地雷或者选择踩坐标在输入坐标处输入0 0结束游戏踩到炸弹,出现炸弹位置胜利代码test.cgame.hgame扫雷.c效果展示 开始的界面 输入0结束...
    99+
    2024-04-02
  • 怎么用C语言实现简单扫雷游戏
    本篇内容介绍了“怎么用C语言实现简单扫雷游戏”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.主函数的构建int main(){&...
    99+
    2023-06-25
  • C语言实现一个简单的扫雷游戏
    前言 扫雷跟上一篇文章的三子棋一样,是C语言基础知识的综合运用的实例,对于巩固我们的基础知识非常重要,同时扫雷作为C语言的一个小项目,锻炼我们的编程思维,也是一个不可多得的实践。 提...
    99+
    2024-04-02
  • C语言如何实现简易的扫雷游戏
    这篇文章给大家分享的是有关C语言如何实现简易的扫雷游戏的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。具体内容如下在正式讲内容之前先说一说扫雷游戏的规则游戏规则很简单,点击方格,如果是地雷,游戏失败,找到所有地雷游...
    99+
    2023-06-25
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作