学Python中,自我感觉学的还不错的亚子~想做点什么来练练手,然后我疯狂的找各种小游戏的教程源码什么的,于是我就疯狂的找呀找呀,就找到了一大堆,哈哈哈
毕竟我是从小就有一个游戏梦,现在就弥补一下自己小时候没有玩过瘾的游戏补上叭~
提示:爱学习哦,不要沉迷游戏,平时打发一下无聊时间最好啦
拿走源码的还请留言说一下好吗?不管是想学习的想转发的想干啥的,还请都点个赞说一下不,我也找的不容易呀
1、21点数字小游戏展示:
首先配置文件的源码:
-
'''配置文件'''
-
import os
-
-
-
# 一些常量
-
RED = (
255,
0,
0)
-
BLACK = (
0,
0,
0)
-
AZURE = (
240,
255,
255)
-
WHITE = (
255,
255,
255)
-
MISTYROSE = (
255,
228,
225)
-
PALETURQUOISE = (
175,
238,
238)
-
PAPAYAWHIP = (
255,
239,
213)
-
CURRENTPATH = os.getcwd()
-
FONTPATH = os.path.join(CURRENTPATH,
'resources/fonts/font.TTF')
-
AUDIOWINPATH = os.path.join(CURRENTPATH,
'resources/audios/win.wav')
-
AUDIOLOSEPATH = os.path.join(CURRENTPATH,
'resources/audios/lose.wav')
-
AUDIOWARNPATH = os.path.join(CURRENTPATH,
'resources/audios/warn.wav')
-
BGMPATH = os.path.join(CURRENTPATH,
'resources/audios/bgm.mp3')
-
# 数字卡片
-
# --数字卡片字体颜色
-
NUMBERFONT_COLORS = [BLACK, RED]
-
# --数字卡片背景颜色
-
NUMBERCARD_COLORS = [MISTYROSE, PALETURQUOISE]
-
# --数字卡片字体路径与大小
-
NUMBERFONT = [FONTPATH,
50]
-
# --数字卡片位置
-
NUMBERCARD_POSITIONS = [(
25,
50,
150,
200), (
225,
50,
150,
200), (
425,
50,
150,
200), (
625,
50,
150,
200)]
-
# 运算符卡片
-
# --运算符种类
-
OPREATORS = [
'+',
'-',
'×',
'÷']
-
# --运算符卡片字体颜色
-
OPREATORFONT_COLORS = [BLACK, RED]
-
# --运算符卡片背景颜色
-
OPERATORCARD_COLORS = [MISTYROSE, PALETURQUOISE]
-
# --运算符卡片字体路径与大小
-
OPERATORFONT = [FONTPATH,
30]
-
# --运算符卡片位置
-
OPERATORCARD_POSITIONS = [(
230,
300,
50,
50), (
330,
300,
50,
50), (
430,
300,
50,
50), (
530,
300,
50,
50)]
-
# 按钮卡片
-
# --按钮类型
-
BUTTONS = [
'RESET',
'ANSWERS',
'NEXT']
-
# --按钮卡片字体颜色
-
BUTTONFONT_COLORS = [BLACK, BLACK]
-
# --按钮卡片背景颜色
-
BUTTONCARD_COLORS = [MISTYROSE, PALETURQUOISE]
-
# --按钮卡片字体路径与大小
-
BUTTONFONT = [FONTPATH,
30]
-
# --按钮卡片位置
-
BUTTONCARD_POSITIONS = [(
25,
400,
700/
3,
150), (
50+
700/
3,
400,
700/
3,
150), (
75+
1400/
3,
400,
700/
3,
150)]
-
# 屏幕大小
-
SCREENSIZE = (
800,
600)
-
# 卡片类型
-
GROUPTYPES = [
'NUMBER',
'OPREATOR',
'BUTTON']
游戏源码:
-
import os
-
import sys
-
import pygame
-
from cfg
import *
-
from modules
import *
-
from fractions
import Fraction
-
-
-
'''检查控件是否被点击'''
-
def checkClicked(group, mouse_pos, group_type='NUMBER'):
-
selected = []
-
# 数字卡片/运算符卡片
-
if group_type == GROUPTYPES[
0]
or group_type == GROUPTYPES[
1]:
-
max_selected =
2
if group_type == GROUPTYPES[
0]
else
1
-
num_selected =
0
-
for each
in group:
-
num_selected += int(each.is_selected)
-
for each
in group:
-
if each.rect.collidepoint(mouse_pos):
-
if each.is_selected:
-
each.is_selected =
not each.is_selected
-
num_selected -=
1
-
each.select_order =
None
-
else:
-
if num_selected < max_selected:
-
each.is_selected =
not each.is_selected
-
num_selected +=
1
-
each.select_order = str(num_selected)
-
if each.is_selected:
-
selected.append(each.attribute)
-
# 按钮卡片
-
elif group_type == GROUPTYPES[
2]:
-
for each
in group:
-
if each.rect.collidepoint(mouse_pos):
-
each.is_selected =
True
-
selected.append(each.attribute)
-
# 抛出异常
-
else:
-
raise ValueError(
'checkClicked.group_type unsupport %s, expect %s, %s or %s...' % (group_type, *GROUPTYPES))
-
return selected
-
-
-
'''获取数字精灵组'''
-
def getNumberSpritesGroup(numbers):
-
number_sprites_group = pygame.sprite.Group()
-
for idx, number
in enumerate(numbers):
-
args = (*NUMBERCARD_POSITIONS[idx], str(number), NUMBERFONT, NUMBERFONT_COLORS, NUMBERCARD_COLORS, str(number))
-
number_sprites_group.add(Card(*args))
-
return number_sprites_group
-
-
-
'''获取运算符精灵组'''
-
def getOperatorSpritesGroup(operators):
-
operator_sprites_group = pygame.sprite.Group()
-
for idx, operator
in enumerate(operators):
-
args = (*OPERATORCARD_POSITIONS[idx], str(operator), OPERATORFONT, OPREATORFONT_COLORS, OPERATORCARD_COLORS, str(operator))
-
operator_sprites_group.add(Card(*args))
-
return operator_sprites_group
-
-
-
'''获取按钮精灵组'''
-
def getButtonSpritesGroup(buttons):
-
button_sprites_group = pygame.sprite.Group()
-
for idx, button
in enumerate(buttons):
-
args = (*BUTTONCARD_POSITIONS[idx], str(button), BUTTONFONT, BUTTONFONT_COLORS, BUTTONCARD_COLORS, str(button))
-
button_sprites_group.add(Button(*args))
-
return button_sprites_group
-
-
-
'''计算'''
-
def calculate(number1, number2, operator):
-
operator_map = {
'+':
'+',
'-':
'-',
'×':
'*',
'÷':
'/'}
-
try:
-
result = str(eval(number1+operator_map[operator]+number2))
-
return result
if
'.'
not
in result
else str(Fraction(number1+operator_map[operator]+number2))
-
except:
-
return
None
-
-
-
'''在屏幕上显示信息'''
-
def showInfo(text, screen):
-
rect = pygame.Rect(
200,
180,
400,
200)
-
pygame.draw.rect(screen, PAPAYAWHIP, rect)
-
font = pygame.font.Font(FONTPATH,
40)
-
text_render = font.render(text,
True, BLACK)
-
font_size = font.size(text)
-
screen.blit(text_render, (rect.x+(rect.width-font_size[
0])/
2, rect.y+(rect.height-font_size[
1])/
2))
-
-
-
'''主函数'''
-
def main():
-
# 初始化, 导入必要的游戏素材
-
pygame.init()
-
pygame.mixer.init()
-
screen = pygame.display.set_mode(SCREENSIZE)
-
pygame.display.set_caption(
'24 point —— 九歌')
-
win_sound = pygame.mixer.Sound(AUDIOWINPATH)
-
lose_sound = pygame.mixer.Sound(AUDIOLOSEPATH)
-
warn_sound = pygame.mixer.Sound(AUDIOWARNPATH)
-
pygame.mixer.music.load(BGMPATH)
-
pygame.mixer.music.play(
-1,
0.0)
-
# 24点游戏生成器
-
game24_gen = game24Generator()
-
game24_gen.generate()
-
# 精灵组
-
# --数字
-
number_sprites_group = getNumberSpritesGroup(game24_gen.numbers_now)
-
# --运算符
-
operator_sprites_group = getOperatorSpritesGroup(OPREATORS)
-
# --按钮
-
button_sprites_group = getButtonSpritesGroup(BUTTONS)
-
# 游戏主循环
-
clock = pygame.time.Clock()
-
selected_numbers = []
-
selected_operators = []
-
selected_buttons = []
-
is_win =
False
-
while
True:
-
for event
in pygame.event.get():
-
if event.type == pygame.QUIT:
-
pygame.quit()
-
sys.exit(
-1)
-
elif event.type == pygame.MOUSEBUTTONUP:
-
mouse_pos = pygame.mouse.get_pos()
-
selected_numbers = checkClicked(number_sprites_group, mouse_pos,
'NUMBER')
-
selected_operators = checkClicked(operator_sprites_group, mouse_pos,
'OPREATOR')
-
selected_buttons = checkClicked(button_sprites_group, mouse_pos,
'BUTTON')
-
screen.fill(AZURE)
-
# 更新数字
-
if len(selected_numbers) ==
2
and len(selected_operators) ==
1:
-
noselected_numbers = []
-
for each
in number_sprites_group:
-
if each.is_selected:
-
if each.select_order ==
'1':
-
selected_number1 = each.attribute
-
elif each.select_order ==
'2':
-
selected_number2 = each.attribute
-
else:
-
raise ValueError(
'Unknow select_order %s, expect 1 or 2...' % each.select_order)
-
else:
-
noselected_numbers.append(each.attribute)
-
each.is_selected =
False
-
for each
in operator_sprites_group:
-
each.is_selected =
False
-
result = calculate(selected_number1, selected_number2, *selected_operators)
-
if result
is
not
None:
-
game24_gen.numbers_now = noselected_numbers + [result]
-
is_win = game24_gen.check()
-
if is_win:
-
win_sound.play()
-
if
not is_win
and len(game24_gen.numbers_now) ==
1:
-
lose_sound.play()
-
else:
-
warn_sound.play()
-
selected_numbers = []
-
selected_operators = []
-
number_sprites_group = getNumberSpritesGroup(game24_gen.numbers_now)
-
# 精灵都画到screen上
-
for each
in number_sprites_group:
-
each.draw(screen, pygame.mouse.get_pos())
-
for each
in operator_sprites_group:
-
each.draw(screen, pygame.mouse.get_pos())
-
for each
in button_sprites_group:
-
if selected_buttons
and selected_buttons[
0]
in [
'RESET',
'NEXT']:
-
is_win =
False
-
if selected_buttons
and each.attribute == selected_buttons[
0]:
-
each.is_selected =
False
-
number_sprites_group = each.do(game24_gen, getNumberSpritesGroup, number_sprites_group, button_sprites_group)
-
selected_buttons = []
-
each.draw(screen, pygame.mouse.get_pos())
-
# 游戏胜利
-
if is_win:
-
showInfo(
'Congratulations', screen)
-
# 游戏失败
-
if
not is_win
and len(game24_gen.numbers_now) ==
1:
-
showInfo(
'Game Over', screen)
-
pygame.display.flip()
-
clock.tick(
30)
-
-
-
'''run'''
-
if __name__ ==
'__main__':
-
main()
2、保卫森林大作战啦啦
展示:
首先配置文件的源码:
-
''
'配置文件'
''
-
import
os
-
-
-
''
'屏幕大小'
''
-
SCREENSIZE = (
800,
600)
-
''
'图片路径'
''
-
IMAGEPATHS = {
-
'choice': {
-
'load_game':
os.
path.join(
os.getcwd(),
'resources/images/choice/load_game.png'),
-
'map1':
os.
path.join(
os.getcwd(),
'resources/images/choice/map1.png'),
-
'map1_black':
os.
path.join(
os.getcwd(),
'resources/images/choice/map1_black.png'),
-
'map1_red':
os.
path.join(
os.getcwd(),
'resources/images/choice/map1_red.png'),
-
'map2':
os.
path.join(
os.getcwd(),
'resources/images/choice/map2.png'),
-
'map2_black':
os.
path.join(
os.getcwd(),
'resources/images/choice/map2_black.png'),
-
'map2_red':
os.
path.join(
os.getcwd(),
'resources/images/choice/map2_red.png'),
-
'map3':
os.
path.join(
os.getcwd(),
'resources/images/choice/map3.png'),
-
'map3_black':
os.
path.join(
os.getcwd(),
'resources/images/choice/map3_black.png'),
-
'map3_red':
os.
path.join(
os.getcwd(),
'resources/images/choice/map3_red.png'),
-
},
-
'end': {
-
'gameover':
os.
path.join(
os.getcwd(),
'resources/images/end/gameover.png'),
-
'continue_red':
os.
path.join(
os.getcwd(),
'resources/images/end/continue_red.png'),
-
'continue_black':
os.
path.join(
os.getcwd(),
'resources/images/end/continue_black.png'),
-
},
-
'game': {
-
'arrow1':
os.
path.join(
os.getcwd(),
'resources/images/game/arrow1.png'),
-
'arrow2':
os.
path.join(
os.getcwd(),
'resources/images/game/arrow2.png'),
-
'arrow3':
os.
path.join(
os.getcwd(),
'resources/images/game/arrow3.png'),
-
'basic_tower':
os.
path.join(
os.getcwd(),
'resources/images/game/basic_tower.png'),
-
'boulder':
os.
path.join(
os.getcwd(),
'resources/images/game/boulder.png'),
-
'bush':
os.
path.join(
os.getcwd(),
'resources/images/game/bush.png'),
-
'cave':
os.
path.join(
os.getcwd(),
'resources/images/game/cave.png'),
-
'dirt':
os.
path.join(
os.getcwd(),
'resources/images/game/dirt.png'),
-
'enemy_blue':
os.
path.join(
os.getcwd(),
'resources/images/game/enemy_blue.png'),
-
'enemy_pink':
os.
path.join(
os.getcwd(),
'resources/images/game/enemy_pink.png'),
-
'enemy_red':
os.
path.join(
os.getcwd(),
'resources/images/game/enemy_red.png'),
-
'enemy_yellow':
os.
path.join(
os.getcwd(),
'resources/images/game/enemy_yellow.png'),
-
'godark':
os.
path.join(
os.getcwd(),
'resources/images/game/godark.png'),
-
'golight':
os.
path.join(
os.getcwd(),
'resources/images/game/golight.png'),
-
'grass':
os.
path.join(
os.getcwd(),
'resources/images/game/grass.png'),
-
'healthfont':
os.
path.join(
os.getcwd(),
'resources/images/game/healthfont.png'),
-
'heavy_tower':
os.
path.join(
os.getcwd(),
'resources/images/game/heavy_tower.png'),
-
'med_tower':
os.
path.join(
os.getcwd(),
'resources/images/game/med_tower.png'),
-
'nexus':
os.
path.join(
os.getcwd(),
'resources/images/game/nexus.png'),
-
'othergrass':
os.
path.join(
os.getcwd(),
'resources/images/game/othergrass.png'),
-
'path':
os.
path.join(
os.getcwd(),
'resources/images/game/path.png'),
-
'rock':
os.
path.join(
os.getcwd(),
'resources/images/game/rock.png'),
-
'tiles':
os.
path.join(
os.getcwd(),
'resources/images/game/tiles.png'),
-
'unitfont':
os.
path.join(
os.getcwd(),
'resources/images/game/unitfont.png'),
-
'water':
os.
path.join(
os.getcwd(),
'resources/images/game/water.png'),
-
'x':
os.
path.join(
os.getcwd(),
'resources/images/game/x.png'),
-
},
-
'pause': {
-
'gamepaused':
os.
path.join(
os.getcwd(),
'resources/images/pause/gamepaused.png'),
-
'resume_black':
os.
path.join(
os.getcwd(),
'resources/images/pause/resume_black.png'),
-
'resume_red':
os.
path.join(
os.getcwd(),
'resources/images/pause/resume_red.png'),
-
},
-
'start': {
-
'play_black':
os.
path.join(
os.getcwd(),
'resources/images/start/play_black.png'),
-
'play_red':
os.
path.join(
os.getcwd(),
'resources/images/start/play_red.png'),
-
'quit_black':
os.
path.join(
os.getcwd(),
'resources/images/start/quit_black.png'),
-
'quit_red':
os.
path.join(
os.getcwd(),
'resources/images/start/quit_red.png'),
-
'start_interface':
os.
path.join(
os.getcwd(),
'resources/images/start/start_interface.png'),
-
},
-
}
-
''
'地图路径'
''
-
MAPPATHS = {
-
'1':
os.
path.join(
os.getcwd(),
'resources/maps/1.map'),
-
'2':
os.
path.join(
os.getcwd(),
'resources/maps/2.map'),
-
'3':
os.
path.join(
os.getcwd(),
'resources/maps/3.map'),
-
}
-
''
'字体路径'
''
-
FONTPATHS = {
-
'Calibri':
os.
path.join(
os.getcwd(),
'resources/fonts/Calibri.ttf'),
-
'm04':
os.
path.join(
os.getcwd(),
'resources/fonts/m04.ttf'),
-
'Microsoft Sans Serif':
os.
path.join(
os.getcwd(),
'resources/fonts/Microsoft Sans Serif.ttf'),
-
}
-
''
'不同难度的settings'
''
-
DIFFICULTYPATHS = {
-
'easy':
os.
path.join(
os.getcwd(),
'resources/difficulties/easy.json'),
-
'hard':
os.
path.join(
os.getcwd(),
'resources/difficulties/hard.json'),
-
'medium':
os.
path.join(
os.getcwd(),
'resources/difficulties/medium.json'),
-
}
游戏源码:
-
-
import cfg
-
import pygame
-
from modules
import *
-
-
-
'''主函数'''
-
def main():
-
pygame.init()
-
pygame.mixer.init()
-
pygame.mixer.music.load(cfg.AUDIOPATHS[
'bgm'])
-
pygame.mixer.music.play(
-1,
0.0)
-
pygame.mixer.music.set_volume(
0.25)
-
screen = pygame.display.set_mode(cfg.SCREENSIZE)
-
pygame.display.set_caption(
"塔防游戏 —— 九歌")
-
# 调用游戏开始界面
-
start_interface = StartInterface(cfg)
-
is_play = start_interface.update(screen)
-
if
not is_play:
-
return
-
# 调用游戏界面
-
while
True:
-
choice_interface = ChoiceInterface(cfg)
-
map_choice, difficulty_choice = choice_interface.update(screen)
-
game_interface = GamingInterface(cfg)
-
game_interface.start(screen, map_path=cfg.MAPPATHS[str(map_choice)], difficulty_path=cfg.DIFFICULTYPATHS[str(difficulty_choice)])
-
end_interface = EndInterface(cfg)
-
end_interface.update(screen)
-
-
-
'''run'''
-
if __name__ ==
'__main__':
-
main()
3、超级大的迷宫
展示:
首先配置文件的源码:
-
'''配置文件'''
-
import os
-
-
-
'''屏幕大小'''
-
SCREENSIZE = (
800,
625)
-
'''游戏素材'''
-
BGMPATH = os.path.join(os.getcwd(),
'resources/audios/bgm.mp3')
-
HEROPICPATH = os.path.join(os.getcwd(),
'resources/images/hero.png')
-
'''FPS'''
-
FPS =
20
-
'''块大小'''
-
BLOCKSIZE =
15
-
MAZESIZE = (
35,
50)
# num_rows * num_cols
-
BORDERSIZE = (
25,
50)
# 25 * 2 + 50 * 15 = 800, 50 * 2 + 35 * 15 = 625
游戏源码:
-
import cfg
-
import sys
-
import pygame
-
from modules
import *
-
-
-
'''主函数'''
-
def main(cfg):
-
# 初始化
-
pygame.init()
-
pygame.mixer.init()
-
pygame.font.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(
'Maze —— 九歌')
-
font = pygame.font.SysFont(
'Consolas',
15)
-
# 开始界面
-
Interface(screen, cfg,
'game_start')
-
# 记录关卡数
-
num_levels =
0
-
# 记录最少用了多少步通关
-
best_scores =
'None'
-
# 关卡循环切换
-
while
True:
-
num_levels +=
1
-
clock = pygame.time.Clock()
-
screen = pygame.display.set_mode(cfg.SCREENSIZE)
-
# --随机生成关卡地图
-
maze_now = RandomMaze(cfg.MAZESIZE, cfg.BLOCKSIZE, cfg.BORDERSIZE)
-
# --生成hero
-
hero_now = Hero(cfg.HEROPICPATH, [
0,
0], cfg.BLOCKSIZE, cfg.BORDERSIZE)
-
# --统计步数
-
num_steps =
0
-
# --关卡内主循环
-
while
True:
-
dt = clock.tick(cfg.FPS)
-
screen.fill((
255,
255,
255))
-
is_move =
False
-
# ----↑↓←→控制hero
-
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:
-
is_move = hero_now.move(
'up', maze_now)
-
elif event.key == pygame.K_DOWN:
-
is_move = hero_now.move(
'down', maze_now)
-
elif event.key == pygame.K_LEFT:
-
is_move = hero_now.move(
'left', maze_now)
-
elif event.key == pygame.K_RIGHT:
-
is_move = hero_now.move(
'right', maze_now)
-
num_steps += int(is_move)
-
hero_now.draw(screen)
-
maze_now.draw(screen)
-
# ----显示一些信息
-
showText(screen, font,
'LEVELDONE: %d' % num_levels, (
255,
0,
0), (
10,
10))
-
showText(screen, font,
'BESTSCORE: %s' % best_scores, (
255,
0,
0), (
210,
10))
-
showText(screen, font,
'USEDSTEPS: %s' % num_steps, (
255,
0,
0), (
410,
10))
-
showText(screen, font,
'S: your starting point D: your destination', (
255,
0,
0), (
10,
600))
-
# ----判断游戏是否胜利
-
if (hero_now.coordinate[
0] == cfg.MAZESIZE[
1] -
1)
and (hero_now.coordinate[
1] == cfg.MAZESIZE[
0] -
1):
-
break
-
pygame.display.update()
-
# --更新最优成绩
-
if best_scores ==
'None':
-
best_scores = num_steps
-
else:
-
if best_scores > num_steps:
-
best_scores = num_steps
-
# --关卡切换
-
Interface(screen, cfg, mode=
'game_switch')
-
-
-
'''run'''
-
if __name__ ==
'__main__':
-
main(cfg)
...未完
太多了,好累呀!喜欢的就去资源里面下载吧 大概十几二十个游戏源码
转载:https://blog.csdn.net/weixin_45293202/article/details/115327027
查看评论