2048游戏简单实现

前言

最近突然心血来潮想写一个网页小游戏,我看网上有很多人推荐写2048来练练手,遂开始写。目前为止,基本功能已经实现,只是没有添加相应的动画效果,待以后有机会补上(其实我就是动画这块太菜了 T_T)

前方长文预警!!!

游戏截图

    

项目结构

这个项目结构挺简单的,应该也都看得懂,在此仅对js文件夹进行描述,其余的就不再赘述啦

(main.js是入口文件,move.js主要就是一些移动的处理,support.js里是对移动块背景颜色和文字颜色的处理,后面要添加的动画效果也准备写在这个文件里)

主要功能

1.游戏初始化:新建游戏4×4的16宫格画布,随机格子上生成2或者4两个数字

2.格子的移动:先判断能否移动,移动后判断能否合并,合并后改变格子颜色和数字

3.新格子的生成:移动一次,就在剩余的空格子中随机生成一个2或者4

4.判赢:16宫格中合并出了“2048”则为游戏胜利

5.判输:16宫格中没有剩余空格子且不能再向任何方向移动则为游戏失败

分步代码

一、HTML结构

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>2048</title>
  <script
  src="http://code.jquery.com/jquery-3.3.1.min.js"></script>
  <link rel="stylesheet" href="css/index.css">
</head>
<body>
  <header>
    <div class="left">
      <span class="title">2048</span>
      <p class="slogan_1">Play 2048 Game Online</p>
      <p class="slogan_2">Join the numbers and get to the 2048 tile!</p>
    </div>
    <div class="right">
      <p class="score-box">score<br /> 
        <span id="score">669</span>
      </p>
      <button type="button" id="new-game">New Game</button>
    </div>
  </header>
  <div id="grid-con">
    <!-- 第一行 -->
    <div class="grid-cell" id="grid-cell-0-0"></div>
    <div class="grid-cell" id="grid-cell-0-1"></div>
    <div class="grid-cell" id="grid-cell-0-2"></div>
    <div class="grid-cell" id="grid-cell-0-3"></div>

    <!-- 第二行 -->
    <div class="grid-cell" id="grid-cell-1-0"></div>
    <div class="grid-cell" id="grid-cell-1-1"></div>
    <div class="grid-cell" id="grid-cell-1-2"></div>
    <div class="grid-cell" id="grid-cell-1-3"></div>
    
    <!-- 第三行 -->
    <div class="grid-cell" id="grid-cell-2-0"></div>
    <div class="grid-cell" id="grid-cell-2-1"></div>
    <div class="grid-cell" id="grid-cell-2-2"></div>
    <div class="grid-cell" id="grid-cell-2-3"></div>
    
    <!-- 第四行 -->
    <div class="grid-cell" id="grid-cell-3-0"></div>
    <div class="grid-cell" id="grid-cell-3-1"></div>
    <div class="grid-cell" id="grid-cell-3-2"></div>
    <div class="grid-cell" id="grid-cell-3-3"></div>
  </div>
  <div class="mask"></div>    <!-- 灰色遮罩层:游戏结束时随gameover框一并出现 -->
  <div id="game-over">
    Game Over!
  </div>
  <div id="game-win">
    Congradulation!
  </div>
  <script src="js/main.js"></script>
  <script src="js/move.js"></script>
  <script src="js/support.js"></script>
</body>
</html>

HTML结构的主要思路为:利用网格布局将游戏画布的16宫格绘制出来,通过class定制样式,id定位到具体的格子以重绘格子样式。

网格布局的详细

  • 8
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
2048游戏实现需要掌握C语言的基本语法和游戏开发相关知识。以下是实现2048游戏的一些基本步骤: 1. 定义游戏的数据结构:需要定义游戏面板、格子、方向等相关数据结构。 2. 初始化游戏:需要初始化游戏面板,将初始的数字随机放置在面板上。 3. 监听用户操作:需要监听用户的操作,例如键盘输入等。 4. 移动格子:根据用户的操作,将数字格子进行移动,合并等操作。 5. 判断游戏是否结束:判断游戏是否结束,例如没有空格子或者相邻数字相同等情况。 6. 更新分数和最高分数:根据游戏的规则,更新玩家的分数和最高分数。 7. 重新开始游戏:当游戏结束后,需要提示玩家,并提供重新开始游戏的选项。 以下是一份简单的C语言2048游戏实现代码,仅供参考: ``` #include <stdio.h> #include <stdlib.h> #include <time.h> #include <conio.h> #define BOARD_SIZE 4 #define WIN_SCORE 2048 int board[BOARD_SIZE][BOARD_SIZE]; int score = 0; int highest_score = 0; void init_board() { srand(time(NULL)); int i, j; for(i = 0; i < BOARD_SIZE; i++) { for(j = 0; j < BOARD_SIZE; j++) { board[i][j] = 0; } } int x1 = rand() % BOARD_SIZE; int y1 = rand() % BOARD_SIZE; int x2 = rand() % BOARD_SIZE; int y2 = rand() % BOARD_SIZE; while(x1 == x2 && y1 == y2) { x2 = rand() % BOARD_SIZE; y2 = rand() % BOARD_SIZE; } board[x1][y1] = 2; board[x2][y2] = 2; } void draw_board() { int i, j; printf("\n"); for(i = 0; i < BOARD_SIZE; i++) { printf("\t+------+------+------+------+\n"); for(j = 0; j < BOARD_SIZE; j++) { printf("\t|"); if(board[i][j] == 0) { printf(" "); } else { printf("%4d", board[i][j]); } } printf("\t|\n"); } printf("\t+------+------+------+------+\n"); printf("\tScore: %d\tHighest Score: %d\n", score, highest_score); } void move_left() { int i, j, k; for(i = 0; i < BOARD_SIZE; i++) { for(j = 1; j < BOARD_SIZE; j++) { if(board[i][j] != 0) { for(k = j - 1; k >= 0; k--) { if(board[i][k] == 0) { board[i][k] = board[i][k+1]; board[i][k+1] = 0; } else if(board[i][k] == board[i][k+1]) { board[i][k] *= 2; score += board[i][k]; board[i][k+1] = 0; } else { break; } } } } } } void move_right() { int i, j, k; for(i = 0; i < BOARD_SIZE; i++) { for(j = BOARD_SIZE - 2; j >= 0; j--) { if(board[i][j] != 0) { for(k = j + 1; k < BOARD_SIZE; k++) { if(board[i][k] == 0) { board[i][k] = board[i][k-1]; board[i][k-1] = 0; } else if(board[i][k] == board[i][k-1]) { board[i][k] *= 2; score += board[i][k]; board[i][k-1] = 0; } else { break; } } } } } } void move_up() { int i, j, k; for(j = 0; j < BOARD_SIZE; j++) { for(i = 1; i < BOARD_SIZE; i++) { if(board[i][j] != 0) { for(k = i - 1; k >= 0; k--) { if(board[k][j] == 0) { board[k][j] = board[k+1][j]; board[k+1][j] = 0; } else if(board[k][j] == board[k+1][j]) { board[k][j] *= 2; score += board[k][j]; board[k+1][j] = 0; } else { break; } } } } } } void move_down() { int i, j, k; for(j = 0; j < BOARD_SIZE; j++) { for(i = BOARD_SIZE - 2; i >= 0; i--) { if(board[i][j] != 0) { for(k = i + 1; k < BOARD_SIZE; k++) { if(board[k][j] == 0) { board[k][j] = board[k-1][j]; board[k-1][j] = 0; } else if(board[k][j] == board[k-1][j]) { board[k][j] *= 2; score += board[k][j]; board[k-1][j] = 0; } else { break; } } } } } } int is_game_over() { int i, j, flag = 0; for(i = 0; i < BOARD_SIZE; i++) { for(j = 0; j < BOARD_SIZE; j++) { if(board[i][j] == WIN_SCORE) return 1; if(board[i][j] == 0) flag = 1; if(i > 0 && board[i-1][j] == board[i][j]) return 0; if(i < BOARD_SIZE-1 && board[i+1][j] == board[i][j]) return 0; if(j > 0 && board[i][j-1] == board[i][j]) return 0; if(j < BOARD_SIZE-1 && board[i][j+1] == board[i][j]) return 0; } } if(flag) return 0; return 1; } void save_game() { FILE *fp; fp = fopen("game.dat", "w"); fprintf(fp, "%d\n", highest_score); fprintf(fp, "%d\n", score); int i, j; for(i = 0; i < BOARD_SIZE; i++) { for(j = 0; j < BOARD_SIZE; j++) { fprintf(fp, "%d ", board[i][j]); } fprintf(fp, "\n"); } fclose(fp); } void load_game() { FILE *fp; fp = fopen("game.dat", "r"); if(fp != NULL) { fscanf(fp, "%d\n", &highest_score); fscanf(fp, "%d\n", &score); int i, j; for(i = 0; i < BOARD_SIZE; i++) { for(j = 0; j < BOARD_SIZE; j++) { fscanf(fp, "%d ", &board[i][j]); } } fclose(fp); } else { printf("No saved game found.\n"); getch(); } } void play_game() { char ch; init_board(); while(1) { draw_board(); ch = getch(); switch(ch) { case 'w': move_up(); break; case 's': move_down(); break; case 'a': move_left(); break; case 'd': move_right(); break; case 'q': save_game(); exit(0); break; case 'r': init_board(); score = 0; break; case 'l': load_game(); break; default: continue; } if(is_game_over()) break; system("cls"); } system("cls"); draw_board(); printf("\nGame over!\n"); } int main() { play_game(); return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值