首页 > 其他分享 >2048 游戏实现

2048 游戏实现

时间:2024-10-29 10:18:19浏览次数:6  
标签:游戏 实现 2048 range board new col merged row

引言

2048 是一个非常受欢迎的数字拼图游戏,玩家通过移动方块使相同的数字合并,目标是得到 2048 或更高的数字。这个游戏简单而有趣,适合用来练习编程技能。

代码实现

1import random
2import curses
3
4def get_empty_board():
5    return [[0] * 4 for _ in range(4)]
6
7def add_new_tile(board):
8    empty_tiles = [(i, j) for i in range(4) for j in range(4) if board[i][j] == 0]
9    if not empty_tiles:
10        return False
11    i, j = random.choice(empty_tiles)
12    board[i][j] = 2
13    return True
14
15def move_left(board):
16    new_board = [row[:] for row in board]
17    for i in range(4):
18        row = new_board[i]
19        merged = [False] * 4
20        for j in range(1, 4):
21            if row[j] != 0:
22                k = j
23                while k > 0 and (row[k - 1] == 0 or (row[k - 1] == row[k] and not merged[k - 1])):
24                    if row[k - 1] == 0:
25                        row[k - 1], row[k] = row[k], row[k - 1]
26                    elif row[k - 1] == row[k]:
27                        row[k - 1] *= 2
28                        row[k] = 0
29                        merged[k - 1] = True
30                    k -= 1
31    return new_board
32
33def move_right(board):
34    new_board = [row[:] for row in board]
35    for i in range(4):
36        row = new_board[i]
37        merged = [False] * 4
38        for j in range(2, -1, -1):
39            if row[j] != 0:
40                k = j
41                while k < 3 and (row[k + 1] == 0 or (row[k + 1] == row[k] and not merged[k + 1])):
42                    if row[k + 1] == 0:
43                        row[k + 1], row[k] = row[k], row[k + 1]
44                    elif row[k + 1] == row[k]:
45                        row[k + 1] *= 2
46                        row[k] = 0
47                        merged[k + 1] = True
48                    k += 1
49    return new_board
50
51def move_up(board):
52    new_board = [row[:] for row in board]
53    for j in range(4):
54        col = [new_board[i][j] for i in range(4)]
55        merged = [False] * 4
56        for i in range(1, 4):
57            if col[i] != 0:
58                k = i
59                while k > 0 and (col[k - 1] == 0 or (col[k - 1] == col[k] and not merged[k - 1])):
60                    if col[k - 1] == 0:
61                        col[k - 1], col[k] = col[k], col[k - 1]
62                    elif col[k - 1] == col[k]:
63                        col[k - 1] *= 2
64                        col[k] = 0
65                        merged[k - 1] = True
66                    k -= 1
67        for i in range(4):
68            new_board[i][j] = col[i]
69    return new_board
70
71def move_down(board):
72    new_board = [row[:] for row in board]
73    for j in range(4):
74        col = [new_board[i][j] for i in range(4)]
75        merged = [False] * 4
76        for i in range(2, -1, -1):
77            if col[i] != 0:
78                k = i
79                while k < 3 and (col[k + 1] == 0 or (col[k + 1] == col[k] and not merged[k + 1])):
80                    if col[k + 1] == 0:
81                        col[k + 1], col[k] = col[k], col[k + 1]
82                    elif col[k + 1] == col[k]:
83                        col[k + 1] *= 2
84                        col[k] = 0
85                        merged[k + 1] = True
86                    k += 1
87        for i in range(4):
88            new_board[i][j] = col[i]
89    return new_board
90
91def is_game_over(board):
92    for i in range(4):
93        for j in range(4):
94            if board[i][j] == 0:
95                return False
96            if i < 3 and board[i][j] == board[i + 1][j]:
97                return False
98            if j < 3 and board[i][j] == board[i][j + 1]:
99                return False
100    return True
101
102def draw_board(stdscr, board):
103    stdscr.clear()
104    for i in range(4):
105        for j in range(4):
106            if board[i][j] == 0:
107                stdscr.addstr(i, j * 5, '   ')
108            else:
109                stdscr.addstr(i, j * 5, f'{board[i][j]:3}')
110    stdscr.refresh()
111
112def main(stdscr):
113    curses.curs_set(0)
114    board = get_empty_board()
115    add_new_tile(board)
116    add_new_tile(board)
117
118    while True:
119        draw_board(stdscr, board)
120        if is_game_over(board):
121            stdscr.addstr(5, 0, "Game Over! Press any key to exit.")
122            stdscr.getch()
123            break
124
125        key = stdscr.getch()
126        if key == ord('q'):
127            break
128        elif key == curses.KEY_LEFT:
129            board = move_left(board)
130        elif key == curses.KEY_RIGHT:
131            board = move_right(board)
132        elif key == curses.KEY_UP:
133            board = move_up(board)
134        elif key == curses.KEY_DOWN:
135            board = move_down(board)
136
137        if add_new_tile(board):
138            continue
139        else:
140            break
141
142    curses.endwin()
143
144if __name__ == "__main__":
145    curses.wrapper(main)

运行说明

  1. 安装依赖:确保你的系统上安装了 curses 库。大多数 Linux 和 macOS 系统默认已安装此库。如果你使用的是 Windows,可以考虑使用 windows-curses 库。
  2. 保存代码:将上述代码保存为一个 Python 文件,例如 2048.py
  3. 运行游戏:在终端或命令提示符中运行 python 2048.py

控制方式

  • 左箭头键:向左移动方块
  • 右箭头键:向右移动方块
  • 上箭头键:向上移动方块
  • 下箭头键:向下移动方块
  • q 键:退出游戏

总结

这个简单的 2048 游戏实现展示了如何使用 Python 和 curses 库来创建一个基本的命令行游戏。你可以在此基础上进行扩展,添加更多的功能和优化,例如分数显示、更复杂的动画效果等。希望你喜欢这个小游戏!

标签:游戏,实现,2048,range,board,new,col,merged,row
From: https://blog.51cto.com/u_14940497/12394001

相关文章

  • Springboot计算机毕业设计房屋租赁管理系统的设计与实现64tm5
    Springboot计算机毕业设计房屋租赁管理系统的设计与实现64tm5本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表项目功能:房东,租户,房源类型,房源信息,预定房子,合同信息,退租信息开题报告内容一、项目背景与......
  • 客户端存储 — IndexedDB 实现分页查询
    前言相信IndexedDB大家都有过了解,但是不一定每个人都有过实践,并且其中涉及到事务、游标等概念,会导致在初次使用时会有些不适应,那么本文会通过IndexedDB实现分页查询的形式进行实践,在开始之前,可以尝试思考一下浏览器的客户端存储你都了解哪些呢?其实客户端存储分为下面......
  • 抖音中aBogus签名算法的纯Python代码实现(2024年10月)
    目前网上的aBogus签名算法都是用python里execjs来执行js代码计算的,这种方法虽然可以达到计算签名值的结果,但是性能不高。本文直接将aBogus的js的源码改成python代码,同样的参数,计算的结果和js版本一样。附python源码importjsonfromrandomimportchoicefromrandomimport......
  • rust+tikio实现websocket
    toml[dependencies]libc="0.2.98"tokio={version="1.8.1",features=["sync","time","rt-multi-thread","macros"]}tokio-tungstenite="0.15.0"tungstenite="0.14.0"futu......
  • 帝国CMS隔色换色列表页样式加分隔线实现方法
    隔行换色使用默认的列表循环代码,并在每个列表项中添加不同的样式类。[!--empirenews.listtemp--]<liclass="a"><!--list.var1--></li><li><!--list.var2--></li>[!--empirenews.listtemp--]设置每次显示的参数为2,以实现隔行换色。隔5行加分隔线在每5个列......
  • 帝国cms一句MySQL语句实现多表数据之和
    SQL语句:SELECTCOUNT(AA.id)AStotalFROM(SELECTidFROMwww_moban5_cn_ecms_newsUNIONALLSELECTidFROMwww_moban5_cn_ecms_xiazaiUNIONALLSELECTidFROMwww_moban5_cn_ecms_photoUNIONALLSELECTidFROMwww_moban5_cn_ecms_download)......
  • PbootCMS如何实现留言内容自动发送到QQ邮箱
    准备两个QQ邮箱:发件邮箱:用于发送邮件,需要开通【POP3/SMTP服务】和【IMAP/SMTP服务】。收件邮箱:用于接收邮件。开通邮箱服务:登录QQ邮箱,进入“设置”->“账户”。开启【POP3/SMTP服务】和【IMAP/SMTP服务】。记录生成的授权码,用于后续配置。配置PBootCMS:进......
  • 使用Python实现深度学习模型:智能光污染监测与管理
    随着城市化的快速发展,光污染问题变得越来越严重。光污染不仅影响天文学观测,还对生态环境和人类健康产生负面影响。本文将介绍如何使用Python实现一个深度学习模型来进行智能光污染监测与管理,并提供详细的代码说明,使读者能够轻松上手。深度学习与光污染监测深度学习是一种......
  • C#使用Socket实现分布式事件总线,不依赖第三方MQ
    使用Socket实现的分布式事件总线,支持CQRS,不依赖第三方MQ。CodeWF.EventBus.Socket是一个轻量级的、基于Socket的分布式事件总线系统,旨在简化分布式架构中的事件通信。它允许进程之间通过发布/订阅模式进行通信,无需依赖外部消息队列服务。CommandQuery特性轻量级:不......
  • RSA加密算法实现
    Java实现RSA加密算法示例,包括密钥对的生成、加密和解密过程。首先需要导入Java的加密库,这些功能主要通过java.security和javax.crypto包提供。先生成了一个RSA密钥对,包括一个公钥和一个私钥。然后使用公钥加密了一个字符串,并使用私钥解密了加密后的字符串。加密和解密的结果都......