用Python实现的这五个小游戏,你真的学会了嘛?

article/2025/9/12 2:49:59

相关文件

源码分享,问题解答!!
关注小编,私信小编领取哟!
当然别忘了一件三连哟~~

对了大家可以关注小编的公众号哟~~
有很多资源可以领取的哟!!

Python日志在这里插入图片描述

游戏名称

  1. 五子棋
  2. 雷霆战机
  3. 贪吃蛇
  4. 坦克大战
  5. 俄罗斯方块

开发环境

Python版本:3.6.4
相关模块:
pygame模块;
以及一些Python自带的模块。

环境搭建

安装Python并添加到环境变量,pip安装需要的相关模块即可。

一:五子棋

五子棋是是一种两人对弈的纯策略型棋类游戏。

五子棋有两种玩法。玩法一:双方分别使用黑白两色的棋子,下在棋盘直线与横线的交叉点上,先形成五子连线者获胜。玩法二:自己形成五子连线就替换对方任意一枚棋子。被替换的棋子可以和对方交换棋子。最后以先出完所有棋子的一方为胜。

pygame模块

游戏采用pygame模块需要先安装

pip install pygame

窗口启动

import pygamepygame.init()
pygame.display.set_caption('五子棋-IT入门') # 改标题
# pygame.display.set_mode()表示建立个窗口,左上角为坐标原点,往右为x正向,往下为y轴正向
screen = pygame.display.set_mode((640,640))

绘制棋子
需要说一下的是画棋子,因为没找到什么合适的棋子图片,所以只要自己来画棋子。
我们用pygame.draw.circle

绘制棋盘

定义棋盘这个类
class RenjuBoard(object):def __init__(self):# self._board = board = [[EMPTY] * 15 for _ in range(15)]# 将棋盘每一个交叉点都看作列表的一个元素位,一共有15*15共225个元素self._board = [[]] * 15self.reset()#重置棋盘def reset(self):for row in range(len(self._board)):self._board[row] = [EMPTY] * 15#定义棋盘上的下棋函数,row表示行,col表示列,is_black表示判断当前点位该下黑棋,还是白棋def move(self, row, col, is_black):if self._board[row][col] == EMPTY:self._board[row][col] = BLACK if is_black else WHITEreturn Truereturn False# 给棋盘定义一个函数将自己在screen上面画出来,使用pygame.draw()函数。并且顺便将下了的棋子也画出来def draw(self, screen):for h in range(1, 16):pygame.draw.line(screen, black_color,[40, h * 40], [600, h * 40], 1)pygame.draw.line(screen, black_color,[h * 40,40], [h * 40, 600], 1)# 给棋盘加一个外框,使美观pygame.draw.rect(screen, black_color, [36, 36, 568, 568], 3)# 在棋盘上标出,天元以及另外4个特殊点位pygame.draw.circle(screen, black_color, [320, 320], 5, 0)pygame.draw.circle(screen, black_color, [160, 160], 3, 0)pygame.draw.circle(screen, black_color, [160, 480], 3, 0)pygame.draw.circle(screen, black_color, [480, 160], 3, 0)pygame.draw.circle(screen, black_color, [480, 480], 3, 0)#做2次for循环取得棋盘上所有交叉点的坐标for row in range(len(self._board)):for col in range(len(self._board[row])):# 将下在棋盘上的棋子画出来if self._board[row][col] != EMPTY:ccolor = black_color \if self._board[row][col] == BLACK else white_color# 取得这个交叉点下的棋子的颜色,并将棋子画出来pos = [40 * (col + 1), 40 * (row + 1)]# 画出棋子pygame.draw.circle(screen, ccolor, pos, 18, 0)

最后就是代码的实现啦,代码有点长我就不一一写出来啦,需要的小伙伴可以看相关文件哟!!

效果展示
在这里插入图片描述

二:雷霆战机

敌人精灵
首先定义Mob(小怪物)类型:

class Mob(pygame.sprite.Sprite):def __init__(self):pygame.sprite.Sprite.__init__(self)self.image = pygame.Surface((30, 40))self.image.fill(RED)self.rect = self.image.get_rect()self.rect.x = random.randrange(WIDTH - self.rect.width)self.rect.y = random.randrange(-100, -40)self.speedy = random.randrange(1, 8)

这里的关键是为小怪物初始化一个好的位置。选择一个高于顶部的值(y <0)和一个介于左右两边之间的x的随机值。

在update函数中,更新精灵y轴的坐标,向下移动精灵;精灵离开底部时,通过将精灵移回顶部上方的随机位置来制造下一个精灵。

def update(self):self.rect.y += self.speedyif self.rect.top > HEIGHT + 10:self.rect.x = random.randrange(WIDTH - self.rect.width)self.rect.y = random.randrange(-100, -40)self.speedy = random.randrange(1, 8)

一群敌机
使用for语句,循环创建一些怪物,并将它们添加到精灵组中:

player = Player()
all_sprites.add(player)
for i in range(8):m = Mob()all_sprites.add(m)mobs.add(m)

这很棒,但让小怪直接向下移动有点无聊。让在x方向上添加一点运动:

class Mob(pygame.sprite.Sprite):def __init__(self):pygame.sprite.Sprite.__init__(self)self.image = pygame.Surface((30, 40))self.image.fill(RED)self.rect = self.image.get_rect()self.rect.x = random.randrange(WIDTH - self.rect.width)self.rect.y = random.randrange(-100, -40)self.speedy = random.randrange(1, 8)self.speedx = random.randrange(-3, 3)def update(self):self.rect.x += self.speedxself.rect.y += self.speedyif self.rect.top > HEIGHT + 10 or self.rect.left < -25 or self.rect.right > WIDTH + 20:self.rect.x = random.randrange(WIDTH - self.rect.width)self.rect.y = random.randrange(-100, -40)self.speedy = random.randrange(1, 8)

效果实现
在这里插入图片描述
在这里插入图片描述

需要源码的小伙伴一样的可以看相关文件哈!!!!

三:贪吃蛇

原理介绍

贪吃蛇的游戏规则应该不需要我多做介绍了吧T_T。写个贪吃蛇游戏其实还是很简单的。首先,我们进行一下游戏初始化:

pygame.init()
screen = pygame.display.set_mode(cfg.SCREENSIZE)
clock = pygame.time.Clock()

然后定义一个贪吃蛇类:

'''贪吃蛇类'''
class Snake(pygame.sprite.Sprite):def __init__(self, cfg, **kwargs):pygame.sprite.Sprite.__init__(self)self.cfg = cfgself.head_coord = [random.randint(5, cfg.GAME_MATRIX_SIZE[0]-6), random.randint(5, cfg.GAME_MATRIX_SIZE[1]-6)]self.tail_coords = []for i in range(1, 3):self.tail_coords.append([self.head_coord[0]-i, self.head_coord[1]])self.direction = 'right'self.head_colors = [(0, 80, 255), (0, 255, 255)]self.tail_colors = [(0, 155, 0), (0, 255, 0)]

其中head_coord用来记录蛇头所在位置,而tail_coords是一个二维数组,用来记录所有蛇身的位置。一开始,贪吃蛇长为3,并且位置是随机生成的。用户通过↑↓←→键来控制贪吃蛇的行动:

# --按键检测
for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()elif event.type == pygame.KEYDOWN:if event.key in [pygame.K_UP, pygame.K_DOWN, pygame.K_LEFT, pygame.K_RIGHT]:snake.setDirection({pygame.K_UP: 'up', pygame.K_DOWN: 'down', pygame.K_LEFT: 'left', pygame.K_RIGHT: 'right'}[event.key])

需要注意的是,贪吃蛇不能180°大拐弯,只能90°地拐弯。例如正在向左行动的贪吃蛇不能瞬间变成向右行动。具体而言,代码实现如下:

'''设置方向'''
def setDirection(self, direction):assert direction in ['up', 'down', 'right', 'left']if direction == 'up':if self.head_coord[1]-1 != self.tail_coords[0][1]:self.direction = directionelif direction == 'down':if self.head_coord[1]+1 != self.tail_coords[0][1]:self.direction = directionelif direction == 'left':if self.head_coord[0]-1 != self.tail_coords[0][0]:self.direction = directionelif direction == 'right':if self.head_coord[0]+1 != self.tail_coords[0][0]:self.direction = direction

然后,我们需要随机生成一个食物,且需要保证该食物的位置不与贪吃蛇的位置相同:
‘’‘食物类’’’

class Apple(pygame.sprite.Sprite):def __init__(self, cfg, snake_coords, **kwargs):pygame.sprite.Sprite.__init__(self)self.cfg = cfgwhile True:self.coord = [random.randint(0, cfg.GAME_MATRIX_SIZE[0]-1), random.randint(0, cfg.GAME_MATRIX_SIZE[1]-1)]if self.coord not in snake_coords:breakself.color = (255, 0, 0)'''画到屏幕上'''def draw(self, screen):cx, cy = int((self.coord[0] + 0.5) * self.cfg.BLOCK_SIZE), int((self.coord[1] + 0.5) * self.cfg.BLOCK_SIZE)pygame.draw.circle(screen, self.color, (cx, cy), self.cfg.BLOCK_SIZE//2-2)
# 随机生成一个食物
apple = Apple(cfg, snake.coords)

在更新贪吃蛇的时候,如果它吃到了食物,则蛇身长加一,否则只是简单的按照给定的方向行动而不改变蛇身长度:

'''更新贪吃蛇'''
def update(self, apple):# 根据指定的方向运动self.tail_coords.insert(0, copy.deepcopy(self.head_coord))if self.direction == 'up':self.head_coord[1] -= 1elif self.direction == 'down':self.head_coord[1] += 1elif self.direction == 'left':self.head_coord[0] -= 1elif self.direction == 'right':self.head_coord[0] += 1# 判断是否吃到了食物if self.head_coord == apple.coord:return Trueelse:self.tail_coords = self.tail_coords[:-1]return False

效果实现
在这里插入图片描述
视频教学:点击可以查看教学视频

四:坦克大战

坦克大战这个游戏相信是一代人的回忆吧,话不多说,这次先上代码
依旧是老样子
我们先定义这次代码所需要的模块

import pygame
from pygame.locals import *
import math
import random

扩展战场

def expand_battle_field():for row in small_battle_field:new_row = []for column in row:new_row.extend([column] * 2)battle_field.append(new_row)battle_field.append(new_row[:])

定义区域

def area_conflict(area1, area2):for point1 in area1:if point1 in area2:return Truereturn False

定义绘制战场

def draw_battle_field():global symbol_positionglobal symbol_areafor row_index in range(y_max):for column_index in range(x_max):if battle_field[row_index][column_index] == 1:# is a brick_wallscreen.blit(brick_wall_img, (column_index * 30, row_index * 30))if battle_field[row_index][column_index] == 2:# is a cement_wallscreen.blit(cement_wall_img, (column_index * 30, row_index * 30))if symbol_position != None:continueif battle_field[row_index][column_index] == 3:# is a symbolsymbol_position = (column_index, row_index)symbol_area = ((column_index, row_index),(column_index + 1, row_index),(column_index, row_index + 1),(column_index + 1, row_index + 1))if game_over:screen.blit(symbol_destoryed_img, (symbol_position[0] * 30, symbol_position[1] * 30))else:screen.blit(symbol_img, (symbol_position[0] * 30, symbol_position[1] * 30))

时间

def produce_enemy(time):global last_productglobal enemys_cur_numberif last_product != -1 and time - last_product < enemys_product_interval:returnindex_e = random.randint(0, 1)conflict = Falsefor point in tank.area:if point in enemy_init_area[index_e]:conflict = Truebreakif not conflict:for enemy in enemys:for point_e in enemy.area:if point_e in enemy_init_area[index_e]:conflict = Truebreakif conflict:break;if not conflict:enemys.append(Enemy(enemy_init_position[index_e]))last_product = timeenemys_cur_number += 1returnfor point in tank.area:if point in enemy_init_area[1 - index_e]:returnfor enemy in enemys:for point_e in enemy.area:if point_e in enemy_init_area[1 - index_e]:returnenemys.append(Enemy(enemy_init_position[1 - index_e]))last_product = timeenemys_cur_number += 1

效果实现
在这里插入图片描述
在这里插入图片描述

五:俄罗斯方块

相信大家都玩过俄罗斯方块吧,应该是小时候的回忆吧,但是想不想了解一下这个程序是怎么写出来的呢,自己写出来的应该玩起来更有感觉吧!
接下来,我就分享一下这个游戏的源码过程啊!

先用python创建一个py文件

定义这次程序所需要的类

import sys
import time
import pygame
from pygame.localsimport *
import blocks

然后写出它所需要的模块

SIZE =30 # 每个小方格大小
BLOCK_HEIGHT =25  # 游戏区高度
BLOCK_WIDTH =10  # 游戏区宽度
BORDER_WIDTH =4  # 游戏区边框宽度
BORDER_COLOR = (40, 40, 200)# 游戏区边框颜色
SCREEN_WIDTH = SIZE * (BLOCK_WIDTH +5)# 游戏屏幕的宽
SCREEN_HEIGHT = SIZE * BLOCK_HEIGHT# 游戏屏幕的高
BG_COLOR = (40, 40, 60)# 背景色
BLOCK_COLOR = (20, 128, 200)#
BLACK = (0, 0, 0)
RED = (200, 30, 30)# GAME OVER 的字体颜色

画已经落下的方块

def _draw_game_area(screen, game_area):if game_area:for i, row in enumerate(game_area):for j, cell in enumerate(row):if cell != '.':pygame.draw.rect(screen, BLOCK_COLOR, (j * SIZE, i * SIZE, SIZE, SIZE), 0)

画单个方块

def _draw_block(screen, block, offset_x, offset_y, pos_x, pos_y):if block:for i in range(block.start_pos.Y, block.end_pos.Y + 1):for j in range(block.start_pos.X, block.end_pos.X + 1):if block.template[i][j] != '.':pygame.draw.rect(screen, BLOCK_COLOR,(offset_x + (pos_x + j) * SIZE, offset_y + (pos_y + i) * SIZE, SIZE, SIZE), 0)

画得分等信息

def _draw_info(screen, font, pos_x, font_height, score):print_text(screen, font, pos_x, 10, f'得分: ')print_text(screen, font, pos_x, 10 + font_height + 6, f'{score}')print_text(screen, font, pos_x, 20 + (font_height + 6) * 2, f'速度: ')print_text(screen, font, pos_x, 20 + (font_height + 6) * 3, f'{score // 10000}')print_text(screen, font, pos_x, 30 + (font_height + 6) * 4, f'下一个:')if __name__ == '__main__':main()

效果实现:
效果实现:
好啦,今天就的分享就到这里啦,需要源代码的小伙伴可以查看相关文件哟!
也可以关注小编的公众号获取源码和资源哟!!
公众号:Python日志
在这里插入图片描述
更多Python视频教学:Python视频教学


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

相关文章

Python实现四个经典小游戏合集

这篇文章主要介绍了利用Python编写一个经典小游戏的合集,包括:贪吃蛇,扫雷,俄罗斯方块,五子棋。感兴趣的小伙伴可以跟随小编一起学习一下 目录 一、效果展示 1、俄罗斯方块2、扫雷3、五子棋4、贪吃蛇二、代码展示 1、俄罗斯方块2、扫雷3、五子棋4、贪吃蛇 一、效果展示 …

10个python入门小游戏,零基础打通关,就能掌握编程基础

前言 不会python就不能用python开发入门级的小游戏&#xff1f; 当然不是&#xff0c;我收集了十个python入门小游戏的源码和教程&#xff0c;并且即使你没有python基础&#xff0c;只要跟着这十个小游戏的开发详细教程去做&#xff0c;以及有了全部的源码&#xff0c;那就能…

python小游戏源码

见缝插针小游戏&#xff0c;设置关卡&#xff0c;难度逐渐增大&#xff0c;效果图如下&#xff0c;需要的话去个人主页提取资源 部分代码如下&#xff1a; def __init__(self, angle): self.x x0 self.y y0 length self.center (self.x, self.y) …

10个python经典小游戏(上)-五一嗨起来(动图演示+源码分享)

&#x1f41a;作者简介&#xff1a;苏凉&#xff08;专注于网络爬虫&#xff0c;数据分析&#xff09; &#x1f433;博客主页&#xff1a;苏凉.py的博客 &#x1f451;名言警句&#xff1a;海阔凭鱼跃&#xff0c;天高任鸟飞。 &#x1f4f0;要是觉得博主文章写的不错的话&…

30个Python小游戏,小白练手,我都能玩一天

大家好&#xff0c;我是雨雨~ 今天给大家带来30个py小游戏&#xff0c;一定要收藏&#xff01;全部源码都整理好了小游戏源码腾讯文档-在线文档https://docs.qq.com/doc/DRnZDTnFGVUFMc3FL 有手就行 1、吃金币 【有手就行系列不介绍玩法了附源码】 源码分享&#xff1a; i…

6个Python童年小游戏,开始敲起来,玩吧!

你的童年&#xff0c;我的童年好像都一样&#xff0c;谁的童年又没玩过游戏呢&#xff0c;这些小游戏应该只有玩过才会懂吧 虽然程序员敲代码多年&#xff0c;但童心还是一直都在的&#xff0c;今天就分享一些私藏的童年游戏&#xff0c;十几行代码就能进入使用Python开发的小…

Java开发面试简历这么写,命中率达70%

上篇文章我们了解到&#xff0c;想要有面试机会&#xff0c;首先要完成一份好的简历。但是在撰写简历的时候&#xff0c;往往有一些细节很容易被忽视&#xff0c;导致面试机会远远不如自己的期望值。一份经过优化的简历&#xff0c;面试的命中率可以达到70%。那我们就来看看&am…

java开发个人简历模板_java程序开发个人简历模板

java程序开发需要有扎实的程序编码知识&#xff0c;下面java程序开发个人简历模板是小编为大家带来的&#xff0c;欢迎浏览。 java程序开发个人简历模板 延伸阅读 面试&#xff0c;简历很重要&#xff0c;那好的简历模板应该如何制作呢? 写简历之前&#xff0c;你得先站在用人…

JAVA开发(nginx)

主要描述下面4个内容&#xff1a; 1.Nginx的正向代理和反向代理 2.Nginx的动静分离 3.Nginx的负载均衡 4.Nginx的配置详解 解释&#xff1a; Nginx的正向代理&#xff1a;代理的是客户端。 Nginx的反向代理&#xff1a;代理的是服务端。在web服务中&#xff0c;一般都是…

8年Java开发教你如何写简历

前言 成为优秀的架构师是大部分初中级工程师的阶段性目标。优秀的架构师往往具备七种核心能力&#xff1a;编程能力、调试能力、编译部署能力、性能优化能力、业务架构能力、在线运维能力、项目管理能力和规划能力。 这几种能力之间的关系大概如下图。编程能力、调试能力和编…

java开发简历项目经验,面试必会

java基础 1.1java的8种基本数据类型装箱拆箱 1.2重写重载封装继承多态 1.3 Stack Queue 1.7 Concurrent包 1.8面向对象 1.9 String StringBuffer StringBuilder hashcode equ 1.10 java文件读取 1.11 Java反射 1.12 JDK NDK JRE JNI 1.13 static和final的区别 1.14 …

java有关物流管理的简历_Java开发实习生大学生简历模板

求职意向 Java开发实习生 福建福州 薪资面议 随时到岗 教育背景 2020.x -2020x 锤子简历大学 软件工程(本科) 通过CET4/6等级考试 主修课程&#xff1a;Java程序设计、Web程序设计、JavaEE应用开发、数据库系统原理、Linux操作系统、数据通信与计算机网络。 工作经验 2020.x -2…

《R语言入门》如何在Windows下安装R语言编程环境

R语言主页&#xff1a;https://www.r-project.org/ R语言开发环境下载安装地址&#xff1a;https://cran.r-project.org/mirrors.html 这是一个下载镜像站点的列表页面&#xff0c;之前贴了其中一个的链接&#xff0c;结果过了一段时间之后不能访问了&#xff1b; 有Linux…

R语言安装ggcor包

找了很多方法&#xff0c;一直安装不上去&#xff0c;后来把包下载了本地&#xff0c;用本地安装的方法&#xff0c;也还是报错。后来兜兜转转找到了这个方法&#xff0c;非常好用&#xff01;参考了看见你啦&#xff0c;自己根据实际情况&#xff0c;也稍作修改。 1.下载ggco…

【入门】R语言最详细Windows安装指南

登录R语言官网https://www.r-project.org/ 选择CRAN mirror 下拉找到China 选择其中任意一个&#xff0c;这里我选的是清华的一个mirror 点开后选择Download R for Windows&#xff08;如果是其他系统则选择其他对应链接&#xff09; 选择base 得到 选择Download R 3.5.3 fo…

R 安装详解

目录 1.R软件 的下载 1.1 R下载 1.2 RStudio下载 2.辅助软件 notepad 3.R 扩展软件包的安装与管理 4.基本 R 软件的用法 1.基本运行 2.项目目录 5.RStudio 软件 1.介绍 2.项目 3.帮助 4.使用历史命令 5.放大显示某一窗格 6.运行程序 7.中文编码问题 8.Rmd 文件 …

【R语言(一)】R 和 RStudio的安装与初步使用

1. R语言和RStudio基本介绍 2. R的下载安装 3. 添加R的环境变量 4. windows系统安装RStudio步骤 5. R中的常见语法 6. R和python在语法上的主要区别 1. R语言和RStudio基本介绍 R是一种流行的统计软件和编程语言&#xff0c;用于数据分析和可视化。它是一个开源的软件&am…

R语言环境下载及RStudio安装教程

R语言官网&#xff1a;https://www.r-project.org/ RStudio官网链接&#xff1a;https://rstudio.com/products/rstudio/download/#download R语言环境配置&#xff1a; 进入官网后&#xff1a; 选择中国科技大学镜像 安装适合自己系统的R环境 如果是初学的话基础版也可以…

R语言:R语言ggplot2的安装过程。

一、R语言的安装。 1.在搜索引擎中输入网址&#xff1a;R: The R Project for Statistical Computing (r-project.org)R: The R Project for Statistical Computing (r-project.org)&#xff0c;跳转到R语言官网。 R: The R Project for Statistical Computing (r-project.or…

R 语言详细安装教程(保姆级)及 RStudio简易安装教程

进入官网 官网地址 点击下载 单击 “Download” 栏目下的 “CRAN” &#xff0c;即可跳转到 R 综合资料网的路径上 &#xff0c;如下图所示 从镜像路径中选择 China 栏目下的任意一个链接&#xff0c;单击进入 R 的下载界面&#xff0c;如图所示 这里可以选择不同的系统&am…