|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 一个账号 于 2020-3-16 14:26 编辑
python小白来展示学习成果啦!!!! 希望各位帅气的小哥哥漂亮的小姐姐们能指点一下下
最近在看一本python入门书《python游戏编程快速上手》感觉这本书还是不错滴,很适合像我这个亚子的白白的小白
书里面有一个TicTacToe也就是井字棋游戏,看着书编了一遍又自己实现了一下下,好了废话不多说,先上波儿效果图(让我找找哈,不知道存哪了 )
第一次展示作品,不知道该说点啥。。。。
效果呢就上上面这两张图展示的那个亚子,是不是有点小失望呀,这TM是啥破游戏,连个正儿八经的界面都没。
emmmmmm刚开始学Python嘛,嘿嘿,等我以后学成归来,一定要把我的井字棋改成不同寻常的、高端大气上档次的....井字棋
下面我来稍微说一下这个小游戏吧,顺便复习一下。
有兴趣的童鞋们可以自己实现一下子呀,如果大家有啥想法或者发现我有哪里写的不好,欢迎评论交流呦
这个是书上给出的流程图,emmmm,是不是有点乱呀?! 不用怕,我自己又做了一张流程图(是不是莫名又开始恐慌了???hhhhh)
没错,就是咱们的编辑神器IDLE,hhhhh,大概思路就是这样梓吧,然后就是按照写好的思路来编写程序了
首先呢,咱们稍微看下写好的流程,对于重复出现的操作可考虑一下函数之类的东东,比如咱们看到好多地方要展示游戏板,那就把这一块函数封装到一个函数里呗
就像这样
def draw_board(board, nums=[' ']*10):
"""展示游戏板"""
# board 是一个含有十个元素的列表,第一个元素不用管,只是抵消差一行为
print(" | |")
print(" " + board[7] + " | " + board[8] + " | " + board[9])
print(nums[7], " |", nums[8], " |", nums[9])
print("----------------")
print(" | |")
print(" " + board[4] + " | " + board[5] + " | " + board[6])
print(nums[4], " |", nums[5], " |", nums[6])
print("----------------")
print(" | |")
print(" " + board[1] + " | " + board[2] + " | " + board[3])
print(nums[1], " |", nums[2], " |", nums[3] )
说实话,这个游戏板是真的简陋。。。。
然后就像这样依次定义出别的、各种各样的函数,这里就不一一赘述了。
再然后呢,就是游戏的主要股骨架了,其实我感觉可以先写游戏骨架,最后再进行重构,把差不多的代码整到一块,这样是不是更好呢?
# 开始,骚话问候
print("呕吼~~~~决一死战吧,大帅哥!!!!")
# 显示原始游戏板
draw_board([' ']*10, range(0, 10))
print("这个是游戏板,有点简陋哈,不过也要按编号落子呦!!!!")
# 进入游戏主循环
while True:
# 重置游戏板
the_board = [' '] * 10
player_letter, computer_letter = choose_chess() # 让玩家选自棋子类型(x 或 o)
turn = first_go() # 随机决定谁先走
if turn == 'computer':
print("本电脑小哥哥先走,你一边呆着去。。。")
else:
print("你先走吧")
playing = True # 设定标志,保证游戏正常进行和中断
# 进入一局游戏的循环
while playing:
if turn == 'player':
# 轮到玩家
move = get_player_move(the_board)
make_move(the_board, move, player_letter) # 让玩家落子
# 显示游戏板
draw_board(the_board)
if is_winner(the_board, player_letter):
# 判断是否获胜
print("卧槽,你竟然赢了T_T\n我不服,敢不敢再来一局!?")
playing = False
elif is_full_board(the_board):
# 判断是否平局(游戏板全装满,胜负未分)
print("你的实力也就只配跟我打个平局吧,哼!¬︿̫̿¬")
playing = False
else:
# 轮到电脑
turn = 'computer'
else:
# 轮到电脑
# 算法计算最佳落子位置
move = get_computer_move(the_board, computer_letter)
make_move(the_board, move, computer_letter) # 让电脑落子
# 显示游戏板
draw_board(the_board)
if is_winner(the_board, computer_letter):
# 判断是否获胜
print("呕吼,你怎么输了呢,大帅哥!!!\n啊哈哈哈哈哈~~~///(^v^)\\\~~~")
playing = False
elif is_full_board(the_board):
# 判断是否平局
print("你的实力也就只配跟我打个平局吧,哼!¬︿̫̿¬")
playing = False
else:
# 轮到玩家
turn = 'player'
# 玩家是否要再玩一次,注意这里的缩进
if not play_again():
break
# 游戏结束,表达依依不舍之情
print("大帅哥,记着常来找我玩啊!!!(>人<)")
差不多就是这亚子了。
我把剩下的代码也放的这里吧,如果哪里做的还是不是很好,请在评论区留下宁宝贵的建议(此处身体弯成90度)
def choose_chess():
"""让玩家选择棋子类型"""
print("\n请选择宁心仪的棋子类型(x 或 y) (反正选啥都得输,(¬︿̫̿¬☆))")
letter = input().upper()
# 防止玩家选别的字母
while not (letter == 'X' or letter == 'Y'):
print("骚凹瑞!宁只能在 X 和 Y 中选择一个呦!!!!")
letter = input().upper()
# 返回一个列表,第一个元素为玩家的棋子,第二个为电脑的棋子
if letter == 'X':
return ['X', 'Y']
else:
return ['Y', 'X']
def first_go():
"""随机决定谁先走"""
if random.randint(0, 1) == 0:
return 'player'
else:
return 'computer'
def is_free(board, move):
"""判断某位置是否为空, 如果为空就返回True"""
copy = board[:] # 注意这里使用列表复制,防止更改原列表
return copy[move] == ' '
def get_player_move(board):
"""获得玩家的落子位置"""
print("\n大帅哥,到你了。请输入:(1 - 9)")
print("快点!我还想早点把你打得落花流水呢!!!")
move = input()
# 确保玩家的输入合法
while not ((move in [str(i) for i in range(1, 10)]) or is_free(board, int(move))):
print("你咋不按规矩出牌呢。。。")
print("请重新输入吧!")
move = input()
return int(move)
def make_move(board, move, letter):
"""根据所给位置落子"""
board[move] = letter # 注意这里能修改局部变量board[move] 的原因, 列表引用
def is_winner(bo, le):
"""判断玩家或电脑是否获胜"""
# 用 bo 代替 board、le 代替 letter,比较方便
return ((bo[7] == le and bo[8] == le and bo[9] == le) or # 判断最上面一行是否一致
(bo[4] == le and bo[5] == le and bo[6] == le) or # 判断中间一行
(bo[1] == le and bo[2] == le and bo[3] == le) or # 判断最下面一行
(bo[7] == le and bo[4] == le and bo[1] == le) or # 判断最左边一列
(bo[8] == le and bo[5] == le and bo[2] == le) or # 判断中间一列
(bo[9] == le and bo[6] == le and bo[3] == le) or # 判断最右边一列
(bo[7] == le and bo[5] == le and bo[3] == le) or # 判断主对角线
(bo[1] == le and bo[5] == le and bo[9] == le)) # 判断副对角线
def is_full_board(board):
"""判断游戏板是否全装满,即是否平局"""
copy = board[:]
is_full = True
for i in range(1, 10):
if copy[i] == ' ':
is_full = False
return is_full
def get_computer_move(board, computer_letter):
"""计算最佳落子位置"""
print("\n到我了,你离死亡不远了,啊哈哈哈哈(发出小月般的笑声)")
if computer_letter == 'X':
player_letter = 'Y'
else:
player_letter = 'X'
# 通过模拟,判断是否有能让电脑获胜的位置
for i in range(1, 10):
copy = board[:]
if is_free(copy, i):
make_move(copy, i, computer_letter)
if is_winner(copy, computer_letter):
return i
# 通过模拟,判断是否有能阻止玩家获胜的位置
for i in range(1, 10):
copy = board[:]
if is_free(copy, i):
make_move(copy, i, player_letter)
if is_winner(copy, player_letter):
return i
# 判断是否还有角角是空的
move = []
for i in [1, 3, 7, 9]:
if is_free(board, i):
move.append(i)
if move:
return random.choice(move)
# 判断中心是否是空的
if is_free(board, 5):
return 5
# 判断剩余位置(每条边的中间)是否为空
move = []
for i in [2, 4, 6, 8]:
if is_free(board, i):
move.append(i)
if move:
return random.choice(move)
def play_again():
"""询问玩家是否要再玩一次"""
print("\n再来一局呗!!!!(❤ ω ❤)")
print("请输入: (yes or no)")
return input().lower().startswith('y')
咸小鱼一号:What!!!!!!小先生二号,你这代码西一块东一块的着实把我整懵了。。。。
咸小鱼二号:那我要不再整个发一遍吧
咸小鱼一号:..............
(写在最后:感谢每一位在咸小鱼成长道路上每一位帮助过咸小鱼的人 )
等等,再让我说一句,如果大家需要这本《python游戏编程快速上手》的话,可以在评论区留言或者私信我哦!!!
不说了,要上课了 ,拜拜啦
|
评分
-
查看全部评分
|