基于SpringBoot和Vue寫一個2048小游戲
1. 設(shè)置項目結(jié)構(gòu)
你需要創(chuàng)建一個包含兩個部分的項目:
- 后端 (Java Spring Boot)
- 前端 (Vue.js)
2. 后端 (Spring Boot)
首先,創(chuàng)建一個新的 Spring Boot 項目。你可以使用 Spring Initializr 或者任何其他你喜歡的方式。
項目依賴
確保添加以下依賴:
Spring WebSpring Boot DevTools
編寫游戲邏輯
在 src/main/java 下創(chuàng)建一個用于處理游戲邏輯的包,例如 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)建一個新的 Vue 項目,你可以使用 Vue CLI 或者 Vite 等工具。
設(shè)置 Vue 項目
安裝 Axios 以便與后端進行通信:
npm install axios
創(chuàng)建游戲界面
在 src/components 目錄下創(chuàng)建一個 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. 運行和調(diào)試
- 啟動 Spring Boot 項目。
- 啟動 Vue 前端項目。
確保 Spring Boot 的默認端口(8080)與 Vue 的默認端口(通常是8081)不會沖突。
你現(xiàn)在應(yīng)該能夠在瀏覽器中訪問 Vue 前端,并與 Spring Boot 后端進行交互,從而玩 2048 游戲。
到此這篇關(guān)于基于SpringBoot和Vue寫一個2048小游戲的文章就介紹到這了,更多相關(guān)SpringBoot Vue 2048游戲內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java案例實戰(zhàn)之字符串轉(zhuǎn)換為二進制
最近遇到個需求,要求編寫一個程序,從鍵盤錄入一個字符串,將字符串轉(zhuǎn)換為二進制數(shù),下面這篇文章主要給大家介紹了關(guān)于java字符串轉(zhuǎn)換為二進制的相關(guān)資料,需要的朋友可以參考下2023-06-06
SpringBoot整合MybatisPlus的基本應(yīng)用詳解
MyBatis-Plus (簡稱 MP)是一個 MyBatis的增強工具,在 MyBatis 的基礎(chǔ)上只做增強不做改變,為 簡化開發(fā)、提高效率而生,本文將給大家介紹一下SpringBoot整合MybatisPlus的基本應(yīng)用,需要的朋友可以參考下2024-05-05
Java 并發(fā)編程ArrayBlockingQueue的實現(xiàn)
這篇文章主要介紹了Java 并發(fā)編程ArrayBlockingQueue的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02
spring?boot實現(xiàn)圖片上傳到后臺的功能(瀏覽器可直接訪問)
這篇文章主要介紹了spring?boot實現(xiàn)圖片上傳到后臺的功能(瀏覽器可直接訪問),需要的朋友可以參考下2022-04-04

