完成了棋局数据的构建
This commit is contained in:
parent
aae863abe8
commit
39d005902a
10
web/chess/Cargo.toml
Normal file
10
web/chess/Cargo.toml
Normal file
@ -0,0 +1,10 @@
|
||||
[package]
|
||||
name = "chess"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
[dependencies]
|
||||
wasm-bindgen = "0.2.95"
|
||||
|
||||
[lib]
|
||||
crate-type = ["cdylib", "rlib"]
|
29
web/chess/src/App.tsx
Normal file
29
web/chess/src/App.tsx
Normal file
@ -0,0 +1,29 @@
|
||||
import React, { useEffect, useState } from 'react';
|
||||
import init, { ChessGame } from '../pkg'; // 确保路径正确
|
||||
|
||||
const App: React.FC = () => {
|
||||
|
||||
|
||||
useEffect(() => {
|
||||
const loadWasm = async () => {
|
||||
try {
|
||||
await init() // 初始化 WASM 模块
|
||||
const chessboard= ChessGame.new(5*60)
|
||||
console.log(chessboard.render())
|
||||
|
||||
} catch (error) {
|
||||
console.error("Failed to load WASM module:", error);
|
||||
}
|
||||
};
|
||||
|
||||
loadWasm();
|
||||
}, []);
|
||||
|
||||
return (
|
||||
<div>
|
||||
<h1>WASM Module Loaded</h1>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default App;
|
68
web/chess/src/index.css
Normal file
68
web/chess/src/index.css
Normal file
@ -0,0 +1,68 @@
|
||||
:root {
|
||||
font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif;
|
||||
line-height: 1.5;
|
||||
font-weight: 400;
|
||||
|
||||
color-scheme: light dark;
|
||||
color: rgba(255, 255, 255, 0.87);
|
||||
background-color: #242424;
|
||||
|
||||
font-synthesis: none;
|
||||
text-rendering: optimizeLegibility;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
}
|
||||
|
||||
a {
|
||||
font-weight: 500;
|
||||
color: #646cff;
|
||||
text-decoration: inherit;
|
||||
}
|
||||
a:hover {
|
||||
color: #535bf2;
|
||||
}
|
||||
|
||||
body {
|
||||
margin: 0;
|
||||
display: flex;
|
||||
place-items: center;
|
||||
min-width: 320px;
|
||||
min-height: 100vh;
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: 3.2em;
|
||||
line-height: 1.1;
|
||||
}
|
||||
|
||||
button {
|
||||
border-radius: 8px;
|
||||
border: 1px solid transparent;
|
||||
padding: 0.6em 1.2em;
|
||||
font-size: 1em;
|
||||
font-weight: 500;
|
||||
font-family: inherit;
|
||||
background-color: #1a1a1a;
|
||||
cursor: pointer;
|
||||
transition: border-color 0.25s;
|
||||
}
|
||||
button:hover {
|
||||
border-color: #646cff;
|
||||
}
|
||||
button:focus,
|
||||
button:focus-visible {
|
||||
outline: 4px auto -webkit-focus-ring-color;
|
||||
}
|
||||
|
||||
@media (prefers-color-scheme: light) {
|
||||
:root {
|
||||
color: #213547;
|
||||
background-color: #ffffff;
|
||||
}
|
||||
a:hover {
|
||||
color: #747bff;
|
||||
}
|
||||
button {
|
||||
background-color: #f9f9f9;
|
||||
}
|
||||
}
|
130
web/chess/src/lib.rs
Normal file
130
web/chess/src/lib.rs
Normal file
@ -0,0 +1,130 @@
|
||||
use std::fmt;
|
||||
use std::collections::HashMap;
|
||||
use wasm_bindgen::prelude::*;
|
||||
|
||||
|
||||
enum Grade {
|
||||
King,
|
||||
Queen,
|
||||
Rook,
|
||||
Bishop,
|
||||
Knight,
|
||||
Pawn,
|
||||
None
|
||||
}
|
||||
|
||||
impl Grade {
|
||||
fn as_str(&self) -> &'static str {
|
||||
match self {
|
||||
Grade::King => "king",
|
||||
Grade::Queen => "queen",
|
||||
Grade::Rook => "rook",
|
||||
Grade::Bishop => "bishop",
|
||||
Grade::Knight => "knight",
|
||||
Grade::Pawn => "pawn",
|
||||
Grade::None => "None"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Hash, Eq, PartialEq)]
|
||||
enum Camp {
|
||||
Black,
|
||||
White,
|
||||
}
|
||||
|
||||
impl Camp {
|
||||
fn as_str(&self) -> &'static str {
|
||||
match self {
|
||||
Camp::Black => "black",
|
||||
Camp::White => "white",
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
struct Chessman {
|
||||
grade: Grade,
|
||||
camp: Camp,
|
||||
}
|
||||
|
||||
struct Player {
|
||||
username: String,
|
||||
time:u32,
|
||||
score:u32
|
||||
}
|
||||
|
||||
#[wasm_bindgen]
|
||||
pub struct ChessGame {
|
||||
players: HashMap<Camp, Player>,
|
||||
chess: Vec<Chessman>,
|
||||
}
|
||||
|
||||
impl fmt::Display for ChessGame {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
for line in self.chess.as_slice().chunks(8) {
|
||||
for square in line {
|
||||
write!(f, " ")?;
|
||||
match square.camp {
|
||||
Camp::White => {
|
||||
match &square.grade {
|
||||
Grade::King => { write!(f, "♔")?; }
|
||||
Grade::Queen => { write!(f, "♕")?; }
|
||||
Grade::Rook => { write!(f, "♖")?; }
|
||||
Grade::Bishop => { write!(f, "♗")?; }
|
||||
Grade::Knight => { write!(f, "♘")?; }
|
||||
Grade::Pawn => { write!(f, "♙")?; }
|
||||
Grade::None => { write!(f, "※")?; }
|
||||
}
|
||||
}
|
||||
Camp::Black => {
|
||||
match &square.grade {
|
||||
Grade::King => { write!(f, "♚")?; }
|
||||
Grade::Queen => { write!(f, "♛")?; }
|
||||
Grade::Rook => { write!(f, "♜")?; }
|
||||
Grade::Bishop => { write!(f, "♝")?; }
|
||||
Grade::Knight => { write!(f, "♞")?; }
|
||||
Grade::Pawn => { write!(f, "♟")?; }
|
||||
Grade::None => { write!(f, "※")?; }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
write!(f, "\n")?;
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
#[wasm_bindgen]
|
||||
impl ChessGame {
|
||||
pub fn new(time:u32) -> ChessGame {
|
||||
fn level_position(index: u8) -> Grade {
|
||||
match index {
|
||||
0 | 7 => Grade::Rook,
|
||||
1 | 6 => Grade::Knight,
|
||||
2 | 5 => Grade::Bishop,
|
||||
3 => Grade::King,
|
||||
4 => Grade::Queen,
|
||||
_ => Grade::None
|
||||
}
|
||||
}
|
||||
let chess_game = (0..64).map(|i| {
|
||||
let row = i / 8;
|
||||
let color = if row == 0 || row == 1 { Camp::Black } else { Camp::White };
|
||||
if row == 1 || row == 6 {
|
||||
return Chessman { grade: Grade::Pawn, camp: color }
|
||||
} else if row == 0 || row == 7 {
|
||||
return Chessman { grade: level_position(i % 8), camp: color }
|
||||
} else {
|
||||
Chessman { grade: Grade::None, camp: color }
|
||||
}
|
||||
}).collect();
|
||||
let mut players=HashMap::new();
|
||||
players.insert(Camp::Black, Player{username:String::from("黑色玩家"), time, score:0 });
|
||||
players.insert(Camp::White, Player{username:String::from("白色玩家"), time, score:0 });
|
||||
|
||||
ChessGame { players, chess: chess_game }
|
||||
}
|
||||
pub fn render(&self) -> String { self.to_string() }
|
||||
}
|
||||
|
12
web/chess/src/main.tsx
Normal file
12
web/chess/src/main.tsx
Normal file
@ -0,0 +1,12 @@
|
||||
import { StrictMode } from 'react'
|
||||
import { createRoot } from 'react-dom/client'
|
||||
import WasmComponent from './App.tsx'
|
||||
|
||||
createRoot(document.getElementById('root')!).render(
|
||||
<StrictMode>
|
||||
<WasmComponent />
|
||||
</StrictMode>,
|
||||
)
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user