用Python实现2048小游戏(终端升级版)相比上篇 增添了撤回功能和历史最高分数的统计
最编程
2024-08-15 11:16:49
...
时隔数天,我又回来了
最近工作稍微有点忙,没有更新
昨晚给学生上课,写2048的时候,被学生提了需求,一个撤回功能和历史分数的记录
就拿过来给大家也看一下
下方链接为原游戏代码
用Python实现2048小游戏(终端版)
首先是增添的撤回功能
每局游戏有三次撤回的机会
# 撤销
def revoke(self):
if self.count > 0:
self.count -= 1
self.screen = copy.deepcopy(self.h[-2])
del self.h[-2:]
else:
print('您已经没有撤销机会了')
self.screen_print()
然后是历史分数
这边我是写入了一个文件中保存
因为代码是整合在主体当中了
就不单独放代码了
游戏的主体相比上篇文章也进行了重构
写了类, 一些判断也稍微优化了一点
完整代码如下:
import random
import copy
class Game:
def __init__(self):
# 棋盘信息存储
self.screen = []
self.h = []
self.count = 3
# 棋盘初始化
def screen_init(self):
for i in range(4):
list_width = []
for j in range(4):
list_width.append(' ')
self.screen.append(list_width)
# 打印棋盘
def screen_print(self):
print('-' * 25)
for i in range(4):
print('|', end=' ')
for j in range(4):
print(' ' + str(self.screen[i][j]), end=' | ')
print()
print('-' * 25)
# 随机生成棋子
def produce_chess(self):
while True:
# 随机一个坐标
x = random.randint(0, 3)
y = random.randint(0, 3)
if self.screen[x][y] == ' ':
self.screen[x][y] = random.choice([2, 4])
break
# 向上移动
def move_w(self):
flag = False
for k in range(3):
# 判断是否可以移动
for i in range(1, 4):
for j in range(4):
if self.screen[i][j] != self.screen[i - 1][j] and self.screen[i - 1][j] == ' ':
self.screen[i][j], self.screen[i - 1][j] = self.screen[i - 1][j], self.screen[i][j]
flag = True
# 判断是否可以合并
for i in range(1, 4):
for j in range(4):
if self.screen[i][j] == self.screen[i - 1][j] and self.screen[i - 1][j] != ' ':
self.screen[i - 1][j] = self.screen[i - 1][j] * 2
self.screen[i][j] = ' '
flag = True
if flag:
self.produce_chess()
self.screen_print()
# 向下移动
def move_s(self):
flag = False
for k in range(3):
# 判断是否可以移动
for i in range(2, -1, -1):
for j in range(4):
if self.screen[i][j] != self.screen[i + 1][j] and self.screen[i + 1][j] == ' ':
self.screen[i][j], self.screen[i + 1][j] = self.screen[i + 1][j], self.screen[i][j]
flag = True
# 判断是否可以合并
for i in range(2, -1, -1):
for j in range(4):
if self.screen[i][j] == self.screen[i + 1][j] and self.screen[i + 1][j] != ' ':
self.screen[i + 1][j] = self.screen[i + 1][j] * 2
self.screen[i][j] = ' '
flag = True
if flag:
self.produce_chess()
self.screen_print()
# 向左移动
def move_a(self):
flag = False
for k in range(3):
# 判断是否可以移动
for i in range(4):
for j in range(1, 4):
if self.screen[i][j] != self.screen[i][j - 1] and self.screen[i][j - 1] == ' ':
self.screen[i][j], self.screen[i][j - 1] = self.screen[i][j - 1], self.screen[i][j]
flag = True
# 判断是否可以合并
for i in range(4):
for j in range(1, 4):
if self.screen[i][j] == self.screen[i][j - 1] and self.screen[i][j - 1] != ' ':
self.screen[i][j - 1] = self.screen[i][j - 1] * 2
self.screen[i][j] = ' '
flag = True
if flag:
self.produce_chess()
self.screen_print()
# 向右移动
def move_d(self):
flag = False
for k in range(3):
# 判断是否可以移动
for i in range(4):
for j in range(2, -1, -1):
if self.screen[i][j] != self.screen[i][j + 1] and self.screen[i][j + 1] == ' ':
self.screen[i][j], self.screen[i][j + 1] = self.screen[i][j + 1], self.screen[i][j]
flag = True
# 判断是否可以合并
for i in range(4):
for j in range(2, -1, -1):
if self.screen[i][j] == self.screen[i][j + 1] and self.screen[i][j + 1] != ' ':
self.screen[i][j + 1] = self.screen[i][j + 1] * 2
self.screen[i][j] = ' '
flag = True
if flag:
self.produce_chess()
self.screen_print()
# 判断游戏是否可以继续运行
def referee(self):
flag = False
# 是否还有空格
for i in range(4):
for j in range(4):
if self.screen[i][j] == ' ':
flag = True
# 是否还能继续想加
if not flag:
# 判断是否可以左右移动
for i in range(4):
for j in range(3):
if self.screen[i][j] == self.screen[i][j + 1]:
flag = True
# 判断是否可以上下移动
for i in range(3):
for j in range(4):
if self.screen[i][j] == self.screen[i + 1][j]:
flag = True
return flag
# 计算总成绩
def score(self):
score_sum = 0
for i in range(4):
for j in range(4):
score_sum += self.screen[i][j]
return score_sum
# 撤销
def revoke(self):
if self.count > 0:
self.count -= 1
self.screen = copy.deepcopy(self.h[-2])
del self.h[-2:]
else:
print('您已经没有撤销机会了')
self.screen_print()
if __name__ == '__main__':
f = open('score_h.txt', 'r+', encoding='utf-8')
score_h = [int(i) for i in f.read().split('\n') if i]
max_score = max(score_h) if score_h else 0
while True:
# 游戏对象实例化
game_2048 = Game()
# 创造棋盘
game_2048.screen_init()
# 开始游戏
game_2048.produce_chess()
game_2048.screen_print()
while game_2048.referee():
# user = input('请输入你的操作(wasd代表上下左右,SOS代表撤销)\n>>>')
user = random.choice('wasd')
if user in ['W', 'w']:
game_2048.move_w()
elif user in ['S', 's']:
game_2048.move_s()
elif user in ['A', 'a']:
game_2048.move_a()
elif user in ['D', 'd']:
game_2048.move_d()
elif user == 'SOS':
game_2048.revoke()
else:
print('输入的指令错误,请重新输入')
game_2048.h.append(copy.deepcopy(game_2048.screen))
score = game_2048.score()
print('本局游戏结束!')
print('您的成绩为:{}'.format(score))
max_score = score if score > max_score else max_score
print('您的历史最高成绩为:{}'.format(max_score))
f.write(str(score) + '\n')
if not input('是否继续游戏,继续游戏请输入任意字符'):
break
print('退出游戏!')
f.close()
效果图:
一起学习python,小白指导,教学分享记得私信我
上一篇: 最高分数达到2048的理论上限是多少?
下一篇: C#版本实现:探究游戏2048的核心算法