python 俄罗斯方块ai_TKinter实现俄罗斯方块
[python]代码库# -*- coding: utf-8 -*-
from Tkinter import *
import random
from tkMessageBox import askquestion
# 尚需改进,有待提高
# 各种方块的表示,与参考方块的相对位置
shapedic = {1: ((0, 0), (1, 0), (0, -1), (1, -1)), # 正方形
2: ((0, 0), (0, -1), (0, -2), (0, 1)), # 长条
3: ((0, 0), (0, -1), (1, 0), (1, 1)), # 之字型
4: ((0, 0), (0, -1), (-1, 0), (-1, 1)), # 反之字型
5: ((0, 0), (1, 0), (-1, 0), (-1, -1)), # L型
6: ((0, 0), (1, 0), (-1, 0), (1, -1)), # 反L型
7: ((0, 0), (1, 0), (-1, 0), (0, -1)) # T型
}
# 旋转函数,顺时针旋转90度,相对于参考方块
change_dic = {(0, 0): (0, 0), (0, 1): (-1, 0), (-1, 0): (0, -1), (0, -1): (1, 0), (1, 0): (0, 1),
(1, -1): (1, 1), (1, 1): (-1, 1), (-1, 1): (-1, -1), (-1, -1): (1, -1),
(2, 0): (0, 2), (0, 2): (-2, 0), (-2, 0): (0, -2), (0, -2): (2, 0)}
# 随机颜色
colorDict = {
0: '#CCC0B4',
1: '#EEE4DA',
2: '#EDE0C8',
3: '#F2B179',
4: '#EC8D54',
5: '#F67C5F',
6: '#EA5937',
7: '#804000',
8: '#F1D04B',
9: '#E4C02A',
10: '#EE7600',
11: '#D5A500',
12: '#E4C02A',
13: '#804000',
14: '#EA5937',
15: '#EE7600',
16: '#776E65',
17: '#776E65',
18: '#FFFFFF',
19: 'yellow',
20: 'blue',
21: 'lightblue',
22: 'red'
}
# 俄罗斯方块
class Game_Russia:
def __init__(self):
# 每个方块的大小
self.width = 20
# 方块数目,长和宽
self.row = 28
self.column = 19
# #初始化
# self.scores=0
# self.all_square={}#坐标系网格中个位置方块的存在性
# self.head_square=[]#参考方块绝对位置
# self.new_square=[]#移动方块相对位置
# self.direction=-1#方块初始方向
# #规定界限
# #i表示第i列,0在左边
# #j表示第j行,零在上面
# for j in range(-4,self.row):
# for i in range(self.column):
# self.all_square[i,j]=0
# #划界,开口向上
# for j in range(self.row+1):
# self.all_square[19,j]=1
# self.all_square[-1,j]=1
# for i in range(-1,self.column+1):
# self.all_square[i,28]=1
"""
用来debug
for j in range(self.row+1):
for i in range(-1,self.column+1):
print self.all_square[i,j],
"""
self.window = Tk()
self.window.geometry()
self.window.maxsize(400, 610)
self.window.minsize(400, 610)
self.window.title(u"俄罗斯方块")
self.frame1 = Frame(self.window, bg="white", relief=GROOVE, borderwidth=5)
self.frame2 = Frame(self.window, bg="white", relief=RAISED, borderwidth=2, height=40,
width=570)
self.canvas = Canvas(self.frame1, bg='purple', width=400, height=570)
self.score_label = Label(self.frame2, text="Score: 0")
self.frame1.pack()
self.frame2.pack(fill=BOTH)
self.score_label.pack(side=LEFT)
self.canvas.pack(fill=BOTH)
self.draw_wall()
self.initial()
self.get_new_square()
self.draw_new_square()
self.play()
self.window.mainloop()
"=== View Part ==="
# 边界
def draw_wall(self):
self.canvas.create_line(5, 5, 385, 5, fill='blue', width=1)
self.canvas.create_line(385, 5, 385, 565, fill='blue', width=1)
self.canvas.create_line(5, 5, 5, 565, fill='blue', width=1)
self.canvas.create_line(5, 565, 385, 565, fill='blue', width=1)
# 得分
def draw_score(self):
self.get_score()
self.score_label.config(self.score_label, text="Score: " + str(self.scores))
# 画下面所有不动的方块
def draw_square(self):
color = colorDict[random.randint(0, len(colorDict) - 1)]
for j in range(self.row):
self.canvas.delete("line" + str(j))
for i in range(self.column):
if self.all_square[i, j]:
self.canvas.create_rectangle(5 + i * self.width,
5 + j * self.width, 5 + (i + 1) * self.width,
5 + (j + 1) * self.width, fill=color, tags="line" + str(j))
# 画移动的方块
def draw_new_square(self):
self.canvas.delete("new")
self.head_square[1] += 1
color = colorDict[random.randint(0, len(colorDict) - 1)]
for i in range(4):
self.canvas.create_rectangle(5 + (self.head_square[0] + self.new_square[i][0]) * self.width,
5 + (self.head_square[1] + self.new_square[i][1]) * self.width,
5 + (self.head_square[0] + self.new_square[i][0] + 1) * self.width,
5 + (self.head_square[1] + 1 + self.new_square[i][1]) * self.width, fill=color,
tags="new")
"=== Model Part ==="
def initial(self):
# 初始化
self.scores = 0
self.all_square = {} # 坐标系网格中个位置方块的存在性
self.head_square = [] # 参考方块绝对位置
self.new_square = [] # 移动方块相对位置
self.direction = -1 # 方块初始方向
# 规定界限
# i表示第i列,0在左边
# j表示第j行,零在上面
for j in range(-4, self.row):
for i in range(self.column):
self.all_square[i, j] = 0
# 划界,开口向上
for j in range(self.row + 1):
self.all_square[19, j] = 1
self.all_square[-1, j] = 1
for i in range(-1, self.column + 1):
self.all_square[i, 28] = 1
def is_dead(self):
# 判断死亡与否,最上方中间四个方块
for i in {8, 9, 10, 11}:
if self.all_square[i, 0]:
return True
else:
return False
def get_new_square(self):
# 获得新的方块,初始位置均为(9,-2)
self.new = random.randrange(1, 8) # 随机方块
# 主方块(参考方块)的位置
self.direction = random.randrange(4)
self.head_square = [9, -2]
self.new_square = list(shapedic[self.new])
for i in range(self.direction):
self.change()
def delete_one_line(self, j):
# 得分后删除整行
for t in range(j, 2, -1):
for i in range(self.column):
self.all_square[i, t] = self.all_square[i, t - 1]
for i in range(self.column):
self.all_square[i, 0] = 0
def get_score(self):
for j in range(self.row):
for i in range(self.column):
# 判断某行是否全满
if not self.all_square[i, j]:
break
else:
self.scores += 10
self.delete_one_line(j)
# 移动方块停止
def get_seated(self):
self.all_square[tuple(self.head_square)] = 1
for i in range(4):
self.all_square[self.head_square[0] + self.new_square[i][0],
self.head_square[1] + self.new_square[i][1]] = 1
# 方块是否到了最底端
def is_seated(self):
for i in range(4):
if self.all_square[self.head_square[0] + self.new_square[i][0],
self.head_square[1] + self.new_square[i][1] + 1]:
return True
return False
"=== Control Part ==="
# 改变方块朝向
# 通过旋转改变,主方块不动
def change(self):
if self.new > 1:
for i in range(4):
if self.all_square[self.head_square[0] + change_dic[self.new_square[i]][0], self.head_square[1] +
change_dic[self.new_square[i]][1]]:
return
else:
for i in range(4):
self.new_square[i] = change_dic[self.new_square[i]]
else:
return
# 右移
def right_move(self):
# 先判断是否可以移动
for i in range(4):
if self.all_square[self.head_square[0] + self.new_square[i][0] - 1,
self.head_square[1] + self.new_square[i][1]]:
return True
self.head_square[0] -= 1
# 左移
def left_move(self):
for i in range(4):
if self.all_square[self.head_square[0] + self.new_square[i][0] + 1,
self.head_square[1] + self.new_square[i][1]]:
return True
self.head_square[0] += 1
# 向下加速
def down_quicker(self):
while (not self.is_seated()):
self.draw_new_square()
self.canvas.after(50)
self.canvas.update()
# 方向键控制
def move(self, event):
if event.keycode == 39:
self.left_move()
elif event.keycode == 38:
self.change()
elif event.keycode == 37:
self.right_move()
elif event.keycode == 40:
self.down_quicker()
else:
pass
# 开始游戏
def play(self):
self.canvas.bind('', self.move)
self.canvas.focus_set()
while True:
if self.is_dead():
self.gameover()
break
if self.is_seated():
self.get_seated()
self.get_new_square()
self.draw_score()
self.draw_square()
self.draw_new_square()
else:
self.draw_new_square()
self.canvas.after(500)
self.canvas.update()
# 游戏结束
def gameover(self):
if askquestion("LOSE", u"你输了!\n重新开始吗?") == 'yes':
return self.restart()
else:
return self.window.destroy()
# 重新开始
def restart(self):
self.initial()
self.draw_square()
self.get_new_square()
self.draw_new_square()
self.play()
# 主程序
if __name__ == "__main__":
Game_Russia()
python 俄罗斯方块ai_TKinter实现俄罗斯方块相关推荐
- python编的俄罗斯方块游戏_手把手制作Python小游戏:俄罗斯方块(一)
手把手制作Python小游戏:俄罗斯方块1 大家好,新手第一次写文章,请多多指教 A.准备工作: 这里我们运用的是Pygame库,因为Python没有内置,所以需要下载 如果没有pygame,可以到官 ...
- python图形小游戏代码_手把手制作Python小游戏:俄罗斯方块(一)
手把手制作Python小游戏:俄罗斯方块1 大家好,新手第一次写文章,请多多指教 A.准备工作: 这里我们运用的是Pygame库,因为Python没有内置,所以需要下载 如果没有pygame,可以到官 ...
- python 基于pygame实现俄罗斯方块
一.简单说明 80.90后的小伙伴都玩过"俄罗斯方块",那种"叱咤风云"场景 偶尔闪现在脑海 真的是太爽了:如果没有来得及玩过的同学,这次可以真正的自己做一个了 ...
- Python课程设计之俄罗斯方块
Python课程设计之俄罗斯方块 演示效果 下载地址 运行效果 基础页面 界面动起来 生成.移动.固定.变形 消除与得分 演示效果 点击查看 下载地址 点击下载 Python课程设计之俄罗斯方块 软件 ...
- 用Python制作简单的俄罗斯方块游戏
主要思路: 一.基础页面 二.让界面动起来 三.生成.移动.固定.消除 四.消除与得分 代码: import tkinter as tk # 导入包,并 ...
- ai俄罗斯方块java_俄罗斯方块进阶--AI俄罗斯方块
原标题:俄罗斯方块进阶--AI俄罗斯方块 人工智能大火的今天,如果还是自己玩俄罗斯方块未免显得太LOW,为什么不对游戏升级,让机器自己去玩俄罗斯方块呢?有了这个想法之后利用周六周日两天的时间去搜集了大 ...
- 学生专用计算机玩俄罗斯方块,c++编程俄罗斯方块计算机实习报告模板.doc
c编程俄罗斯方块计算机实习报告模板 c++编程俄罗斯方块计算机实习报告模板c++编程俄罗斯方块计算机实习报告模板 姓名: 班级: 学号: 小班序号: 指导老师: 题目:用c++编程俄罗斯方块 邮箱: ...
- python下俄罗斯方块的游戏设计_[源码和文档分享]基于Python的PyGame的俄罗斯方块游戏设计与实现...
摘 要 近年来,随着游戏产业的突飞猛进,游戏玩家的技术也是与日俱增,当你看见游戏高手完美的表演时,你是否想过我也能达到那种水平,本程序用Python语言编写俄罗斯方块,左侧显示正在运行的游戏,右边显示 ...
- python编程方块_趣味Python编程之经典俄罗斯方块
本帖最后由 柠檬守护 于 2016-10-23 14:14 编辑 转载:http://www.linuxidc.com/Linux/2016-10/136205.htm 用python把经典俄罗斯方块 ...
- python编辑俄罗斯方块_python编写俄罗斯方块
本文实例为大家分享了python实现俄罗斯方块的具体代码,供大家参考,具体内容如下 #coding=utf-8 from tkinter import * from random import * i ...
最新文章
- 长短期记忆网络_昆明理工大学刘可真、苟家萁、骆钊等:粒子群优化长短期记忆网络模型如何进一步提高变压器油中溶解气体浓度的精准预测?...
- pc端汽车obd软件下载?_【软件】PandaOCR:PC端图片转文字识别软件
- Spring boot + mybatis + oracle代码生成器
- 信息学奥赛C++语言:时间转换
- java 打印_剑指Offer面试题20(Java版):顺时针打印矩阵
- ./config/config_global.php,直接git config和带--global、--system的区别
- android实现资源嗅探器手机版,OPPO Reno尝鲜Android Q教程来了
- 《信息化项目文档模板一——项目需求说明书》
- Apizza-响应json数据上设置浮动注释
- 【小程序源码】多功能图片处理器一键多种处理照片
- ZipEntry 类,zip的压缩与解压
- Java项目(SpringBoot+MyBatis-Plus):国内新冠肺炎疫情大数据可视化平台+疫情数据后台管理系统
- 【华为云】python调用华为云API,获取token值
- 那些你可能不知道的视频下载奇技淫巧
- 基于linux嵌入式浏览,基于LINUX的嵌入式浏览器的设计与 - 嵌入式操作系统 - 电子发烧友网...
- 亚马逊账号关联因素分析防关联技巧
- TensorFlow 2019
- java 批量读取excel表格内容_java 使用POI批量导入excel数据
- [CVPR 2020] RPM-Net: Robust Point Matching using Learned Features
- html5显示状态灯,如何使用css3+html5来制作文字霓虹灯效果
热门文章
- 144个城市坐标Python程序
- S7-200SMART编程软件在符号绝对模式下变量符号名显示不全的解决办法
- 微信小程序-colorUI组件库
- 下载蓝盒插件_chrome迅雷下载插件-迅雷下载支持插件下载 v3.1官方版--pc6下载站...
- 计算机网络课程设计个人总结,计算机网络课程设计心得体会.doc
- Java核心技术 卷1
- java核心技术卷——学习笔记(一)
- 第一二三章 PMP第六版读书笔记
- List of USB ID's
- linux查看perl进程,如何找到挂起perl脚本(linux进程)的位置