Python代码,能玩30多款童年游戏!这些有几个是你玩过的

article/2025/8/8 18:19:43

大游戏小游戏有千千万万,这些小游戏应该只有90后才玩过和懂吧

儿童节即将到来,虽然秃头程序员没有头发,但是童心还是一直都在的,今天就分享一些私藏的童年游戏,十几行代码就能进入使用Python开发的小游戏快乐玩耍! 

使用工具:

Python3.8、pycharm2020

也可以不安装pycharm2020也可以直接运行~但是安装了些会好一点

1.五子棋

源码:

'''游戏开始界面'''
class gameStartUI(QWidget):def __init__(self, parent=None, **kwargs):super(gameStartUI, self).__init__(parent)self.setFixedSize(760, 650)self.setWindowTitle('五子棋 —— 九歌')self.setWindowIcon(QIcon(cfg.ICON_FILEPATH))# 背景图片palette = QPalette()palette.setBrush(self.backgroundRole(), QBrush(QPixmap(cfg.BACKGROUND_IMAGEPATHS.get('bg_start'))))self.setPalette(palette)# 按钮# --人机对战self.ai_button = PushButton(cfg.BUTTON_IMAGEPATHS.get('ai'), self)self.ai_button.move(250, 200)self.ai_button.show()self.ai_button.click_signal.connect(self.playWithAI)# --联机对战self.online_button = PushButton(cfg.BUTTON_IMAGEPATHS.get('online'), self)self.online_button.move(250, 350)self.online_button.show()self.online_button.click_signal.connect(self.playOnline)'''人机对战'''def playWithAI(self):self.close()self.gaming_ui = playWithAIUI(cfg)self.gaming_ui.exit_signal.connect(lambda: sys.exit())self.gaming_ui.back_signal.connect(self.show)self.gaming_ui.show()'''联机对战'''def playOnline(self):self.close()self.gaming_ui = playOnlineUI(cfg, self)self.gaming_ui.show()'''run'''
if __name__ == '__main__':app = QApplication(sys.argv)handle = gameStartUI()font = QFont()font.setPointSize(12)handle.setFont(font)handle.show()sys.exit(app.exec_())

 2.超级玛丽

这个源码超级多多,文件很大很大~

如果对Python爬虫、数据分析、机器学习、人工智能、面试经验、接单兼职、代码画图、游戏代码感兴趣可以进到881744585,群内会有不定期的分享学习资料和有趣的代码。还会有技术大牛,业内同行一起交流技术

else:breakInterface(screen, cfg, mode='game_end')可以关注公众号:学习py最风sao的方式
pygame.display.update()clock.tick(cfg.FPS)if is_win_flag:

 3.炸弹人

 源码:

'''游戏主程序'''
def main(cfg):# 初始化pygame.init()pygame.mixer.init()pygame.mixer.music.load(cfg.BGMPATH)pygame.mixer.music.play(-1, 0.0)screen = pygame.display.set_mode(cfg.SCREENSIZE)pygame.display.set_caption('Bomber Man —— 九歌')# 开始界面Interface(screen, cfg, mode='game_start')# 游戏主循环font = pygame.font.SysFont('Consolas', 15)for gamemap_path in cfg.GAMEMAPPATHS:# -地图map_parser = mapParser(gamemap_path, bg_paths=cfg.BACKGROUNDPATHS, wall_paths=cfg.WALLPATHS, blocksize=cfg.BLOCKSIZE)# -水果fruit_sprite_group = pygame.sprite.Group()used_spaces = []for i in range(5):coordinate = map_parser.randomGetSpace(used_spaces)used_spaces.append(coordinate)fruit_sprite_group.add(Fruit(random.choice(cfg.FRUITPATHS), coordinate=coordinate, blocksize=cfg.BLOCKSIZE))# -我方Herocoordinate = map_parser.randomGetSpace(used_spaces)used_spaces.append(coordinate)ourhero = Hero(imagepaths=cfg.HEROZELDAPATHS, coordinate=coordinate, blocksize=cfg.BLOCKSIZE, map_parser=map_parser, hero_name='ZELDA')# -电脑Heroaihero_sprite_group = pygame.sprite.Group()coordinate = map_parser.randomGetSpace(used_spaces)aihero_sprite_group.add(Hero(imagepaths=cfg.HEROBATMANPATHS, coordinate=coordinate, blocksize=cfg.BLOCKSIZE, map_parser=map_parser, hero_name='BATMAN'))used_spaces.append(coordinate)coordinate = map_parser.randomGetSpace(used_spaces)aihero_sprite_group.add(Hero(imagepaths=cfg.HERODKPATHS, coordinate=coordinate, blocksize=cfg.BLOCKSIZE, map_parser=map_parser, hero_name='DK'))used_spaces.append(coordinate)# -炸弹bombbomb_sprite_group = pygame.sprite.Group()# -用于判断游戏胜利或者失败的flagis_win_flag = False# -主循环screen = pygame.display.set_mode(map_parser.screen_size)clock = pygame.time.Clock()while True:dt = clock.tick(cfg.FPS)for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit(-1)# --↑↓←→键控制上下左右, 空格键丢炸弹elif event.type == pygame.KEYDOWN:if event.key == pygame.K_UP:ourhero.move('up')elif event.key == pygame.K_DOWN:ourhero.move('down')elif event.key == pygame.K_LEFT:ourhero.move('left')elif event.key == pygame.K_RIGHT:ourhero.move('right')elif event.key == pygame.K_SPACE:if ourhero.bomb_cooling_count <= 0:bomb_sprite_group.add(ourhero.generateBomb(imagepath=cfg.BOMBPATH, digitalcolor=cfg.YELLOW, explode_imagepath=cfg.FIREPATH))screen.fill(cfg.WHITE)# --电脑Hero随机行动for hero in aihero_sprite_group:action, flag = hero.randomAction(dt)if flag and action == 'dropbomb':bomb_sprite_group.add(hero.generateBomb(imagepath=cfg.BOMBPATH, digitalcolor=cfg.YELLOW, explode_imagepath=cfg.FIREPATH))# --吃到水果加生命值(只要是Hero, 都能加)ourhero.eatFruit(fruit_sprite_group)for hero in aihero_sprite_group:hero.eatFruit(fruit_sprite_group)# --游戏元素都绑定到屏幕上map_parser.draw(screen)for bomb in bomb_sprite_group:if not bomb.is_being:bomb_sprite_group.remove(bomb)explode_area = bomb.draw(screen, dt, map_parser)if explode_area:# --爆炸火焰范围内的Hero生命值将持续下降if ourhero.coordinate in explode_area:ourhero.health_value -= bomb.harm_valuefor hero in aihero_sprite_group:if hero.coordinate in explode_area:hero.health_value -= bomb.harm_valuefruit_sprite_group.draw(screen)for hero in aihero_sprite_group:hero.draw(screen, dt)ourhero.draw(screen, dt)# --左上角显示生命值pos_x = showText(screen, font, text=ourhero.hero_name+'(our):'+str(ourhero.health_value), color=cfg.YELLOW, position=[5, 5])for hero in aihero_sprite_group:pos_x, pos_y = pos_x+15, 5pos_x = showText(screen, font, text=hero.hero_name+'(ai):'+str(hero.health_value), color=cfg.YELLOW, position=[pos_x, pos_y])# --我方玩家生命值小于等于0/电脑方玩家生命值均小于等于0则判断游戏结束if ourhero.health_value <= 0:is_win_flag = Falsebreakfor hero in aihero_sprite_group:if hero.health_value <= 0:aihero_sprite_group.remove(hero)if len(aihero_sprite_group) == 0:is_win_flag = Truebreakpygame.display.update()clock.tick(cfg.FPS)if is_win_flag:Interface(screen, cfg, mode='game_switch')else:breakInterface(screen, cfg, mode='game_end')'''run'''
if __name__ == '__main__':while True:main(cfg)

 4.推箱子

 源码:

'''开始游戏'''
def startGame(screen):clock = pygame.time.Clock()# 加载字体font = pygame.font.SysFont('arial', 18)if not os.path.isfile('score'):f = open('score', 'w')f.write('0')f.close()with open('score', 'r') as f:highest_score = int(f.read().strip())# 敌方enemies_group = pygame.sprite.Group()for i in range(55):if i < 11:enemy = enemySprite('small', i, cfg.WHITE, cfg.WHITE)elif i < 33:enemy = enemySprite('medium', i, cfg.WHITE, cfg.WHITE)else:enemy = enemySprite('large', i, cfg.WHITE, cfg.WHITE)enemy.rect.x = 85 + (i % 11) * 50enemy.rect.y = 120 + (i // 11) * 45enemies_group.add(enemy)boomed_enemies_group = pygame.sprite.Group()en_bullets_group = pygame.sprite.Group()ufo = ufoSprite(color=cfg.RED)# 我方myaircraft = aircraftSprite(color=cfg.GREEN, bullet_color=cfg.WHITE)my_bullets_group = pygame.sprite.Group()# 用于控制敌方位置更新# --移动一行enemy_move_count = 24enemy_move_interval = 24enemy_move_flag = False# --改变移动方向(改变方向的同时集体下降一次)enemy_change_direction_count = 0enemy_change_direction_interval = 60enemy_need_down = Falseenemy_move_right = Trueenemy_need_move_row = 6enemy_max_row = 5# 用于控制敌方发射子弹enemy_shot_interval = 100enemy_shot_count = 0enemy_shot_flag = False# 游戏进行中running = Trueis_win = False# 主循环while running:screen.fill(cfg.BLACK)for event in pygame.event.get():# --点右上角的X或者按Esc键退出游戏if event.type == pygame.QUIT:pygame.quit()sys.exit()if event.type == pygame.KEYDOWN:if event.key == pygame.K_ESCAPE:pygame.quit()sys.exit()# --射击if event.type == pygame.MOUSEBUTTONDOWN:my_bullet = myaircraft.shot()if my_bullet:my_bullets_group.add(my_bullet)# --我方子弹与敌方/UFO碰撞检测for enemy in enemies_group:if pygame.sprite.spritecollide(enemy, my_bullets_group, True, None):boomed_enemies_group.add(enemy)enemies_group.remove(enemy)myaircraft.score += enemy.rewardif pygame.sprite.spritecollide(ufo, my_bullets_group, True, None):ufo.is_dead = Truemyaircraft.score += ufo.reward# --更新并画敌方# ----敌方子弹enemy_shot_count += 1if enemy_shot_count > enemy_shot_interval:enemy_shot_flag = Trueenemies_survive_list = [enemy.number for enemy in enemies_group]shot_number = random.choice(enemies_survive_list)enemy_shot_count = 0# ----敌方移动enemy_move_count += 1if enemy_move_count > enemy_move_interval:enemy_move_count = 0enemy_move_flag = Trueenemy_need_move_row -= 1if enemy_need_move_row == 0:enemy_need_move_row = enemy_max_rowenemy_change_direction_count += 1if enemy_change_direction_count > enemy_change_direction_interval:enemy_change_direction_count = 1enemy_move_right = not enemy_move_rightenemy_need_down = True# ----每次下降提高移动和射击速度enemy_move_interval = max(15, enemy_move_interval-3)enemy_shot_interval = max(50, enemy_move_interval-10)# ----遍历更新for enemy in enemies_group:if enemy_shot_flag:if enemy.number == shot_number:en_bullet = enemy.shot()en_bullets_group.add(en_bullet)if enemy_move_flag:if enemy.number in range((enemy_need_move_row-1)*11, enemy_need_move_row*11):if enemy_move_right:enemy.update('right', cfg.SCREENSIZE[1])else:enemy.update('left', cfg.SCREENSIZE[1])else:enemy.update(None, cfg.SCREENSIZE[1])if enemy_need_down:if enemy.update('down', cfg.SCREENSIZE[1]):running = Falseis_win = Falseenemy.change_count -= 1enemy.draw(screen)enemy_move_flag = Falseenemy_need_down = Falseenemy_shot_flag = False# ----敌方爆炸特效for boomed_enemy in boomed_enemies_group:if boomed_enemy.boom(screen):boomed_enemies_group.remove(boomed_enemy)del boomed_enemy# --敌方子弹与我方飞船碰撞检测if not myaircraft.one_dead:if pygame.sprite.spritecollide(myaircraft, en_bullets_group, True, None):myaircraft.one_dead = Trueif myaircraft.one_dead:if myaircraft.boom(screen):myaircraft.resetBoom()myaircraft.num_life -= 1if myaircraft.num_life < 1:running = Falseis_win = Falseelse:# ----更新飞船myaircraft.update(cfg.SCREENSIZE[0])# ----画飞船myaircraft.draw(screen)if (not ufo.has_boomed) and (ufo.is_dead):if ufo.boom(screen):ufo.has_boomed = Trueelse:# ----更新UFOufo.update(cfg.SCREENSIZE[0])# ----画UFOufo.draw(screen)# --画我方飞船子弹for bullet in my_bullets_group:if bullet.update():my_bullets_group.remove(bullet)del bulletelse:bullet.draw(screen)# --画敌方子弹for bullet in en_bullets_group:if bullet.update(cfg.SCREENSIZE[1]):en_bullets_group.remove(bullet)del bulletelse:bullet.draw(screen)if myaircraft.score > highest_score:highest_score = myaircraft.score# --得分每增加2000我方飞船增加一条生命if (myaircraft.score % 2000 == 0) and (myaircraft.score > 0) and (myaircraft.score != myaircraft.old_score):myaircraft.old_score = myaircraft.scoremyaircraft.num_life = min(myaircraft.num_life + 1, myaircraft.max_num_life)# --敌人都死光了的话就胜利了if len(enemies_group) < 1:is_win = Truerunning = False# --显示文字# ----当前得分showText(screen, 'SCORE: ', cfg.WHITE, font, 200, 8)showText(screen, str(myaircraft.score), cfg.WHITE, font, 200, 24)# ----敌人数量showText(screen, 'ENEMY: ', cfg.WHITE, font, 370, 8)showText(screen, str(len(enemies_group)), cfg.WHITE, font, 370, 24)# ----历史最高分showText(screen, 'HIGHEST: ', cfg.WHITE, font, 540, 8)showText(screen, str(highest_score), cfg.WHITE, font, 540, 24)# ----FPSshowText(screen, 'FPS: ' + str(int(clock.get_fps())), cfg.RED, font, 8, 8)# --显示剩余生命值showLife(screen, myaircraft.num_life, cfg.GREEN)pygame.display.update()clock.tick(cfg.FPS)with open('score', 'w') as f:f.write(str(highest_score))return is_win'''主函数'''
def main():# 初始化pygame.init()pygame.display.set_caption('外星人入侵 —— 九歌')screen = pygame.display.set_mode(cfg.SCREENSIZE)pygame.mixer.init()pygame.mixer.music.load(cfg.BGMPATH)pygame.mixer.music.set_volume(0.4)pygame.mixer.music.play(-1)while True:is_win = startGame(screen)endInterface(screen, cfg.BLACK, is_win)'''run'''
if __name__ == '__main__':main()

 5.扫雷

上学时恨不得一直待在电脑房玩这个游戏,哈哈哈

第二种AI贪吃蛇 

经典游戏俄罗斯方块

 

太多了就不一一展示啦


http://chatgpt.dhexx.cn/article/gbSRFBhg.shtml

相关文章

一口气用Python写了13个小游戏(附源码)

仅限技术学习参考 分享13个游戏源码&#xff0c;可以自己复现玩玩&#xff0c;研究下里面的编程逻辑&#xff0c;对学习编程&#xff08;特别是初学者&#xff09;应该会有很大帮助。 1、吃金币 源码分享&#xff1a; import os import cfg import sys import pygame import…

JSP校验必填项

输入框为input标签&#xff0c;在保存的function() 里增加校验&#xff1b;

android textview 必填,在android中如何使用Html渲染的方式实现必填项前面的*号

本篇文章主要介绍了android中使用Html渲染的方式实现必填项前面的*号示例&#xff0c;具有一定的参考价值&#xff0c;有兴趣的可以了解一下 项目的个人基本信息UI界面效果图如下&#xff0c;有一个红色的*号&#xff0c;并且跟它挨着的文字颜色不一样。简友们&#xff0c;你们…

php邮箱必填,WordPress移除用户新注册时邮件必填选项(注册不填邮箱/邮箱非必填)...

使用WordPress搭建的网站是支持用户注册做商城网站的&#xff0c;注册的时候默认要求用户填写一个邮箱&#xff0c;并且是必须填写的&#xff0c;而某些网站情况特殊&#xff0c;可能并不需要强制填写邮件&#xff0c;所以我们可以通过下面的代码把强制填写邮件功能改为必填项目…

element ui表单必填_详解element-ui设置下拉选择切换必填和非必填

? 需求 默认都是必选 下拉选择的时候 选择必填&#xff0c;活动名称为必填&#xff0c;需要校验和显示* 选择非必填&#xff0c;活动名称不做校验&#xff0c;隐藏* ? 初始校验规则 经测试&#xff0c;网上其他的方式都没有实现需求&#xff0c;动态切换rules中的required没有…

必填校验 验证问题

今天做项目的时候&#xff0c;突然发现在新增和保存的时候有个必填校验明明加了&#xff0c;但是没有填写&#xff0c;结果竟然没有提示。原来是接收的验证对象不一样造成的&#xff0c;从而忽略了对他的校验。 当我对处理应收单类型没选取的时候&#xff0c;进行新增或者保存…

easypoi必填项_easypoi必填项_EasyPoi使用入门

咱们在开发的时候&#xff0c;总会遇到需要通过代码操作办公软件的情况&#xff0c;而excel与word的操作最为频繁。 当然我们Java程序员可以选择JXL或者POI来完成相应的Excel操作&#xff0c;但是大家用过都知道&#xff0c;有些地方感觉还是不够简单&#xff0c;不那么尽如人意…

php邮箱必填,discuz关闭邮箱注册必填选项

由于需要,我要做的网站不需要注册的时候填写邮件,需要关闭必填,于是从网上找了教程,发现没有后台的选项,之后知道,discuz3.2之后就取消 取消邮箱必填 这个选项了,于是从网上找了点资料,成功关闭邮箱注册必填选项。 情况1:disczu3.2之前的版本,直接在后台-----全局--…

html 必填设置,html如何设置必填项

在html中&#xff0c;可以使用required属性来设置必填项&#xff0c;需要在input元素标签中添加“required"required"”样式即可。required属性规定必需在提交之前填写输入字段。如果使用该属性&#xff0c;则字段是必填(或必选)的。 本教程操作环境&#xff1a;wind…

vue 设置表单必填项

1.要求 在做一些用户信息相关的功能时&#xff0c;经常用到表单项去收集数据&#xff0c;其中有些属性必须填写&#xff0c;要求如图&#xff1a; 2.实现方法 在data中添加一个rules来规定&#xff1a; rules: {no: [{required: true, message: 请输入账号, trigger:…

vue设置必填项和判断必填项是否填入的弹窗提示

项目场景&#xff1a; 有的功能需要设置必填项,当然也需要判断是不是添上了,还需要加上提示框 问题描述 1.如何设置必填项 2.如何设置弹窗提示 3.如何将二者结合起来实现点击时既可以判断必填项也可以弹出提示框 原因分析&#xff1a; 其他两个我没有什么问题,在将二者结合…

莫队算法——从入门到黑题

众所周知,莫队是由莫涛大神提出的,一种玄学毒瘤暴力骗分区间操作算法,它以简短的框架、简单易记的板子和优秀的复杂度闻名于世。然而由于莫队算法应用的毒瘤,很多可做的莫队模板题都有着较高的难度评级,令很多初学者望而却步。然而,如果你真正理解了莫队的算法原理,那么…

莫队(模板 + 带简单修改的莫队)

莫队 这个算法的思想比较简单&#xff0c;我们在做RMQ类问题时&#xff0c;有多次询问的那种&#xff0c;其实在这些询问中有很多都是问的同一段区间&#xff0c;即有的区间被询问的多次&#xff0c;所以我们对询问进行一个排序&#xff0c;假设上次询问我们得到了区间[l,r]的…

莫队 - 基础与扩展

普通莫队 莫队可以说是一个算法&#xff0c;但更多是一种思想。 我们先来看看普通莫队解决的问题&#xff1a; 有一个长度为 n n n 的数列 a a a。 q q q 个询问&#xff1a; a a a 在 [ l i , r i ] [{l_i},r_i] [li​,ri​] 中有多少个不同的数。 不强制在线。 1 ≤ n …

莫队详解

莫队实际很简&#xff08;du&#xff09;单&#xff08;liu&#xff09; 依照某位dalao的说法&#xff0c;就是两只小手&#xff08;two-pointers&#xff09;瞎跳 一.莫队&#xff08;静态莫队&#xff09; 我们以Luogu P3901 数列找不同为例讲一下静态莫队 这道题是个绿题&am…

关于莫队

待补&#xff1a;树上莫队&#xff0c;二次离线莫队 关于莫队 其实是个神奇的暴力算法.. 通常就是一种处理区间的东西 通过上一次的的左端点和右端点跳来跳去 从而得到这次区间的值 很暴力啊...完全不用思考就能懂的 那么 接下来首先是 普通莫队 排序和移动两点提及一下 …

莫队(普通莫队,带修莫队,树上莫队)

听说 莫队算法是一种“优雅的暴力”&#xff08;小声bb&#xff09;。 普通莫队 1/ 引入 problem&#xff1a;给你一个长度为n的数组&#xff0c;有m次查询&#xff0c;每次查询询问一个区间[L, R]内有多少个不同的数。 首先想想暴力怎么做。 开一个数组用来记数&#xff0c…

回滚莫队解析

&#xff08;南昌理工ACM集训队&#xff09; 泻药&#xff0c;不匿&#xff08;bushi&#xff09; 浅谈莫队回滚莫队样例小结 浅谈莫队 莫队是要摸清回滚莫队必须掌握的前置技能(๑ŐдŐ)b 前两天打多校有幸接触了莫队算法&#xff0c;花了几天时间搞懂了这些东西&#xff0…

【莫队/树上莫队/回滚莫队】原理详解及例题:小B的询问(普通莫队),Count on a tree II(树上莫队),kangaroos(回滚莫队)

文章目录 问题引入介绍莫队算法及其实现过程时间复杂度莫队算法适用范围莫队奇偶优化普通莫队&#xff1a;小B的询问树上莫队&#xff1a;SP10707 COT2 - Count on a tree II回滚莫队&#xff1a;[PA2011]Kangaroos upd&#xff1a;2021-08-11&#xff1a;重新对博客进行了外观…

超全的莫队算法一遍过

前置知识&#xff1a;双指针、分块 简单概括而言&#xff0c;莫队是一个离线算法&#xff0c;核心思想是将所有的询问按照分块进行排序后&#xff0c;对于每个询问可以通过双指针增删数据来达到总体的复杂度。 莫队通常用来解决求一段区间内不同数的个数相关的问题。 目录 1、…