目录
在编程的世界里,没有什么比亲手打造一款属于自己的小游戏更能带来成就感了。当一行行代码在屏幕上跳动,最终幻化成可以操作的角色、有趣的关卡时,那种从 0 到 1 的创造喜悦,足以让每个开发者为之着迷。
而 Python,凭借其简洁易懂的语法和丰富的库支持,成为了入门级游戏开发的绝佳选择。无论是用 Pygame 构建 2D 像素世界,还是借助其他库实现简单的交互逻辑,Python 都能让我们快速上手,将创意转化为实际可玩的作品。
但此时,一个新的问题会浮现在我们脑海:如何把精心制作的小游戏分享给身边的朋友呢?总不能让每个人都先安装 Python 环境,再运行代码吧?这时候,PyInstaller 库就像一位得力的助手,帮我们解决了这个难题。它能将 Python 脚本打包成独立的可执行文件,让你的游戏摆脱环境限制,轻松在不同电脑上运行。
今天,就让我们一起走进用 Python 自制简单小游戏的世界,并深入了解 PyInstaller 库是如何让我们的作品更便于传播和分享的。
一、简单介绍Pyinstaller库
PyInstaller 是一个非常实用的 Python 库,它可以将 Python 脚本打包成独立的可执行文件(.exe、.app 等),让用户无需安装 Python 解释器和相关依赖就能运行程序。
主要特点
- 跨平台支持:可以在 Windows、macOS 和 Linux 系统上使用
- 生成单一可执行文件:将所有依赖打包到一个文件中,方便分发
- 支持多种打包模式:单文件模式、文件夹模式等
- 自动处理依赖:会分析脚本依赖的库并一同打包
基本使用方法
1、安装 PyInstaller:
pip install pyinstaller
2、基本打包命令:
# 生成文件夹模式(默认)
pyinstaller your_script.py
# 生成单文件模式
pyinstaller --onefile your_script.py
# 不显示控制台窗口(Windows)
pyinstaller --onefile --windowed your_script.py
打包软件
Pyinstaller -F 代码文件地址+代码文件名
3、常用参数:
--onefile
:打包成单个可执行文件--name
:指定输出文件的名称--icon
:指定程序图标--hidden-import
:手动指定隐藏的导入--distpath
:指定输出目录
打包流程说明
执行打包命令后,会生成三个主要部分:
dist
文件夹:包含最终生成的可执行文件build
文件夹:包含打包过程中的临时文件.spec
文件:打包配置文件
对于复杂项目,可以通过编辑
.spec
文件来进行更精细的配置
注意事项
- 某些库可能需要特殊处理才能正确打包
- 打包后的文件体积通常会比较大,因为包含了 Python 解释器和所有依赖
- 不同操作系统上打包的文件不能跨平台使用
- 可能需要处理数据文件、资源文件的路径问题
二、实例演示
1、井字棋
打包代码(换成自己的python代码位置)(所有打包代码均在终端运行)
Pyinstaller -F W:\学徒\工程\2\游戏\井字棋.py
直接打包
Pyinstaller -i C:\Users\31253\Desktop\mmm.ico -F W:\学徒\工程\2\游戏\井字棋.py
添加封面图片
可以添加软件图片(必须使ico格式的)
没有的可以去这个网站转化
代码
import sys
def print_board(board):
print("\n 1 2 3")
for i, row in enumerate(board):
print(f"{i + 1} {' '.join(row)}")
print()
def check_winner(board):
# 检查行
for row in board:
if row[0] == row[1] == row[2] and row[0] != ' ':
return row[0]
# 检查列
for col in range(3):
if board[0][col] == board[1][col] == board[2][col] and board[0][col] != ' ':
return board[0][col]
# 检查对角线
if board[0][0] == board[1][1] == board[2][2] and board[0][0] != ' ':
return board[0][0]
if board[0][2] == board[1][1] == board[2][0] and board[0][2] != ' ':
return board[0][2]
# 检查平局
if all(cell != ' ' for row in board for cell in row):
return 'tie'
return None
def get_move(player, board):
while True:
try:
move = input(f"玩家 {player} 的回合 (行 列): ").split()
if len(move) != 2:
raise ValueError("请输入行和列,用空格分隔")
row, col = int(move[0]) - 1, int(move[1]) - 1
if 0 <= row <= 2 and 0 <= col <= 2:
if board[row][col] == ' ':
return row, col
else:
print("该位置已被占用!")
else:
print("请输入1-3之间的数字!")
except (ValueError, IndexError):
print("输入无效,请重试!")
def main():
print("欢迎来到井字棋游戏!")
print("玩家1使用 X,玩家2使用 O")
print("输入格式:行 列 (例如:1 3 表示第一行第三列)")
while True:
board = [[' ' for _ in range(3)] for _ in range(3)]
current_player = 'X'
while True:
print_board(board)
row, col = get_move(current_player, board)
board[row][col] = current_player
winner = check_winner(board)
if winner:
print_board(board)
if winner == 'tie':
print("平局!")
else:
print(f"玩家 {winner} 获胜!")
break
current_player = 'O' if current_player == 'X' else 'X'
if input("再玩一局?(y/n): ").lower() != 'y':
print("感谢游玩!")
sys.exit()
if __name__ == "__main__":
main()
2、猜单词
打包代码(记得换成自己的地址)
Pyinstaller -F W:\学徒\工程\2\游戏\猜单词.py
直接打包
Pyinstaller -i C:\Users\31253\Desktop\mmm.ico -F W:\学徒\工程\2\游戏\猜单词.py
添加封面图片
代码(可以自己添加单词库的内容,以数组的格式添加)
import random
def word_guessing_game():
# 游戏配置
WORDS = ["absorb", "accompany", "accomplish", "acknowledge", "activate", "adapt", "adjust", "admire", "admit", "adopt",
"advance", "affect", "announce", "anticipate", "apologize", "applaud", "appreciate", "approach", "approve", "arrange",
"assemble", "assess", "assign", "assist", "assume", "astonish", "attach", "attract", "avenge", "awaken",
"balance", "banish", "bargain", "bark", "bathe", "behave", "bend", "betray", "blame", "bless",
"bother", "bounce", "browse", "brush", "burst", "calculate", "camp", "cancel", "capture", "carve",
"celebrate", "challenge", "charge", "chase", "cheat", "cheer", "clap", "classify", "climb", "clinch",
"coach", "collapse", "combine", "comfort", "communicate", "compete", "complain", "complete", "comprehend", "concentrate",
"concern", "confess", "confirm", "conflict", "confuse", "connect", "consider", "construct", "contact", "contain",
"continue", "contract", "contrast", "contribute", "convince", "copy", "correct", "cost", "count", "cover",
"crash", "create", "cross", "crowd", "cure", "damage", "dare", "decorate", "define", "deliver",
"demand", "deny", "depart", "depend", "deposit", "derive", "design", "desire", "destroy", "determine",
"develop", "devote", "digest", "direct", "disagree", "disappear", "disappoint", "discover", "discuss", "dismiss",
"distribute", "dive", "divide", "dominate", "doubt", "drain", "drift", "drip", "drown", "dye",
"earn", "echo", "edit", "educate", "effect", "elect", "eliminate", "embarrass", "emphasize", "enable",
"encourage", "endure", "enforce", "engage", "enlarge", "enlighten", "enlist", "enrich", "ensure", "entertain",
"entitle", "entrust", "envy", "equal", "equip", "escape", "establish", "estimate", "evaluate", "evolve",
"examine", "exceed", "exchange", "excite", "exclude", "excuse", "execute", "exercise", "exhaust", "exist",
"expand", "expect", "explain", "explode", "export", "express", "extend", "extract", "fade", "fail",
"fasten", "favor", "fear", "feature", "feed", "feel", "fight", "fill", "find", "finish",
"fix", "flap", "flee", "float", "flock", "flow", "fluctuate", "focus", "fold", "follow",
"fool", "force", "forget", "forgive", "form", "found", "freeze", "gather", "gaze", "generate",
"gesture", "glance", "govern", "grab", "grade", "grant", "grasp", "greet", "grieve", "grow",
"guess", "guide", "harm", "hate", "head", "heal", "hear", "heat", "help", "hesitate",
"hide", "highlight", "hire", "hit", "hold", "honor", "hope", "host", "hurry", "identify",
"ignore", "illustrate", "imitate", "imagine", "impose", "improve", "include", "increase", "indicate", "inflate",
"inform", "inherit", "inspect", "inspire", "install", "instruct", "intend", "interrupt", "introduce", "invite",
"involve", "issue", "jail", "jam", "joke", "judge", "jump", "justify", "keep", "kick",
"kill", "kiss", "knit", "know", "label", "lack", "ladder", "lag", "laugh", "lay",
"lead", "lean", "leap", "learn", "leave", "lecture", "legalize", "lend", "length", "lessen",
"let", "lie", "lift", "light", "like", "limit", "listen", "live", "load", "locate",
"lock", "log", "look", "loosen", "love", "lower", "luck", "lump", "lure", "maintain",
"major", "make", "manage", "mar", "mark", "marry", "mask", "match", "mate", "maximize",
"mean", "measure", "meet", "melt", "memorize", "mention", "merge", "mess", "metal", "meter",
"middle", "migrate", "milk", "mind", "mine", "minimize", "mirror", "miss", "mix", "model",
"modify", "moist", "mold", "moment", "monitor", "monkey", "mood", "moon", "mop", "moral",
"more", "motion", "motivate", "mourn", "move", "multiply", "murder", "muscle", "mute", "name",
"narrow", "nation", "nature", "near", "need", "neglect", "negotiate", "nest", "net", "network",
"neutralize", "never", "new", "nick", "nudge", "nurse", "object", "observe", "obtain", "occupy",
"occur", "offer", "offend", "omit", "open", "operate", "oppose", "opt", "order", "organize",
"originate", "ought", "outcome", "outline", "output", "outrage", "outside", "overcome", "overhear", "overlook",
"owe", "own", "pack", "pad", "paint", "pair", "pal", "pan", "pant", "paper",
"parade", "parallel", "park", "parrot", "part", "participate", "partner", "party", "pass", "paste",
"patch", "path", "pause", "pay", "peace", "peek", "pen", "pencil", "perceive", "perform",
"permit", "persist", "person", "persuade", "pet", "phase", "phone", "photograph", "pick", "pile",
"pill", "pilot", "pin", "pine", "pink", "pint", "pipe", "pitch", "place", "plan",
"plant", "play", "please", "pledge", "plot", "plug", "plus", "pocket", "point", "poison",
"polish", "pollute", "pond", "pool", "poor", "pop", "pour", "powder", "power", "practice",
"praise", "pray", "preach", "prepare", "preserve", "press", "pretend", "prevent", "price", "pride",
"print", "prioritize", "prison", "privilege", "probable", "problem", "process", "produce", "profit", "program",
"project", "promote", "prompt", "proof", "propel", "proper", "protect", "protest", "provide", "prove",
"public", "publish", "pull", "pulse", "pump", "punish", "purchase", "purple", "purpose", "push",
"put", "qualify", "quarrel", "quarter", "question", "quick", "quit", "quote", "race", "radiate",
"raise", "rake", "ram", "range", "rank", "rapid", "rare", "rate", "reach", "react",
"read", "ready", "realize", "reap", "rearrange", "reason", "reassure", "rebel", "recall", "receive",
"recent", "recharge", "recognize", "recommend", "record", "recover", "redden", "reduce", "refer", "reflect",
"reform", "refuse", "regard", "regret", "regular", "reign", "reinforce", "reject", "relate", "release",
"relieve", "rely", "remain", "remember", "remind", "remove", "render", "renew", "rent", "repair",
"repeat", "replace", "reply", "report", "represent", "reproduce", "research", "resemble", "resign", "resist",
"resolve", "resource", "respect", "respond", "responsible", "rest", "restore", "restrict", "result", "retail",
"retain", "retire", "return", "reveal", "review", "reward", "rhyme", "rice", "rich", "ride",
"right", "ring", "rip", "rise", "risk", "rival", "roast", "rob", "rock", "roll",
"romance", "roof", "room", "root", "rotate", "rough", "round", "rouse", "route", "row",
"rub", "rule", "run", "rush", "rust", "sack", "sail", "salute", "same", "sample",
"sand", "satisfy", "save", "saw", "say", "scale", "scan", "scare", "scatter", "scene",
"schedule", "school", "science", "scold", "score", "scrape", "screen", "scrub", "sea", "search",
"season", "seat", "second", "secret", "section", "secure", "see", "seek", "seem", "segment",
"select", "sell", "send", "sense", "separate", "serve", "set", "settle", "seven", "sew",
"shake", "shape", "share", "shave", "shear", "shed", "shine", "ship", "shock", "shoot",
"shop", "shore", "shorten", "shoulder", "shout", "show", "shove", "shrink", "shrug", "shuffle",
"shut", "shy", "sick", "side", "sign", "signal", "silence", "simplify", "sing", "sink",
"sit", "situate", "size", "skate", "sketch", "ski", "skip", "skirt", "skull", "slap",
"sleep", "slide", "slip", "slow", "small", "smash", "smell", "smile", "smoke", "smooth",
"snake", "snap", "snatch", "snow", "soak", "soap", "sock", "soften", "soil", "solve",
"some", "sort", "sound", "soup", "source", "south", "space", "spare", "spark", "speak",
"specialize", "speed", "spell", "spend", "sphere", "spill", "spin", "spirit", "split", "spoil",
"sponsor", "spoon", "sport", "spot", "spray", "spread", "spring", "sprint", "spur", "spy",
"square", "squeeze", "stab", "stack", "staff", "stage", "stain", "stair", "stamp", "stand",
"start", "state", "station", "stay", "steal", "steam", "steel", "steer", "stem", "step",
"stick", "stiff", "still", "stimulate", "sting", "stir", "stock", "stomach", "stone", "stop",
"store", "storm", "story", "stove", "straighten", "strange", "strap", "strategy", "stream", "street",
"stretch", "strike", "string", "strip", "strive", "stroke", "structure", "struggle", "study", "stuff",
"stumble", "stun", "style", "subject", "submit", "subtract", "succeed", "such", "sudden", "suffer",
"sugar", "suggest", "suit", "sum", "summarize", "sun", "supply", "support", "suppose", "surf",
"surge", "surprise", "surround", "survey", "suspect", "suspend", "swallow", "swear", "sweat", "sweep",
"sweeten", "swell", "swim", "swing", "switch", "symbolize", "sympathize", "system", "table", "tackle",
"tag", "tail", "take", "talk", "tall", "tame", "tap", "target", "task", "taste",
"tax", "teach", "team", "tear", "technical", "technique", "ted", "telephone", "tell", "tempt",
"tend", "tense", "term", "terrify", "test", "text", "thank", "that", "theorize", "there",
"thick", "thin", "think", "thirst", "threaten", "throw", "thumb", "thunder", "tick", "tie",
"tiger", "tighten", "time", "tip", "tire", "title", "toast", "tobacco", "today", "toddle",
"toe", "together", "toil", "told", "tomorrow", "tone", "tool", "top", "topic", "torch",
"toss", "total", "touch", "tour", "toward", "towel", "town", "trace", "track", "trade",
"traffic", "train", "transfer", "transform", "translate", "transport", "trap", "travel", "tray", "treat",
"tree", "tremble", "trend", "trial", "tribe", "trick", "trigger", "trim", "trip", "triumph",
"troop", "trot", "trouble", "truck", "true", "truly", "trumpet", "trust", "truth", "try",
"tube", "tune", "tunnel", "turn", "tutor", "type", "uglify", "uncover", "undergo", "underline",
"understand", "undertake", "undo", "unfold", "unite", "unload", "unlock", "unpack", "unscrew", "untie",
"up", "update", "uphold", "upper", "upset", "urge", "use", "useful", "usual", "vacate",
"vacuum", "vague", "validate", "value", "vanish", "vary", "vast", "vegetate", "venture", "verify",
"version", "vest", "vibrate", "vice", "victimize", "view", "visit", "visualize", "vocalize", "vote",
"wade", "wait", "wake", "walk", "wall", "want", "war", "warm", "warn", "wash",
"waste", "watch", "water", "wave", "wax", "way", "wear", "weave", "weep", "weigh",
"welcome", "weld", "well", "west", "wet", "whisper", "whistle", "whip", "whirl", "whisper",
"white", "who", "whole", "whom", "whose", "why", "wick", "wide", "widen", "wife",
"wild", "will", "win", "wind", "window", "wine", "wing", "wink", "winner", "winter",
"wipe", "wire", "wisdom", "wish", "wither", "withhold", "witness", "wolf", "woman", "wonder",
"wood", "wool", "word", "work", "worm", "worry", "worth", "would", "wound", "wrap",
"wreck", "wrinkle", "write", "wrong", "yearn", "yield", "zip", "zoom"
'apple', 'banana', 'grape', 'orange', 'mango', 'lemon'
"apple", "bird", "book", "car", "chair", "city", "dog", "egg", "family", "flower",\
"game", "house", "idea", "job", "key", "lake", "mountain", "name", "ocean", "pen",\
"question", "river", "sun", "tree", "umbrella", "voice", "water", "year", "zoo",\
"kite", "library", "money", "nose", "orange", "piano", "queen", "rain", "star",\
"table", "university", "vegetable", "window", "box", "cloud", "door", "elephant",\
"fire", "garden", "hill", "island", "jacket", "king", "lion", "music", "night",\
"oath", "paper", "quill", "road", "snake", "train", "umbrella", "valley", "wind",\
"xylophone", "yacht", "zebra", "actor", "beach", "camera", "doctor", "engine",\
"friend", "guitar", "hospital", "island", "jungle", "kitchen", "lake", "mountain",\
"needle", "ocean", "pencil", "rabbit", "school", "teacher", "umbrella", "village",\
"watch", "box", "cloud", "dress", "elephant", "flower", "guitar", "house", "ice",\
"jungle", "kite", "lake", "mountain", "nose", "orange", "pen", "rabbit", "sun",\
"table", "umbrella", "voice", "water", "year", "zoo"\
"accept", "achieve", "admire", "advise", "afford", "agree", "allow", "answer", "appear", "argue",\
"arrive", "ask", "attack", "attend", "avoid", "begin", "believe", "belong", "breathe", "bring",\
"build", "burn", "buy", "call", "care", "carry", "catch", "change", "check", "choose",\
"claim", "clean", "close", "collect", "come", "compare", "consider", "continue", "control", "cook",\
"count", "create", "cry", "decide", "defend", "delay", "depend", "describe", "destroy", "develop",\
"die", "discover", "discuss", "disturb", "doubt", "dream", "drive", "drop", "eat", "educate",\
"enjoy", "enter", "escape", "expect", "explain", "express", "fail", "fall", "feed", "feel",\
"fight", "find", "finish", "fix", "fly", "follow", "forget", "forgive", "gather", "give",\
"go", "grow", "guess", "happen", "have", "hear", "help", "hide", "hit", "hold",\
"hope", "hurt", "imagine", "improve", "include", "increase", "inform", "insist", "invite", "join",\
"judge", "keep", "kill", "know", "laugh", "learn", "leave", "lend", "let", "lie",\
"like", "listen", "live", "load", "love", "make", "manage", "mark", "match", "mean",\
"meet", "mention", "move", "need", "notice", "obey", "offer", "open", "order", "organize",\
"pay", "perform", "plan", "play", "point", "prepare", "prevent", "promise", "prove", "provide",\
"pull", "push", "put", "question", "reach", "read", "realize", "receive", "recognize", "recommend",\
"reduce", "refuse", "regret", "remember", "remove", "repeat", "report", "request", "rest", "return",\
"review", "ride", "run", "save", "say", "see", "seem", "sell", "send", "serve",\
"set", "show", "shut", "sing", "sit", "sleep", "smell", "speak", "spend", "stand",\
"start", "stay", "stop", "study", "succeed", "suggest", "support", "surprise", "swim", "take",\
"talk", "teach", "tell", "think", "throw", "touch", "travel", "try", "understand", "use",\
"wait", "walk", "want", "watch", "wear", "win", "work", "write"] # 单词库[^1]
MAX_GUESSES = 6 # 最大猜测次数
HINT_PROMPT_LIMIT = 3 # 提示请求限制
# 随机选择单词
secret_word = random.choice(WORDS).lower()
word_length = len(secret_word)
# 初始化游戏状态
guessed_letters = set()
correct_letters = set()
guesses_left = MAX_GUESSES
hint_count = 0
print(f"欢迎来到猜单词游戏!单词包含{word_length}个字母。你有{MAX_GUESSES}次猜测机会。")
while guesses_left > 0:
# 显示当前状态
display_word = ''.join(
[letter if letter in correct_letters else '_' for letter in secret_word]
)
print(f"\n当前单词: {display_word}")
print(f"已尝试字母: {' '.join(sorted(guessed_letters))}")
print(f"剩余尝试次数: {guesses_left}")
# 玩家输入
guess = input("请输入一个字母或输入'hint'获取提示: ").lower()
# 处理提示请求
if guess == 'hint':
if hint_count < HINT_PROMPT_LIMIT:
hint_count += 1
# 随机显示一个未猜出的字母
unrevealed = [l for l in secret_word if l not in correct_letters]
if unrevealed:
hint_letter = random.choice(unrevealed)
print(f"提示: 字母 '{hint_letter}' 在单词中")
correct_letters.add(hint_letter)
else:
print("提示: 所有字母已被猜出!")
else:
print("提示次数已用完!")
continue
# 验证输入
if len(guess) != 1 or not guess.isalpha():
print("请输入单个字母!")
continue
# 检查是否已尝试过
if guess in guessed_letters:
print("你已尝试过这个字母!")
continue
guessed_letters.add(guess)
# 检查猜测结果
if guess in secret_word:
correct_letters.add(guess)
print(f"正确! 字母 '{guess}' 在单词中")
# 检查是否获胜
if set(secret_word) <= correct_letters:
print(f"\n恭喜! 你猜对了单词: {secret_word}")
print(f"剩余尝试次数: {guesses_left}")
return
else:
guesses_left -= 1
print(f"错误! 字母 '{guess}' 不在单词中")
# 游戏失败
print(f"\n游戏结束! 正确单词是: {secret_word}")
print(f"你猜中的字母: {' '.join(correct_letters)}")
# 启动游戏
if __name__ == "__main__":
word_guessing_game()
3、猜数字
打包代码(记得换成自己的地址)
Pyinstaller -F W:\学徒\工程\2\游戏\猜数字.py
直接打包
Pyinstaller -i C:\Users\31253\Desktop\mmm.ico -F W:\学徒\工程\2\游戏\猜数字.py
添加封面图片
代码
import time
import random
a=random.randint(1,9999)
while True:
try:
time.sleep(0.5)
b=int(input("请输入一个在四位以内的数字:"))
while (b>10000 or b<0):
time.sleep(0.5)
print("输入数字不对")
continue
except :
time.sleep(0.5)
print("输入数字不符合")
break
if (b<=10000 and b>=0)and (a==b):
time.sleep(0.5)
print("你猜对了!")
c=input("是否继续玩Y/N:")
if c=='Y':
time.sleep(0.5)
print("再来一局")
continue
elif c=='N':
time.sleep(0.5)
print("游戏结束")
break
else:
time.sleep(0.5)
print("不认真回答,游戏结束")
break
elif (b<=10000 and b>=0)and a>=b:
time.sleep(0.5)
print("往大的猜")
continue
elif (b<=10000 and b>=0)and a<=b:
time.sleep(0.5)
print("往小的猜")
time.sleep(0.5)
三、找到自己打包的可执行文件
打包完成后会显示如下内容(红色框显示的就是打包的位置)
打开后就是这样的文件