Compare commits

...

45 Commits

Author SHA1 Message Date
Varga Dávid Lajos
f39c113ef9 implemented method append for struct MoveBuffer 2025-11-19 16:13:34 +01:00
Varga Dávid Lajos
f417a7e47c implemented getter for field buffer i struct MoveBuffer 2025-11-19 16:09:31 +01:00
Varga Dávid Lajos
547b0e51cb corrected annotation for method clear in struct MoveBuffer 2025-11-19 16:00:09 +01:00
Varga Dávid Lajos
5340744abe implemented method clear for struct MoveBuffer 2025-11-19 15:56:57 +01:00
Varga Dávid Lajos
f64ebfa47f implemented method get for struct MoveBuffer 2025-11-19 15:53:39 +01:00
Varga Dávid Lajos
4e7ac2a195 added getter for field count in struct MoveBuffer 2025-11-19 15:50:03 +01:00
Varga Dávid Lajos
dc176c103b implemented method add for struct MoveBuffer 2025-11-19 15:40:11 +01:00
Varga Dávid Lajos
85a7fa37ef added parameterless constructor for struct MoveBuffer 2025-11-19 15:22:15 +01:00
Varga Dávid Lajos
a60658763d defined shape of struct MoveBuffer 2025-11-19 15:06:37 +01:00
Varga Dávid Lajos
b76a009e4e added file and module structure for movebuffer.rs 2025-11-19 14:57:36 +01:00
Varga Dávid Lajos
db333a693f added method uci_notation to struct BitMove 2025-11-18 17:38:48 +01:00
Varga Dávid Lajos
fd0d26486b switched from public fields to getters for struct BitMove 2025-11-18 17:30:04 +01:00
Varga Dávid Lajos
e1f4ae717e added constructor for castling moves in bitboard::bitmove.rs 2025-11-18 17:24:11 +01:00
Varga Dávid Lajos
7b9c1edbab added constructor for capture moves in bitboard::bitmove.rs 2025-11-18 17:23:07 +01:00
Varga Dávid Lajos
05294a7736 changed name of value of enum BitMoveType to align with Rust naming conventions 2025-11-18 17:20:40 +01:00
Varga Dávid Lajos
d8da808580 added enum BitMoveType to bitboard::bitmove.rs for readability 2025-11-18 17:19:31 +01:00
Varga Dávid Lajos
c420d8b3dd added constructor for quiet moves in bitboard::bitmove.rs 2025-11-18 17:17:11 +01:00
Varga Dávid Lajos
57af3aaae3 defined shape of struct bitboard::bitmove::BitMove 2025-11-18 17:09:39 +01:00
Varga Dávid Lajos
887b9abed8 adde file and module structure for bitboard::bitmove.rs 2025-11-18 17:02:07 +01:00
Bence
3ebfc61ac7 Merge pull request #15 from htamas1210/Engine/library-functions
Engine/library functions
2025-11-17 15:04:28 +01:00
Hatvani Tamás
d8d8b58ed7 Uploaded presentation for class 2025-11-17 12:24:42 +01:00
Varga Dávid Lajos
a8970053f9 added constructor for castling moves in chessmove.rs 2025-11-16 19:05:52 +01:00
vargadavidlajos
7cd77ab904 Merge pull request #14 from htamas1210/Docs/kovspec
Added point 3 to kovspec.md
2025-11-16 19:05:07 +01:00
Varga Dávid Lajos
fa0a93172d added constructore for captures in chessmove.rs 2025-11-16 19:01:53 +01:00
Varga Dávid Lajos
bb74a486d8 added constructor for quiet moves in chessmove.rs 2025-11-16 19:00:00 +01:00
vargadavidlajos
10c176a0f5 Added point 3 to kovspec.md 2025-11-16 18:39:48 +01:00
Varga Dávid Lajos
d1932762f9 removed field is_promotion from struct ChessMove and added an Option for field promotion_piece 2025-11-16 18:33:04 +01:00
Varga Dávid Lajos
9181b6c4ca added all arguments constructor for struct BoardSquare 2025-11-16 13:51:10 +01:00
Varga Dávid Lajos
b703d8b9a1 added parameterless constructor for struct BoardSquare 2025-11-16 13:44:41 +01:00
Varga Dávid Lajos
acaa7d078a added new library function: get_board_after_move 2025-11-15 20:40:58 +01:00
Varga Dávid Lajos
30448b5f3d switched return type of is_game_over from bool to GameEnd 2025-11-15 20:37:06 +01:00
Varga Dávid Lajos
ff38c5c475 added struct GameEnd 2025-11-15 20:28:33 +01:00
Varga Dávid Lajos
42daeb9971 added file and module structure for gameend.rs 2025-11-15 20:15:17 +01:00
Bence
fc7ece9e94 Fixed app not starting in fullscreen 2025-11-15 20:09:26 +01:00
Varga Dávid Lajos
c8b6bc35d5 added library functions: get_available_moves and is_game_over 2025-11-15 20:08:54 +01:00
Varga Dávid Lajos
5f2a4e1721 added struct ChessMove 2025-11-15 19:57:11 +01:00
Varga Dávid Lajos
5c42b6e52a added enum MoveType 2025-11-15 19:37:30 +01:00
Varga Dávid Lajos
f7364e7939 added file and module structure for movetype.rs 2025-11-15 19:35:17 +01:00
Varga Dávid Lajos
b4a1f0820f added struct BoardSquare 2025-11-15 19:26:21 +01:00
Varga Dávid Lajos
6d9d5c49ae added file and module structure for boardsquare.rs 2025-11-15 19:24:37 +01:00
Varga Dávid Lajos
1ca44b472b added enum PieceType 2025-11-15 19:21:46 +01:00
Varga Dávid Lajos
79aabeac8c added file and module structure for piecetype.rs 2025-11-15 19:17:50 +01:00
Varga Dávid Lajos
5eb85dab89 added file and module structure for file: chessmove.rs 2025-11-15 19:15:30 +01:00
Varga Dávid Lajos
291b7e71a2 added crate root file lib.rs for library crate 2025-11-15 19:14:08 +01:00
vargadavidlajos
2aaa2aca70 Merge pull request #13 from htamas1210/UI/SettingsAndGame
Created a new branch due to a bug
2025-11-15 19:11:39 +01:00
13 changed files with 348 additions and 2 deletions

View File

@@ -22,6 +22,68 @@ A vágyálom rendszer alapját egy központi szerver képezné, amely kezeli a f
A platform célja a megbízható és folyamatos működés, akár nagyobb terhelés mellett is. A rendszer fejlesztése során kiemelt szempont lenne a biztonság (adatvédelem, csalás elleni védelem), a stabil hálózati kommunikáció, valamint a bővíthetőség például ranglisták, versenyek vagy mobilalkalmazás későbbi integrálásának lehetősége. A platform célja a megbízható és folyamatos működés, akár nagyobb terhelés mellett is. A rendszer fejlesztése során kiemelt szempont lenne a biztonság (adatvédelem, csalás elleni védelem), a stabil hálózati kommunikáció, valamint a bővíthetőség például ranglisták, versenyek vagy mobilalkalmazás későbbi integrálásának lehetősége.
Összességében a vágyálom rendszer egy minden szempontból teljes értékű, közösségorientált sakkalkalmazás lenne, amely a mostani, helyi hálózaton működő változatból fejlődne tovább egy interneten keresztül bárhonnan elérhető platformmá. Összességében a vágyálom rendszer egy minden szempontból teljes értékű, közösségorientált sakkalkalmazás lenne, amely a mostani, helyi hálózaton működő változatból fejlődne tovább egy interneten keresztül bárhonnan elérhető platformmá.
## 3. Igényelt funkciók
### Alapok
- Két játékos közti sakkjátszma lebonyolítása.
- Teljes szabályrendszer megvalósítása (érvényes lépések, sakk/sakkmatt/patt felismerése).
- Új játék indítása.
- Játékosok nevének megadása a játszma elején.
- Felhasználóbarát grafikus felület (UI) látható tábla, figurák, órák, státuszjelzések.
- Játékoslépések vizuális kiemelése (pl. kijelölt mező, lehetséges lépések megjelenítése).
- A játék állapotának kijelzése (folyamatban, sakk, matt, döntetlen).
### LAN és hálózati funkciók
- „Szerver indítása” funkció a játékos hostként indíthat egy helyi szervert.
- „Csatlakozás” funkció másik játékos IP-cím alapján tud csatlakozni.
- Helyi hálózaton keresztüli valós idejű kommunikáció.
- LAN játék automatikus felfedezése (broadcast keresés).
- Játék mentése és visszatöltése hálózati módban.
### Online vágyálom funkciók
- Felhasználói regisztráció és bejelentkezés.
- Jelszóval védett fiókok, email- vagy OAuth-alapú hitelesítés (Google, GitHub stb.).
- Profiloldal megtekintése (név, avatar, statisztikák, értékszám).
- Automatikus matchmaking rendszer.
- Kézi játékindítás meghívó küldése barátnak.
- Játszmák mentése és visszajátszása.
- Játszmaelemzés lépések listázása, hibák kiemelése.
- Webes felület vagy mobilalkalmazás támogatása.
- Játék előzményeinek és statisztikáinak megtekintése (győzelmek, vereségek, döntetlenek).
- Automatikus szervermentés és adatbázis szinkronizáció.
### Felhasználói felület
- Letisztult, reszponzív, platformfüggetlen felület (asztali és webes verzió).
- Sötét/világos téma lehetősége.
- Egyéni figurakészlet vagy tábla kinézet választása.
- Animált figuramozgások.
- Egérrel és billentyűzettel is vezérelhető játék.
- Hangjelzések a lépésekhez és az idő lejártához.
- Lépéselőzmények (move list) megjelenítése oldalt.
- Tábla forgatásának lehetősége (pl. a fehér vagy fekete nézőpontból).
- Állapotjelzők (sakk, matt, döntetlen, várakozás az ellenfélre).
- Teljes képernyős mód.
### Technikai / fejlesztői funkciók
- Kliensszerver architektúra.
- REST API vagy WebSocket alapú kommunikáció.
- Adatbázis a felhasználói adatok és meccsek tárolására (pl. SQLite, PostgreSQL, MongoDB).
- Logolási és hibakezelési rendszer.
- Automatikus mentés és adatvisszaállítás.
- Verziókezelés (Git).
- Tesztelhető, moduláris kódszerkezet (külön modulok: logika, UI, hálózat, adat).
- Cross-platform működés (Windows, Linux, esetleg web).
### További funkciók
- Egyszemélyes mód (ember vs. gép, AI-bot).
- Több nehézségi szintű AI.
- Oktató mód (javasolt lépések, hibák magyarázata).
- Hivatalos FEN/PGN formátum export/import.
- Beépített sakkfeladványok, kihívások.
- Érintéses vezérlés mobilon.
- Többnyelvű felület (pl. magyar, angol).
## 4. Rendszer követelmények ## 4. Rendszer követelmények
A rendszer célja egy kétjátékos sakkalkalmazás megvalósítása, amely alapvetően hálózati kapcsolat (LAN vagy internet) segítségével biztosítja a valós idejű játékot. A rendszer kliensszerver architektúrán alapul, ahol az egyes komponensek jól elkülönülten, meghatározott feladatokat látnak el. A rendszer célja egy kétjátékos sakkalkalmazás megvalósítása, amely alapvetően hálózati kapcsolat (LAN vagy internet) segítségével biztosítja a valós idejű játékot. A rendszer kliensszerver architektúrán alapul, ahol az egyes komponensek jól elkülönülten, meghatározott feladatokat látnak el.

BIN
Knightly prezentáció.pptx Normal file

Binary file not shown.

View File

@@ -3,5 +3,7 @@ mod utils;
mod legality; mod legality;
mod checkinfo; mod checkinfo;
mod attacks; mod attacks;
mod bitmove;
mod movebuffer;
pub mod board; pub mod board;

View File

@@ -0,0 +1,77 @@
use super::utils::*;
#[derive(Copy, Clone, PartialEq, Eq)]
pub struct BitMove {
move_type: BitMoveType,
from_square: u8,
to_square: u8,
promotion_piece: Option<u8>
}
impl BitMove {
#[inline]
pub fn quiet(from: u8, to: u8, promotion_piece: Option<u8>) -> Self {
return Self {
move_type: BitMoveType::Quiet,
from_square: from,
to_square: to,
promotion_piece: promotion_piece
};
}
#[inline]
pub fn capture(from: u8, to: u8, promotion_piece: Option<u8>) -> Self {
return Self {
move_type: BitMoveType::Capture,
from_square: from,
to_square: to,
promotion_piece: promotion_piece
};
}
#[inline]
pub fn castle(from: u8, to: u8) -> Self {
return Self {
move_type: BitMoveType::Castle,
from_square: from,
to_square: to,
promotion_piece: None
};
}
#[inline(always)]
pub fn move_type(&self) -> BitMoveType {
return self.move_type;
}
#[inline(always)]
pub fn from_square(&self) -> u8 {
return self.from_square;
}
#[inline(always)]
pub fn to_square(&self) -> u8 {
return self.to_square;
}
#[inline(always)]
pub fn promotion_piece(&self) -> Option<u8> {
return self.promotion_piece;
}
pub fn uci_notation(&self) -> String {
let mut notation = notation_from_square_number(self.from_square());
notation.push_str(&notation_from_square_number(self.to_square()));
if let Some(promotion_piece) = self.promotion_piece {
notation.push(get_character_by_piece_id(promotion_piece).to_ascii_lowercase());
}
return notation;
}
}
#[derive(Copy, Clone, PartialEq, Eq)]
pub enum BitMoveType {
Quiet,
Capture,
Castle,
EnPassant
}

View File

@@ -0,0 +1,44 @@
use super::bitmove::BitMove;
pub struct MoveBuffer {
buffer: [BitMove; 256],
count: usize
}
impl MoveBuffer {
pub fn new() -> Self {
return Self {
buffer: [BitMove::quiet(0, 0, None); 256],
count: 0
};
}
#[inline]
pub fn add(&mut self, bitmove: BitMove) {
self.buffer[self.count] = bitmove;
self.count += 1;
}
#[inline]
pub fn append(&mut self, other: &MoveBuffer) {
self.buffer[self.count..self.count + other.count()].copy_from_slice(other.contents());
self.count += other.count();
}
#[inline(always)]
pub fn clear(&mut self) {
self.count = 0;
}
#[inline(always)]
pub fn count(&self) -> usize{
return self.count;
}
#[inline(always)]
pub fn get(&self, idx: usize) -> &BitMove {
return &self.buffer[idx];
}
#[inline(always)]
pub fn contents(&self) -> &[BitMove] {
return &self.buffer[0..self.count];
}
}

View File

@@ -48,6 +48,11 @@ pub fn try_get_square_number_from_notation(notation: &str) -> Result<u8, ()> {
} }
} }
const PIECE_CHARACTERS: [char; 12] = ['P', 'N', 'B', 'R', 'Q', 'K', 'p', 'n', 'b', 'r', 'q', 'k'];
pub fn get_character_by_piece_id(id: u8) -> char {
return PIECE_CHARACTERS[id as usize];
}
// <----- TESTS -----> // <----- TESTS ----->

32
engine/src/boardsquare.rs Normal file
View File

@@ -0,0 +1,32 @@
pub struct BoardSquare {
pub x: usize,
pub y: usize
}
impl BoardSquare {
pub fn new() -> Self {
return Self{
x: 0,
y: 0
};
}
pub fn from_coord(x: usize, y: usize) -> Self {
#[cfg(debug_assertions)]
{
if x > 7 {
println!("Warning: x coordinate of square is bigger than 7, it might not be on the board!");
}
if y > 7 {
println!("Warning: y coordinate of square is bigger than 7, it might not be on the board!");
}
}
return Self {
x: x,
y: y
};
}
}

71
engine/src/chessmove.rs Normal file
View File

@@ -0,0 +1,71 @@
use crate::piecetype;
use super::boardsquare::BoardSquare;
use super::piecetype::PieceType;
use super::movetype::MoveType;
pub struct ChessMove {
pub move_type: MoveType,
pub piece_type: PieceType,
pub from_square: BoardSquare,
pub to_square: BoardSquare,
pub rook_from: BoardSquare,
pub rook_to: BoardSquare,
pub promotion_piece: Option<PieceType>
}
impl ChessMove {
pub fn quiet(
piece_type: PieceType,
from_square: BoardSquare,
to_square: BoardSquare,
promotion_piece: Option<PieceType>
) -> Self {
return Self {
move_type: MoveType::Quiet,
piece_type: piece_type,
from_square: from_square,
to_square: to_square,
rook_from: BoardSquare::new(),
rook_to: BoardSquare::new(),
promotion_piece: promotion_piece
}
}
pub fn capture(
piece_type: PieceType,
from_square: BoardSquare,
to_square: BoardSquare,
promotion_piece: Option<PieceType>
) -> Self {
return Self {
move_type: MoveType::Capture,
piece_type: piece_type,
from_square: from_square,
to_square: to_square,
rook_from: BoardSquare::new(),
rook_to: BoardSquare::new(),
promotion_piece: promotion_piece
}
}
pub fn castle(
piece_type: PieceType,
from_square: BoardSquare,
to_square: BoardSquare,
rook_from: BoardSquare,
rook_to: BoardSquare
) -> Self {
return Self {
move_type: MoveType::Quiet,
piece_type: piece_type,
from_square: from_square,
to_square: to_square,
rook_from: rook_from,
rook_to: rook_to,
promotion_piece: None
}
}
}

6
engine/src/gameend.rs Normal file
View File

@@ -0,0 +1,6 @@
pub enum GameEnd {
WhiteWon(String),
BlackWon(String),
Draw(String)
}

24
engine/src/lib.rs Normal file
View File

@@ -0,0 +1,24 @@
mod bitboard;
pub mod chessmove;
pub mod piecetype;
pub mod boardsquare;
pub mod movetype;
pub mod gameend;
use chessmove::ChessMove;
use gameend::GameEnd;
pub fn get_available_moves(fen: &str) -> Vec<ChessMove> {
println!("get_available_moves answered");
return vec![];
}
pub fn is_game_over(fen: &str) -> Option<GameEnd> {
println!("is_game_over answered");
return None;
}
pub fn get_board_after_move(fen: &str, chess_move: &ChessMove) -> String {
println!("get_board_after_move answered");
return String::from("rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1");
}

7
engine/src/movetype.rs Normal file
View File

@@ -0,0 +1,7 @@
pub enum MoveType {
Quiet,
Capture,
Castle,
EnPassant
}

15
engine/src/piecetype.rs Normal file
View File

@@ -0,0 +1,15 @@
pub enum PieceType {
WhitePawn,
WhiteKnight,
WhiteBishop,
WhiteRook,
WhiteQueen,
WhiteKing,
BlackPawn,
BlackKnight,
BlackBishop,
BlackRook,
BlackQueen,
BlackKing
}

View File

@@ -3,7 +3,7 @@ use eframe::egui;
fn main() -> eframe::Result<()> { fn main() -> eframe::Result<()> {
let options = eframe::NativeOptions{ let options = eframe::NativeOptions{
viewport: egui::ViewportBuilder::default() viewport: egui::ViewportBuilder::default()
.with_fullscreen(false) .with_fullscreen(true)
.with_min_inner_size(egui::vec2(800.0, 600.0)) // Minimum width, height .with_min_inner_size(egui::vec2(800.0, 600.0)) // Minimum width, height
.with_inner_size(egui::vec2(7680.0, 4320.0)), // Initial size .with_inner_size(egui::vec2(7680.0, 4320.0)), // Initial size
..Default::default() ..Default::default()
@@ -101,6 +101,7 @@ impl Default for ChessApp {
(1920, 1080), (1920, 1080),
(2560, 1440), (2560, 1440),
(3840, 2160), (3840, 2160),
(7680, 4320),
], ],
selected_resolution: 2, // Default to 1920x1080 selected_resolution: 2, // Default to 1920x1080
state: AppState::MainMenu, state: AppState::MainMenu,
@@ -427,4 +428,4 @@ mod tests {
let app = ChessApp::default(); let app = ChessApp::default();
assert_eq!(app.server_port, "8080"); assert_eq!(app.server_port, "8080");
} }
} }