完成了棋局数据的构建

This commit is contained in:
lsy 2024-10-28 00:42:46 +08:00
parent aae863abe8
commit 39d005902a
5 changed files with 249 additions and 0 deletions

10
web/chess/Cargo.toml Normal file
View 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
View 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
View 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
View 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
View 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>,
)