基于SpringBoot和Vue寫(xiě)一個(gè)2048小游戲
1. 設(shè)置項(xiàng)目結(jié)構(gòu)
你需要?jiǎng)?chuàng)建一個(gè)包含兩個(gè)部分的項(xiàng)目:
- 后端 (Java Spring Boot)
- 前端 (Vue.js)
2. 后端 (Spring Boot)
首先,創(chuàng)建一個(gè)新的 Spring Boot 項(xiàng)目。你可以使用 Spring Initializr 或者任何其他你喜歡的方式。
項(xiàng)目依賴
確保添加以下依賴:
Spring WebSpring Boot DevTools
編寫(xiě)游戲邏輯
在 src/main/java 下創(chuàng)建一個(gè)用于處理游戲邏輯的包,例如 com.example.game.
GameController.java
package com.example.game;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class GameController {
private Game game = new Game();
@GetMapping("/game")
public int[][] getGameState() {
return game.getBoard();
}
@PostMapping("/move")
public int[][] makeMove(@RequestBody String direction) {
switch (direction) {
case "up":
game.moveUp();
break;
case "down":
game.moveDown();
break;
case "left":
game.moveLeft();
break;
case "right":
game.moveRight();
break;
}
game.addRandomTile();
return game.getBoard();
}
}Game.java
package com.example.game;
import java.util.Random;
public class Game {
private int[][] board = new int[4][4];
private Random random = new Random();
public Game() {
addRandomTile();
addRandomTile();
}
public int[][] getBoard() {
return board;
}
public void moveUp() {
for (int col = 0; col < 4; col++) {
int[] column = new int[4];
int index = 0;
for (int row = 0; row < 4; row++) {
if (board[row][col] != 0) {
column[index++] = board[row][col];
}
}
merge(column);
for (int row = 0; row < 4; row++) {
board[row][col] = column[row];
}
}
}
public void moveDown() {
for (int col = 0; col < 4; col++) {
int[] column = new int[4];
int index = 0;
for (int row = 3; row >= 0; row--) {
if (board[row][col] != 0) {
column[index++] = board[row][col];
}
}
merge(column);
for (int row = 0; row < 4; row++) {
board[3 - row][col] = column[row];
}
}
}
public void moveLeft() {
for (int row = 0; row < 4; row++) {
int[] newRow = new int[4];
int index = 0;
for (int col = 0; col < 4; col++) {
if (board[row][col] != 0) {
newRow[index++] = board[row][col];
}
}
merge(newRow);
board[row] = newRow;
}
}
public void moveRight() {
for (int row = 0; row < 4; row++) {
int[] newRow = new int[4];
int index = 0;
for (int col = 3; col >= 0; col--) {
if (board[row][col] != 0) {
newRow[index++] = board[row][col];
}
}
merge(newRow);
for (int col = 0; col < 4; col++) {
board[row][3 - col] = newRow[col];
}
}
}
private void merge(int[] row) {
for (int i = 0; i < 3; i++) {
if (row[i] != 0 && row[i] == row[i + 1]) {
row[i] *= 2;
row[i + 1] = 0;
i++;
}
}
int[] newRow = new int[4];
int index = 0;
for (int num : row) {
if (num != 0) {
newRow[index++] = num;
}
}
System.arraycopy(newRow, 0, row, 0, 4);
}
public void addRandomTile() {
int emptyTiles = 0;
for (int[] row : board) {
for (int tile : row) {
if (tile == 0) {
emptyTiles++;
}
}
}
if (emptyTiles == 0) {
return;
}
int randomTile = random.nextInt(emptyTiles);
int value = random.nextInt(10) < 9 ? 2 : 4;
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
if (board[i][j] == 0) {
if (randomTile == 0) {
board[i][j] = value;
return;
}
randomTile--;
}
}
}
}
}3. 前端 (Vue.js)
創(chuàng)建一個(gè)新的 Vue 項(xiàng)目,你可以使用 Vue CLI 或者 Vite 等工具。
設(shè)置 Vue 項(xiàng)目
安裝 Axios 以便與后端進(jìn)行通信:
npm install axios
創(chuàng)建游戲界面
在 src/components 目錄下創(chuàng)建一個(gè) Game.vue 組件:
<template>
<div class="game">
<div class="board">
<div v-for="(row, rowIndex) in board" :key="rowIndex" class="row">
<div v-for="(cell, colIndex) in row" :key="colIndex" class="cell">
{{ cell || '' }}
</div>
</div>
</div>
<div class="controls">
<button @click="move('up')">Up</button>
<button @click="move('down')">Down</button>
<button @click="move('left')">Left</button>
<button @click="move('right')">Right</button>
</div>
</div>
</template>
<script>
import axios from 'axios';
export default {
data() {
return {
board: [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
};
},
mounted() {
this.getBoard();
},
methods: {
async getBoard() {
const response = await axios.get('/game');
this.board = response.data;
},
async move(direction) {
const response = await axios.post('/move', direction);
this.board = response.data;
}
}
};
</script>
<style>
.game {
text-align: center;
}
.board {
display: inline-block;
}
.row {
display: flex;
}
.cell {
width: 50px;
height: 50px;
background-color: #ccc;
margin: 5px;
display: flex;
justify-content: center;
align-items: center;
font-size: 18px;
font-weight: bold;
}
.controls {
margin-top: 20px;
}
</style>在 App.vue 中導(dǎo)入 Game.vue
<template>
<div id="app">
<Game />
</div>
</template>
<script>
import Game from './components/Game.vue';
export default {
name: 'App',
components: {
Game
}
};
</script>
<style>
#app {
font-family: Avenir, Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
margin-top: 60px;
}
</style>4. 運(yùn)行和調(diào)試
- 啟動(dòng) Spring Boot 項(xiàng)目。
- 啟動(dòng) Vue 前端項(xiàng)目。
確保 Spring Boot 的默認(rèn)端口(8080)與 Vue 的默認(rèn)端口(通常是8081)不會(huì)沖突。
你現(xiàn)在應(yīng)該能夠在瀏覽器中訪問(wèn) Vue 前端,并與 Spring Boot 后端進(jìn)行交互,從而玩 2048 游戲。
到此這篇關(guān)于基于SpringBoot和Vue寫(xiě)一個(gè)2048小游戲的文章就介紹到這了,更多相關(guān)SpringBoot Vue 2048游戲內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java編程實(shí)現(xiàn)國(guó)際象棋棋盤(pán)
這篇文章主要為大家詳細(xì)介紹了java編程實(shí)現(xiàn)國(guó)際象棋棋盤(pán),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-05-05
java案例實(shí)戰(zhàn)之字符串轉(zhuǎn)換為二進(jìn)制
最近遇到個(gè)需求,要求編寫(xiě)一個(gè)程序,從鍵盤(pán)錄入一個(gè)字符串,將字符串轉(zhuǎn)換為二進(jìn)制數(shù),下面這篇文章主要給大家介紹了關(guān)于java字符串轉(zhuǎn)換為二進(jìn)制的相關(guān)資料,需要的朋友可以參考下2023-06-06
SpringBoot整合MybatisPlus的基本應(yīng)用詳解
MyBatis-Plus (簡(jiǎn)稱 MP)是一個(gè) MyBatis的增強(qiáng)工具,在 MyBatis 的基礎(chǔ)上只做增強(qiáng)不做改變,為 簡(jiǎn)化開(kāi)發(fā)、提高效率而生,本文將給大家介紹一下SpringBoot整合MybatisPlus的基本應(yīng)用,需要的朋友可以參考下2024-05-05
Java如何對(duì)返回參數(shù)進(jìn)行處理
這篇文章主要介紹了Java如何對(duì)返回參數(shù)進(jìn)行處理問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07
Java 并發(fā)編程ArrayBlockingQueue的實(shí)現(xiàn)
這篇文章主要介紹了Java 并發(fā)編程ArrayBlockingQueue的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02
運(yùn)用springboot搭建并部署web項(xiàng)目的示例
這篇文章主要介紹了運(yùn)用springboot搭建并部署web項(xiàng)目的示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-06-06
spring?boot實(shí)現(xiàn)圖片上傳到后臺(tái)的功能(瀏覽器可直接訪問(wèn))
這篇文章主要介紹了spring?boot實(shí)現(xiàn)圖片上傳到后臺(tái)的功能(瀏覽器可直接訪問(wèn)),需要的朋友可以參考下2022-04-04

