python代码200行左右_200行Python代码实现2048

import curses

from random import randrange,chioce

from collections import defaultdict

actions=['Up','Left','Down','Right','Restart','Exit']

letter_codes=[ord(ch) for ch in 'WASDRQwasdrq']

action_dict=dict(zip(letter_codes,actions*2))

def main(stdscr):

def init():

#重置游戏棋盘

game_field.reset()

return 'Game'

def not_game(state):

#画出GomeOver 或WIN 的界面

game_field.draw(stdscr)

#读取用户输入得到action,判断重启游戏还是结束游戏

action = get_user_action(stdscr)

responses = defaultdict(lambda :state)#默认当前状态

responses['Restart'],responses['Exit']='Init','Exit'

return responses[actions]

def game():

#画出当前棋盘状态

game_field.draw(stdscr)

#读取用户的action

action = get_user_action(stdscr)

if action == 'Restart':

return 'Init'

if action == 'Exit':

return 'Exit'

if game_field.move(action): # move successful

if game_field.is_win():

return 'Win'

if game_field.is_gameover():

return 'Gameover'

return 'Game'

state_actions = {

'Init':init,

'Win':lambda: not_game('Win'),

'Gameover':lambda: not_game('Gameover'),

'Game':game}

curses.use_default_colors()

game_field = GameField(win=32)

state = 'Init'

#状态机开始循环

while state!='Exit':

state = state_actions[state]()

def get_user_action(keyboard):

char = 'N'

while char not in action_dict:

char = keyboard.getch()

return action_dict[char]

def transpose(field):

return [list(row) for row in zip(*field)]

def invert(field):#矩阵逆转,非逆矩阵

return [row[::-1] for row in field]

class GameField(object):

def draw(self, screen):

help_string1 = '(W)Up (S)Down (A)Left (D)Right'

help_string2 = ' (R)Restart (Q)Exit'

gameover_string = ' GAME OVER'

win_string = ' YOU WIN!'

def cast(string):

screen.addstr(string + '\n')

# 绘制水平分割线

def draw_hor_separator():

line = '+' + ('+------' * self.width + '+')[1:]

separator = defaultdict(lambda: line)

if not hasattr(draw_hor_separator, "counter"):

draw_hor_separator.counter = 0

cast(separator[draw_hor_separator.counter])

draw_hor_separator.counter += 1

def draw_row(row):

cast(''.join('|{: ^5} '.format(num) if num > 0 else '| ' for num in row) + '|')

screen.clear()

cast('SCORE: ' + str(self.score))

if 0 != self.highscore:

cast('HGHSCORE: ' + str(self.highscore))

for row in self.field:

draw_hor_separator()

draw_row(row)

draw_hor_separator()

if self.is_win():

cast(win_string)

else:

if self.is_gameover():

cast(gameover_string)

else:

cast(help_string1)

cast(help_string2)

def init(self,height=4,width=4,win=2048):

self.height = height

self.width = width

self.win_vlaue = 2048

self.score = 0

self.highscore = 0

self.reset() #重置

def spawn(self):#随机生成2或4

new_element = 4 if randrange(100)>89 else 2

(i,j) = chioce([(i,j) for i in range(self.width)

for j in range(self.height)

if self.field[i][j]==0])

self.field[i][j] = new_element

def reset(self):

if self.score > self.highscore:

self.highscore = self.score

self.score = 0

self.field = [[0 for i in range(self.width)]

for j in range(self.height)]

self.spawn()

self.spawn()

def move(self,direction):

def move_row_left(row):

def tighten(row):#把零散的非零单元挤到一块

new_row = [i for i in row if i!=0]

new_row += [0 for i in range(len(row)-

len(new_row))]

return new_row

def merge(row):#相邻元素拼合

pair = False

new_row = []

for i in range(len(row)):

if pair:

new_row.append(2row[i])

self.score += 2row[i]

pair = False

else:

if i+1 < len(row) and row[i] ==row[i+1]:

pair = True

new_row.append(0)

else:

new_row.append(row[i])

assert len(new_row) == len(row)

return new_row

return tighten(merge(tighten(row)))#先挤再合并再挤

moves = {}

moves['Left'] = lambda field: [move_row_left(row)

for row in field]

moves['Right'] = lambda field: invert(moves['Left']

(invert(field)))

moves['Up'] = lambda field: transpose(moves['Left']

(transpose(field)))

moves['Down'] = lambda field: transpose(moves['Right']

(transpose(field)))

if direction in moves:

if self.move_is_possible(direction):

self.field = movesdirection

self.spawn()

return True

else:

return False

def is_win(self):

return any(any(i >= self.win_vlaue for i in row)

for row in self.field)

def is_gameover(self):

return not any(self.move_is_possible(move) for move in actions)

def move_is_possible(self,direction):

def row_is_left_movable(row):

def change(i):

if row[i] == 0 and row[i+1] != 0:

return True

if row[i] != 0 and row[i+1] == row[i]:

return True

return False

return any(change(i) for i in range(len(row)-1))

check = {}

check['Left'] = lambda field: any(row_is_left_movable(row)

for row in field)

check['Right'] = lambda field: check'Left'

check['Up'] = lambda field: check'Left'

check['Down'] = lambda field: check'Right'

if direction in check:

return checkdirection

else:

return False

curses.wrapper(main)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/507238.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python将excel导入mysql_Python将Excel数据自动导入MySQL,python,实现,excel,到,中

废话不多说&#xff0c;下面附上代码。# -*- coding: utf-8 -*-"""Created on Mon Apr 20 14:18:49 2020author: admin"""import osimport pandas as pd#import cx_Oracle as cxfrom sqlalchemy import create_engineimport pymysqlfile_name[]#…

presto java_Presto Jdbc

Presto Jdbc标签(空格分隔)&#xff1a; Presto一&#xff0c; 建立连接传统的JDBC方式类似&#xff0c;建立PrestoConnection”连接“&#xff0c;并且通过unwrap方法将connection转换为PrestoConnection。实际上是赋值一些基本信息&#xff0c;并且建立新的OkHttpClient。Str…

计算机二级java上机_计算机二级JAVA上机试题及答案

2016年9月计算机等级考试正在紧张复习中&#xff0c;为帮助大家进一步复习java&#xff0c;yjbys小编为大家带来最新java上机试题及答案如下&#xff1a;1. 基本操作(1小题&#xff0c;计30分)注意&#xff1a;下面出现的“考生文件夹”均为%USER%在考生文件夹中存有文件名为Ja…

java divide 用法_java中BigDecimal加减乘除基本用法

Java在java.math包中提供的API类BigDecimal&#xff0c;用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。在实际应用中&#xff0c;需要对更大或者更小的数进行运算和处理。float和double只能用来做科学计算或者是工程计算&#xff0c;在商…

如何反映两条曲线的拟合精度_你知道850加工中心定位精度的检测有哪些吗?

你知道850加工中心定位精度的检测有哪些吗&#xff1f;定位精度在机械制造上指零件或刀具等实际位置与标准位置&#xff08;理论位置/理想位置&#xff09;之间的差距&#xff0c;其差距越小&#xff0c;说明精度越高。定位精度是零件加工精度得以保证的前提。XFL-850加工中心的…

java ee最新_从此再无 JavaEE,现在叫 JakartaEE

各位小伙伴,你们都知道这个消息吗&#xff1f;Java EE 正式改名为 Jakarta EE 了。以后小伙伴们自我介绍的时候又多了一种方式。(〃▽〃) &#xff1a;你是做什么的&#xff1f;(&#xffe3;▽&#xffe3;)~* &#xff1a;你好我是做 JakartaEE&#xff01;Σ(っД;)っ&#…

十二月份找工作好找吗_小儿推拿师工作好找吗?工资高吗?

小儿推拿师工作好找吗&#xff1f;会不会学成之后找不到工作?作为现在比较热门的一个医学类职业&#xff0c;小儿推拿师还是比较容易找工作的&#xff0c;现在基本一条街上能有不低于十家小儿推拿店&#xff0c;而这些店里面小儿推拿师只有两三个&#xff0c;后面孩子还有很多…

java 单例 读写锁_终极锁实战:单JVM锁+分布式锁

目录1.前言2.单JVM锁3.分布式锁4.总结正文分割线1.前言锁就像一把钥匙&#xff0c;需要加锁的代码就像一个房间。出现互斥操作的典型场景&#xff1a;多人同时想进同一个房间争抢这个房间的钥匙(只有一把)&#xff0c;一人抢到钥匙&#xff0c;其他人都等待这个人出来归还钥匙&…

怎么用python读取excel数据并导出_python怎样导入excel表格数据-如何使用python将大量数据导出到Excel中的小技巧...

如何用python将数据写入excel表格 #导入包 import xlrd #设置路径 pathC:\\Users\\jyjh\\Desktop\\datap.xlsx #打开文件 dataxlrd.open_workbook(path) #查询工作表 sheetsdata.sheets() sheets 可以通过函数、索引、名称获得工作表。 sheet_1_by_functiondata.sheets()[0] sh…

linux java socket编程_深入学习socket网络编程,以java语言为例

了解java的socket编程与Linux Socket API之间的关系一、java的网络编程1、socket原理socket通信就是通过IP和端口号将两台主机建立连接&#xff0c;提供通信。主机A的应用程序要能和服务器B进行通信&#xff0c;必须通过Socket建立连接&#xff0c;而建立Socket连接本质上就是依…

python去掉空白行_python去掉空白行的多种实现代码

这篇文章主要介绍了python去掉空白行实现代码,需要的朋友可以参考下 测试代码 php.txt1:www.php.cn 2:www.php.cn 3:www.php.cn 4:www.php.cn 5:www.php.cn 6:www.php.cn 7:www.php.cn 8:www.php.cn 9:www.php.cn 10:www.php.cn 11:www.php.cn 12:www.php.cn 13:www.php.cn 14:…

mysql 手动配置服务器_Win7系统下手动配置Apache+PHP+MySQL环境WEB服务器 -电脑资料...

本来想学学php,于是就想搭建web服务器和sql环境&#xff0c;结果浪费掉了不少时间&#xff0c;大致的总结下&#xff0c;也算是长个记性。使用的安装包分别是httpd-2.2.22-win32-x86-no_ssl .msi,php-5.2.5-Win32.zip和mysql-installer-community-5.5.28.3.msi,很显然用的还算是…

html get请求_99% 的人都理解错了 HTTP 中 GET 与 POST 的区别【面试必问】

先分析一波&#xff1a;1、GET和POST与数据如何传递没有关系&#xff1f;&#xff1f;GET和POST是由HTTP协议定义的。那么使用哪个方式与应用层的数据如何传输是没有相互关系的。从而&#xff0c;HTTP就没有要求&#xff0c;POST一定要放到请求体里面&#xff0c;GET就一定要放…

java属于哪种语言_Java属于以下哪种语言( )_学小易找答案

【单选题】AT89s51单片机若晶振频率为fosc12MHz,则一个机器周期等于( ) μS。【单选题】下列选项中,不属于Java中关键字的是( )【简答题】写出力在坐标轴上投影计算的两条重要结论。【判断题】《周南桃夭》中多次出现的“宜”指的是适宜。【单选题】以下关于三元运算符的说法中…

hive load data外部表报错_生产SparkSQL如何读写本地外部数据源及排错

https://spark-packages.org/里有很多third-party数据源的package&#xff0c;spark把包加载进来就可以使用了csv格式在spark2.0版本之后是内置的&#xff0c;2.0之前属于第三方数据源一、读取本地外部数据源1.直接读取一个json文件[hadoophadoop000 bin]$ ./spark-shell --mas…

java中的throw_Java中的throw和throws之间的区别

throw和throws都是异常处理的概念&#xff0c;其中throw用于显式地从方法或任何代码块中引发异常&#xff0c;而throw在方法的签名中用于指示此方法可能抛出列出的类型之一例外。以下是throw和throws之间的重要区别。序号键扔抛出1定义Throw是一个关键字&#xff0c;用于在函数…

ffmpeg命令_使用ffmpeg命令为多个短视频修改视频备注说明

今天主要给大家讲一下使用视频剪辑高手中的ffmpeg命令为多个短视频修改备注说明的详细步骤&#xff0c;有需要和感兴趣的宝贝们可以跟随小编一起来试试。收集视频将需要剪辑的短视频保存到同一文件夹上进入软件双击进入视频剪辑高手&#xff0c;选择“批量剪辑视频”功能添加视…

java 开发帮助_java的简单编程请帮助

(选择题答案可能有多选)一、java基础1、下面那句话编译时不会出现警告或错误&#xff1a;(5分)a)floatf1.3;b)charc"a";c)byteb257;d)booleanbnull;e)inti10;2、下面哪段程序编译时不会有错...(选择题答案可能有多选)一、 java基础1、 下面那句话编译时不会出现警告或…

从事python需要掌握哪些知识和技能_零基础想转行从事Python?需要掌握如下技能...

零基础python能找到工作吗&#xff1f;需要掌握哪些技能&#xff1f;对于大部分零基础学编程半路出家的人来说&#xff0c;无非是想改变现状换一门新职业&#xff0c;所谓技术大牛不过是比小白们更早接触编程罢了&#xff0c;选择好自己有兴趣的职业技能&#xff0c;并为之学习…

java 无法打印_为什么我在Java中尝试阻止后无法打印到控制台?

我在Android应用程序中有以下代码&#xff1a;public static HttpResponse dbPost(String handlerUrl, List postData) {HttpClient httpclient new DefaultHttpClient();String postUrl constants.postUrl();HttpPost httppost new HttpPost(postUrl);HttpResponse respons…