分別用python和go語言來實現的風靡一時的2048 游戲,包含完整代碼

目錄

  • 1、Python實現
  • 2、Go實現

2048 游戲實現主要包括以下幾個步驟:

  1. 創建一個棋盤,通常使用二維列表表示。
  2. 實現棋子的移動規則,左移、右移、上移、下移。
  3. 判斷游戲是否結束,即棋盤是否已滿或者無空位可移動。
  4. 實現游戲界面的顯示。

1、Python實現

下面是一個簡單的 Python 實現示例,運行效果如下:

import pygame    
import sys    
import random
# 初始化 pygame    
pygame.init()
# 設置屏幕大小    
screen_size = (800, 800)
# 創建屏幕    
screen = pygame.display.set_mode(screen_size)
# 設置標題    
pygame.display.set_caption("2048 游戲")
# 定義顏色    
WHITE = (255, 255, 255)    
BLACK = (0, 0, 0)
# 創建棋盤    
board_size = 8    
board = [[0 for x in range(board_size)] for y in range(board_size)]
# 初始化棋子    
num_boards = 4    
board_History = [[0 for x in range(board_size)] for y in range(num_boards)]
# 隨機生成初始棋局    
for i in range(num_boards):    for j in range(board_size):    board_History[i][j] = random.randint(0, 2)
# 定義繪制棋盤的函數    
def draw_board():    screen.fill(BLACK)for i in range(board_size):    for j in range(board_size):    if board_History[i][j] == 0:    pygame.draw.rect(screen, WHITE, (j * 40, i * 40, 40, 40))    else:    pygame.draw.rect(screen, WHITE, (j * 40 + 20, i * 40 + 20, 40, 40))    pygame.draw.rect(screen, BLACK, (j * 40, i * 40, 40, 40))pygame.display.update()
# 定義處理棋子移動的函數    
def move_board(direction):    for i in range(num_boards):    for j in range(board_size):    if board_History[i][j]!= 0:    if direction == "up" and board_History[i][j]!= 2:    board_History[i][j] = board_History[i][j - 1]    elif direction == "down" and board_History[i][j]!= 0:    board_History[i][j] = board_History[i][j + 1]    elif direction == "left" and board_History[i][j]!= 1:    board_History[i][j] = board_History[i - 1][j]    elif direction == "right" and board_History[i][j]!= 1:    board_History[i][j] = board_History[i + 1][j]
# 判斷游戲是否結束    
def is_game_over():    for i in range(board_size):    for j in range(board_size):    if board_History[i][j] == 0:    return False    elif board_History[i][j] == 2:    return True    return False
# 游戲主循環    
while True:  for event in pygame.event.get():  if event.type == pygame.QUIT:  pygame.quit()  sys.exit()if event.type == pygame.KEYDOWN:  if event.key == pygame.K_UP and board_History[0][0]!= 0:  move_board("up")  elif event.key == pygame.K_DOWN and board_History[0][0]!= 2:  move_board("down")  elif event.key == pygame.K_LEFT and board_History[0][0]!= 1:  move_board("left")  elif event.key == pygame.K_RIGHT and board_History[0][0]!= 1:  move_board("right")# 繪制棋盤  draw_board()# 判斷游戲是否結束  if is_game_over():  break# 刷新屏幕  pygame.display.update()  

2、Go實現

2048 游戲是一個簡單而又具有挑戰性的益智游戲,可以在一個小小的 4x4 網格中實現。玩家需要使用箭頭鍵移動方塊,使具有相同數字的方塊相互碰撞,從而合并成更大的方塊,最終達到目標數字 2048。
以下是用 Go 語言實現 2048 游戲的基本步驟:
創建一個 4x4 的二維數組來存儲游戲網格中的方塊。
初始化游戲網格,將所有方塊設置為初始數字(例如 2 或 4)。
生成一個新的方塊,將其放置在游戲網格的邊緣。
檢查新方塊與現有方塊是否相碰,如果是,將它們合并成更大的方塊。
檢查游戲網格是否已經達到目標數字 2048,如果是,顯示勝利畫面。
如果游戲網格已經填滿,沒有更多的空間生成新方塊,則顯示失敗畫面。
下面是一個簡單的示例程序,它實現了上述基本步驟,并在終端中顯示游戲運行效果:

package main
import (  "fmt"  "math/rand"  "time"  
)
type Tile struct {  Value int  Next   *Tile  
}
func main() {  boardSize := 4  board := make([][]Tile, boardSize)// 初始化游戲網格  for i := 0; i < boardSize; i++ {  row := make([]Tile, boardSize)  for j := 0; j < boardSize; j++ {  row[j] = Tile{Value: 2, Next: nil}  }  board[i] = row  }// 生成新方塊  newTile := Tile{Value: 2, Next: nil}// 游戲循環  for {  // 打印當前游戲網格  fmt.Println(board)// 隨機選擇一個方向生成新方塊  direction := rand.Intn(4)  switch direction {  case 0:  newTile.Next = board[0][boardSize-1]  case 1:  newTile.Next = board[1][boardSize-1]  case 2:  newTile.Next = board[2][boardSize-1]  case 3:  newTile.Next = board[3][boardSize-1]  }// 檢查新方塊是否與現有方塊相碰  collision := false  for j := 0; j < boardSize; j++ {  if newTile.Next!= nil && newTile.Next.Value == board[0][j].Value {  collision = true  break  }  }  if collision {  // 合并方塊  for j := 0; j < boardSize; j++ {  if newTile.Next!= nil && newTile.Next.Value == board[0][j].Value {  board[0][j].Value *= 2  newTile.Next = nil  }  }  } else {  // 將新方塊添加到游戲網格  for j := 0; j < boardSize; j++ {  if newTile.Next == nil {  board[0][j] = newTile  newTile.Next = board[0][j+1]  } else {  board[0][j] = newTile  newTile = newTile.Next  }  }  }// 檢查游戲是否結束  if board[0][0].Value == 2048 {  fmt.Println("恭喜你,你贏了!")  time.Sleep(1000)  return  } else if len(board[0]) == 0 {  fmt.Println("游戲失敗,游戲網格已經填滿。")  time.Sleep(1000)  return  }  }  
}

這個示例程序實現了一個簡單的 2048 游戲,運行在終端中。玩家可以使用箭頭鍵(上、下、左、右)來移動方塊。當方塊相碰時,它們會合并成更大的方塊。當游戲網格達到目標數字 2048 時,游戲勝利。當游戲網格填滿而無法生成新方塊時,游戲失敗。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/35370.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/35370.shtml
英文地址,請注明出處:http://en.pswp.cn/news/35370.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Android】ViewBinding+DataBinding+MVVM新手快速上手

為什么寫這篇博客 網上大部分博客&#xff0c;代碼量都比較大&#xff0c;把實際的業務都代入進去了 這篇博客的目的&#xff0c;就是為了講解基本原理和使用思路&#xff0c;然后給出一個最簡單的Demo 這里不講解具體用法&#xff0c;那樣篇幅會太長&#xff0c;直接看Demo…

TENNECO EDI 項目——X12與XML之間的轉換

近期為了幫助廣大用戶更好地使用 EDI 系統&#xff0c;我們根據以往的項目實施經驗&#xff0c;將成熟的 EDI 項目進行開源。用戶安裝好知行之橋EDI系統之后&#xff0c;只需要下載我們整理好的示例代碼&#xff0c;并放置在知行之橋指定的工作區中&#xff0c;即可開始使用。 …

YOLOv5入門實踐(3)— 手把手教你如何去劃分數據集

前言&#xff1a;Hello大家好&#xff0c;我是小哥談。數據集標注完成之后&#xff0c;下一步就是對這些數據集進行劃分了。面對繁雜的數據集&#xff0c;如果手動劃分的話&#xff0c;不僅麻煩而且不能保持隨機性。本節課就給大家介紹一種方法&#xff0c;即使用代碼去劃分數據…

Xcode升級導致關聯庫報錯

想辦法找到對應的庫 然后到 Build Phases -- LinkBinary With Libraries中點擊&#xff0c;選擇對應的framework即可&#xff0c;就像我工程的報錯 Undefined symbol: _OBJC_CLASS_$_ADClient _OBJC_CLASS_$_ASIdentifierManager 缺失的庫是AdSupport.framework 添加后再次編…

Elasticsearch6.x和7.x的區別

Elasticsearch6.x和7.x的區別 1、查找方面的區別 在增刪改方面&#xff0c;6.x和7.x是一樣的&#xff0c;在查找方面&#xff08;分為普通查找和有高亮的查找&#xff09;&#xff0c;6.x和7.x有區別。 在7.x的es中&#xff1a; org.springframework.data.elasticsearch.cor…

Styled-components,另一種css in js的方案

介紹 Styled-components是一種流行的CSS-in-JS庫&#xff0c;它為React和React Native應用程序提供了一種優雅的方式來管理組件的樣式。它的設計理念是將CSS樣式與組件邏輯緊密綁定在一起&#xff0c;從而使樣式在組件層級中作用更加清晰和可維護 使用 安裝Styled-components…

【C語言】操作符詳解

目錄 一、算數操作符 二、移位操作符 1.左移操作符 2.右移操作符 (1) 邏輯右移 (2) 算術右移 (3)小總結 三、位操作符 四、賦值操作符 五、單目操作符 六、關系操作符 七、邏輯操作符 八、 條件操作符 九、逗號表達式 十、下標引用、函數調用和結構成員 1. [ ]下…

QT-如何使用RS232進行讀寫通訊

以下是一個使用Qt進行RS232通訊的具體示例&#xff0c;包括讀取和寫入數據的操作&#xff1a; #include <QCoreApplication> #include <QDebug> #include <QSerialPort> #include <QTimer>QSerialPort serial; // 串口對象void readData() {QByteArra…

GO學習之 微框架(Gin)

GO系列 1、GO學習之Hello World 2、GO學習之入門語法 3、GO學習之切片操作 4、GO學習之 Map 操作 5、GO學習之 結構體 操作 6、GO學習之 通道(Channel) 7、GO學習之 多線程(goroutine) 8、GO學習之 函數(Function) 9、GO學習之 接口(Interface) 10、GO學習之 網絡通信(Net/Htt…

UDS的DID(Data identification)

引言 DID是UDS中的一個重要概念&#xff0c;它代表著特定的數據標識符。DID用于標識和獲取ECU中的特定參數數據&#xff0c;如傳感器數據、狀態信息等。通過使用DID&#xff0c;診斷工具可以準確地獲取所需的數據&#xff0c;從而幫助診斷人員更好地了解車輛的狀態和性能。 D…

開發者必知:.gitignore 文件的魔法,助你管理項目文件如虎添翼!

前言&#xff1a; 在軟件開發的世界中&#xff0c;版本控制是一個至關重要的環節。而 Git 作為目前最流行的分布式版本控制系統之一&#xff0c;已經成為開發者不可或缺的工具。然而&#xff0c;在日常的開發過程中&#xff0c;有些文件是不適合被納入版本控制的&#xff0c;比…

leetcode242. 有效的字母異位詞

題目&#xff1a;leetcode242. 有效的字母異位詞 描述&#xff1a; 給定兩個字符串 s 和 t &#xff0c;編寫一個函數來判斷 t 是否是 s 的字母異位詞。 注意&#xff1a;若 s 和 t 中每個字符出現的次數都相同&#xff0c;則稱 s 和 t 互為字母異位詞。 示例 1: 輸入: s “…

【React | 前端】在React的前端頁面中,判斷某個變量值是否被定義?根據是否定義顯示不同的內容?

問題描述 在React的前端頁面中&#xff0c;判斷某個變量值是否被定義&#xff1f;根據是否定義顯示不同的內容&#xff1f; 問題場景 假如&#xff0c;現在有一個需求是設計一個新功能&#xff0c;新功能中要求新增一個之前沒有的變量&#xff0c;假設是計算某一個數組的長度…

基于Java+SpringBoot+Vue的數碼論壇系統設計與實現(源碼+LW+部署文檔等)

博主介紹&#xff1a; 大家好&#xff0c;我是一名在Java圈混跡十余年的程序員&#xff0c;精通Java編程語言&#xff0c;同時也熟練掌握微信小程序、Python和Android等技術&#xff0c;能夠為大家提供全方位的技術支持和交流。 我擅長在JavaWeb、SSH、SSM、SpringBoot等框架…

【C語言】深度剖析數據在內存中的存儲

一、數據類型詳細介紹 1、數據類型介紹 &#xff08;1&#xff09;基本的內置類型 //內置類型就是C語言自帶的類型char //字符數據類型 short //短整型 int //整形 long //長整型 long long //更長的整形 float //單精度浮點數 double …

微信小程序使用rich-text解析富文本字符串的時候,遇到image標簽圖片很大超過屏幕

場景&#xff1a; 使用uniapp開發微信小程序&#xff0c;解析富文本文章需求 用到的組件&#xff1a; u-view2.0的u-parse uniapp提供的rich-text 以上兩種組件都是解析富文本的作用&#xff0c;一般用于富文本解析場景&#xff0c;比如解析文章內容&#xff0c;商品詳情&am…

桶排序-1184:明明的隨機數

【題目描述】 明明想在學校中請一些同學一起做一項問卷調查&#xff0c;為了實驗的客觀性&#xff0c;他先用計算機生成了N個1到1000之間的隨機整數&#xff08;N≤100&#xff09;&#xff0c;對于其中重復的數字&#xff0c;只保留一個&#xff0c;把其余相同的數去掉&#x…

安防監控視頻匯聚平臺EasyCVR分發的FLV視頻流在VLC中無法播放是什么原因?

眾所周知&#xff0c;TSINGSEE青犀視頻匯聚平臺EasyCVR可支持多協議方式接入&#xff0c;包括主流標準協議國標GB28181、RTSP/Onvif、RTMP等&#xff0c;以及廠家私有協議與SDK接入&#xff0c;包括海康Ehome、海大宇等設備的SDK等。在視頻流的處理與分發上&#xff0c;視頻監控…

【jvm】jvm的生命周期

目錄 一、啟動二、執行三、退出 一、啟動 1.java虛擬機的啟動是通過引導類加載器bootstrap class loader創建一個初始類&#xff08;initial class&#xff09;來完成的&#xff0c;這個類是由虛擬機的具體實現指定的(根據具體虛擬機的類型) 二、執行 1.一個運行中的java虛擬機…

ORACLE行轉列、列轉行實現方式及案例

ORACLE行轉列、列轉行實現方式及案例 行轉列案例方式1.PIVOT方式2.MAX和DECODE方式3.CASE WHEN和GROUP BY 列轉行案例方式1.UNPIVOT方式2.UNION ALL 行轉列 案例 假設我們有一個名為sales的表&#xff0c;其中包含了產品銷售數據。表中有三列&#xff1a;product&#xff08;…