From 11ea599ab48bb32cc30ef68517e590771dc14178 Mon Sep 17 00:00:00 2001 From: AJSmyth Date: Tue, 12 Apr 2022 15:13:19 -0700 Subject: [PATCH 01/19] Initial Rebase Commit --- Makefile | 10 ++++++++++ src/main.c | 17 ++++++++++++++++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 5d395b3..56923eb 100644 --- a/Makefile +++ b/Makefile @@ -1,3 +1,4 @@ +<<<<<<< HEAD SOURCEDIR = src DESTDIR = bin @@ -21,3 +22,12 @@ clean: test: $(foreach src, $(SRCS), gcc -c $(src) -DTEST $(CFLAGS) -o $(basename $(src)).o;) gcc $(OBJS) $(CFLAGS) -o $(DESTDIR)/$(OUT) +======= +build: + gcc -std=c11 -c main.c + gcc -std=c11 -c -Wno-return-local-addr game.c + gcc -std=c11 -c board.c + gcc -std=c11 -c gui.c + #link + gcc -std=c11 main.o board.o game.o gui.o -o a -lncurses +>>>>>>> e085263 (Initial Rebase Commit) diff --git a/src/main.c b/src/main.c index 5df669d..6ab8699 100644 --- a/src/main.c +++ b/src/main.c @@ -1,8 +1,11 @@ #include #include #include +#include +#include #include "board.h" #include "game.h" +#include "gui.h" int main(int argc, char *argv[]) { @@ -13,13 +16,21 @@ int main(int argc, char *argv[]) { printf("Select 1 for White and 2 for Black and 3 for Free Play: "); scanf("%d",&a); FillBoard(chessBoard); - PrintBoard(chessBoard); + EGUIState gui = MENU; + //PrintBoard(chessBoard); + +<<<<<<< HEAD //If side chosen is White if (a == 1) { bool done = false; while (!done){ +======= + bool done = false; + /* + while (!done) { +>>>>>>> e085263 (Initial Rebase Commit) printf("Select a piece to move in the form \"FR FR\" (e.g. A2 A3): "); char s0[3], s1[3]; char *MoveCheck; @@ -133,5 +144,9 @@ int main(int argc, char *argv[]) { + return 0; + */ + + return 0; } From c604c62ad9237ed654de11976a87be82ab30ae13 Mon Sep 17 00:00:00 2001 From: AJSmyth Date: Fri, 15 Apr 2022 16:00:13 -0700 Subject: [PATCH 02/19] Inital GUI Setup - Add ncurses mode initialization code - Add basic window outline setup - Update makefile to include ncurses build arguments --- Makefile | 34 +++++------------------ gui.c | 81 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ gui.h | 33 ++++++++++++++++++++++ src/main.c | 17 ++++++++---- 4 files changed, 132 insertions(+), 33 deletions(-) create mode 100644 gui.c create mode 100644 gui.h diff --git a/Makefile b/Makefile index 56923eb..a488372 100644 --- a/Makefile +++ b/Makefile @@ -1,33 +1,13 @@ -<<<<<<< HEAD -SOURCEDIR = src -DESTDIR = bin - -CFLAGS = -std=c11 -Wno-return-local-addr -LIBS := $(shell ncursesw5-config --libs) -ltinfo -SRCS := $(wildcard $(SOURCEDIR)/*.c) -OBJS := $(patsubst %.c, %.o, $(SRCS)) -OUT = chess +CFLAGS = -std=c11 -Wno-return-local-addr +LIBS = $(shell ncursesw5-config --libs) +OBJS = main.o game.o gui.o board.o +OUT = a $(OUT): $(OBJS) - gcc -g $(OBJS) $(CFLAGS) -o $(DESTDIR)/$(OUT) - #NCURSES build - #gcc $(OBJS) $(CFLAGS) $(LIBS) $(shell ncursesw5-config --cflags) --enable-widec -o $(DESTDIR)/$(OUT) + gcc $(OBJS) $(CFLAGS) $(LIBS) $(shell ncursesw5-config --cflags) --enable-widec -o $(OUT) %.o: %.c - gcc -c $< $(CFLAGS) -o $@ + gcc -c $(CFLAGS) $< clean: - rm $(OBJS) $(DESTDIR)/$(OUT) - -test: - $(foreach src, $(SRCS), gcc -c $(src) -DTEST $(CFLAGS) -o $(basename $(src)).o;) - gcc $(OBJS) $(CFLAGS) -o $(DESTDIR)/$(OUT) -======= -build: - gcc -std=c11 -c main.c - gcc -std=c11 -c -Wno-return-local-addr game.c - gcc -std=c11 -c board.c - gcc -std=c11 -c gui.c - #link - gcc -std=c11 main.o board.o game.o gui.o -o a -lncurses ->>>>>>> e085263 (Initial Rebase Commit) + rm *.o a diff --git a/gui.c b/gui.c new file mode 100644 index 0000000..4b4d7f3 --- /dev/null +++ b/gui.c @@ -0,0 +1,81 @@ +#include "gui.h" + +const int MIN_X = 0, MIN_Y = 0; + +//start ncurses mode, returns false if window size is smaller than chess board +bool InitGUI(GUI *g) { + g->state = MENU; + + initscr(); + curs_set(0); + getmaxyx(stdscr, g->y, g->x); + wattrset(stdscr, A_NORMAL); + + if (g->y < MIN_Y || g->x < MIN_X) return false; + else return true; + + //set up mouse event + mousemask(BUTTON1_CLICKED, NULL); +} + +//to be called in main game loop, handle the GUI operation +void DoGUI(GUI *g) { + //handle mouse input + + //handle gui drawing + switch (g->state) { + case MENU: + DrawMenu(g); + break; + } +} + +//draws and handles the menu +void DrawMenu(GUI *g) { + char *title = "QUEEN'S CHESS"; + int titleX = (g->x - strlen(title)) / 2; + + //draw the top border around the title + mvhwall(0, 0 , 0x250C, 0x2500, 0x2500, titleX - 1); + mvhwall(0, titleX + strlen(title) + 1 , 0x2500, 0x2500, 0x2510, g->x - (titleX + strlen(title) + 1)); + + //draw the title + attron(A_BOLD); + mvprintw(0, titleX, title); + attroff(A_BOLD); + + //draw the side vertical borders + mvvwall(1, 0, 0x2502, g->y - 2); + mvvwall(1, g->x - 1, 0x2502, g->y - 2); + + //draw the bottom border + mvhwall(g->y - 1, 0 , 0x2514, 0x2500, 0x2518, g->x); + + refresh(); +} + +//moves the cursor and draws a horizontal wall with the specified characters +void mvhwall(int y, int x, wchar_t start, wchar_t mid, wchar_t end, int n) { + if (n >= 2) { + wchar_t *c = malloc(sizeof(wchar_t) * (n + 1)); + + c[0] = start; + c[n - 1] = end; + for (int i = 1; i < n - 1; ++i) { + c[i] = mid; + } + c[n] = L'\0'; + + mvaddwstr(y, x, c); + } +} + +//moves the cursor and draws a vertical wall with the specified character +void mvvwall(int y, int x, wchar_t w, int n) { + cchar_t *c = malloc(sizeof(cchar_t)); + c->chars[0] = w; + c->chars[1] = L'\0'; + + for (int i = 0; i < n; ++i) mvadd_wch(y + i, x, c); +} + diff --git a/gui.h b/gui.h new file mode 100644 index 0000000..625861d --- /dev/null +++ b/gui.h @@ -0,0 +1,33 @@ +#ifndef GUI_H +#define GUI_H +#define _XOPEN_SOURCE_EXTENDED 1 +#define NCURSES_WIDECHAR 1 + +#include +#include +#include + +extern const int MIN_X, MIN_Y; + +typedef enum { + MENU, + SETTINGS, + GAME, +} EGUIState; + +typedef struct { + WINDOW *menuArea; +} Menu; + +typedef struct { + Menu *menu; + EGUIState state; + int y, x; +} GUI; + +bool InitGUI(GUI *g); +void DoGUI(GUI *g); +void DrawMenu(GUI *g); +void mvhwall(int, int, wchar_t, wchar_t, wchar_t, int); +void mvvwall(int, int, wchar_t, int); +#endif diff --git a/src/main.c b/src/main.c index 6ab8699..0e43349 100644 --- a/src/main.c +++ b/src/main.c @@ -1,7 +1,6 @@ #include #include #include -#include #include #include "board.h" #include "game.h" @@ -9,16 +8,15 @@ int main(int argc, char *argv[]) { - setlocale(LC_CTYPE,""); + setlocale(LC_ALL, ""); + Board *chessBoard = malloc(sizeof(Board)); //Board *chessBoardCopy = malloc(sizeof(Board)); int a; printf("Select 1 for White and 2 for Black and 3 for Free Play: "); scanf("%d",&a); FillBoard(chessBoard); - EGUIState gui = MENU; - - //PrintBoard(chessBoard); + GUI *gui = malloc(sizeof(MENU)); <<<<<<< HEAD //If side chosen is White @@ -145,8 +143,15 @@ int main(int argc, char *argv[]) { return 0; - */ + */ + InitGUI(gui); + + while (!done) { + DoGUI(gui); + } + free(chessBoard); + free(gui); return 0; } From 06696a3514c54c7d3503d46e5c7c2e60e029ae26 Mon Sep 17 00:00:00 2001 From: AJSmyth Date: Sat, 16 Apr 2022 18:01:59 -0700 Subject: [PATCH 03/19] Add GUI Structures and Mouse Integration --- Makefile | 2 +- gui.c | 113 +++++++++++++++++++++++++++++++++++++++++++++++++++-- gui.h | 32 ++++++++++++++- src/main.c | 4 +- 4 files changed, 144 insertions(+), 7 deletions(-) diff --git a/Makefile b/Makefile index a488372..e69ce87 100644 --- a/Makefile +++ b/Makefile @@ -10,4 +10,4 @@ $(OUT): $(OBJS) gcc -c $(CFLAGS) $< clean: - rm *.o a + rm *.o $(OUT) diff --git a/gui.c b/gui.c index 4b4d7f3..2c108e0 100644 --- a/gui.c +++ b/gui.c @@ -2,26 +2,71 @@ const int MIN_X = 0, MIN_Y = 0; + + //start ncurses mode, returns false if window size is smaller than chess board bool InitGUI(GUI *g) { g->state = MENU; initscr(); curs_set(0); + noecho(); + cbreak(); + + //weird stuff to make mouse work + keypad(stdscr, true); + printf("\033[?1003h\n"); + + //set up mouse event + mousemask(BUTTON1_PRESSED, NULL); + getmaxyx(stdscr, g->y, g->x); wattrset(stdscr, A_NORMAL); + //setup menu and options + g->menu = malloc(sizeof(Menu)); + g->menu->nSet = 1; + g->menu->settings = calloc(1, sizeof(MenuSetting *)); + + //GAMEMODE OPTIONS + g->menu->gamemode = malloc(sizeof(MenuSetting)); + g->menu->gamemode->text = "GAMEMODE:"; + g->menu->gamemode->size = 2; + g->menu->settings[0] = g->menu->gamemode; + g->menu->gamemode->selected = -1; + // allocate space + g->menu->gamemode->options = calloc(2, sizeof(MenuOption *)); + g->menu->gamemode->options[0] = malloc(sizeof(MenuOption)); + g->menu->gamemode->options[1] = malloc(sizeof(MenuOption)); + // option0, tutorial + g->menu->gamemode->options[0]->text = "TUTORIAL"; + g->menu->gamemode->options[0]->value = 0; + // option1, player vs ai + g->menu->gamemode->options[1]->text = "PLAYER VS AI"; + g->menu->gamemode->options[1]->value = 1; + + SetBox(g->menu->gamemode, g->y, g->x, 4); if (g->y < MIN_Y || g->x < MIN_X) return false; else return true; - - //set up mouse event - mousemask(BUTTON1_CLICKED, NULL); } + + //to be called in main game loop, handle the GUI operation void DoGUI(GUI *g) { //handle mouse input - + MEVENT e; + int ch = wgetch(stdscr); + + if (ch == KEY_MOUSE) { + if (getmouse(&e) == OK) { + if (e.bstate & (BUTTON1_PRESSED)) { + HandleMouse(g, e); + } + } + } + + flushinp(); //handle gui drawing switch (g->state) { case MENU: @@ -51,9 +96,41 @@ void DrawMenu(GUI *g) { //draw the bottom border mvhwall(g->y - 1, 0 , 0x2514, 0x2500, 0x2518, g->x); + //iterate over every setting, print the label + for (int s = 0; s < g->menu->nSet; ++s) { + mvprintw(g->menu->settings[s]->labelY, g->menu->settings[s]->labelX, g->menu->settings[s]->text); + //iterater over every option of the setting, printing each + for (int o = 0; o < g->menu->settings[s]->size; ++o) { + if (g->menu->settings[s]->selected == o) attron(A_BOLD); + mvprintw(g->menu->settings[s]->options[o]->bound.y0, g->menu->settings[s]->options[o]->bound.x0, g->menu->settings[s]->options[o]->text); + attroff(A_BOLD); + } + } + + refresh(); } + + +void HandleMouse(GUI *g, MEVENT e) { + switch(g->state) { + case MENU: + //iterate over every setting, print the label + for (int s = 0; s < g->menu->nSet; ++s) { + mvprintw(g->menu->settings[s]->labelY, g->menu->settings[s]->labelX, g->menu->settings[s]->text); + //iterater over every option of the setting, printing each + for (int o = 0; o < g->menu->settings[s]->size; ++o) { + if (IsInBox(e.y, e.x, g->menu->settings[s]->options[o]->bound)) + g->menu->settings[s]->selected = o; + } + } + break; + } +} + + + //moves the cursor and draws a horizontal wall with the specified characters void mvhwall(int y, int x, wchar_t start, wchar_t mid, wchar_t end, int n) { if (n >= 2) { @@ -70,6 +147,8 @@ void mvhwall(int y, int x, wchar_t start, wchar_t mid, wchar_t end, int n) { } } + + //moves the cursor and draws a vertical wall with the specified character void mvvwall(int y, int x, wchar_t w, int n) { cchar_t *c = malloc(sizeof(cchar_t)); @@ -79,3 +158,29 @@ void mvvwall(int y, int x, wchar_t w, int n) { for (int i = 0; i < n; ++i) mvadd_wch(y + i, x, c); } +bool IsInBox(int y, int x, Box b) { + return y >= b.y0 && y <= b.y1 && x >= b.x0 && x <= b.x1; +} + +void SetBox(MenuSetting *s, int height, int width, int y) { + s->labelX = width - strlen(s->text); + + //calculate left margin for centering, 4 char spacing + for (int i = 0; i < s->size; ++i) { + s->labelX -= 4 + strlen(s->options[i]->text); + } + + s->labelX = s->labelX / 2; + s->labelY = y; + + s->options[0]->bound.x0 = s->labelX + strlen(s->text) + 4; + s->options[0]->bound.y0 = y; + s->options[0]->bound.x1 = s->options[0]->bound.x0 + strlen(s->options[0]->text) - 1; + s->options[0]->bound.y1 = y; + for (int i = 1; i < s->size; ++i) { + s->options[i]->bound.x0 = s->options[i-1]->bound.x0 + strlen(s->options[i-1]->text) + 4; + s->options[i]->bound.y0 = y; + s->options[i]->bound.x1 = s->options[i]->bound.x0 + strlen(s->options[i]->text) - 1; + s->options[i]->bound.y1 = y; + } +} diff --git a/gui.h b/gui.h index 625861d..93ecfa8 100644 --- a/gui.h +++ b/gui.h @@ -16,7 +16,32 @@ typedef enum { } EGUIState; typedef struct { - WINDOW *menuArea; + int x0, x1; + int y0, y1; +} Box; + +typedef struct { + Box bound; + int value; + char *text; +} MenuOption; + +typedef struct { + MenuOption **options; + int selected; + char *text; + int labelX, labelY; + size_t size; +} MenuSetting; + +typedef struct { + //MenuSetting represents [text | MenuOption[0] | ... | MenuOption[size - 1]] + MenuSetting *gamemode; + MenuSetting *difficulty; + + size_t nSet; + MenuSetting **settings; + Box exit; } Menu; typedef struct { @@ -25,9 +50,14 @@ typedef struct { int y, x; } GUI; +bool IsInBox(int y, int x, Box b); +void SetBox(MenuSetting *, int, int, int); bool InitGUI(GUI *g); void DoGUI(GUI *g); void DrawMenu(GUI *g); +void HandleMouse(GUI *g, MEVENT e); + + void mvhwall(int, int, wchar_t, wchar_t, wchar_t, int); void mvvwall(int, int, wchar_t, int); #endif diff --git a/src/main.c b/src/main.c index 0e43349..4aff0aa 100644 --- a/src/main.c +++ b/src/main.c @@ -16,7 +16,7 @@ int main(int argc, char *argv[]) { printf("Select 1 for White and 2 for Black and 3 for Free Play: "); scanf("%d",&a); FillBoard(chessBoard); - GUI *gui = malloc(sizeof(MENU)); + GUI *gui = malloc(sizeof(GUI)); <<<<<<< HEAD //If side chosen is White @@ -146,11 +146,13 @@ int main(int argc, char *argv[]) { */ InitGUI(gui); + DrawMenu(gui); while (!done) { DoGUI(gui); } + printf("\033[?1003l\n"); free(chessBoard); free(gui); return 0; From 6ec817eb7951e93c3c7507559d6cf1b64f9fbe91 Mon Sep 17 00:00:00 2001 From: AJSmyth Date: Sun, 17 Apr 2022 14:52:40 -0700 Subject: [PATCH 04/19] Add curses menu functionality - Fix mouse handling to only take click events - Update main.c game loop - Define methods and data types for GAME gui state --- gui.c | 153 +++++++++++++++++++++++++++++++++++++++++++++------- gui.h | 19 +++++-- src/board.h | 1 + src/main.c | 7 +-- 4 files changed, 155 insertions(+), 25 deletions(-) diff --git a/gui.c b/gui.c index 2c108e0..8747b7f 100644 --- a/gui.c +++ b/gui.c @@ -15,7 +15,7 @@ bool InitGUI(GUI *g) { //weird stuff to make mouse work keypad(stdscr, true); - printf("\033[?1003h\n"); + printf("\033[?1002h\n"); //xterm report mouse button events (NO MOVEMENT EVENTS) //set up mouse event mousemask(BUTTON1_PRESSED, NULL); @@ -25,34 +25,97 @@ bool InitGUI(GUI *g) { //setup menu and options g->menu = malloc(sizeof(Menu)); - g->menu->nSet = 1; - g->menu->settings = calloc(1, sizeof(MenuSetting *)); + g->menu->size = 2; + g->menu->settings = calloc(2, sizeof(MenuSetting *)); //GAMEMODE OPTIONS - g->menu->gamemode = malloc(sizeof(MenuSetting)); - g->menu->gamemode->text = "GAMEMODE:"; - g->menu->gamemode->size = 2; - g->menu->settings[0] = g->menu->gamemode; - g->menu->gamemode->selected = -1; + g->menu->settings[0] = malloc(sizeof(MenuSetting)); + g->menu->gamemode = g->menu->settings[0]; + g->menu->settings[0]->text = "GAMEMODE:"; + g->menu->settings[0]->size = 2; + g->menu->settings[0]->selected = -1; // allocate space - g->menu->gamemode->options = calloc(2, sizeof(MenuOption *)); - g->menu->gamemode->options[0] = malloc(sizeof(MenuOption)); - g->menu->gamemode->options[1] = malloc(sizeof(MenuOption)); + g->menu->settings[0]->options = calloc(2, sizeof(MenuOption *)); + g->menu->settings[0]->options[0] = malloc(sizeof(MenuOption)); + g->menu->settings[0]->options[1] = malloc(sizeof(MenuOption)); // option0, tutorial - g->menu->gamemode->options[0]->text = "TUTORIAL"; - g->menu->gamemode->options[0]->value = 0; + g->menu->settings[0]->options[0]->text = "TUTORIAL"; + g->menu->settings[0]->options[0]->value = 0; // option1, player vs ai - g->menu->gamemode->options[1]->text = "PLAYER VS AI"; - g->menu->gamemode->options[1]->value = 1; + g->menu->settings[0]->options[1]->text = "PLAYER VS AI"; + g->menu->settings[0]->options[1]->value = 1; + SetBox(g->menu->settings[0], g->y, g->x, 4); + + + //DIFFICULTY OPTIONS + g->menu->settings[1] = malloc(sizeof(MenuSetting)); + g->menu->difficulty = g->menu->settings[1]; + g->menu->settings[1]->text = "DIFFICULTY:"; + g->menu->settings[1]->size = 3; + g->menu->settings[1]->selected = -1; + // allocate space + g->menu->settings[1]->options = calloc(3, sizeof(MenuOption *)); + g->menu->settings[1]->options[0] = malloc(sizeof(MenuOption)); + g->menu->settings[1]->options[1] = malloc(sizeof(MenuOption)); + g->menu->settings[1]->options[2] = malloc(sizeof(MenuOption)); + // option0, tutorial + g->menu->settings[1]->options[0]->text = "BEGINNER"; + g->menu->settings[1]->options[0]->value = 0; + // option1, player vs ai + g->menu->settings[1]->options[1]->text = "INTERMEDIATE"; + g->menu->settings[1]->options[1]->value = 1; + // option2 + g->menu->settings[1]->options[2]->text = "EXPERT"; + g->menu->settings[1]->options[2]->value = 2; + SetBox(g->menu->settings[1], g->y, g->x, 6); + + //START BUTTON + g->menu->start.x0 = (g->x - 10)/2; + g->menu->start.x1 = g->menu->start.x0 + 9; + g->menu->start.y1 = g->menu->start.y0 = g->y - 5; + + //EXIT BUTTON + g->menu->exit.x0 = (g->x - 4)/2; + g->menu->exit.x1 = g->menu->exit.x0 + 3; + g->menu->exit.y1 = g->menu->exit.y0 = g->y - 3; - SetBox(g->menu->gamemode, g->y, g->x, 4); if (g->y < MIN_Y || g->x < MIN_X) return false; else return true; } -//to be called in main game loop, handle the GUI operation +//frees GUI structs and deconstructs ncurses +void Cleanup(GUI *g) { + echo(); + nocbreak(); + endwin(); + printf("\033[?1002l\n"); //disable mouse reporting + //ughhhhhh pointers + + //free menu and children + for (int i = 0; i < g->menu->size; ++i) { + MenuSetting *curSet = g->menu->settings[i]; + for (int j = 0; j < curSet->size; ++j) { + free(curSet->options[j]); + } + free(curSet->options); + free(curSet); + } + free(g->menu->settings); + free(g->menu); + + //free and unset gui pointer + free(g); + g = NULL; + + system("clear"); + //raise(SIGINT); +} + + + +//to be called in main game loop, handles the entire GUI operation void DoGUI(GUI *g) { //handle mouse input MEVENT e; @@ -67,14 +130,20 @@ void DoGUI(GUI *g) { } flushinp(); + //handle gui drawing switch (g->state) { case MENU: DrawMenu(g); break; + case GAME: + DrawGame(g); + break; } } + + //draws and handles the menu void DrawMenu(GUI *g) { char *title = "QUEEN'S CHESS"; @@ -97,7 +166,7 @@ void DrawMenu(GUI *g) { mvhwall(g->y - 1, 0 , 0x2514, 0x2500, 0x2518, g->x); //iterate over every setting, print the label - for (int s = 0; s < g->menu->nSet; ++s) { + for (int s = 0; s < g->menu->size; ++s) { mvprintw(g->menu->settings[s]->labelY, g->menu->settings[s]->labelX, g->menu->settings[s]->text); //iterater over every option of the setting, printing each for (int o = 0; o < g->menu->settings[s]->size; ++o) { @@ -107,7 +176,44 @@ void DrawMenu(GUI *g) { } } + //print the start button + //mvprintw(g->menu->start.y0, g->menu->start.x0, "START GAME"); + + //print the quit button + mvprintw(g->menu->exit.y0, g->menu->exit.x0, "QUIT"); + + refresh(); +} + + + +void DrawGame(GUI *g) { + char *title = "QUEEN'S CHESS"; + int titleX = (g->x - strlen(title)) / 2; + + //draw the top border around the title + mvhwall(0, 0 , 0x250C, 0x2500, 0x2500, titleX - 1); + mvhwall(0, titleX + strlen(title) + 1 , 0x2500, 0x2500, 0x2510, g->x - (titleX + strlen(title) + 1)); + + //draw the title + attron(A_BOLD); + mvprintw(0, titleX, title); + attroff(A_BOLD); + + //draw the side vertical borders + mvvwall(1, 0, 0x2502, g->y - 2); + mvvwall(1, g->x - 1, 0x2502, g->y - 2); + + //draw the bottom border + mvhwall(g->y - 1, 0 , 0x2514, 0x2500, 0x2518, g->x); + //setup chess board window + //35w 17h + int bh = 17, bw = 35; + g->game->bWin = newwin(bh, bw, (g->y - bh)/2, (g->x - bw)/2); + box(g->game->bWin, 0, 0); + + wrefresh(g->game->bWin); refresh(); } @@ -117,7 +223,7 @@ void HandleMouse(GUI *g, MEVENT e) { switch(g->state) { case MENU: //iterate over every setting, print the label - for (int s = 0; s < g->menu->nSet; ++s) { + for (int s = 0; s < g->menu->size; ++s) { mvprintw(g->menu->settings[s]->labelY, g->menu->settings[s]->labelX, g->menu->settings[s]->text); //iterater over every option of the setting, printing each for (int o = 0; o < g->menu->settings[s]->size; ++o) { @@ -125,6 +231,9 @@ void HandleMouse(GUI *g, MEVENT e) { g->menu->settings[s]->selected = o; } } + + //if (IsInBox(e.y, e.x, g->menu->start)) g->state = GAME; + if (IsInBox(e.y, e.x, g->menu->exit)) g->state = EXITING; break; } } @@ -144,6 +253,7 @@ void mvhwall(int y, int x, wchar_t start, wchar_t mid, wchar_t end, int n) { c[n] = L'\0'; mvaddwstr(y, x, c); + free(c); } } @@ -156,12 +266,17 @@ void mvvwall(int y, int x, wchar_t w, int n) { c->chars[1] = L'\0'; for (int i = 0; i < n; ++i) mvadd_wch(y + i, x, c); + free(c); } + + bool IsInBox(int y, int x, Box b) { return y >= b.y0 && y <= b.y1 && x >= b.x0 && x <= b.x1; } + + void SetBox(MenuSetting *s, int height, int width, int y) { s->labelX = width - strlen(s->text); diff --git a/gui.h b/gui.h index 93ecfa8..d9d9eb5 100644 --- a/gui.h +++ b/gui.h @@ -6,13 +6,16 @@ #include #include #include +#include +#include "board.h" +#include "game.h" extern const int MIN_X, MIN_Y; typedef enum { MENU, - SETTINGS, GAME, + EXITING } EGUIState; typedef struct { @@ -39,13 +42,22 @@ typedef struct { MenuSetting *gamemode; MenuSetting *difficulty; - size_t nSet; + size_t size; MenuSetting **settings; + Box start; Box exit; } Menu; +typedef struct { + //board window + WINDOW *bWin; + Board *board; + EGameState state; +} Game; + typedef struct { Menu *menu; + Game *game; EGUIState state; int y, x; } GUI; @@ -55,8 +67,9 @@ void SetBox(MenuSetting *, int, int, int); bool InitGUI(GUI *g); void DoGUI(GUI *g); void DrawMenu(GUI *g); +void DrawGame(GUI *g); void HandleMouse(GUI *g, MEVENT e); - +void Cleanup(GUI *g); void mvhwall(int, int, wchar_t, wchar_t, wchar_t, int); void mvvwall(int, int, wchar_t, int); diff --git a/src/board.h b/src/board.h index c920d14..c1b4b13 100644 --- a/src/board.h +++ b/src/board.h @@ -14,6 +14,7 @@ typedef enum { } EPieceType; typedef enum { + PROGRESS, WHITE_WIN, BLACK_WIN, STALEMATE diff --git a/src/main.c b/src/main.c index 4aff0aa..a8285b2 100644 --- a/src/main.c +++ b/src/main.c @@ -150,10 +150,11 @@ int main(int argc, char *argv[]) { while (!done) { DoGUI(gui); + if (gui->state == EXITING) done = true; } - - printf("\033[?1003l\n"); + + Cleanup(gui); free(chessBoard); - free(gui); + return 0; } From 4ff38736829481cdcb37d8a9d9c0303d9391ab17 Mon Sep 17 00:00:00 2001 From: AJSmyth Date: Tue, 19 Apr 2022 17:15:59 -0700 Subject: [PATCH 05/19] Add main chess game state --- gui.c | 23 ++++++++++++++++++----- gui.h | 2 ++ gui.o | Bin 0 -> 11432 bytes 3 files changed, 20 insertions(+), 5 deletions(-) create mode 100644 gui.o diff --git a/gui.c b/gui.c index 8747b7f..d7b276a 100644 --- a/gui.c +++ b/gui.c @@ -25,6 +25,7 @@ bool InitGUI(GUI *g) { //setup menu and options g->menu = malloc(sizeof(Menu)); + g->game = malloc(sizeof(Game)); g->menu->size = 2; g->menu->settings = calloc(2, sizeof(MenuSetting *)); @@ -177,7 +178,7 @@ void DrawMenu(GUI *g) { } //print the start button - //mvprintw(g->menu->start.y0, g->menu->start.x0, "START GAME"); + mvprintw(g->menu->start.y0, g->menu->start.x0, "START GAME"); //print the quit button mvprintw(g->menu->exit.y0, g->menu->exit.x0, "QUIT"); @@ -209,9 +210,16 @@ void DrawGame(GUI *g) { //setup chess board window //35w 17h - int bh = 17, bw = 35; - g->game->bWin = newwin(bh, bw, (g->y - bh)/2, (g->x - bw)/2); - box(g->game->bWin, 0, 0); + g->game->boardBound.y0 = (g->y - 17)/2; + g->game->boardBound.x0 = (g->x - 35)/2; + g->game->boardBound.y1 = g->game->boardBound.y0 + 1; + g->game->boardBound.x1 = g->game->boardBound.x0 + 35; + + g->game->bWin = newwin(g->game->boardBound.y0, g->game->boardBound.x0, g->game->boardBound.y1, g->game->boardBound.x1); + + mvvwall(g->game->boardBound.y0, g->game->boardBound.x0, 0x2502, 17); + mvvwall(g->game->boardBound.y0, g->game->boardBound.x1, 0x2502, 17); + wrefresh(g->game->bWin); refresh(); @@ -232,7 +240,11 @@ void HandleMouse(GUI *g, MEVENT e) { } } - //if (IsInBox(e.y, e.x, g->menu->start)) g->state = GAME; + if (IsInBox(e.y, e.x, g->menu->start)) { + clear(); + g->state = GAME; + } + if (IsInBox(e.y, e.x, g->menu->exit)) g->state = EXITING; break; } @@ -264,6 +276,7 @@ void mvvwall(int y, int x, wchar_t w, int n) { cchar_t *c = malloc(sizeof(cchar_t)); c->chars[0] = w; c->chars[1] = L'\0'; + c->attr = A_NORMAL; for (int i = 0; i < n; ++i) mvadd_wch(y + i, x, c); free(c); diff --git a/gui.h b/gui.h index d9d9eb5..ac6a7c8 100644 --- a/gui.h +++ b/gui.h @@ -51,6 +51,8 @@ typedef struct { typedef struct { //board window WINDOW *bWin; + Box boardBound; + Board *board; EGameState state; } Game; diff --git a/gui.o b/gui.o new file mode 100644 index 0000000000000000000000000000000000000000..78c4b664c69b7aa804ca2b834543c49ccbacc249 GIT binary patch literal 11432 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 H_3Qr!g8L+% literal 0 HcmV?d00001 From 2c60458a24a7bcaf5c3e387f8d06a92bbeebb30d Mon Sep 17 00:00:00 2001 From: AJSmyth Date: Thu, 21 Apr 2022 18:22:06 -0700 Subject: [PATCH 06/19] Add Board Print Functionality - Add board print functionality - Update file structuring --- Makefile | 15 ++- src/board.c | 12 +- src/board.h | 2 +- src/gui.c | 335 ++++++++++++++++++++++++++++++++++++++++++++++++++++ src/gui.h | 78 ++++++++++++ 5 files changed, 429 insertions(+), 13 deletions(-) create mode 100644 src/gui.c create mode 100644 src/gui.h diff --git a/Makefile b/Makefile index e69ce87..b5adee3 100644 --- a/Makefile +++ b/Makefile @@ -1,13 +1,16 @@ +SOURCEDIR = src +DESTDIR = bin + CFLAGS = -std=c11 -Wno-return-local-addr -LIBS = $(shell ncursesw5-config --libs) -OBJS = main.o game.o gui.o board.o -OUT = a +LIBS := $(shell ncursesw5-config --libs) +OBJS := $(patsubst %.c, %.o, $(wildcard $(SOURCEDIR)/*.c)) +OUT = chess $(OUT): $(OBJS) - gcc $(OBJS) $(CFLAGS) $(LIBS) $(shell ncursesw5-config --cflags) --enable-widec -o $(OUT) + gcc $(OBJS) $(CFLAGS) $(LIBS) $(shell ncursesw5-config --cflags) --enable-widec -o $(DESTDIR)/$(OUT) %.o: %.c - gcc -c $(CFLAGS) $< + gcc -c $< $(CFLAGS) -o $@ clean: - rm *.o $(OUT) + rm $(OBJS) $(DESTDIR)/$(OUT) diff --git a/src/board.c b/src/board.c index a47234f..a437019 100644 --- a/src/board.c +++ b/src/board.c @@ -14,9 +14,9 @@ void PrintBoard(Board *b) { printf("%d ║", rank + 1); for (int file = 0; file < 8; ++file) { if(!b->board[file][rank]->hl){ - printf(" %lc ", GetUnicode(b->board[file][rank]->piece, b->board[file][rank]->color)); + printf(" %lc ", GetUnicode(b->board[file][rank], false)); }else{ - printf("<%lc>", GetUnicode(b->board[file][rank]->piece, b->board[file][rank]->color)); + printf("<%lc>", GetUnicode(b->board[file][rank], false)); } if (file != 7) printf("│"); } @@ -104,9 +104,9 @@ void FillBoardTest(Board *chessBoard) { //return the corresponding chess piece character (e.g. white pawn ♙ = 0x2659) given the color and piece type //note: unicode characters must be stored in the wchar_t type due to their larger size -wchar_t GetUnicode(EPieceType piece, EColor color) { - if (color == BLACK) { - switch (piece) { +wchar_t GetUnicode(Piece *p, bool whiteTile) { + if ((p->color == WHITE && whiteTile) || (p->color == BLACK && !whiteTile)) { + switch (p->piece) { case PAWN: return 0x2659; case ROOK: @@ -124,7 +124,7 @@ wchar_t GetUnicode(EPieceType piece, EColor color) { } } else { - switch (piece) { + switch (p->piece) { case PAWN: return 0x265F; //0x265F; case ROOK: diff --git a/src/board.h b/src/board.h index c1b4b13..d2ab958 100644 --- a/src/board.h +++ b/src/board.h @@ -53,5 +53,5 @@ void FillBoard(Board *board); void FillBoardTest(Board *board); void CopyBoard(Board *b1, Board *b2); void DeleteBoard(Board *b); -wchar_t GetUnicode(EPieceType, EColor); +wchar_t GetUnicode(Piece *p, bool whiteTile); #endif diff --git a/src/gui.c b/src/gui.c new file mode 100644 index 0000000..b54cb09 --- /dev/null +++ b/src/gui.c @@ -0,0 +1,335 @@ +#include "gui.h" + +const int MIN_X = 0, MIN_Y = 0; + +//start ncurses mode, returns false if window size is smaller than chess board +bool InitGUI(GUI *g) { + g->state = MENU; + + initscr(); + curs_set(0); + noecho(); + cbreak(); + + //weird stuff to make mouse work + keypad(stdscr, true); + printf("\033[?1002h\n"); //xterm report mouse button events (NO MOVEMENT EVENTS) + + //set up mouse event + mousemask(BUTTON1_PRESSED, NULL); + + getmaxyx(stdscr, g->y, g->x); + wattrset(stdscr, A_NORMAL); + + //setup menu and options + g->menu = malloc(sizeof(Menu)); + g->game = malloc(sizeof(Game)); + g->menu->size = 2; + g->menu->settings = calloc(2, sizeof(MenuSetting *)); + + //GAMEMODE OPTIONS + g->menu->settings[0] = malloc(sizeof(MenuSetting)); + g->menu->gamemode = g->menu->settings[0]; + g->menu->settings[0]->text = "GAMEMODE:"; + g->menu->settings[0]->size = 2; + g->menu->settings[0]->selected = -1; + // allocate space + g->menu->settings[0]->options = calloc(2, sizeof(MenuOption *)); + g->menu->settings[0]->options[0] = malloc(sizeof(MenuOption)); + g->menu->settings[0]->options[1] = malloc(sizeof(MenuOption)); + // option0, tutorial + g->menu->settings[0]->options[0]->text = "TUTORIAL"; + g->menu->settings[0]->options[0]->value = 0; + // option1, player vs ai + g->menu->settings[0]->options[1]->text = "PLAYER VS AI"; + g->menu->settings[0]->options[1]->value = 1; + SetBox(g->menu->settings[0], g->y, g->x, 4); + + + //DIFFICULTY OPTIONS + g->menu->settings[1] = malloc(sizeof(MenuSetting)); + g->menu->difficulty = g->menu->settings[1]; + g->menu->settings[1]->text = "DIFFICULTY:"; + g->menu->settings[1]->size = 3; + g->menu->settings[1]->selected = -1; + // allocate space + g->menu->settings[1]->options = calloc(3, sizeof(MenuOption *)); + g->menu->settings[1]->options[0] = malloc(sizeof(MenuOption)); + g->menu->settings[1]->options[1] = malloc(sizeof(MenuOption)); + g->menu->settings[1]->options[2] = malloc(sizeof(MenuOption)); + // option0, tutorial + g->menu->settings[1]->options[0]->text = "BEGINNER"; + g->menu->settings[1]->options[0]->value = 0; + // option1, player vs ai + g->menu->settings[1]->options[1]->text = "INTERMEDIATE"; + g->menu->settings[1]->options[1]->value = 1; + // option2 + g->menu->settings[1]->options[2]->text = "EXPERT"; + g->menu->settings[1]->options[2]->value = 2; + SetBox(g->menu->settings[1], g->y, g->x, 6); + + //START BUTTON + g->menu->start.x0 = (g->x - 10)/2; + g->menu->start.x1 = g->menu->start.x0 + 9; + g->menu->start.y1 = g->menu->start.y0 = g->y - 5; + + //EXIT BUTTON + g->menu->exit.x0 = (g->x - 4)/2; + g->menu->exit.x1 = g->menu->exit.x0 + 3; + g->menu->exit.y1 = g->menu->exit.y0 = g->y - 3; + + + //Setup game + g->game->board = malloc(sizeof(Board)); + FillBoard(g->game->board); + + if (g->y < MIN_Y || g->x < MIN_X) return false; + else return true; +} + + + +//frees GUI structs and deconstructs ncurses +void Cleanup(GUI *g) { + echo(); + nocbreak(); + endwin(); + printf("\033[?1002l\n"); //disable mouse reporting + //ughhhhhh pointers + + //free menu and children + for (int i = 0; i < g->menu->size; ++i) { + MenuSetting *curSet = g->menu->settings[i]; + for (int j = 0; j < curSet->size; ++j) { + free(curSet->options[j]); + } + free(curSet->options); + free(curSet); + } + free(g->menu->settings); + free(g->menu); + + //free and unset gui pointer + free(g); + g = NULL; + + system("clear"); + //raise(SIGINT); +} + + + +//to be called in main game loop, handles the entire GUI operation +void DoGUI(GUI *g) { + //handle mouse input + MEVENT e; + int ch = wgetch(stdscr); + + if (ch == KEY_MOUSE) { + if (getmouse(&e) == OK) { + if (e.bstate & (BUTTON1_PRESSED)) { + HandleMouse(g, e); + } + } + } + + flushinp(); + + //handle gui drawing + switch (g->state) { + case MENU: + DrawMenu(g); + break; + case GAME: + DrawGame(g); + break; + } +} + + + +//draws and handles the menu +void DrawMenu(GUI *g) { + char *title = "QUEEN'S CHESS"; + int titleX = (g->x - strlen(title)) / 2; + + //draw the top border around the title + mvhwall(0, 0 , 0x250C, 0x2500, 0x2500, titleX - 1); + mvhwall(0, titleX + strlen(title) + 1 , 0x2500, 0x2500, 0x2510, g->x - (titleX + strlen(title) + 1)); + + //draw the title + attron(A_BOLD); + mvprintw(0, titleX, title); + attroff(A_BOLD); + + //draw the side vertical borders + mvvwall(1, 0, 0x2502, g->y - 2); + mvvwall(1, g->x - 1, 0x2502, g->y - 2); + + //draw the bottom border + mvhwall(g->y - 1, 0 , 0x2514, 0x2500, 0x2518, g->x); + + //iterate over every setting, print the label + for (int s = 0; s < g->menu->size; ++s) { + mvprintw(g->menu->settings[s]->labelY, g->menu->settings[s]->labelX, g->menu->settings[s]->text); + //iterater over every option of the setting, printing each + for (int o = 0; o < g->menu->settings[s]->size; ++o) { + if (g->menu->settings[s]->selected == o) attron(A_BOLD); + mvprintw(g->menu->settings[s]->options[o]->bound.y0, g->menu->settings[s]->options[o]->bound.x0, g->menu->settings[s]->options[o]->text); + attroff(A_BOLD); + } + } + + //print the start button + mvprintw(g->menu->start.y0, g->menu->start.x0, "START GAME"); + + //print the quit button + mvprintw(g->menu->exit.y0, g->menu->exit.x0, "QUIT"); + + refresh(); +} + + + +void DrawGame(GUI *g) { + char *title = "QUEEN'S CHESS"; + int titleX = (g->x - strlen(title)) / 2; + + //draw the top border around the title + mvhwall(0, 0 , 0x250C, 0x2500, 0x2500, titleX - 1); + mvhwall(0, titleX + strlen(title) + 1 , 0x2500, 0x2500, 0x2510, g->x - (titleX + strlen(title) + 1)); + + //draw the title + attron(A_BOLD); + mvprintw(0, titleX, title); + attroff(A_BOLD); + + //draw the side vertical borders + mvvwall(1, 0, 0x2502, g->y - 2); + mvvwall(1, g->x - 1, 0x2502, g->y - 2); + + //draw the bottom border + mvhwall(g->y - 1, 0 , 0x2514, 0x2500, 0x2518, g->x); + + //setup chess board window + //35w 17h + g->game->boardBound.y0 = (g->y - 18)/2; + g->game->boardBound.x0 = (g->x - 36)/2; + g->game->boardBound.y1 = g->game->boardBound.y0 + 18; + g->game->boardBound.x1 = g->game->boardBound.x0 + 36; + + g->game->bWin = newwin(18, 36, g->game->boardBound.y0, g->game->boardBound.x0); + + /*mvvwall(g->game->boardBound.y0, g->game->boardBound.x0, 0x2502, 17); + mvvwall(g->game->boardBound.y0, g->game->boardBound.x1, 0x2502, 17); +*/ + bool whiteTile; + mvwaddstr(g->game->bWin, 0, 3, "╔═══╤═══╤═══╤═══╤═══╤═══╤═══╤═══╗"); + + for (int rank = 7; rank >= 0; --rank) { + if (rank % 2 == 1) + mvwprintw(g->game->bWin, 1 + rank * 2, 0, " %d ║█ █│ │█ █│ │█ █│ │█ █│ ║", rank + 1); + else + mvwprintw(g->game->bWin, 1 + rank * 2, 0, " %d ║ │█ █│ │█ █│ │█ █│ │█ █║", rank + 1); + mvwaddstr(g->game->bWin, 2 + rank * 2, 3, "╟───┼───┼───┼───┼───┼───┼───┼───╢"); + for (int file = 0; file < 8; ++file) { + whiteTile = ((rank % 2) && !(file % 2)) || (!(rank % 2) && (file % 2)); + if (whiteTile) wattron(g->game->bWin, A_STANDOUT); + mvwprintw(g->game->bWin, 1 + rank * 2, 5 + file * 4, "%lc", GetUnicode(g->game->board->board[file][rank], whiteTile)); + wattroff(g->game->bWin, A_STANDOUT); + } + } + mvwaddstr(g->game->bWin, 16, 3, "╚═══╧═══╧═══╧═══╧═══╧═══╧═══╧═══╝"); + mvwaddstr(g->game->bWin, 17, 3, " H G F E D C B A"); + + refresh(); + wrefresh(g->game->bWin); +} + + + +void HandleMouse(GUI *g, MEVENT e) { + switch(g->state) { + case MENU: + //iterate over every setting, print the label + for (int s = 0; s < g->menu->size; ++s) { + mvprintw(g->menu->settings[s]->labelY, g->menu->settings[s]->labelX, g->menu->settings[s]->text); + //iterater over every option of the setting, printing each + for (int o = 0; o < g->menu->settings[s]->size; ++o) { + if (IsInBox(e.y, e.x, g->menu->settings[s]->options[o]->bound)) + g->menu->settings[s]->selected = o; + } + } + + if (IsInBox(e.y, e.x, g->menu->start)) { + clear(); + g->state = GAME; + } + + if (IsInBox(e.y, e.x, g->menu->exit)) g->state = EXITING; + break; + } +} + + + +//moves the cursor and draws a horizontal wall with the specified characters +void mvhwall(int y, int x, wchar_t start, wchar_t mid, wchar_t end, int n) { + if (n >= 2) { + wchar_t *c = malloc(sizeof(wchar_t) * (n + 1)); + + c[0] = start; + c[n - 1] = end; + for (int i = 1; i < n - 1; ++i) { + c[i] = mid; + } + c[n] = L'\0'; + + mvaddwstr(y, x, c); + free(c); + } +} + + + +//moves the cursor and draws a vertical wall with the specified character +void mvvwall(int y, int x, wchar_t w, int n) { + cchar_t *c = malloc(sizeof(cchar_t)); + c->chars[0] = w; + c->chars[1] = L'\0'; + c->attr = A_NORMAL; + + for (int i = 0; i < n; ++i) mvadd_wch(y + i, x, c); + free(c); +} + + + +bool IsInBox(int y, int x, Box b) { + return y >= b.y0 && y <= b.y1 && x >= b.x0 && x <= b.x1; +} + + + +void SetBox(MenuSetting *s, int height, int width, int y) { + s->labelX = width - strlen(s->text); + + //calculate left margin for centering, 4 char spacing + for (int i = 0; i < s->size; ++i) { + s->labelX -= 4 + strlen(s->options[i]->text); + } + + s->labelX = s->labelX / 2; + s->labelY = y; + + s->options[0]->bound.x0 = s->labelX + strlen(s->text) + 4; + s->options[0]->bound.y0 = y; + s->options[0]->bound.x1 = s->options[0]->bound.x0 + strlen(s->options[0]->text) - 1; + s->options[0]->bound.y1 = y; + for (int i = 1; i < s->size; ++i) { + s->options[i]->bound.x0 = s->options[i-1]->bound.x0 + strlen(s->options[i-1]->text) + 4; + s->options[i]->bound.y0 = y; + s->options[i]->bound.x1 = s->options[i]->bound.x0 + strlen(s->options[i]->text) - 1; + s->options[i]->bound.y1 = y; + } +} diff --git a/src/gui.h b/src/gui.h new file mode 100644 index 0000000..ac6a7c8 --- /dev/null +++ b/src/gui.h @@ -0,0 +1,78 @@ +#ifndef GUI_H +#define GUI_H +#define _XOPEN_SOURCE_EXTENDED 1 +#define NCURSES_WIDECHAR 1 + +#include +#include +#include +#include +#include "board.h" +#include "game.h" + +extern const int MIN_X, MIN_Y; + +typedef enum { + MENU, + GAME, + EXITING +} EGUIState; + +typedef struct { + int x0, x1; + int y0, y1; +} Box; + +typedef struct { + Box bound; + int value; + char *text; +} MenuOption; + +typedef struct { + MenuOption **options; + int selected; + char *text; + int labelX, labelY; + size_t size; +} MenuSetting; + +typedef struct { + //MenuSetting represents [text | MenuOption[0] | ... | MenuOption[size - 1]] + MenuSetting *gamemode; + MenuSetting *difficulty; + + size_t size; + MenuSetting **settings; + Box start; + Box exit; +} Menu; + +typedef struct { + //board window + WINDOW *bWin; + Box boardBound; + + Board *board; + EGameState state; +} Game; + +typedef struct { + Menu *menu; + Game *game; + EGUIState state; + int y, x; +} GUI; + +bool IsInBox(int y, int x, Box b); +void SetBox(MenuSetting *, int, int, int); +bool InitGUI(GUI *g); +void DoGUI(GUI *g); +void DrawMenu(GUI *g); +void DrawGame(GUI *g); +void HandleMouse(GUI *g, MEVENT e); +void Cleanup(GUI *g); + +void mvhwall(int, int, wchar_t, wchar_t, wchar_t, int); +void mvvwall(int, int, wchar_t, int); +#endif From 0439ab6e3b945053286d413b498017803dfebc0f Mon Sep 17 00:00:00 2001 From: AJSmyth Date: Thu, 21 Apr 2022 18:31:58 -0700 Subject: [PATCH 07/19] Remove old and swap files --- gui.c | 314 ---------------------------------------------------------- gui.h | 78 --------------- gui.o | Bin 11432 -> 0 bytes 3 files changed, 392 deletions(-) delete mode 100644 gui.c delete mode 100644 gui.h delete mode 100644 gui.o diff --git a/gui.c b/gui.c deleted file mode 100644 index d7b276a..0000000 --- a/gui.c +++ /dev/null @@ -1,314 +0,0 @@ -#include "gui.h" - -const int MIN_X = 0, MIN_Y = 0; - - - -//start ncurses mode, returns false if window size is smaller than chess board -bool InitGUI(GUI *g) { - g->state = MENU; - - initscr(); - curs_set(0); - noecho(); - cbreak(); - - //weird stuff to make mouse work - keypad(stdscr, true); - printf("\033[?1002h\n"); //xterm report mouse button events (NO MOVEMENT EVENTS) - - //set up mouse event - mousemask(BUTTON1_PRESSED, NULL); - - getmaxyx(stdscr, g->y, g->x); - wattrset(stdscr, A_NORMAL); - - //setup menu and options - g->menu = malloc(sizeof(Menu)); - g->game = malloc(sizeof(Game)); - g->menu->size = 2; - g->menu->settings = calloc(2, sizeof(MenuSetting *)); - - //GAMEMODE OPTIONS - g->menu->settings[0] = malloc(sizeof(MenuSetting)); - g->menu->gamemode = g->menu->settings[0]; - g->menu->settings[0]->text = "GAMEMODE:"; - g->menu->settings[0]->size = 2; - g->menu->settings[0]->selected = -1; - // allocate space - g->menu->settings[0]->options = calloc(2, sizeof(MenuOption *)); - g->menu->settings[0]->options[0] = malloc(sizeof(MenuOption)); - g->menu->settings[0]->options[1] = malloc(sizeof(MenuOption)); - // option0, tutorial - g->menu->settings[0]->options[0]->text = "TUTORIAL"; - g->menu->settings[0]->options[0]->value = 0; - // option1, player vs ai - g->menu->settings[0]->options[1]->text = "PLAYER VS AI"; - g->menu->settings[0]->options[1]->value = 1; - SetBox(g->menu->settings[0], g->y, g->x, 4); - - - //DIFFICULTY OPTIONS - g->menu->settings[1] = malloc(sizeof(MenuSetting)); - g->menu->difficulty = g->menu->settings[1]; - g->menu->settings[1]->text = "DIFFICULTY:"; - g->menu->settings[1]->size = 3; - g->menu->settings[1]->selected = -1; - // allocate space - g->menu->settings[1]->options = calloc(3, sizeof(MenuOption *)); - g->menu->settings[1]->options[0] = malloc(sizeof(MenuOption)); - g->menu->settings[1]->options[1] = malloc(sizeof(MenuOption)); - g->menu->settings[1]->options[2] = malloc(sizeof(MenuOption)); - // option0, tutorial - g->menu->settings[1]->options[0]->text = "BEGINNER"; - g->menu->settings[1]->options[0]->value = 0; - // option1, player vs ai - g->menu->settings[1]->options[1]->text = "INTERMEDIATE"; - g->menu->settings[1]->options[1]->value = 1; - // option2 - g->menu->settings[1]->options[2]->text = "EXPERT"; - g->menu->settings[1]->options[2]->value = 2; - SetBox(g->menu->settings[1], g->y, g->x, 6); - - //START BUTTON - g->menu->start.x0 = (g->x - 10)/2; - g->menu->start.x1 = g->menu->start.x0 + 9; - g->menu->start.y1 = g->menu->start.y0 = g->y - 5; - - //EXIT BUTTON - g->menu->exit.x0 = (g->x - 4)/2; - g->menu->exit.x1 = g->menu->exit.x0 + 3; - g->menu->exit.y1 = g->menu->exit.y0 = g->y - 3; - - if (g->y < MIN_Y || g->x < MIN_X) return false; - else return true; -} - - - -//frees GUI structs and deconstructs ncurses -void Cleanup(GUI *g) { - echo(); - nocbreak(); - endwin(); - printf("\033[?1002l\n"); //disable mouse reporting - //ughhhhhh pointers - - //free menu and children - for (int i = 0; i < g->menu->size; ++i) { - MenuSetting *curSet = g->menu->settings[i]; - for (int j = 0; j < curSet->size; ++j) { - free(curSet->options[j]); - } - free(curSet->options); - free(curSet); - } - free(g->menu->settings); - free(g->menu); - - //free and unset gui pointer - free(g); - g = NULL; - - system("clear"); - //raise(SIGINT); -} - - - -//to be called in main game loop, handles the entire GUI operation -void DoGUI(GUI *g) { - //handle mouse input - MEVENT e; - int ch = wgetch(stdscr); - - if (ch == KEY_MOUSE) { - if (getmouse(&e) == OK) { - if (e.bstate & (BUTTON1_PRESSED)) { - HandleMouse(g, e); - } - } - } - - flushinp(); - - //handle gui drawing - switch (g->state) { - case MENU: - DrawMenu(g); - break; - case GAME: - DrawGame(g); - break; - } -} - - - -//draws and handles the menu -void DrawMenu(GUI *g) { - char *title = "QUEEN'S CHESS"; - int titleX = (g->x - strlen(title)) / 2; - - //draw the top border around the title - mvhwall(0, 0 , 0x250C, 0x2500, 0x2500, titleX - 1); - mvhwall(0, titleX + strlen(title) + 1 , 0x2500, 0x2500, 0x2510, g->x - (titleX + strlen(title) + 1)); - - //draw the title - attron(A_BOLD); - mvprintw(0, titleX, title); - attroff(A_BOLD); - - //draw the side vertical borders - mvvwall(1, 0, 0x2502, g->y - 2); - mvvwall(1, g->x - 1, 0x2502, g->y - 2); - - //draw the bottom border - mvhwall(g->y - 1, 0 , 0x2514, 0x2500, 0x2518, g->x); - - //iterate over every setting, print the label - for (int s = 0; s < g->menu->size; ++s) { - mvprintw(g->menu->settings[s]->labelY, g->menu->settings[s]->labelX, g->menu->settings[s]->text); - //iterater over every option of the setting, printing each - for (int o = 0; o < g->menu->settings[s]->size; ++o) { - if (g->menu->settings[s]->selected == o) attron(A_BOLD); - mvprintw(g->menu->settings[s]->options[o]->bound.y0, g->menu->settings[s]->options[o]->bound.x0, g->menu->settings[s]->options[o]->text); - attroff(A_BOLD); - } - } - - //print the start button - mvprintw(g->menu->start.y0, g->menu->start.x0, "START GAME"); - - //print the quit button - mvprintw(g->menu->exit.y0, g->menu->exit.x0, "QUIT"); - - refresh(); -} - - - -void DrawGame(GUI *g) { - char *title = "QUEEN'S CHESS"; - int titleX = (g->x - strlen(title)) / 2; - - //draw the top border around the title - mvhwall(0, 0 , 0x250C, 0x2500, 0x2500, titleX - 1); - mvhwall(0, titleX + strlen(title) + 1 , 0x2500, 0x2500, 0x2510, g->x - (titleX + strlen(title) + 1)); - - //draw the title - attron(A_BOLD); - mvprintw(0, titleX, title); - attroff(A_BOLD); - - //draw the side vertical borders - mvvwall(1, 0, 0x2502, g->y - 2); - mvvwall(1, g->x - 1, 0x2502, g->y - 2); - - //draw the bottom border - mvhwall(g->y - 1, 0 , 0x2514, 0x2500, 0x2518, g->x); - - //setup chess board window - //35w 17h - g->game->boardBound.y0 = (g->y - 17)/2; - g->game->boardBound.x0 = (g->x - 35)/2; - g->game->boardBound.y1 = g->game->boardBound.y0 + 1; - g->game->boardBound.x1 = g->game->boardBound.x0 + 35; - - g->game->bWin = newwin(g->game->boardBound.y0, g->game->boardBound.x0, g->game->boardBound.y1, g->game->boardBound.x1); - - mvvwall(g->game->boardBound.y0, g->game->boardBound.x0, 0x2502, 17); - mvvwall(g->game->boardBound.y0, g->game->boardBound.x1, 0x2502, 17); - - - wrefresh(g->game->bWin); - refresh(); -} - - - -void HandleMouse(GUI *g, MEVENT e) { - switch(g->state) { - case MENU: - //iterate over every setting, print the label - for (int s = 0; s < g->menu->size; ++s) { - mvprintw(g->menu->settings[s]->labelY, g->menu->settings[s]->labelX, g->menu->settings[s]->text); - //iterater over every option of the setting, printing each - for (int o = 0; o < g->menu->settings[s]->size; ++o) { - if (IsInBox(e.y, e.x, g->menu->settings[s]->options[o]->bound)) - g->menu->settings[s]->selected = o; - } - } - - if (IsInBox(e.y, e.x, g->menu->start)) { - clear(); - g->state = GAME; - } - - if (IsInBox(e.y, e.x, g->menu->exit)) g->state = EXITING; - break; - } -} - - - -//moves the cursor and draws a horizontal wall with the specified characters -void mvhwall(int y, int x, wchar_t start, wchar_t mid, wchar_t end, int n) { - if (n >= 2) { - wchar_t *c = malloc(sizeof(wchar_t) * (n + 1)); - - c[0] = start; - c[n - 1] = end; - for (int i = 1; i < n - 1; ++i) { - c[i] = mid; - } - c[n] = L'\0'; - - mvaddwstr(y, x, c); - free(c); - } -} - - - -//moves the cursor and draws a vertical wall with the specified character -void mvvwall(int y, int x, wchar_t w, int n) { - cchar_t *c = malloc(sizeof(cchar_t)); - c->chars[0] = w; - c->chars[1] = L'\0'; - c->attr = A_NORMAL; - - for (int i = 0; i < n; ++i) mvadd_wch(y + i, x, c); - free(c); -} - - - -bool IsInBox(int y, int x, Box b) { - return y >= b.y0 && y <= b.y1 && x >= b.x0 && x <= b.x1; -} - - - -void SetBox(MenuSetting *s, int height, int width, int y) { - s->labelX = width - strlen(s->text); - - //calculate left margin for centering, 4 char spacing - for (int i = 0; i < s->size; ++i) { - s->labelX -= 4 + strlen(s->options[i]->text); - } - - s->labelX = s->labelX / 2; - s->labelY = y; - - s->options[0]->bound.x0 = s->labelX + strlen(s->text) + 4; - s->options[0]->bound.y0 = y; - s->options[0]->bound.x1 = s->options[0]->bound.x0 + strlen(s->options[0]->text) - 1; - s->options[0]->bound.y1 = y; - for (int i = 1; i < s->size; ++i) { - s->options[i]->bound.x0 = s->options[i-1]->bound.x0 + strlen(s->options[i-1]->text) + 4; - s->options[i]->bound.y0 = y; - s->options[i]->bound.x1 = s->options[i]->bound.x0 + strlen(s->options[i]->text) - 1; - s->options[i]->bound.y1 = y; - } -} diff --git a/gui.h b/gui.h deleted file mode 100644 index ac6a7c8..0000000 --- a/gui.h +++ /dev/null @@ -1,78 +0,0 @@ -#ifndef GUI_H -#define GUI_H -#define _XOPEN_SOURCE_EXTENDED 1 -#define NCURSES_WIDECHAR 1 - -#include -#include -#include -#include -#include "board.h" -#include "game.h" - -extern const int MIN_X, MIN_Y; - -typedef enum { - MENU, - GAME, - EXITING -} EGUIState; - -typedef struct { - int x0, x1; - int y0, y1; -} Box; - -typedef struct { - Box bound; - int value; - char *text; -} MenuOption; - -typedef struct { - MenuOption **options; - int selected; - char *text; - int labelX, labelY; - size_t size; -} MenuSetting; - -typedef struct { - //MenuSetting represents [text | MenuOption[0] | ... | MenuOption[size - 1]] - MenuSetting *gamemode; - MenuSetting *difficulty; - - size_t size; - MenuSetting **settings; - Box start; - Box exit; -} Menu; - -typedef struct { - //board window - WINDOW *bWin; - Box boardBound; - - Board *board; - EGameState state; -} Game; - -typedef struct { - Menu *menu; - Game *game; - EGUIState state; - int y, x; -} GUI; - -bool IsInBox(int y, int x, Box b); -void SetBox(MenuSetting *, int, int, int); -bool InitGUI(GUI *g); -void DoGUI(GUI *g); -void DrawMenu(GUI *g); -void DrawGame(GUI *g); -void HandleMouse(GUI *g, MEVENT e); -void Cleanup(GUI *g); - -void mvhwall(int, int, wchar_t, wchar_t, wchar_t, int); -void mvvwall(int, int, wchar_t, int); -#endif diff --git a/gui.o b/gui.o deleted file mode 100644 index 78c4b664c69b7aa804ca2b834543c49ccbacc249..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11432 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 H_3Qr!g8L+% From 2dfcc9a7802ba6d646ceba0e4e7b4c0b218b2260 Mon Sep 17 00:00:00 2001 From: AJSmyth Date: Fri, 22 Apr 2022 09:46:30 -0700 Subject: [PATCH 08/19] Add mouse integration to chess board --- src/gui.c | 36 ++++++++++++++++++++++++++++++++++++ src/gui.h | 3 +++ 2 files changed, 39 insertions(+) diff --git a/src/gui.c b/src/gui.c index b54cb09..69d3dc2 100644 --- a/src/gui.c +++ b/src/gui.c @@ -82,6 +82,7 @@ bool InitGUI(GUI *g) { //Setup game g->game->board = malloc(sizeof(Board)); FillBoard(g->game->board); + g->game->InitMove = false; if (g->y < MIN_Y || g->x < MIN_X) return false; else return true; @@ -268,7 +269,28 @@ void HandleMouse(GUI *g, MEVENT e) { if (IsInBox(e.y, e.x, g->menu->exit)) g->state = EXITING; break; + case GAME: + //check if chess board interacted with + if (IsInBox(e.y, e.x, g->game->boardBound)) { + int x, y; + WinToBoard(g, e.y, e.x, &y, &x); + + mvprintw(3,3,"(%d,%d)", x, y); + if (x != -1 && y != -1) { + if (!g->game->InitMove) { + g->game->InitMove = true; + g->game->iY = y; + g->game->iX = x; + } + else { + Move(g->game->iX, g->game->iY, x, y, g->game->board); + g->game->InitMove = false; + } + } + } + break; } + } @@ -333,3 +355,17 @@ void SetBox(MenuSetting *s, int height, int width, int y) { s->options[i]->bound.y1 = y; } } + + +//convert main window space to board +void WinToBoard(GUI *g, int yw, int xw, int *yt, int *xt) { + //neeed to handle alternate board orientation + int x = xw, y = yw; + + y -= g->game->boardBound.y0 + 1; + x -= g->game->boardBound.x0 + 4; + + *yt = (y / 2 <= 7) ? y / 2 : -1; + *xt = (x % 4 < 3) ? x / 4 : -1; +} + diff --git a/src/gui.h b/src/gui.h index ac6a7c8..1b6a51f 100644 --- a/src/gui.h +++ b/src/gui.h @@ -52,6 +52,8 @@ typedef struct { //board window WINDOW *bWin; Box boardBound; + bool InitMove; + int iX, iY; Board *board; EGameState state; @@ -72,6 +74,7 @@ void DrawMenu(GUI *g); void DrawGame(GUI *g); void HandleMouse(GUI *g, MEVENT e); void Cleanup(GUI *g); +void WinToBoard(GUI *g, int yw, int xw, int *yt, int *xt); void mvhwall(int, int, wchar_t, wchar_t, wchar_t, int); void mvvwall(int, int, wchar_t, int); From 15534ff476e59b04fc9576c8ae594c54c5007a90 Mon Sep 17 00:00:00 2001 From: AJSmyth Date: Fri, 22 Apr 2022 10:35:58 -0700 Subject: [PATCH 09/19] Add exit button to main game --- src/gui.c | 12 +++++++++++- src/gui.h | 1 + src/gui.o | Bin 0 -> 14208 bytes 3 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 src/gui.o diff --git a/src/gui.c b/src/gui.c index 69d3dc2..94e06db 100644 --- a/src/gui.c +++ b/src/gui.c @@ -83,6 +83,10 @@ bool InitGUI(GUI *g) { g->game->board = malloc(sizeof(Board)); FillBoard(g->game->board); g->game->InitMove = false; + //EXIT BUTTON + g->game->exit.x0 = (g->x - 4)/2; + g->game->exit.x1 = g->game->exit.x0 + 3; + g->game->exit.y1 = g->game->exit.y0 = g->y - 3; if (g->y < MIN_Y || g->x < MIN_X) return false; else return true; @@ -242,6 +246,9 @@ void DrawGame(GUI *g) { } mvwaddstr(g->game->bWin, 16, 3, "╚═══╧═══╧═══╧═══╧═══╧═══╧═══╧═══╝"); mvwaddstr(g->game->bWin, 17, 3, " H G F E D C B A"); + + //print the quit button + mvprintw(g->game->exit.y0, g->game->exit.x0, "QUIT"); refresh(); wrefresh(g->game->bWin); @@ -275,7 +282,6 @@ void HandleMouse(GUI *g, MEVENT e) { int x, y; WinToBoard(g, e.y, e.x, &y, &x); - mvprintw(3,3,"(%d,%d)", x, y); if (x != -1 && y != -1) { if (!g->game->InitMove) { g->game->InitMove = true; @@ -288,6 +294,10 @@ void HandleMouse(GUI *g, MEVENT e) { } } } + if (IsInBox(e.y, e.x, g->game->exit)) { + erase(); + g->state = MENU; + } break; } diff --git a/src/gui.h b/src/gui.h index 1b6a51f..6f5dc16 100644 --- a/src/gui.h +++ b/src/gui.h @@ -56,6 +56,7 @@ typedef struct { int iX, iY; Board *board; + Box exit; EGameState state; } Game; diff --git a/src/gui.o b/src/gui.o new file mode 100644 index 0000000000000000000000000000000000000000..c6cf30dbcfa99439756ad35df27d52a43ed5f39b GIT binary patch literal 14208 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�y^mHDln_rOR#@%fwUP(hJ%9lvMr z6ytL-0DlKK@%eWOU=%su@%w8$#rTw93Khez3&3vxPW;d6h4VWk1m%_hdO9{1ZfIk47^xUK4vq7mTwgu2XqUmp|QiO7iLUmUFeO~}R5P*L*02ezmT{Z2Z zsc}o|L-M^%G$y;!4e>_Nh2Q@6lxWYS`dj-GX_4$rw0HK3{&WYyyAn_IwRMQTOuAq6 z^k(`KJ#GEF#6Vj*og(6%w(joUcG0eWwkFc`y}QMxuI}#o-nLYS*nngzndt-1_D55R zwp}8T>=@`uiXEv$Li9h;pHB3MjlHDCz|KUvy;I;Vr3kw%+0mV7B8g&0cc#CyE7>PD zrrHLY63L9LG_>_3L~Cn*x~+XzYkTLe)*WqK-B3H#ok)tF$2$k0lTx&`mw>)hS28_d zkR3Y!J+5d{3Fy<`DUyi+Qf{E9_wfYiIy#cz2C@O&wIPv?C%f8vI})O?zcERs4ybhT zPr8yVy~^Y!**TGFgW{6M05PFj>i`T?qr>NViJgA@Ot$r9`@n)Yy2gR(+{_Im%KHa z>(4C1Y3nlnsioW-h4|1?Zt%}B{6>baXE=?Cp|8`p(f>iTQE6oKd>(y+;j|?fK0gV- zPX*xb2jJJx;(|hUasD?1;L9~`^lz2Dg;>StKLyO_8E5o-o!QRlDVH_$8HO)q_{$8Z zwb9W3EyHhR_!)*TWB4x_9%1-z7=9bWZ_@dZu{VJ>Dr+=Oe!Cry(WjH)pJw0JynfAzs=~Y8GeG%lRgQ}{|uw&@l!#YGz#g-{k($VoW3pqe~jUr&!1`BKQ38D z&&TDj7|#9nd;p&xGI~BPZ!w(5+kXe(cj=AQ?}yhJz7jq%{=dlZI~l%!k`)va4+qqz zSgdj4e-|FZXRD8XM$>mP`c;g6$VY##-tV6ep#M9Db3Nbo@!6yK%rJVc=Yy2=ppgE{ z@fiL8g5j$f{*uOxA99-itBju8b%x=59G6fMfI@P){xupm{LgFt>ll53{tV}QQa(PL zi6P1$qvw2{^U<66`vRlqar+XZzYctj-+s*K`TTu70RJ*2c_`!u&VP*IHE1*ZAEsml zh3GlHL*ry7*C)y7KZ`cQ=UIkxK7Sv8zsK-e#^+0v455%dYw#HU-(xuE|FXvYdLCo+ zcQZaYhTq2Uh(6zwTym|Edqm@Y{x2|k9w$ExpdVxO_b~o%F`VZ`zh*es=X3ge@7JeZ z;pX0Evky1- zjdcG)#qcrrHln8giJo-Zqxemy)NiM$r4rq3HR;6ew5aK5OSg%dNBjFlO{!OYwDU3GjCB?2a7(gGi|sQ&&5 z1s^Ngd=H^qo?<2HA*wP)Nd?N$Me3KGL%h{Z*?vr&51fJ9+6N$DojXycqq>Z#^1Kozp#|`*V!ye%fYW zbd>R_DURs=5w!8**Z(mz5>J2sqq_f7K7s!J6otjce;+OODCYk=H2!oHF#XN&7L!f= xqWVH?mYAcI;i0O(Kk@XBJs`36c6tl(mp=V{pYl$pSpTPJb3jR}AMfq&|3CK`6*K?< literal 0 HcmV?d00001 From 6af0877113d9af59e95e5c739b409636293192f1 Mon Sep 17 00:00:00 2001 From: AJSmyth Date: Fri, 22 Apr 2022 20:01:33 -0700 Subject: [PATCH 10/19] Prevent empty tiles from being moved --- Makefile | 2 +- src/board.h | 1 + src/game.c | 19 +++++++++++++++++-- src/gui.c | 17 +++++++++++------ 4 files changed, 30 insertions(+), 9 deletions(-) diff --git a/Makefile b/Makefile index b5adee3..5e2050f 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ SOURCEDIR = src DESTDIR = bin CFLAGS = -std=c11 -Wno-return-local-addr -LIBS := $(shell ncursesw5-config --libs) +LIBS := $(shell ncursesw5-config --libs) -ltinfo OBJS := $(patsubst %.c, %.o, $(wildcard $(SOURCEDIR)/*.c)) OUT = chess diff --git a/src/board.h b/src/board.h index d2ab958..65ab5df 100644 --- a/src/board.h +++ b/src/board.h @@ -44,6 +44,7 @@ typedef struct { int nCapW, nCapB; EColor p1; EColor currentPlayerTurn; + EColor p1; EGameState gameState; } Board; diff --git a/src/game.c b/src/game.c index 4eb8b6e..c711d4e 100644 --- a/src/game.c +++ b/src/game.c @@ -3,6 +3,7 @@ #include #include #include +#include const int VALID_MOVE_SIZE = 63; @@ -45,6 +46,7 @@ char *Move(int f0, int r0, int f1, int r1, Board *b) { b->board[f0][r0]->piece = EMPTY; b->board[f0][r0]->color = NO_COLOR; } + /* if (b->board[f0][r0]->piece == PAWN) printf("dOMOSF"); //promotion (PAWN HAS BEEN MOVED) @@ -74,10 +76,12 @@ char *Move(int f0, int r0, int f1, int r1, Board *b) { } } } - + */ + mvprintw(1,1, " "); }else{ - printf("Invalid move!\n"); + mvprintw(1,1,"INVALID MOVE!"); + //printf("Invalid move!\n"); } return ""; } @@ -942,6 +946,7 @@ bool IsInCheck(int f0, int r0, int f1, int r1, Board *b) { break; } +<<<<<<< HEAD LLElem *curr = moves->first; while(curr){ MOVE *currmove = (MOVE *)(curr->data); @@ -949,6 +954,16 @@ bool IsInCheck(int f0, int r0, int f1, int r1, Board *b) { DeleteBoard(b2); DeleteList(moves); return true; +======= + for(int j = 0; j < VALID_MOVE_SIZE; j++){ + if(valid[j]){ + //printf("%d %d\n", valid[j]->f1, valid[j]->r1); + /* + if(b2->board[valid[j]->f1][valid[j]->r1]->piece == KING){ + return true; + } + */ +>>>>>>> 411e5b1 (Prevent empty tiles from being moved) } curr = curr->next; } diff --git a/src/gui.c b/src/gui.c index 94e06db..f6bd75e 100644 --- a/src/gui.c +++ b/src/gui.c @@ -77,16 +77,17 @@ bool InitGUI(GUI *g) { g->menu->exit.x0 = (g->x - 4)/2; g->menu->exit.x1 = g->menu->exit.x0 + 3; g->menu->exit.y1 = g->menu->exit.y0 = g->y - 3; - //Setup game g->game->board = malloc(sizeof(Board)); FillBoard(g->game->board); g->game->InitMove = false; + //EXIT BUTTON g->game->exit.x0 = (g->x - 4)/2; g->game->exit.x1 = g->game->exit.x0 + 3; g->game->exit.y1 = g->game->exit.y0 = g->y - 3; + g->game->board->p1 == WHITE; if (g->y < MIN_Y || g->x < MIN_X) return false; else return true; @@ -231,7 +232,9 @@ void DrawGame(GUI *g) { bool whiteTile; mvwaddstr(g->game->bWin, 0, 3, "╔═══╤═══╤═══╤═══╤═══╤═══╤═══╤═══╗"); - for (int rank = 7; rank >= 0; --rank) { + int dir = (g->game->board->p1 == WHITE) ? -1 : 1; + + for (int rank = (dir == 1) ? 0 : 7; (dir == 1) ? (rank <= 7) : (rank >= 0); rank += dir) { if (rank % 2 == 1) mvwprintw(g->game->bWin, 1 + rank * 2, 0, " %d ║█ █│ │█ █│ │█ █│ │█ █│ ║", rank + 1); else @@ -282,11 +285,13 @@ void HandleMouse(GUI *g, MEVENT e) { int x, y; WinToBoard(g, e.y, e.x, &y, &x); - if (x != -1 && y != -1) { + if (x != -1 && y != -1 ) { if (!g->game->InitMove) { - g->game->InitMove = true; - g->game->iY = y; - g->game->iX = x; + if (g->game->board->board[x][y]->piece != EMPTY) { + g->game->InitMove = true; + g->game->iY = y; + g->game->iX = x; + } } else { Move(g->game->iX, g->game->iY, x, y, g->game->board); From be08bd9ee5ce1bd8dd306beebcd3da42215fc5bf Mon Sep 17 00:00:00 2001 From: AJSmyth Date: Sun, 24 Apr 2022 21:45:21 -0700 Subject: [PATCH 11/19] Implement board rotation based on player color --- bin/chess | Bin 0 -> 43576 bytes src/gui.c | 103 ++++++++++++++++++++++++++++++++++++++++-------------- src/gui.h | 1 + src/gui.o | Bin 14208 -> 0 bytes 4 files changed, 77 insertions(+), 27 deletions(-) create mode 100755 bin/chess delete mode 100644 src/gui.o diff --git a/bin/chess b/bin/chess new file mode 100755 index 0000000000000000000000000000000000000000..ccd330a110a4c6208d3396e264df54b806c5d1cc GIT binary patch literal 43576 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 literal 0 HcmV?d00001 diff --git a/src/gui.c b/src/gui.c index f6bd75e..8464676 100644 --- a/src/gui.c +++ b/src/gui.c @@ -24,8 +24,8 @@ bool InitGUI(GUI *g) { //setup menu and options g->menu = malloc(sizeof(Menu)); g->game = malloc(sizeof(Game)); - g->menu->size = 2; - g->menu->settings = calloc(2, sizeof(MenuSetting *)); + g->menu->size = 3; + g->menu->settings = calloc(3, sizeof(MenuSetting *)); //GAMEMODE OPTIONS g->menu->settings[0] = malloc(sizeof(MenuSetting)); @@ -68,6 +68,24 @@ bool InitGUI(GUI *g) { g->menu->settings[1]->options[2]->value = 2; SetBox(g->menu->settings[1], g->y, g->x, 6); + //PLAYER COLOR + g->menu->settings[2] = malloc(sizeof(MenuSetting)); + g->menu->playerColor = g->menu->settings[2]; + g->menu->settings[2]->text = "COLOR:"; + g->menu->settings[2]->size = 2; + g->menu->settings[2]->selected = 0; + // allocate space + g->menu->settings[2]->options = calloc(2, sizeof(MenuOption *)); + g->menu->settings[2]->options[0] = malloc(sizeof(MenuOption)); + g->menu->settings[2]->options[1] = malloc(sizeof(MenuOption)); + // option0, tutorial + g->menu->settings[2]->options[0]->text = "WHITE"; + g->menu->settings[2]->options[0]->value = 0; + // option1, player vs ai + g->menu->settings[2]->options[1]->text = "BLACK"; + g->menu->settings[2]->options[1]->value = 1; + SetBox(g->menu->settings[2], g->y, g->x, 8); + //START BUTTON g->menu->start.x0 = (g->x - 10)/2; g->menu->start.x1 = g->menu->start.x0 + 9; @@ -87,7 +105,6 @@ bool InitGUI(GUI *g) { g->game->exit.x0 = (g->x - 4)/2; g->game->exit.x1 = g->game->exit.x0 + 3; g->game->exit.y1 = g->game->exit.y0 = g->y - 3; - g->game->board->p1 == WHITE; if (g->y < MIN_Y || g->x < MIN_X) return false; else return true; @@ -218,37 +235,51 @@ void DrawGame(GUI *g) { mvhwall(g->y - 1, 0 , 0x2514, 0x2500, 0x2518, g->x); //setup chess board window - //35w 17h + //36w 18h g->game->boardBound.y0 = (g->y - 18)/2; g->game->boardBound.x0 = (g->x - 36)/2; g->game->boardBound.y1 = g->game->boardBound.y0 + 18; g->game->boardBound.x1 = g->game->boardBound.x0 + 36; + //create the board window g->game->bWin = newwin(18, 36, g->game->boardBound.y0, g->game->boardBound.x0); - - /*mvvwall(g->game->boardBound.y0, g->game->boardBound.x0, 0x2502, 17); - mvvwall(g->game->boardBound.y0, g->game->boardBound.x1, 0x2502, 17); -*/ + + //print turn + if (g->game->board->currentPlayerTurn == WHITE) attron(A_BOLD); + mvprintw(g->game->boardBound.y0 - 1, g->game->boardBound.x0 + 3, "WHITE"); + attroff(A_BOLD); + + if (g->game->board->currentPlayerTurn == BLACK) attron(A_BOLD); + mvprintw(g->game->boardBound.y0 - 1, g->game->boardBound.x1 - 5, "BLACK"); + attroff(A_BOLD); + + //begin printing board bool whiteTile; mvwaddstr(g->game->bWin, 0, 3, "╔═══╤═══╤═══╤═══╤═══╤═══╤═══╤═══╗"); - int dir = (g->game->board->p1 == WHITE) ? -1 : 1; - - for (int rank = (dir == 1) ? 0 : 7; (dir == 1) ? (rank <= 7) : (rank >= 0); rank += dir) { - if (rank % 2 == 1) - mvwprintw(g->game->bWin, 1 + rank * 2, 0, " %d ║█ █│ │█ █│ │█ █│ │█ █│ ║", rank + 1); - else - mvwprintw(g->game->bWin, 1 + rank * 2, 0, " %d ║ │█ █│ │█ █│ │█ █│ │█ █║", rank + 1); - mvwaddstr(g->game->bWin, 2 + rank * 2, 3, "╟───┼───┼───┼───┼───┼───┼───┼───╢"); - for (int file = 0; file < 8; ++file) { + for (int y = 0; y < 8; ++y) { + int rank = (g->game->board->p1 == BLACK) ? y : (7 - y); + mvwprintw(g->game->bWin, 1 + y * 2, 0, " %d ║ │ │ │ │ │ │ │ ║", rank + 1); + mvwaddstr(g->game->bWin, 2 + y * 2, 0, " ╟───┼───┼───┼───┼───┼───┼───┼───╢"); + for (int x = 0; x <= 7; ++x) { + int file = (g->game->board->p1 == BLACK) ? (7 - x) : x; whiteTile = ((rank % 2) && !(file % 2)) || (!(rank % 2) && (file % 2)); - if (whiteTile) wattron(g->game->bWin, A_STANDOUT); - mvwprintw(g->game->bWin, 1 + rank * 2, 5 + file * 4, "%lc", GetUnicode(g->game->board->board[file][rank], whiteTile)); + if (whiteTile) { + //print tile characters + mvwprintw(g->game->bWin, 1 + y * 2, 4 + x * 4, "%s","█ █"); + wattron(g->game->bWin, A_STANDOUT); + } + + mvwprintw(g->game->bWin, 1 + y * 2, 5 + x * 4, "%lc", GetUnicode(g->game->board->board[file][rank], whiteTile)); wattroff(g->game->bWin, A_STANDOUT); + + if (rank == 0) { + mvwprintw(g->game->bWin, 17, 5 + x * 4, "%c", 65 + file); + } } } mvwaddstr(g->game->bWin, 16, 3, "╚═══╧═══╧═══╧═══╧═══╧═══╧═══╧═══╝"); - mvwaddstr(g->game->bWin, 17, 3, " H G F E D C B A"); + //print the quit button mvprintw(g->game->exit.y0, g->game->exit.x0, "QUIT"); @@ -271,10 +302,27 @@ void HandleMouse(GUI *g, MEVENT e) { g->menu->settings[s]->selected = o; } } + bool invalid = false; if (IsInBox(e.y, e.x, g->menu->start)) { - clear(); - g->state = GAME; + for (int i = 0; i < g->menu->size; ++i) { + if (g->menu->settings[i]->selected == -1) { + mvprintw(3, 3, "Invalid Settings!"); + invalid = true; + } + } + if (!invalid) { + switch (g->menu->playerColor->selected) { + case 0: + g->game->board->p1 = WHITE; + break; + case 1: + g->game->board->p1 = BLACK; + break; + } + clear(); + g->state = GAME; + } } if (IsInBox(e.y, e.x, g->menu->exit)) g->state = EXITING; @@ -287,7 +335,7 @@ void HandleMouse(GUI *g, MEVENT e) { if (x != -1 && y != -1 ) { if (!g->game->InitMove) { - if (g->game->board->board[x][y]->piece != EMPTY) { + if (g->game->board->board[y][x]->piece != EMPTY) { g->game->InitMove = true; g->game->iY = y; g->game->iX = x; @@ -374,13 +422,14 @@ void SetBox(MenuSetting *s, int height, int width, int y) { //convert main window space to board void WinToBoard(GUI *g, int yw, int xw, int *yt, int *xt) { - //neeed to handle alternate board orientation - int x = xw, y = yw; + int x = xw, y = yw, rank, file; y -= g->game->boardBound.y0 + 1; x -= g->game->boardBound.x0 + 4; + if (y / 2 <= 7) *yt = (g->game->board->p1 == BLACK) ? (y / 2) : (7 - (y / 2)); + else *yt = -1; + if (x % 4 < 3) *xt = (g->game->board->p1 == BLACK) ? (7 - (x / 4)) : (x / 4); + else *xt = -1; - *yt = (y / 2 <= 7) ? y / 2 : -1; - *xt = (x % 4 < 3) ? x / 4 : -1; } diff --git a/src/gui.h b/src/gui.h index 6f5dc16..e612756 100644 --- a/src/gui.h +++ b/src/gui.h @@ -41,6 +41,7 @@ typedef struct { //MenuSetting represents [text | MenuOption[0] | ... | MenuOption[size - 1]] MenuSetting *gamemode; MenuSetting *difficulty; + MenuSetting *playerColor; size_t size; MenuSetting **settings; diff --git a/src/gui.o b/src/gui.o deleted file mode 100644 index c6cf30dbcfa99439756ad35df27d52a43ed5f39b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14208 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�y^mHDln_rOR#@%fwUP(hJ%9lvMr z6ytL-0DlKK@%eWOU=%su@%w8$#rTw93Khez3&3vxPW;d6h4VWk1m%_hdO9{1ZfIk47^xUK4vq7mTwgu2XqUmp|QiO7iLUmUFeO~}R5P*L*02ezmT{Z2Z zsc}o|L-M^%G$y;!4e>_Nh2Q@6lxWYS`dj-GX_4$rw0HK3{&WYyyAn_IwRMQTOuAq6 z^k(`KJ#GEF#6Vj*og(6%w(joUcG0eWwkFc`y}QMxuI}#o-nLYS*nngzndt-1_D55R zwp}8T>=@`uiXEv$Li9h;pHB3MjlHDCz|KUvy;I;Vr3kw%+0mV7B8g&0cc#CyE7>PD zrrHLY63L9LG_>_3L~Cn*x~+XzYkTLe)*WqK-B3H#ok)tF$2$k0lTx&`mw>)hS28_d zkR3Y!J+5d{3Fy<`DUyi+Qf{E9_wfYiIy#cz2C@O&wIPv?C%f8vI})O?zcERs4ybhT zPr8yVy~^Y!**TGFgW{6M05PFj>i`T?qr>NViJgA@Ot$r9`@n)Yy2gR(+{_Im%KHa z>(4C1Y3nlnsioW-h4|1?Zt%}B{6>baXE=?Cp|8`p(f>iTQE6oKd>(y+;j|?fK0gV- zPX*xb2jJJx;(|hUasD?1;L9~`^lz2Dg;>StKLyO_8E5o-o!QRlDVH_$8HO)q_{$8Z zwb9W3EyHhR_!)*TWB4x_9%1-z7=9bWZ_@dZu{VJ>Dr+=Oe!Cry(WjH)pJw0JynfAzs=~Y8GeG%lRgQ}{|uw&@l!#YGz#g-{k($VoW3pqe~jUr&!1`BKQ38D z&&TDj7|#9nd;p&xGI~BPZ!w(5+kXe(cj=AQ?}yhJz7jq%{=dlZI~l%!k`)va4+qqz zSgdj4e-|FZXRD8XM$>mP`c;g6$VY##-tV6ep#M9Db3Nbo@!6yK%rJVc=Yy2=ppgE{ z@fiL8g5j$f{*uOxA99-itBju8b%x=59G6fMfI@P){xupm{LgFt>ll53{tV}QQa(PL zi6P1$qvw2{^U<66`vRlqar+XZzYctj-+s*K`TTu70RJ*2c_`!u&VP*IHE1*ZAEsml zh3GlHL*ry7*C)y7KZ`cQ=UIkxK7Sv8zsK-e#^+0v455%dYw#HU-(xuE|FXvYdLCo+ zcQZaYhTq2Uh(6zwTym|Edqm@Y{x2|k9w$ExpdVxO_b~o%F`VZ`zh*es=X3ge@7JeZ z;pX0Evky1- zjdcG)#qcrrHln8giJo-Zqxemy)NiM$r4rq3HR;6ew5aK5OSg%dNBjFlO{!OYwDU3GjCB?2a7(gGi|sQ&&5 z1s^Ngd=H^qo?<2HA*wP)Nd?N$Me3KGL%h{Z*?vr&51fJ9+6N$DojXycqq>Z#^1Kozp#|`*V!ye%fYW zbd>R_DURs=5w!8**Z(mz5>J2sqq_f7K7s!J6otjce;+OODCYk=H2!oHF#XN&7L!f= xqWVH?mYAcI;i0O(Kk@XBJs`36c6tl(mp=V{pYl$pSpTPJb3jR}AMfq&|3CK`6*K?< From e8ad0e4393bae8e1146e15414a35f765a69458dc Mon Sep 17 00:00:00 2001 From: AJSmyth Date: Mon, 25 Apr 2022 00:02:46 -0700 Subject: [PATCH 12/19] Add pvp turn checking --- bin/chess | Bin 43576 -> 43904 bytes src/board.h | 1 - src/game.c | 15 +----- src/gui.c | 23 ++++----- src/main.c | 135 +--------------------------------------------------- 5 files changed, 15 insertions(+), 159 deletions(-) diff --git a/bin/chess b/bin/chess index ccd330a110a4c6208d3396e264df54b806c5d1cc..0ae5ad599105571122191dc112d888dd42ce08e0 100755 GIT binary patch literal 43904 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 literal 43576 zcmeHw4SZC^)%R>ZAX+fNLK_ivRkYA*8a|}NkGg?exM>MQNc?JXU6KunCQ7^y~!?)yLUarf@c-h|d7 z&+qqg;qJ_wIdkUBnKNh3%$<94owj6Aip#~+mCC-#DAhVyKs+*I-Q6;Rz{BRViTFK* zoy^7|oyK7z-y;I#imN*%G0c$gRD@J6n<7cVX#&hts5qpM$~j({GDn43B2DGeDJs+U zaAldmQ=!T?>uVDE%off)R=`zgEl0B1yhY@1zS9=Uc5juTDo5g?a$9A&t+Jd7v!py# zsN_j9p?kihXAg6cN0$oi_{F2e<|X zlF?b@fd7^QJja2~qYn7gZZ~fG^*R8__^EP$r#sZ^ae&isOh*4A2mI9z@EaWHe9ZxW zodbNC1D*eJfR{VK-*37z;2#4%iA`l$t%%@K_BtDUo+dzvzuv-FXO055m)XvbHnK*PLVnHKMg^e4RMuZx-dI(uid0lE zPQ1n!Si>3{{1pxUKqYJRH~6T+vTDDtfz|pOd5N03wSHDrTNMnH5euj?;17a@vQ-U! z-x^j?9ST%d)z-5${`K{~aux`d6JlAYA>buM+|_kuKHl`Qbv|!JRjseO>S{l$@l_)O z0)crilLD#nfyeq#Fu=f(p9R)Kel;N3Q0=b;W>uiBEHBR+DD%};APFIst?`ysuJKm* zs;U`pas@+OL>E+Ri3xw8k*11y1PE5uR@9lPG7($4uypwfZN)rqN#W8(%e?30haCdphf4;1F)%+Af7Ju7!sUIKU)fpc@e zk~<&zlEVL`;x`R5R|<0>q&PuRF`v+HDjScGpp+sE0U?|e=pmI7bSTG#f44y=Y2I?< zPA$3wziI53fYC+e@0Iz*NPoVnY9eX#vl2F$r^m4uW%}WpzmI7xo&8OwLsP4cp;_<^ zr0Jr%zb*49o#*)?@W-?FBuu~kY@}1zM4BjZDZfjNpQb4S-Xi@f1@}mJMytqIaFy=< zv4Dd(YKvdJ7C0C+uc!q+)r2xOXn{|+z=tjHnHIPj|Kw-Pu)y1YBof4n6b%P-THsOy z9NuMtD<6e2x-D?>Kh)K0fpfoEW<)J;l7+ekEpR0}${V)8rK>E8$o3NdpAiuLn_+=Z zu)wn{a43*@Wn19KnNaAW1+JC?ls&@&C!JMSt_40x0TIr(z^!)OV}XCxg0EZPatXzA zi!E@eY8-y41^zh;ohvQy&s*S?7I?M=UT=Y)V1ci*z)!Tmn=J5Y7WifhoaS_OwOHUM zD(aw}GM?a~iJkM^8yOploe@Ehc?u)^O3E4PdnFc& zweU0yO$KME??E$7hGwYmE;CIAW~lFGGfjqNsPB3+O-5pdQCNWMGE+W|?U+EJJ;#nrSj9Lw%FXG#QeiK9`v$12WY2 z&c~{~WH``%Gff5q?Kjh8DA0a0O$Gw(H`8Po(0(&b1_A9i(_{$Heltx50PQ!^H1N@W zGfe{??Kjgj;h_Cyng%}FZ>DL$qy1)@20GerrfGnq{bu?Uo_^;e)qXcmzhb6oAfx?e zng%f1uhP(-=4R5K0>Z0Q$m>EGMZPukMIv!#D+OaH=_zSoxip)Gx@E!}KOZ?dH~*wP_ey2h6F z+tMp-=~7#|$d=Y@=?iS>bFArEZx$MRuh5NG_3-||;u39E`>dz+<_mgOG8UWiSzsQh z$jLlqBa{vXtoedGK=kJH*%agr2dBWaz4u*V+K!3!W}ebScu&X>_{VVkb5ban`LS*c z>bu^$P~SD2s=J=j_kJ9l3<6I|0vWO13a+=RJlVgd3x1Dm7Wz`D9=_miit5Je!3lcg zg8Pt&esC}riyFff4;0FE+@6lK^~D0?z@k|6~BBNuf;# z0LhR{PN70IgP=IbGL6Sz={mGwYF_`m4(%Y1oGw~2%;j}3QC?4ZGFVtUh~fvwU;C%9 zHjLQt_-psHv^@QUy(2p`(FHf4t5hX5J824u))7<2F0-N`YsU=f#)K|2Yh<4h52Ivv zcqULYOx~K&E}EzN7mGq@(MXyd9`uaTl;jv#TM<>>_VjBX(j%qOh;~5Vs_*I@r@O!~ z>mU+f&6W{vhm+x)naeYY!z3l=kCw^FdeR(s%2nj_(+69C>773x{7jVdDkr0o7SV}bsh=p>yfLN-YpUBC&L{4ZRByvLP3W$Z1 z`6D=?-NVFEZ6i1tj&qV!d-<^F+eWpCk8T-~)>SLtmi47%$SYSQJ>OQap=A}S6c^32+1W5cj9xEb0U z(S{>zQ+sG!(}n{q^f{3Z54%F&%6vpSAS`7ChkDY&!{ZuP80~uVSo?@3G)_--|B@_hON-3yrE1|&O<_1Fl6_#3x z5^8zFAFt)Fh|5~MRCq?)Hz_!^?FtH}wymV#vu)p?U_#sF6r^+dD@T|s-3aw!c0t{& z?-Bec^F{k5qSGIJpE_L|24|R0Fq6QJU{qfQ3XNe9 z$cLfW*q*uZC1^5;cEh-Gxep}DU3QC8cBFVhc(=Fz{usTDyz0pQp87(~JCVkoGn2%UzN z&-~6WP$4un0AG(ihW=x@g7tkD1Us}n_+|YKLJWJTfpGlExRoS=BA$#q zZF@+wLnq{E4~M>tA-FA4v^`S#uxOnyPsL|Lntc6m961;?nq0w3G9U3PY z(e4korx;p0x)5q=XnQyWkxmXl)^h}jBGN?=ESI!>9D+zUhajt`L)$@Y_g#ZFpy%|h zk%CR_o7yus)6-lN5FQ?%c~hx?fKnVQ-v;A|XPHGyHi5q#qQsI-?T~LPS-*tQ%B^Sc zB2m{N6(CF98Y$Yw&FTFXa~etOjIg}jnHztGCPlP1a!16NLVYjcIQ9Vy`rJH}<+ zcs1=m0WAtu5oQUhvgIvs8(BFVw`NJSME0ZV>GnPvQe39VMeuhbN+Lj)Ctz4b;E*Ro z;E;*7XE;(tNt%dTxlw}QM(0@#w@?LIPdj3a)%U?PND~rm$MUot{?G@IC?60sM8*=z zAKyGoLfLa@LV<}ILnz5H4pAsIdmxlOSo{m2z<`js7)vO>8#qit**2O`I!#T%Fo#e& zN70nz7>6hntrJ4&G&Kbl6GC}zETL@cKN3QD&L))S#uSPj;}C^X^BjcooJ~{W(?}nk zo*X&IP5b)YHx83@_Kl`8U8Z#Qah2&BMLNkb4pBN<7YxikNT_T4b;pJ`?1S>W&CQG$ zQG9YGE$SIdPOJJ3lbm`+lT)`Tryee+?os5F9OF>s)a?q_^gvGCTuwdECnYBmPp`7e z`^S>gxzWQUr~RYJsn?Vf)_X8PSlKyFR>?6AQBF0zkkfw1sh6#TKJB;3DXJ#*fwAOt z{NE3goCZddQ`D5x0GCsA6gefwI8-@BG42K+rzn@xfE;%%Bb}r9#)cjv)D0K93odkL zMC&oM{aEYr886zQ4RD|LZ}^3;fh7`HMhBx46FQjK>WUO$d|=s*kzg*{O+WLe+{qe9 zaG^Tme&!9Y%l@!qNGA)!6uzWGW;Z#Z4tda9IG7HZ=nuG+kdp>^ZHPijpU0+9zpEuK z1{!|RzQf=C{YSL@HN5>8P4V_~1t3lMblU&g5pBOlHf4W8|8wu=(`)~$N3{Lirjj+4 z{h!28Tq^d1U?{f3P;Beao+HZu*M=(!Jf1cl+1K})uoc(^NWNV{wqkpv2z~`@1w4Q^gk$6&404QwFf5J>gh7srMHtd|5yIGisKUVH z0%5?1_?Lxo{@)IhFogHxAPn+;xG=2V34}r8$tH}b8YTmWDh#**5C&%5e_0q`{_9~9 zhH!Blgh4Kj5QfDCfiTDgk-|t~Tx?#5bUVnY&?8OsG?Z_$retpNA#MfZIb7zZB@&2@ zL++hmG$nW^o(Y6?Ca|EPX_=d*@mM#@+;sdHB{}&wxjE`-)?HLHuVhFs+bd2;4ADj@ z-;K%KM4PDa9Gdl%F%W;i5eE_soW&Um^~j#HV|+4a2oL?oC9Rl~?ZAlvT;vW30h=3R8Zbqt>1q0LGAdql@H(L;GPAj+gfF-|y`9?)fODjGx1qKD`;8!;kI;<4`WnVUX4 zMoB^6l>DbPBv$?Ta7ljjAwlP;;zPnSUy0q2V$vgk37M=NLvljq#az-fDi-k=$(+t< znTm``u}@}#gl(JT%9xeuuz>da^RTzYhOG(tf7xE&yB2C8t88RAUy*%Z`^fP zVF`uD8`QtaCntI$onApU^t`%azlgUpm z7Ea`oh^43Nu!&`iQNyi^Fr*{3MViDy^dRBeEIVlPPSrOjUPS1o|-s%B90_&XoGLRn=cjGnu}?bxt-6Y zJM0Ty_!OC&Zs&+y39C%YHd^NMve)bw(o&19GKWmQ$L5enn?vO7SWioA6Q{qqzkn_G zE?6kDh4lOnoriNXX4A-YeS)UV{rwSc8s7@#+kkX%0Ih?Yf79Evmf-Dt9WkK?@L}Na zV-io?u%Q0ixbu*(#^~jl&mCz|&?aDlC|Ks^BO;2EpFNVI;61--94+;lwLj?m4Vl*Y zNEsdcm|FC2&%|OlK>ml!$J@ih%QH9LO6r2hP1||oqF{D-_@d04?&hfl!CB$qrNQF9 z?~Se`@*MzvDt{D>ldl2vUo|=oPAangMWf@;lCA%=(Q(pErrVO*FR|eLNEyOjzMl?5 zxW7Z&hoTroZR0G4khXuuwif$r2FY9-jeA<^g&iZo5ISUXL+Fr48^aOJA(OV0>1+fy zgrbEQDEs-g@n+Ky()9BQn)ap6BiuCp7{uDTUX1>K@-D>o_~v&Ig8-U~G1<0>RS{a7 z%#q35NCyKC6;~KVyX4ItpWJbz#X{3Uf> zgT5}2+Malzzs)?r|5QG?Bk=?Mi3j}Ex!5)wLqC!S`rCzAw}^L(;Ad|(vIJ-&Y_W(n z!SLdY`F5O&-=;^nlyu{HdK2PVh^0f@O6}~U9rO;3-fLogbHx5EUI4h0Pgh%$x@*Vq z60KB%zfaH}!Krlkb>{m7t?ICQt9qZni5!2Q;4TnKc%NWxE)1Z2bL=X_&G!k=>QcN< za3@Y~qZKaN(ufo#0*|3bN_OCbw4AjAGw6Y`9eC2aNr30!%t}j#b`NhcHX!d&?Yrli zp|Ex*PE_29hkj4sykA(`iqux5eu@-#cf>*ePU}Jc=i5<9v%i}k^v}N{-y1*dFAgag zrTdJcF1(AzRGFM=d@;XT4xC~m>+r*l*qQUqoq8`l?o7?h5|`IO@78(_!)2VLr-Qv zXHe2vrT0VqwL}AZ-5Tdv1h@oMVp<=xIK_GhN zje}d_!jmtJBPWD9z%#v(hZpd4<0aDiZ1NH4Z9P4M2Yj4FBe^``Ny9rGgW^37GH#X^ zg+O-1`)T|+?@ib8Rt#W%5AqleR^4=!hyivbkKwS*O&5z8VDtnRhx!0pAYy>cM+`hT zy*MSsfNY!;NOB~NziD>4Adm!Oau?6~x85{M_CDG5@ZOVGW_zD(>*GK?-0zcFx{2O^ z$mZV+Kp%H_$Uw8`95BJ{dGv(e;rj!(?7+|4i0P5^?5{D#UqU0@_&LFv)2E+B`r8pb z2t59t|4y33q9;*PBI*CP5V?3&XcFQtBcAyiPuf=OWcH^&h8c+KmQg$znZL6jJ}3~! zjX=x>;w{KDzb7!Bc-5)CmBfv)8)C+|%M!3cD~t>~e{Wmw@MM#^ie&cV^k{o00iqwE z3A(Y+tq>!Zx_8n`ZBfPvrJC^KILh&;&4haZ#}aPJ311?a6x%a8JZ_RrB03)7DoIe` z2+@#CaY2@Irs8#rIwILS-Nac%@?0=+X@tUWT5H!PtGWG1>H-v6l6EY>lyD|ivBj=TuHwQ^$?Mz0Bhzu=5v>6TxNj+G^7 zeP=W*-hnSeMi4?m2g-Ijbz(eQ#+s-6a8xP+&C;1lQLU69X;S?w$Dl-Lprpn@arR6@k_< z)(94KAI*?m^@Y!hu8MfFn~UF*;xhK`>N~~t%-#=;;u#VYF=OG~#~8)rP{Bkf+Yo*u z-6+oGK2+rRh$q)rK;B!F6FoSR=zNo?iiLNl8pY?^i2~*^iF%9$1)>}b4PW$3{SEcs zLdl{BcEvM;)UTWdAvao{jHf)=5O5+Zo(xL^!8MsTPez0qAflWb(E`;(d^P6{umgU{ z=USeDqawxv!LVmCf73ay>zXWClT2?I&%I-OfI%2l>${B7kBdgrAHj6(`89t2f*9uK zzUkD<9no(BCO^;6|6hVLw4~UL7r?RkMejWGEiD}$r2KLN->DncBRFGlAQ7b_`lE-* zb3cH61$@S#3*>+Yeb3w7@T^GiI@bYvVh`T8+zlwk+X38c$4Y0+#flNGbZm^Dsznngdb#5fRIA6%569upZfBlA@ z+ac0W5q4jDsp_tWVlkY&xB$Ew?cv@O@?g-Lp-zy@5I)l@Xjd=qJp*sIUz9rh3+2b-@KrFY|3rdN9T{0r8 zYyy5B2M1kK2+)k?;X*f{fgvM8U=lc%k?{&!h1UX=OYR{N=@TDPNp}qcRiM3 zwt+@Obhp`t$<4*I@k^p1ruTA8RKn4IpwRfN2^>&E1NP>(Wt$C{tSE!ewRqdUL+c^l z`@RnfM40O-4W6EakrClOpUBm%xde*n*=EstYvv$jdZy90CxiqT8rq@t@*3a8uUTwF zjW9HMT5sqCDD{7R)h^(|2Zg+xn8m>EwXq-Pa0L5$B*TKw8pG(^ZX)s4r{$I6Ihsane>xz!_7_R4ZR;zfgTjV^RjpWX;+GoD~Uw(87k(< zg{Si7DbP_<A)|+ zS;9E&K@-Ltr+vo=b%18a$6_mJ(Kzi%GEO&|d1H*zn>gk4x#!!vB!xKT&F|;g+mN16Gkc6yUVPf2!K2@gu{#_K(j!4B z6b5GtjcA@&4*GKM^+BM?r+a;iuyTlFlL+Z6Y&5qX+eT+TzohN!$M+ca@kc1V{LIuo zSGzdyq^ig_x*)nWyn?-aP69K+@~%ZyD2*Add4i=LF>{HX;P3t1ndxP5rVj$GL+b`h ztS@ZN8p5kInGPwYyNPMMPKTGudc(ag_zTBkS`@L#3Kp7V!p3tS5UwE6->kjRTzvd}!p zpjpp1X~%hDf@VHwK29IjH3{DZ!eI?>BhgWd8v}g8pcl{SmGkW%C05GylRv3|es24z zb64-5N;U9j1CuO_NAz695qx^6+07?dN9dVc%;|ra$JvWET1wI^jXKK#YDs*MgZU&E zejmPkV{>G&0m^;Ldo8PhZ$MkxTQdnTv5E zofVNule?KYNSRh=Wd#^k3k!M#=2#uvjfAB}Bs4j)Asd`!@TTv@Y#43Db`U-$>UO4s z4Ql>$+_I8zXaX!Otw=I&SPhG!&Omb)K@^ZK!pqQyr?l5-v=iLq3jIjyKhD-MoUP1_ zbizQbj`Rc`6IMtxa}38qr@>J_72S`9Jx+SXcNvA9IT@OTO7X^^WesIvtKn`u&3sLK z8EKVSktYk3)mma|Kfb9%EDM{`!3`m5Vf~*U2`9%FT9tnBT%mXmY~yO*9bexkwA}-$ zaAA1cCxUhQf?SEzCKQ39vAzORyD(*{uFT@>h=TioMg?C6cBFK2B$TZ;Z`iLlV_zM7 zkyfJJM8QPd5C=E}UW zlZ%b4J|EsGB-W+(p%(ElXqeiGvDYngn~P}+WmtES!)T;Hok=x#mHyr=>TC4NfG~{}_XrD$WpDb+$kQW5!(xUP`SXM{ zxGH=NxQWYmx3$qbFB&(L@^$BL@=KnIyu|G?PjgpEjTZ$|iDi*>Jz2xqH_er?|TI4x9Kq zqZFUdnWj*lpa}Gx^EnljxVoEpj{u0iW(Mp5Ay7O*B{M8(#uqR$7eqLxFWxPPkTar) zSSfNU6EMS(()Q6Gp%RE_xtgN*SN$MChWaIg$#PYVWwORJK`0|mh<{{EHNiqcp8bk9 zXGC7IipBPtZ01{cB{XwHrK-szD3cKJ60LZlC!ymqZy3T%MyABN7^SCsMrgl5kF<-r z@qD}siiz<9wKOy`1X0K#gVq!6u9;RqMz}p~rZ$WZRcBu3QFy?Od)y%~chHDyNk81v zc=~;4!g!R!2RQnVrLcpMXAiq_`>r=mc6Eh&Q?a8ooN`@3a^h2f*<758!>;=7UBfAy zTt8~G0=Z^($qHbEsDi|Y+c29wc(x6HKmDhZ$N)dJlb$L>uYml;uJ3fjU{D6Z#UKrp zwXi}v-Gp9}eBuiI zS)qOX4UWdEy6ngDz{Ar|h`(c0C`UCnGxr(QWo~vp ze!t3Iz2yc*FmVwZKYsO=CiQ=ZiU9H-ir;!Ss-k-Cur%=}havt$UXRQv;9iKk z0JnyF5$?sfb>JL#M=bW&+i~Ux_Ym$6a5KQh<6e$?2JSE8o`?Ga+y%J5jvFT|7)Zn~ zR=D)y{3V42?xJNEYo{WYvG=e@?Zh3%eFyFbaaZI18}2j87@OJ^iw*t(aNJMf{tNCq zai;^$3CN!lzj5I#{F&iOwm82?D_T~doy$r}OO`D!%wNKam*iijEq7nM!ku5p3JMo3 zDqL8)q~x-5*#d2G;nJnra`086Eicjv3iC@erd?XBEiYjUmn~Vg{9Ja4UI^HNCHV`# z&SWLkQY$Yi)wHEwSm9o%Yb#c;6(#x0OWagFyQs9VMDq1%C@odx7McrLLthW|mo)v; zQRr8{zuAqOoe^LdRE&C7T%U%P7uK%DU)e5qukZ))N3T~0Nb_7Lrk*z)n|!Au-X4j? zE~O2>8)LC1gjoo;BJ{MxVjhGuZ;r*bBOLngSgZ@-_FJKo2=DoREJhD2?z$}&%SE_p zYb;iba0!Ny!bUu$p|irRcpP4U@FSf4s6_Zo zdn~pE;knPE9KutdkHvZrUID#7i1614r{R&&H}`@+glGO4Z(AWe_vKh@Bf?|<5{un~ z@K=Au*g}~4dMq}8Fs&~Zn}7!*A0Rvn;T_m4T7vKugw+Tyd=va4Jnt>ki;ymyjpdi? z>gCL}F3WY|gz*_IXgk4a$9x#FqO)eKU_3wHKOIp#1Y%cy7rdd3?6|B&$7O#l^D~VZ zP3*#{=YDa{^wR+4<-dt=-4@7@0P-TbLEQC#=TdojQC(Ybf9obZxj_9)J1*)$LR*n#XpS2PQob|v#o@ac?_?R z=+NKgTZSh+God>PI47o=IP}Uv$Wyj5>08Ey$EWTU?IT@j1I`7{U_L?{ zOx)DDrmpaDi19^#72eEGS!(h#jPf@l|0fCMf5gjE5jXB>7>kpCAB#OhCqu05+A*Hf zAwE37d2C-SHaUULXG}h>ME(OW!ma?<8L^3jC+D_%mMBQ*0#c6X$jIQJm$RoH-w zXz$s|$HH+YADzI-?8Q?7Yd@t9b0WlN6#0X%#bW90TH4i_E97N|(z2$H%ccN|T>Jmz=g)C)p%iWD@A=mic5}>6%XC5Z7l! zz_Mj1n<-Q99b|0Vk3>WkW4g?s`I;_S9iu-9PFI^Gtl+(}V#PN?e$1{F_~6;4$Aa^B>aIbUy}ci1zTmm*a_y!{uXaN!WWe3D`i+O z!zLNF$gow0+hy1;!!8;2%5YGI438b@%95d5hPg8I$go(3SIV$nhD|bTkzuP0x680y zhFvo3mEoWa867^Q`eo>rVXh24GAx#%z&`Zfj8=iWc;Uix-7`v8g=&K#_pDhtvvYFK z{z`}^XU~*?(WugJOk?jPtQiTP)Wn4x^0(=7^IyjBqES+O($5r@#k!Q@OMJJ4Gur@~ zBjL(^NOV?+h>J~S*{uR1%>^sv@Xs+d-bF5B*C0amDtn~hn>qdzrtF7;{{)d_?fs<# z{1FHE4hOiCe4YTl3*LS1cM-8&$@tj|92cyHeH_uLF6xCVH}Z)2^Cn_0SPNy3R7NTU zm`ue^b%0;!0RN@~yv70E>;V52hi9?JR|pQdpNS~FBa)2I9tZe`fV)*AE#W%<-lH zqtyaL^m8!K$3stEmlH*c%s!376LBfESmGaFCi1usiD3i{j+ zM)Uy*FRu~se~5rR;y~vmiJv7WM81YYnf-ugK@M51l7I~Q2|r~LQ}e9KeMiz+E+;C! zRz&7MIb31I!{cBVNS=2r6EME^K$PC`PS%fe9N;CA&Y#W}boiPI(Z_hdXR**p0?yZl zh*mhzS?>TR`<0BJUjRM{IWuk$^r1HVddLBPFUOy1%2UnP2RJ_DaD^z}CFz{b`IiYx z@Sy|!lfVGUv#d%W^YsX#B#&hL7fSq4|;3 zge9F@P7`$aniX-_t-2`DMxE@Dj(Dg)Kp!1N;~`f<*tZ=>nOr^AVi}coyazcdLa6qNhsyH0gly zJrKaJk$kqw`Ht`P08aZyL_eQR=)K- z{?%21pufQztnrpr*VXz1z$~xxuCA_I<*W9V2kROFUSDV(E32!iul5K1@F}xL3 zwN+kULxXR<*IyfKSkEdNd^LV=d8nplJ&IUTUSI|jP*>IY8p^@YYLuWLRE6IfUsWvv zuXoXMJWcRwOAEYS<}J8vX?{`RLVy=9E%j=;%+(8)Gw@h)4mXoXhdEy-W7 zMDwy*e`8}+t!L@N(&a0(6_?EOo|6N=ITzPga_6(!I)7PZol|aOP2F0*Q)Wej-|tzx zq;SDP?`$~Y=djiOU`<^p;9Q_O6sWAKtycu+c}ohHE?NeLa&uk%Fojr%GsHzE7 z`-1)=)Qm<}SFI}Z272$O7xNY_14emOtrrZIvtsHLp|dq3 zt0dui8*Os4$ToqCi$Z>XE%c_goGtbTOKYpj>dO5L&&3whtz%@IEF!k+p4Yo702QYZ z$)MAqfIq zP!*`GtLNj3MA*oWD>$`mVO{-t(U0hWQB1SfTei+eqZ)(l>O>Lq8H5$0r%2To`U1gf zQproIYD?+_X>O=2hR7}@mJ?WC6ZEY@7;F$>rHVn%{0;Rir?xKW&skj?%BgRttM@kq z*IPiVLRHn}XIGU=Q2v6#vuSeW=#{=eCCe#aUyCY47;F$ZYyAy@s=C^Qgco@Y{%Ri; zkg@veAj=^=WI2fDtge%hfWM681pVufq}dkOb=>sj_$%f7T3HTiDkW%$iB^u|9+g@XBTei4)b*)QRCkPLnz%T0`ZG*t=H*D(4MI(KOgHT zx>T4elIE{kpD6$>ldR<{WqB3K<$yxR9#P^&`%>2OYF|u+?nLwvCl{z|zRR-wX^#qI2|?Y8puvb+kdX9|dhqNl<~ZRORvSA`GA{SPWjmntVx z;&V6F_N)CT6;4!$GPKL@Nx-SRDW)cgC_}HUfa*Vq#eR>7wY=ItRUw^uv0gTE>@T+R zn>Pt;72aCIaN9Xq~CtMDD5Wm?Lseejk;EKmCuq`RtqwXeKY zmd}!cCHp~_s#o>n&jBM5sq$){dE1SI%@{u?B%=IRl~*BsW#3w!wMyg`5vqD5)U02n zC!jFVQuV8Kf0jdeJH1J={#->+hN}D-HaPK0mo+qXPh|1m`Lg~DX^&{TatdzMZe>4? m0Zj4E3(6nQ9U^jq61;?~dKK;@M3R-i>@I;Z)mFfkWd9F&QJ;nY diff --git a/src/board.h b/src/board.h index 65ab5df..b997799 100644 --- a/src/board.h +++ b/src/board.h @@ -42,7 +42,6 @@ typedef struct { //captured board, black starts at 2*8=16 Piece *cap[4][8]; int nCapW, nCapB; - EColor p1; EColor currentPlayerTurn; EColor p1; EGameState gameState; diff --git a/src/game.c b/src/game.c index c711d4e..b153ba7 100644 --- a/src/game.c +++ b/src/game.c @@ -13,9 +13,9 @@ char *Move(int f0, int r0, int f1, int r1, Board *b) { if (IsValid(f0, r0, f1, r1, b)) { //-------- Update Misc. Board Data -------- //To count the total number of moves of each piece - b->board[f0][r0]->counter ++; + b->board[f0][r0]->counter++; - if(b->board[f0][r0]->color == BLACK){ + if(b->currentPlayerTurn == BLACK) { b->currentPlayerTurn = WHITE; }else{ b->currentPlayerTurn = BLACK; @@ -946,7 +946,6 @@ bool IsInCheck(int f0, int r0, int f1, int r1, Board *b) { break; } -<<<<<<< HEAD LLElem *curr = moves->first; while(curr){ MOVE *currmove = (MOVE *)(curr->data); @@ -954,16 +953,6 @@ bool IsInCheck(int f0, int r0, int f1, int r1, Board *b) { DeleteBoard(b2); DeleteList(moves); return true; -======= - for(int j = 0; j < VALID_MOVE_SIZE; j++){ - if(valid[j]){ - //printf("%d %d\n", valid[j]->f1, valid[j]->r1); - /* - if(b2->board[valid[j]->f1][valid[j]->r1]->piece == KING){ - return true; - } - */ ->>>>>>> 411e5b1 (Prevent empty tiles from being moved) } curr = curr->next; } diff --git a/src/gui.c b/src/gui.c index 8464676..8d596f6 100644 --- a/src/gui.c +++ b/src/gui.c @@ -332,25 +332,23 @@ void HandleMouse(GUI *g, MEVENT e) { if (IsInBox(e.y, e.x, g->game->boardBound)) { int x, y; WinToBoard(g, e.y, e.x, &y, &x); - - if (x != -1 && y != -1 ) { + if (x != -1 && y != -1) { + mvprintw(2,1,"%c%d clicked", x + 65, y + 1); if (!g->game->InitMove) { - if (g->game->board->board[y][x]->piece != EMPTY) { - g->game->InitMove = true; + if (g->game->board->board[x][y]->piece != EMPTY && g->game->board->currentPlayerTurn == g->game->board->board[x][y]->color) { g->game->iY = y; g->game->iX = x; + g->game->InitMove = true; } } - else { + else { Move(g->game->iX, g->game->iY, x, y, g->game->board); g->game->InitMove = false; } + } } - if (IsInBox(e.y, e.x, g->game->exit)) { - erase(); - g->state = MENU; - } + if (IsInBox(e.y, e.x, g->menu->exit)) g->state = EXITING; break; } @@ -424,11 +422,14 @@ void SetBox(MenuSetting *s, int height, int width, int y) { void WinToBoard(GUI *g, int yw, int xw, int *yt, int *xt) { int x = xw, y = yw, rank, file; + //set x and y to board coordinates y -= g->game->boardBound.y0 + 1; x -= g->game->boardBound.x0 + 4; - if (y / 2 <= 7) *yt = (g->game->board->p1 == BLACK) ? (y / 2) : (7 - (y / 2)); + + //>= needs to be changed to + if (y % 2 >= 0 && y / 2 <= 7) *yt = (g->game->board->p1 == BLACK) ? (y / 2) : (7 - (y / 2)); else *yt = -1; - if (x % 4 < 3) *xt = (g->game->board->p1 == BLACK) ? (7 - (x / 4)) : (x / 4); + if (x % 4 < 3 && x / 4 <= 7) *xt = (g->game->board->p1 == BLACK) ? (7 - (x / 4)) : (x / 4); else *xt = -1; } diff --git a/src/main.c b/src/main.c index a8285b2..6aca28a 100644 --- a/src/main.c +++ b/src/main.c @@ -10,143 +10,11 @@ int main(int argc, char *argv[]) { setlocale(LC_ALL, ""); - Board *chessBoard = malloc(sizeof(Board)); - //Board *chessBoardCopy = malloc(sizeof(Board)); - int a; - printf("Select 1 for White and 2 for Black and 3 for Free Play: "); - scanf("%d",&a); - FillBoard(chessBoard); GUI *gui = malloc(sizeof(GUI)); -<<<<<<< HEAD - //If side chosen is White - if (a == 1) - { - bool done = false; - while (!done){ -======= - bool done = false; - /* - while (!done) { ->>>>>>> e085263 (Initial Rebase Commit) - printf("Select a piece to move in the form \"FR FR\" (e.g. A2 A3): "); - char s0[3], s1[3]; - char *MoveCheck; - scanf("%2s %2s", s0, s1); - - if (chessBoard->board[s0[0] - 65][s0[1] - 49]->color == BLACK) - { - printf("Invalid move! Choose a White piece!\n"); - continue; - } - - Move(s0[0] - 65, s0[1] - 49, s1[0] - 65, s1[1] - 49, chessBoard); - - //Implement a Move check function which checks if the - //previous move by the player was valid (To Be Done) - //if (MoveCheck == 0) - //{ - // continue; - //} - - MoveRandomBlack(chessBoard); - PrintBoard(chessBoard); - - } - } - - //If side chosen is Black - if (a == 2) - { - bool done = false; - while (!done){ - printf("Select a piece to move in the form \"FR FR\" (e.g. A2 A3): "); - char s0[3], s1[3]; - char *MoveCheck; - scanf("%2s %2s", s0, s1); - - if (chessBoard->board[s0[0] - 65][s0[1] - 49]->color == WHITE) - { - printf("Invalid move! Choose a Black piece!\n"); - continue; - } - - Move(s0[0] - 65, s0[1] - 49, s1[0] - 65, s1[1] - 49, chessBoard); - - //Implement a Move check function which checks if the - //previous move by the player was valid (To Be Done) - //if (MoveCheck == 0) - //{ - // continue; - //} - - MoveRandomWhite(chessBoard); - PrintBoard(chessBoard); - - } - } - - if (a == 3) - { - bool done = false; - while (!done) - { - printf("Select a piece to move in the form \"FR FR\" (e.g. A2 A3): "); - char s0[3], s1[3]; - scanf("%2s %2s", s0, s1); - //MOVE *moves[63]; - #ifdef TEST - printf("Valid: %d | Move: %s %s", IsValid(s0[0] - 65, s0[1] - 49, s1[0] - 65, s1[1] - 49, chessBoard), s0, s1); - #else - Move(s0[0] - 65, s0[1] - 49, s1[0] - 65, s1[1] - 49, chessBoard); - //CopyBoard(chessBoard, chessBoardCopy); - //MOVE *best = IdealMove(chessBoard, WHITE); - //printf("IdealMove: %d%d %d%d", best->f0, best->r0, best->f1, best->r1); - - #endif - - PrintBoard(chessBoard); - } - } - //dev only - if(a == 4){ - while (true) - { - printf("Select a piece to move in the form \"FR FR\" (e.g. A2 A3): "); - char s0[3], s1[3]; - scanf("%2s %2s", s0, s1); - /* - LL *list = malloc(sizeof(LL)); - list->first = NULL; - list->last = NULL; - MOVE *m = malloc(sizeof(MOVE)); - m->f1 = 1; - m->r1 = 1; - m->f0 = 1; - m->r0 = 1; - Append(list, m); - printf("LIST ELEMENT: %d", ((MOVE *)(list->first->data))->f1); - */ - Move(s0[0] - 65, s0[1] - 49, s1[0] - 65, s1[1] - 49, chessBoard); - LL *validlist = getValidMoves(chessBoard, WHITE); - LLElem *curr = validlist->first; - int count = 0; - while(curr){ - MOVE *currmove = (MOVE *)(curr->data); - printf("MOVE#%d: %c%c->%c%c\n", ++count, currmove->f0 + 65, currmove->r0 + 49, currmove->f1 + 65, currmove->r1 + 49); - curr = curr->next; - } - PrintBoard(chessBoard); - } - } - - - - return 0; - */ - InitGUI(gui); DrawMenu(gui); + bool done = false; while (!done) { DoGUI(gui); @@ -154,7 +22,6 @@ int main(int argc, char *argv[]) { } Cleanup(gui); - free(chessBoard); return 0; } From c5df7a0250f8801cbf95781b372316c7929e31a7 Mon Sep 17 00:00:00 2001 From: AJSmyth Date: Mon, 25 Apr 2022 00:11:16 -0700 Subject: [PATCH 13/19] Add turn checking for AI mode --- bin/chess | Bin 43904 -> 43904 bytes src/gui.c | 25 +++++++++++++++++-------- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/bin/chess b/bin/chess index 0ae5ad599105571122191dc112d888dd42ce08e0..725a1c53a7b57dffe95acc4b331201b7d7a7019d 100755 GIT binary patch delta 1789 zcmYk7c}!GS6vp4ZFmzZ1QHm%aTSZg^Vr&I%38Nx|fdmCDHZ8-r0D>aOTCo+BrNaY7 zjth%ms8NZvxQqs>q(a@QrPwwqHg&^l!{$b@<&Wy^_ZX>t$$Y=_?z!ii^Ui&l$?xL% zUHrJ3SshG~My`V?G>-XM&bBe#&NhZKe`X(3WV-#2WZ+L7vR*8a!vegTUB5~>9UCtH zQ7~cQMPr%S277LkV0`J26mG6m(b~AvY#epRO{75GEI!?d*6AWyA)V2^XUY%hzE(GS zN|M$PWDOhJsj(TUc-~SU4`XFxSNG1A6R!KMX?W~LLtaPPQ zD}C5rMA3Y;gK^fX3dWl0{OSkn4jo!E$evMkLKN?`rT&Cio@q;=iAhXQQ=&J&WlNu@ z_;KSHqeapU#?I31wLYwlRLS$0mNdyx+}oNcIhJ==(c|PK{-HG;OPs<3tVgP>t*9ww zko`yv>po>G$a%ev&7!>Z@hpgLua9P~6p(sQefMoVXZe_WbSHHy(^33}Xl6&JHYBi< z)LX#G zHN$PW{p<8pEXvCq>54E@N~(yF_WaA@9c^Wpi`4Yh*~R$_{bGDm6?S+u#t*0WBB1Zx}6!!=hTx+ zR`v(`rzua+BS#JxI+dpV_X&Y6Go7`vY8!G|Idb@nz@;_i1@iD7dBE{>E$bZ~S4S_h z=FaCPBh#+kwI&xwxb*rcF3V7HQ~3g`I;28}@a#kLLho;G9W~onOX=BJT&|^_Yz^1e z(u|x{{P!BF$XUSaYv@K!8uzWCu-pvZTy1R4EoEVTRxmbPI)^b!J$}_foO4&Ap(>?W zbojc<((X4M`}PZQDfDlt-(@trxR1&=O|iD?6`}>z(v|bZwoOUqC-c3`#zsYGR)j8f zUmoplii|V1&E#7;N`=^k1Mn>uq7{4}ybhM_5Mnc!RUyOx=wB&>4c?E(yM*usyLSr_ z0p8ss#5%BQuMlNm82UX524Q9$N*){l(=jOJM32;?9(=GL^=8r*$?Fgdu;APT190C7 z7=ZfIFaVp*!2oQ#00X?JA6uEwL?p&8`?w6p!j$|&yWUs zl=M(GOQE)7i}`{v7G@31<}J0P^tcYw-%1{(Zuqg$ zKzEQHIzRtx#wgrb0)<>!G zWbV>W+kv`%Y633wQ>X07UeR;ejr~dXWje|&i{({$#$U>wm}8{vJHuFv(X#R$<7cy| zkK&Zv;$8KO2dj*IyDd1c%Avu%aojqOmR4o+c%;iEyboSEyiCP5A%Nky1>Yd delta 1732 zcmYk7e@s(X6vyAa6liO!s4zqn3JHh)2Hrf>SgVxPKQt0v!cws zrZA*;!@u+Lgkqjr?zDD2fndQ*#$jY_mYnx zF>4cXh32eOauU3a^Kd50xRtm=lkp;dj$Cl)@*N^ndQWB`&*~%Zz1Sn zRdrum?MCs629Fb%y~FpTrLV$T3|r&et=Tiwwq5;dTl9dqSi_I2`D+6$&KOkn?;B@R z_WO$qRRa@aPsi96L&RunWF&u=Z&TZx>!D=FLIRLwT1dWzBPKr>GMVV~dPvHSrF(1P zZ1yTT?I^s+Houn}BJMk2jUMK2i(AQ$FoxbHZ?)Aq0b^=w^!R!4<4`-|zhfLLn<(oE zoHWm+%WL7TdBvKZ;0YtgDr1eq8y+U56RFs(Qf<&3YXT7y^A>z-0R%W9KlN zYrl*lROaa=(3;oXRN(Inj=i9vO-6c~gudhmjUMG6jAo zO|_Vhv>(NMCvFcn|2P`pgnt7XAiwzm4UmR2Xn<_Fga*j#SI|JhahtE90n*Zr2FR8h zn2%Kcg89hio0yMGxQ+S92IMgEyH3olga^$5U*Zo2)HdKz%b*^0JG7%JU=Xz$ zWS{$zObA9D1r2Hn7*KZuk6I4(sAr)a^&kwQJ_8vq`UIo?1RB(4FrbD4j~W2=sB54d z)dGXOFXgU-yvPTC-hzvK$$8MAR)7I@40zO~P+#Ov?!zq{--XAh1)#M0Q%Nr@vHJOi zJz^{wPn}aub}OV&N*AY3Bnnq4Hw≦k;=O%vK+&u|qlHh8K4h~ V{O?rNEt54CI+ipFztx?f{{aguzbOC! diff --git a/src/gui.c b/src/gui.c index 8d596f6..c52e006 100644 --- a/src/gui.c +++ b/src/gui.c @@ -32,13 +32,13 @@ bool InitGUI(GUI *g) { g->menu->gamemode = g->menu->settings[0]; g->menu->settings[0]->text = "GAMEMODE:"; g->menu->settings[0]->size = 2; - g->menu->settings[0]->selected = -1; + g->menu->settings[0]->selected = 0; // allocate space g->menu->settings[0]->options = calloc(2, sizeof(MenuOption *)); g->menu->settings[0]->options[0] = malloc(sizeof(MenuOption)); g->menu->settings[0]->options[1] = malloc(sizeof(MenuOption)); // option0, tutorial - g->menu->settings[0]->options[0]->text = "TUTORIAL"; + g->menu->settings[0]->options[0]->text = "PLAYER VS PLAYER"; g->menu->settings[0]->options[0]->value = 0; // option1, player vs ai g->menu->settings[0]->options[1]->text = "PLAYER VS AI"; @@ -51,7 +51,7 @@ bool InitGUI(GUI *g) { g->menu->difficulty = g->menu->settings[1]; g->menu->settings[1]->text = "DIFFICULTY:"; g->menu->settings[1]->size = 3; - g->menu->settings[1]->selected = -1; + g->menu->settings[1]->selected = 0; // allocate space g->menu->settings[1]->options = calloc(3, sizeof(MenuOption *)); g->menu->settings[1]->options[0] = malloc(sizeof(MenuOption)); @@ -333,13 +333,22 @@ void HandleMouse(GUI *g, MEVENT e) { int x, y; WinToBoard(g, e.y, e.x, &y, &x); if (x != -1 && y != -1) { - mvprintw(2,1,"%c%d clicked", x + 65, y + 1); if (!g->game->InitMove) { - if (g->game->board->board[x][y]->piece != EMPTY && g->game->board->currentPlayerTurn == g->game->board->board[x][y]->color) { - g->game->iY = y; - g->game->iX = x; - g->game->InitMove = true; + if (g->menu->gamemode->selected == 0) { + if (g->game->board->board[x][y]->piece != EMPTY && g->game->board->currentPlayerTurn == g->game->board->board[x][y]->color) { + g->game->iY = y; + g->game->iX = x; + g->game->InitMove = true; + } } + else { + if (g->game->board->board[x][y]->piece != EMPTY && g->game->board->currentPlayerTurn == g->game->board->p1 && g->game->board->p1 == g->game->board->board[x][y]->color) { + g->game->iY = y; + g->game->iX = x; + g->game->InitMove = true; + } + } + } else { Move(g->game->iX, g->game->iY, x, y, g->game->board); From 42fc6c640b543572ca223044bc01762bfb486507 Mon Sep 17 00:00:00 2001 From: AJSmyth Date: Mon, 25 Apr 2022 00:57:17 -0700 Subject: [PATCH 14/19] Fix queen valid moves --- bin/chess | Bin 43904 -> 43936 bytes src/game.c | 23 ++++++++++++++++------- src/game.h | 2 +- src/gui.c | 6 ++++++ 4 files changed, 23 insertions(+), 8 deletions(-) diff --git a/bin/chess b/bin/chess index 725a1c53a7b57dffe95acc4b331201b7d7a7019d..87d19fe65e139d6b736f9d00a651c6a917f6be21 100755 GIT binary patch delta 6266 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 delta 5834 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 L5V8+S4}1O}Bq&-h diff --git a/src/game.c b/src/game.c index b153ba7..d2edd60 100644 --- a/src/game.c +++ b/src/game.c @@ -325,6 +325,7 @@ LL *getValidMovesQueen(int f, int r, Board *b){ LL *out = malloc(sizeof(LL)); out->first = NULL; out->last = NULL; + //check vertical line up for(int i = r+1; i < 8; i++){ //b->board[f][i]->hl = 1; @@ -411,21 +412,21 @@ LL *getValidMovesQueen(int f, int r, Board *b){ } } //check diagonal bottom right - for(int i = f+1, j=r-1; i<8 && j>=0; i++,j--){ - //b->board[i][j]->hl = 1; - if(b->board[i][j]->color != b->board[f][r]->color){ + for (int i = f+1, j= r-1; i < 8 && j>=0; i++, j--){ + if (b->board[f][r]->color != b->board[i][j]->color){ MOVE *curr = malloc(sizeof(MOVE)); - curr->r0 = r; + curr->r0 = r; curr->f0 = f; curr->r1 = j; curr->f1 = i; Append(out, curr); - if(b->board[i][j]->color != EMPTY){ + //b->board[i][j]->hl = 1; + if (b->board[i][j]->piece != EMPTY){ break; } - }else{ - break; } + + else break; } //check diagonal bottom left for(int i = f-1, j=r-1; i>=0 && j>=0; i--,j--){ @@ -1011,6 +1012,13 @@ LL *getValidMoves(Board * board, EColor player){ return out; } +bool IsMated(Board *b, EColor color) { + LL *m = getValidMoves(b, color); + bool mated = m->first == NULL; + DeleteList(m); + return mated; +} + void Castling(int f0, int r0, int f1, int r1, Board *b) { if (f1 == 6 && r1 == 0 && f0 == 4 && r0 == 0) @@ -1346,5 +1354,6 @@ void DeleteList(LL *list){ curr = next; } free(list); + list = NULL; } diff --git a/src/game.h b/src/game.h index 408f522..0c18262 100644 --- a/src/game.h +++ b/src/game.h @@ -51,7 +51,7 @@ char *Move(int f0, int r0, int f1, int r1, Board *b); void RawMove(int f0, int r0, int f1, int r1, Board *b); bool IsValid(int f0, int r0, int f1, int r1, Board *b); bool IsInCheck(int f0, int r0, int f1, int r1, Board *b); -bool IsMated(int f0, int r0, int f1, int r1, Board *b); +bool IsMated(Board *b, EColor color); void Capture(int f, int r, Board *b); void Promote(int f0, int r0, Board *b); void Castling(int f0, int r0, int f1, int r1, Board *b); diff --git a/src/gui.c b/src/gui.c index c52e006..22cee27 100644 --- a/src/gui.c +++ b/src/gui.c @@ -253,6 +253,12 @@ void DrawGame(GUI *g) { mvprintw(g->game->boardBound.y0 - 1, g->game->boardBound.x1 - 5, "BLACK"); attroff(A_BOLD); + //print any win conditions + if (IsMated(g->game->board, WHITE)) + mvprintw(g->game->boardBound.y0 + 2, (g->x - 9) / 2,"BLACK WINS"); + if (IsMated(g->game->board, BLACK)) + mvprintw(g->game->boardBound.y0 + 2, (g->x - 9) / 2,"WHITE WINS"); + //begin printing board bool whiteTile; mvwaddstr(g->game->bWin, 0, 3, "╔═══╤═══╤═══╤═══╤═══╤═══╤═══╤═══╗"); From 63b81a521d3d620fd3cac2624d13c2d311f98c3b Mon Sep 17 00:00:00 2001 From: AJSmyth Date: Mon, 25 Apr 2022 01:02:35 -0700 Subject: [PATCH 15/19] Move win statement to visible region --- bin/chess | Bin 43936 -> 43936 bytes src/game.c | 3 +-- src/gui.c | 4 ++-- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/bin/chess b/bin/chess index 87d19fe65e139d6b736f9d00a651c6a917f6be21..3789acbc7b9efe74c96b4b2542ac7658633777bb 100755 GIT binary patch delta 48 zcmV-00MGxR*8-r|0-2`U>T9boSgUVBXDl@>$8jlN@@YXlh2? GZgf3knix0$ diff --git a/src/game.c b/src/game.c index d2edd60..4bc3b9a 100644 --- a/src/game.c +++ b/src/game.c @@ -1014,7 +1014,7 @@ LL *getValidMoves(Board * board, EColor player){ bool IsMated(Board *b, EColor color) { LL *m = getValidMoves(b, color); - bool mated = m->first == NULL; + bool mated = (m->first == NULL); DeleteList(m); return mated; } @@ -1356,4 +1356,3 @@ void DeleteList(LL *list){ free(list); list = NULL; } - diff --git a/src/gui.c b/src/gui.c index 22cee27..2f1f814 100644 --- a/src/gui.c +++ b/src/gui.c @@ -255,9 +255,9 @@ void DrawGame(GUI *g) { //print any win conditions if (IsMated(g->game->board, WHITE)) - mvprintw(g->game->boardBound.y0 + 2, (g->x - 9) / 2,"BLACK WINS"); + mvprintw(g->game->boardBound.y0 - 2, (g->x - 9) / 2,"BLACK WINS"); if (IsMated(g->game->board, BLACK)) - mvprintw(g->game->boardBound.y0 + 2, (g->x - 9) / 2,"WHITE WINS"); + mvprintw(g->game->boardBound.y0 - 2, (g->x - 9) / 2,"WHITE WINS"); //begin printing board bool whiteTile; From 0e1e06819f1b35e93338b3de7b28a8257a7a55e2 Mon Sep 17 00:00:00 2001 From: AJSmyth Date: Mon, 25 Apr 2022 01:40:46 -0700 Subject: [PATCH 16/19] Add random AI --- bin/chess | Bin 43936 -> 48072 bytes src/game.c | 46 ++++++++++++++++++++++++++++++++++++++++------ src/game.h | 1 + src/gui.c | 8 ++++++++ 4 files changed, 49 insertions(+), 6 deletions(-) diff --git a/bin/chess b/bin/chess index 3789acbc7b9efe74c96b4b2542ac7658633777bb..a0a0bd73503374db4d49d84066f7969ab1781f34 100755 GIT binary patch delta 10239 zcmZ`<30zcF+rQ_)AR;h;B8xIJpeRbR2`fmZlhLMk-(yYUT%NrDld@z2jDBm_%>h?>TpY%h-2+zdO%){?B@zbMCq4TqysR zo_R!z!>H@wtpl&S>0jW4OaB7+kcgNK?jkEw&P(J85*NJl%0xbIzf9pp(%)M`3njF0 zKfF&a1ZQj%l^kg<^M+S0l+X;>R^hRY{;S7*v-SM((m%=`kAE6J1g)8 z1 z1zxVeLlpR41>Q%2S1Rzn3jCOirz6-;A*huFi1kU`YV*E#M1ANum^RpDM))btuoI_*e~`(3SRL)aJBJ|*wrz^fei zzjt@mf9Sy9bKrk=;7#8<0AD-sUpnxgIq)YO_#+Pd2M+w(oq1E}Yn_469S*$Bf#2xB z=R5GL9QYR;`1zf96Caw@3E)FB9r$q$yupFjJMeK1{2&KDRLN)JmLMB|-^z8a!B*)$Q3EdzP;O^XDO>#E3x~MlC z=LGFUtqbha4x#_s0zXffn}Rt$n$1F9 zmjMkHL$f{25o)myc7$5(I!EZg^@h7bsxFR_X8Z3Lsyzx!?-SjF<xUKd#U{4NeXw9HAC_8>%{Z{Es8lp5vE}l4g6g62crq`fRLS^|92c zJM--MO1YTv^UYA+ryo4-t06oDg~rjDzd=Q~23`!!Cw0&qs>c}>(QiE^zrvw@3FIpL zicIo7$myRz1LNRe{{p)HE<}eV(CM+TJgk5jg$YIj(C7{v8Xy=UlYAR;2BJ|692|&7 zw;(zkjiO>^>%pCL%*$=9SG`cPVwnlY_ z>ll1 z9>ckzZ_ts~VA-$)8q^o|538Vazk~6^6KFyounn)EuUv(w_yjs51eV3mBiE}g#;Xar z06#sQNZzjMli*8e-nS61A3?`!VXgilP5uUQMvS2TnyN!1{0aFFoJ&k3C&4XgGM#t{ zvXc^NSZ}CEnnaGn!=$8c+j?=FIlqWgZ!UuM30jzy98UXPgrej`@?SWgJed?ja7q$g z5D0TqvdKL-osvpw!8LU@9n}a+Qd4MP031xsCKcc{GSw{?w=3rSLi7gSsY3uphLFGD z=*Uz|xNT%8*$O&C6|15_PmY35S}L7!0iI1ups_t+N1BmbgzIT~9O>SpM$@rh!opDr zw68BD7_{3)sNn3VT)Of+BpMTFdJo7qrjYwkYt)l-@Yrai&wl~N(FruQJG?r26!{4* zjMifh-N%G`tvQE_ip5~BVS7RQl5;p(={UUG$E@;PIkaPmSva)HZ)_y-=+}tqR>Nf@ zE-nvXQo6z8QbPw)4sWOTA$B;MUhJ6|*I_+4u4>`95JE?Ig7uk~kyN>kUyAJcs?`}U z5Hlwg&qhFJ$aSYmzJD%r7(%bAA)I=C;`J5$GK8R#AtuW;kQZ z&}tDVT5(op-fEGYpaQ-xn4A$op5ZD2j0ouz;7N%=kUDu{&y|~ z47Gj`dmGe??||HsK&JYuHA-yUN!U6y7_u^ltB*gW(7kyA@mO_%600}?#nb(@g}?Ls zhT2@W8g`hnpFPg=H9FR+!PYH}3)D^5LE;p>`X`jP$9{aA#r8a{#J+_?Q)YP1Q9{cQ z!pCiTcXdA{9DbZd4)DP@Lr3IEpU9C%!}O@F~$9`Z#W$(5Lity?D`dRi!~ znCheUR$89^hVHV5?_X34kL8(P?Nj8gWXu&3;fm)X!l*u$YP72Ehi{s{*p3&OHA zGiq2^W^3Pwq3j&{c^NUIRW)xS#|axKOx*6rFq_JVpA;Co2=z`fvl`sDadwtGTEw6Q zJGgjbyWd2p$m-?URRR4y0nTOh8q_oa{W4qT2v~e0^KpxH)pAPcgT+h4zCHpzGb6|< zNS^6WieUQ8NTP>LGso(h4l`vZxx>~Z9qYH%Uwj519EOK8b=ro1Rzf}8#`?Ynv9t7K z1-v+GEbSivHM9Jv`Y_Cx836ZZ^`bw9fM@m;I-v^I&*=_pvOVZ5vAH|jn+}(oZe6{^ zh}}iRZMK^VUAu%p^xPhhG20co%=LrP*=}8N&0;~%21}AyS|m5!;H}xQz1;BtuI!F& zs#gupV9wrhNJz?kPA}(X9qxcV=lDU&96cEV1#^PQNc;_i<8!(Z4Qshdor{C0xj`5_ zj6T$2#EEpaFKnD!P2Pc|d4BZ9hcIp4zFs*8aIp7(fIrV36h_xqBM!=$4?sIVow&i$ z`JtXS_p`CZd4!{Nc|Yu#A36A45fbNGy?vL=qDB#G*Bk7ZIXf#nji-BN7zboQSa8{B zk&DHc7Q?mm`PWMDNnAC~Xfrf1tppgeAi?d$Zm4BGt+V%p;swdQMxw{FpR!YKCLSUt z8O?Wx87=u|(D^fPcR>K*z-8f(m@m|5WHp?zCiz=F73zro4)4P_r>usXXR4()j{Fl%()uU04VguY*sKpHmS=5hyt%k-W z5qLJ3x+sUNgL8{wyVs{V8XN)d#ifCz@3UH}x<4VF4WBJutPa4BDwYfKi>fQ=pAR(s zg*%!Ktm!?$!8C(d$Y5lPjn=Hz&IK}JfsSE;-a%WV1#4?H9K*sG=U&E^Q0b|A(U0Yn z(Q?^1puyN^w-_3%23DYCOI`9Y4xjRm*-y1QL@e}-@8d2Mm-!G1D7bJ(7p%Aqor^2T zn%|XVpjo1uc$N*QRaJl=D>@f>8LAnrnN8@#^0}}IiLdBySaw#`_$Lfr69k51P`t!{ z$mI5{de|}^OMPTx+*nO9cl3ypi?a`s)iV5<4qRUn?BgnA#EOEZzY4JT((WeKL0iT( z#I_Zo__I1I%6rvQ1tXw(V9U%f>EluI$z*fk|>6ZE3aCo9u%sS>a_1mI8}{FN^>j zj*Tgfn~^QZa!+w2aKU>Ize9FR-&5}}1J%<{c(O2o>50hZRw9J%_JqNo zZz)5&+l+rb5jw6@XrmaqF4?gYYC*u#HsL!K>yB%H_;j85L3lwAW1g)^{$_hu%c;8C zTGG(iYN_iKj$%*S@Jnn*Pp>LUBRFMqk*#qn|9_{ZfACt_$?L{WUb$)vgf)T>w+5LhBJ4Z za9On&F5{s<*vXwCwYC*(XCci+F4@w6-G5n#&?r3M7)E@Mk76veHrEoHyCRUd42bDm ze4{<L21HTkvh>QGuWM+Y1-3h+zt1 z1Dk)DTQvkbVKXMT`|1dagTQ=DKp!XBpBCC3-KaoY!+AW3o$sRFyz(*Q&LDRNxyrvg zo*_0@gxSOnscf3q%jI!d+A-AfxU}G+B~7OZ7(mX$YGmt)v;YjlNwF1k>3Akq3!PH^ zrWYf8q_AYWBMkah1?1!$^mr2`^@e6PEO(Z|$(-IW`o)Jd+8dHq`qE|P@a)RfZmXXb zy*%Di_3g?jlvcb0k*g;YFW9g;k(QUiXRB9_a2urTCO3?4X`$7u6n@h;DkKn~8#(Of(S=%q!6Y z+j!&t`e{Scy5m?5!P|Ew5SX`$wv@ouykvT)1TN*xrRgOwd`&9p0{Lrl=#E{`yk;fQ zRn1##C28ASS?@ltalsPUckYyr23goLif3rSt*xme;mF(gJ=O4tyVF|^Iu7F2_3P$i z=Xv32Jo{d;@xT_cG73;jeNvPo^gJhgv+Ya}Aq#elND8 zY^a4a38@`v@fO?$Azf39R=A`M-p2Dfr1!V;d=k>1ckp~R(jWiL^94xDu#DwM$L`|! zTBIN2yl6r?6GxB3r{I1W+9MtKI@&wo-}vTWL9!8e6W8AYq-D5)Ek_!32pu5(5lUf3P&mzYm|+^b)*GIby%Nrq_=qpmA>D;vFZLt-0qJ?9`agKS8R^7FJnzL8e!Ota6E0HK`07}qS%wAT44z)E z(o_!@r}@;qiz~; zWHKSZqNQz>5O2|t{xHp=B>}JoAvgu477g8W8mf^TJ`GoqG=2tcsOJg+o3wOGJ;ZO) z1P5RtudwXoglGfHM@VQt4#ZcmW|Nj2gpy6#WcROl{`pS2v)gsuvFKA!o}!em5yYGh zv8Pa;2Uj*}T{5txxeAXr1-h)jrq6evu?DJ&v3UygR;}qUw$gAk@>%udtPEx+r{!JR zqg_UwJ-^@!14pV|$H_&-6j&)+QNH;O&p*U=yPV!_xA#Z8xj3Q~o#eZiJX~-v3>9vo z0-jeo9Q;eL7rHYQ<=yUqOOeK99X1WW!N8(GmojX|H^Z2sh^pdsE1aJE(NV}Nni><8 z&)jmH^rv4={#Ob7f-78Df8h$0Xu*Dt<2_bz7sN_e&}gxhl}^oc#YBvh*G{2?h96il7?oXDA|j7v+GmDy=ed^|Lcp0;$jFl{_Pj=gJe~YUy0cDzLd>9@ZRZ1 zT3Jqzw9}t-g&gF2v)|DPIDuL3f5$JH?D|t$!Nw!*#RYOYX{w1*j+-p$$4N8yZ%I%L zjXV9KXGzkOXGD06BwZ-sk!wU?CQb%+En_(Z*rZtUXo)h8D`8U8LCN-wbs}z)#D^t3 zIYb18OTA@lI_uG>=R{n3^0+S$XEWybdJ)HB3D#8Yx=&pci&U!h{mP=nP3ZX0nL>Ee*qD3Gb>C z@wY|7J;$tq*0ESP9UKc+h`2bB-jM8H7$O>eCQYQH5^k6JCaij>a+3KCxF$(s*vg8R za56#q3zMpxF}DylO^FtAO8rcs$g`fU?IS32!=!q|N%#usVLpdEyYv!XBux^%q@O0? zIg>;^;U$I53<(cU7jZvn@}vvXor6a^yaQ%RI<}WZ9bd`k;;QJ~E1kNHnxC7#cxCRS z#cStRz4>~+3TmlymF}%3Cpvx+(7h3E^7@RcQ~cgEG9K3Njr5imNtxzC-QGm}%M^Jp zs;jiF=9NMGdqZWepbXY_aD`=1jobk-qg}5<8*=jFR1Wd)w{u?Qu=f2#QV!McC%Tr4 b`e8u!4egq}Pvk6+yl*JI^&za?*YE!TFhepi delta 9841 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 diff --git a/src/game.c b/src/game.c index 4bc3b9a..5f035fb 100644 --- a/src/game.c +++ b/src/game.c @@ -27,7 +27,7 @@ char *Move(int f0, int r0, int f1, int r1, Board *b) { //normal move if (b->board[f1][r1]->piece == EMPTY) { - CAN(f0, r0, f1, r1, b); + //CAN(f0, r0, f1, r1, b); b->board[f0][r0] = b->board[f1][r1]; b->board[f1][r1] = p; Castling (f0, r0, f1, r1, b); @@ -36,10 +36,10 @@ char *Move(int f0, int r0, int f1, int r1, Board *b) { //capturing move (prevent capturing king) else if (b->board[f1][r1]->piece != KING) { b->board[f0][r0]->isCapturing = true; //so that CAN know that it is capturing - printf("%d\n", b->board[f0][r0]->isCapturing); - CAN(f0, r0, f1, r1, b); + //printf("%d\n", b->board[f0][r0]->isCapturing); + //CAN(f0, r0, f1, r1, b); - printf("CAPTURING"); + //printf("CAPTURING"); Capture(f1, r1, b); b->board[f1][r1] = p; b->board[f0][r0] = malloc(sizeof(Piece)); @@ -1126,7 +1126,7 @@ int EvaluateBoard(Board *b){ } return value; } - +/* MOVE *IdealMove(Board *b, EColor player){ LL *moves; int score = EvaluateBoard(b); @@ -1138,7 +1138,6 @@ MOVE *IdealMove(Board *b, EColor player){ DeleteBoard(b2); return best; } -/* void GenerateTree(Board *source, TREE *out, int depth){ MOVE * valid[VALID_MOVE_SIZE]; @@ -1179,6 +1178,29 @@ void GenerateTree(Board *source, TREE *out, int depth){ } */ +MOVE *IdealMove(Board *b, EColor color) { + srand(time(NULL)); + + LL *m = getValidMoves(b, color); + int size = GetListSize(m); + int n = rand() % size; + + //iterate through n elements of the moves list + LLElem *curr = m->first; + for (; n >= 0; --n) { + curr = curr->next; + } + + //deep copy move to allow freeing + MOVE *move = malloc(sizeof(MOVE)); + move->f0 = ((MOVE *)curr->data)->f0; + move->r0 = ((MOVE *)curr->data)->r0; + move->f1 = ((MOVE *)curr->data)->f1; + move->r1 = ((MOVE *)curr->data)->r1; + + DeleteList(m); + return move; +} @@ -1356,3 +1378,15 @@ void DeleteList(LL *list){ free(list); list = NULL; } + +int GetListSize(LL *list) { + int i = 0; + LLElem *curr = list->first; + + while (curr->next) { + i++; + curr = curr->next; + } + + return i; +} diff --git a/src/game.h b/src/game.h index 0c18262..cc75c1e 100644 --- a/src/game.h +++ b/src/game.h @@ -78,4 +78,5 @@ MOVE *IdealMove(Board *b, EColor player); void Append(LL *list, void *data); void DeleteList(LL *list); +int GetListSize(LL *list); #endif diff --git a/src/gui.c b/src/gui.c index 2f1f814..c94a41b 100644 --- a/src/gui.c +++ b/src/gui.c @@ -243,6 +243,14 @@ void DrawGame(GUI *g) { //create the board window g->game->bWin = newwin(18, 36, g->game->boardBound.y0, g->game->boardBound.x0); + + //AI Move + EColor AIc = (g->game->board->p1 == WHITE) ? BLACK : WHITE; + + if (g->game->board->currentPlayerTurn == AIc) { + MOVE *m = IdealMove(g->game->board, AIc); + Move(m->f0, m->r0, m->f1, m->r1, g->game->board); + } //print turn if (g->game->board->currentPlayerTurn == WHITE) attron(A_BOLD); From 0c7158acce9d6f9f67fecf9e94ce86965eac5e98 Mon Sep 17 00:00:00 2001 From: Oliver Amjadi Date: Mon, 25 Apr 2022 16:44:10 -0700 Subject: [PATCH 17/19] Adding En Pessant --- src/game.c | 95 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 93 insertions(+), 2 deletions(-) diff --git a/src/game.c b/src/game.c index 5f035fb..e62950f 100644 --- a/src/game.c +++ b/src/game.c @@ -24,7 +24,43 @@ char *Move(int f0, int r0, int f1, int r1, Board *b) { //---------- Move the Piece ---------------- //store the moving piece temporarily Piece *p = b->board[f0][r0]; - + + //White Pawn En Passant + if (b->board[f1][r1-1]->piece == PAWN && (b->board[f0][r0]->color != b->board[f1][r1-1]->color) && b->board[f0][r0]->color == WHITE ) { + if(r0 == 4 && b->board[f1][r1-1]->counter == 1){ + b->board[f0][r0]->isCapturing = true; //so that CAN know that it is capturing + printf("%d\n", b->board[f0][r0]->isCapturing); + CAN(f0, r0, f1, r1, b); + printf("CAPTURING"); + Capture(f1, r1-1, b); + b->board[f1][r1] = p; + b->board[f0][r0] = malloc(sizeof(Piece)); + b->board[f0][r0]->piece = EMPTY; + b->board[f0][r0]->color = NO_COLOR; + b->board[f1][r1-1] = malloc(sizeof(Piece)); + b->board[f1][r1-1]->piece = EMPTY; + b->board[f1][r1-1]->color = NO_COLOR; + } + } + //Black Pawn En Passant + if (b->board[f1][r1+1]->piece == PAWN && (b->board[f0][r0]->color != b->board[f1][r1+1]->color) && b->board[f0][r0]->color == BLACK ) { + if(r0 == 3 && b->board[f1][r1+1]->counter == 1){ + b->board[f0][r0]->isCapturing = true; //so that CAN know that it is capturing + printf("%d\n", b->board[f0][r0]->isCapturing); + CAN(f0, r0, f1, r1, b); + + printf("CAPTURING"); + Capture(f1, r1 + 1, b); + b->board[f1][r1] = p; + b->board[f0][r0] = malloc(sizeof(Piece)); + b->board[f0][r0]->piece = EMPTY; + b->board[f0][r0]->color = NO_COLOR; + b->board[f1][r1+1] = malloc(sizeof(Piece)); + b->board[f1][r1+1]->piece = EMPTY; + b->board[f1][r1+1]->color = NO_COLOR; + } + } + //normal move if (b->board[f1][r1]->piece == EMPTY) { //CAN(f0, r0, f1, r1, b); @@ -849,6 +885,34 @@ LL *getValidMovesPawn(int f0, int r0, Board *b){ Append(out, curr); } //} + + //EN PASSANT for WHITE PAWN + f = f0+1, r = r0+1; + if (f < 8 && r < 8){ + if(b->board[f0+1][r0]->piece == PAWN && b->board[f0+1][r0]->color == BLACK){ + if(r0 == 4 && b->board[f0+1][r0]->counter == 1){ + MOVE *curr = malloc(sizeof(MOVE)); + curr -> f0 = f0; + curr -> r0 = r0; + curr -> f1 = f; + curr -> r1 = r; + Append(out, curr); + } + } + } + f = f0-1, r = r0+1; + if (f >= 0 && r < 8){ + if(b->board[f0-1][r0]->piece == PAWN && b->board[f0-1][r0]->color == BLACK){ + if(r0 == 4 && b->board[f0-1][r0]->counter == 1){ + MOVE *curr = malloc(sizeof(MOVE)); + curr -> f0 = f0; + curr -> r0 = r0; + curr -> f1 = f; + curr -> r1 = r; + Append(out, curr); + } + } + } //check to see if white pawn can capture left diagonally f = f0 - 1, r = r0 + 1; //left diagonal //if(!IsInCheck(f0, r0, f, r, b)){ //check to see if move to be made will put King in check @@ -906,7 +970,34 @@ LL *getValidMovesPawn(int f0, int r0, Board *b){ curr -> r1 = r; Append(out, curr); } - //PROMOTION FOR BLACK PAWN + //EN PASSANT for BLACK PAWN + f = f0-1, r = r0-1; + if (f >= 0 && r >= 0){ + if(b->board[f0-1][r0]->piece == PAWN && b->board[f0-1][r0]->color == WHITE){ + + if(r0 == 3 && b->board[f0-1][r0]->counter == 1){ + MOVE *curr = malloc(sizeof(MOVE)); + curr -> f0 = f0; + curr -> r0 = r0; + curr -> f1 = f; + curr -> r1 = r; + Append(out, curr); + } + } + } + f = f0+1, r = r0-1; + if (f < 8 && r >= 0){ + if(b->board[f0+1][r0]->piece == PAWN && b->board[f0+1][r0]->color == WHITE){ + if(r0 == 3 && b->board[f0+1][r0]->counter == 1){ + MOVE *curr = malloc(sizeof(MOVE)); + curr -> f0 = f0; + curr -> r0 = r0; + curr -> f1 = f; + curr -> r1 = r; + Append(out, curr); + } + } + } } return out; } From 1580a283becbe7b300c4d6181a13e09c059016b7 Mon Sep 17 00:00:00 2001 From: Oliver Amjadi Date: Mon, 25 Apr 2022 16:46:53 -0700 Subject: [PATCH 18/19] Uncomment Promotion --- src/game.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/game.c b/src/game.c index e62950f..bed3914 100644 --- a/src/game.c +++ b/src/game.c @@ -82,9 +82,6 @@ char *Move(int f0, int r0, int f1, int r1, Board *b) { b->board[f0][r0]->piece = EMPTY; b->board[f0][r0]->color = NO_COLOR; } - /* - if (b->board[f0][r0]->piece == PAWN) printf("dOMOSF"); - //promotion (PAWN HAS BEEN MOVED) if (b->board[f1][r1]->piece == PAWN) { if ((r1 == 7 && b->board[f1][r1]->color == WHITE) || (r1 == 0 && b->board[f1][r1]->color == BLACK)) { @@ -112,7 +109,6 @@ char *Move(int f0, int r0, int f1, int r1, Board *b) { } } } - */ mvprintw(1,1, " "); }else{ From 839f16f0c3acf1c4921f97217a33187557a1ff35 Mon Sep 17 00:00:00 2001 From: Oliver Amjadi Date: Mon, 25 Apr 2022 16:58:10 -0700 Subject: [PATCH 19/19] Ncures doesnt work with printf and scanf --- bin/chess | Bin 48072 -> 0 bytes src/game.c | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) delete mode 100755 bin/chess diff --git a/bin/chess b/bin/chess deleted file mode 100755 index a0a0bd73503374db4d49d84066f7969ab1781f34..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48072 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[f1][r1]->piece == PAWN) { if ((r1 == 7 && b->board[f1][r1]->color == WHITE) || (r1 == 0 && b->board[f1][r1]->color == BLACK)) { char promoteTo; - printf("Please choose a piece to promote your pawn to: \nQ:Queen\nN:Knight\nB:Bishop\nR:Rook\nPiece:"); - scanf(" %c", &promoteTo); + //printf("Please choose a piece to promote your pawn to: \nQ:Queen\nN:Knight\nB:Bishop\nR:Rook\nPiece:"); + //scanf(" %c", &promoteTo); switch(promoteTo){ case 'B': b->board[f1][r1]->isPromoted = true;