forked from len0rd/rockbox
Move Sudoku plugin into its own subdirectory and add a random game generator.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@9407 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
9fad701934
commit
0f619c65ba
10 changed files with 4254 additions and 89 deletions
|
@ -58,10 +58,6 @@ solitaire.c
|
|||
sokoban.c
|
||||
star.c
|
||||
starfield.c
|
||||
#if (LCD_WIDTH != 176) && (LCD_WIDTH != 138)
|
||||
/* These need adjusting for the iPod Nano and Mini */
|
||||
sudoku.c
|
||||
#endif
|
||||
#if (LCD_WIDTH != 240) && (LCD_WIDTH != 138) && (LCD_WIDTH != 128)
|
||||
tetrox.c
|
||||
#endif
|
||||
|
|
|
@ -16,6 +16,10 @@ rockboy
|
|||
/* For all targets with a bitmap display */
|
||||
#ifdef HAVE_LCD_BITMAP
|
||||
chessbox
|
||||
#if (LCD_WIDTH != 176) && (LCD_WIDTH != 138)
|
||||
/* This needs adjusting for the iPod Nano and Mini */
|
||||
sudoku
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* For all the colour targets and iriver H1x0 */
|
||||
|
|
117
apps/plugins/sudoku/Makefile
Normal file
117
apps/plugins/sudoku/Makefile
Normal file
|
@ -0,0 +1,117 @@
|
|||
# __________ __ ___.
|
||||
# Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||
# Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||
# Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||
# Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||
# \/ \/ \/ \/ \/
|
||||
# $Id$
|
||||
#
|
||||
|
||||
INCLUDES = -I$(APPSDIR) -I.. -I. -I$(FIRMDIR)/include -I$(FIRMDIR)/export \
|
||||
-I$(FIRMDIR)/common -I$(FIRMDIR)/drivers -I$(OUTDIR) -I$(BUILDDIR)
|
||||
CFLAGS = $(GCCOPTS) $(INCLUDES) $(TARGET) $(EXTRA_DEFINES) \
|
||||
-DTARGET_ID=$(TARGET_ID) -DMEM=${MEMORYSIZE} -DPLUGIN
|
||||
|
||||
ifdef APPEXTRA
|
||||
INCLUDES += $(patsubst %,-I$(APPSDIR)/%,$(subst :, ,$(APPEXTRA)))
|
||||
endif
|
||||
|
||||
LINKFILE := $(OBJDIR)/link.lds
|
||||
DEPFILE = $(OBJDIR)/dep-sudoku
|
||||
|
||||
# This sets up 'SRC' based on the files mentioned in SOURCES
|
||||
include $(TOOLSDIR)/makesrc.inc
|
||||
|
||||
SOURCES = $(SRC)
|
||||
OBJS := $(SRC:%.c=$(OBJDIR)/%.o)
|
||||
DIRS = .
|
||||
|
||||
ifndef SIMVER
|
||||
LDS := ../plugin.lds
|
||||
OUTPUT = $(OUTDIR)/sudoku.rock
|
||||
else ## simulators
|
||||
OUTPUT = $(OUTDIR)/sudoku.rock
|
||||
endif
|
||||
|
||||
all: $(OUTPUT)
|
||||
|
||||
ifndef SIMVER
|
||||
$(OBJDIR)/sudoku.elf: $(OBJS) $(LINKFILE) $(BITMAPLIBS)
|
||||
@echo "LD "`basename $@`
|
||||
@$(CC) $(GCCOPTS) -O -nostdlib -o $@ $(OBJS) -L$(BUILDDIR) -lplugin -lgcc \
|
||||
$(LINKBITMAPS) -T$(LINKFILE) -Wl,-Map,$(OBJDIR)/sudoku.map
|
||||
|
||||
$(OUTPUT): $(OBJDIR)/sudoku.elf
|
||||
@echo "OBJCOPY "`basename $@`
|
||||
@$(OC) -O binary $< $@
|
||||
else
|
||||
|
||||
ifeq ($(SIMVER), x11)
|
||||
###################################################
|
||||
# This is the X11 simulator version
|
||||
|
||||
$(OUTPUT): $(OBJS)
|
||||
@echo "LD $<"
|
||||
@$(CC) $(CFLAGS) -shared $(OBJS) -L$(BUILDDIR) -lplugin $(LINKBITMAPS) -o $@
|
||||
ifeq ($(findstring CYGWIN,$(UNAME)),CYGWIN)
|
||||
# 'x' must be kept or you'll have "Win32 error 5"
|
||||
# $ fgrep 5 /usr/include/w32api/winerror.h | head -1
|
||||
# #define ERROR_ACCESS_DENIED 5L
|
||||
else
|
||||
@chmod -x $@
|
||||
endif
|
||||
|
||||
else # end of x11-simulator
|
||||
ifeq ($(SIMVER), sdl)
|
||||
###################################################
|
||||
# This is the SDL simulator version
|
||||
|
||||
$(OUTPUT): $(OBJS)
|
||||
@echo "LD $<"
|
||||
@$(CC) $(CFLAGS) -shared $(OBJS) -L$(BUILDDIR) -lplugin $(LINKBITMAPS) -o $@
|
||||
ifeq ($(findstring CYGWIN,$(UNAME)),CYGWIN)
|
||||
# 'x' must be kept or you'll have "Win32 error 5"
|
||||
# $ fgrep 5 /usr/include/w32api/winerror.h | head -1
|
||||
# #define ERROR_ACCESS_DENIED 5L
|
||||
else
|
||||
@chmod -x $@
|
||||
endif
|
||||
|
||||
else # end of sdl-simulator
|
||||
###################################################
|
||||
# This is the win32 simulator version
|
||||
DLLTOOLFLAGS = --export-all
|
||||
DLLWRAPFLAGS = -s --entry _DllMain@12 --target=i386-mingw32 -mno-cygwin
|
||||
|
||||
$(OUTPUT): $(OBJS)
|
||||
@echo "DLL "`basename $@`
|
||||
@$(DLLTOOL) $(DLLTOOLFLAGS) -z $(OBJDIR)/$*.def $(OBJS)
|
||||
@$(DLLWRAP) $(DLLWRAPFLAGS) --def $(OBJDIR)/$*.def $(OBJS) \
|
||||
$(BUILDDIR)/libplugin.a $(BITMAPLIBS) -o $@
|
||||
ifeq ($(findstring CYGWIN,$(UNAME)),CYGWIN)
|
||||
# 'x' must be kept or you'll have "Win32 error 5"
|
||||
# $ fgrep 5 /usr/include/w32api/winerror.h | head -1
|
||||
# #define ERROR_ACCESS_DENIED 5L
|
||||
else
|
||||
@chmod -x $@
|
||||
endif
|
||||
endif # end of win32-simulator
|
||||
endif
|
||||
endif # end of simulator section
|
||||
|
||||
|
||||
include $(TOOLSDIR)/make.inc
|
||||
|
||||
# MEMORYSIZE should be passed on to this makefile with the chosen memory size
|
||||
# given in number of MB
|
||||
$(LINKFILE): $(LDS)
|
||||
@echo "build "`basename $@`
|
||||
@cat $< | $(CC) -DMEMORYSIZE=$(MEMORYSIZE) $(INCLUDES) $(TARGET) \
|
||||
$(DEFINES) -E -P - >$@
|
||||
|
||||
clean:
|
||||
@echo "cleaning sudoku"
|
||||
@rm -rf $(OBJDIR)/sudoku
|
||||
@rm -f $(OBJDIR)/sudoku.* $(DEPFILE)
|
||||
|
||||
-include $(DEPFILE)
|
3
apps/plugins/sudoku/SOURCES
Normal file
3
apps/plugins/sudoku/SOURCES
Normal file
|
@ -0,0 +1,3 @@
|
|||
sudoku.c
|
||||
generator.c
|
||||
templates.c
|
1097
apps/plugins/sudoku/generator.c
Normal file
1097
apps/plugins/sudoku/generator.c
Normal file
File diff suppressed because it is too large
Load diff
1
apps/plugins/sudoku/generator.h
Normal file
1
apps/plugins/sudoku/generator.h
Normal file
|
@ -0,0 +1 @@
|
|||
bool sudoku_generate_board(struct sudoku_state_t* state, char** difficulty);
|
|
@ -60,69 +60,12 @@ Example ".ss" file, and one with a saved state:
|
|||
|
||||
#ifdef HAVE_LCD_BITMAP
|
||||
|
||||
#include "sudoku.h"
|
||||
#include "generator.h"
|
||||
|
||||
PLUGIN_HEADER
|
||||
|
||||
#define STATE_FILE PLUGIN_DIR "/sudoku.state"
|
||||
#define GAMES_FILE PLUGIN_DIR "/sudoku.levels"
|
||||
|
||||
/* variable button definitions */
|
||||
#if CONFIG_KEYPAD == RECORDER_PAD
|
||||
#define SUDOKU_BUTTON_QUIT BUTTON_OFF
|
||||
#define SUDOKU_BUTTON_UP BUTTON_UP
|
||||
#define SUDOKU_BUTTON_DOWN BUTTON_DOWN
|
||||
#define SUDOKU_BUTTON_TOGGLE BUTTON_PLAY
|
||||
#define SUDOKU_BUTTON_MENU BUTTON_F1
|
||||
#define SUDOKU_BUTTON_POSSIBLE BUTTON_F2
|
||||
|
||||
#elif CONFIG_KEYPAD == ONDIO_PAD
|
||||
#define SUDOKU_BUTTON_QUIT BUTTON_OFF
|
||||
#define SUDOKU_BUTTON_UP BUTTON_UP
|
||||
#define SUDOKU_BUTTON_DOWN BUTTON_DOWN
|
||||
#define SUDOKU_BUTTON_ALTTOGGLE (BUTTON_MENU | BUTTON_DOWN)
|
||||
#define SUDOKU_BUTTON_TOGGLE_PRE BUTTON_MENU
|
||||
#define SUDOKU_BUTTON_TOGGLE (BUTTON_MENU | BUTTON_REL)
|
||||
#define SUDOKU_BUTTON_MENU_PRE BUTTON_MENU
|
||||
#define SUDOKU_BUTTON_MENU (BUTTON_MENU | BUTTON_REPEAT)
|
||||
#define SUDOKU_BUTTON_POSSIBLE (BUTTON_MENU | BUTTON_LEFT)
|
||||
|
||||
#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
|
||||
(CONFIG_KEYPAD == IRIVER_H300_PAD)
|
||||
#define SUDOKU_BUTTON_QUIT BUTTON_OFF
|
||||
#define SUDOKU_BUTTON_UP BUTTON_UP
|
||||
#define SUDOKU_BUTTON_DOWN BUTTON_DOWN
|
||||
#define SUDOKU_BUTTON_ALTTOGGLE BUTTON_ON
|
||||
#define SUDOKU_BUTTON_TOGGLE BUTTON_SELECT
|
||||
#define SUDOKU_BUTTON_MENU BUTTON_MODE
|
||||
#define SUDOKU_BUTTON_POSSIBLE BUTTON_REC
|
||||
|
||||
#elif (CONFIG_KEYPAD == IPOD_4G_PAD) || \
|
||||
(CONFIG_KEYPAD == IPOD_3G_PAD)
|
||||
#define SUDOKU_BUTTON_QUIT (BUTTON_SELECT | BUTTON_MENU)
|
||||
#define SUDOKU_BUTTON_UP BUTTON_SCROLL_BACK
|
||||
#define SUDOKU_BUTTON_DOWN BUTTON_SCROLL_FWD
|
||||
#define SUDOKU_BUTTON_TOGGLE BUTTON_SELECT
|
||||
#define SUDOKU_BUTTON_MENU BUTTON_MENU
|
||||
#define SUDOKU_BUTTON_POSSIBLE (BUTTON_SELECT | BUTTON_LEFT)
|
||||
|
||||
#elif (CONFIG_KEYPAD == IAUDIO_X5_PAD)
|
||||
#define SUDOKU_BUTTON_QUIT BUTTON_POWER
|
||||
#define SUDOKU_BUTTON_UP BUTTON_UP
|
||||
#define SUDOKU_BUTTON_DOWN BUTTON_DOWN
|
||||
#define SUDOKU_BUTTON_TOGGLE BUTTON_SELECT
|
||||
#define SUDOKU_BUTTON_MENU BUTTON_PLAY
|
||||
#define SUDOKU_BUTTON_POSSIBLE BUTTON_REC
|
||||
|
||||
#elif (CONFIG_KEYPAD == GIGABEAT_PAD)
|
||||
#define SUDOKU_BUTTON_QUIT BUTTON_A
|
||||
#define SUDOKU_BUTTON_UP BUTTON_UP
|
||||
#define SUDOKU_BUTTON_DOWN BUTTON_DOWN
|
||||
#define SUDOKU_BUTTON_TOGGLE BUTTON_SELECT
|
||||
#define SUDOKU_BUTTON_MENU BUTTON_MENU
|
||||
#define SUDOKU_BUTTON_POSSIBLE BUTTON_POWER
|
||||
|
||||
#elif
|
||||
#error SUDOKU: Unsupported keypad
|
||||
#endif
|
||||
struct plugin_api* rb;
|
||||
|
||||
/* The bitmaps */
|
||||
extern const fb_data sudoku_normal[];
|
||||
|
@ -204,23 +147,6 @@ static unsigned char cellypos[9]={ 2, 19, 36, 54, 71, 88, 106, 123, 140 };
|
|||
#error SUDOKU: Unsupported LCD size
|
||||
#endif
|
||||
|
||||
/* here is a global api struct pointer. while not strictly necessary,
|
||||
it's nice not to have to pass the api pointer in all function calls
|
||||
in the plugin */
|
||||
static struct plugin_api* rb;
|
||||
|
||||
struct sudoku_state_t {
|
||||
char filename[MAX_PATH]; /* Filename */
|
||||
char startboard[9][9]; /* The initial state of the game */
|
||||
char currentboard[9][9]; /* The current state of the game */
|
||||
char savedboard[9][9]; /* Cached copy of saved state */
|
||||
int x,y; /* Cursor position */
|
||||
int editmode; /* We are editing the start board */
|
||||
#ifdef SUDOKU_BUTTON_POSSIBLE
|
||||
short possiblevals[9][9]; /* possible values a cell could be, user sets them */
|
||||
#endif
|
||||
};
|
||||
|
||||
/****** Solver routine by Tom Shackell <shackell@cs.york.ac.uk>
|
||||
|
||||
Downloaded from:
|
||||
|
@ -541,7 +467,6 @@ bool load_sudoku(struct sudoku_state_t* state, char* filename)
|
|||
|
||||
fd=rb->open(filename, O_RDONLY);
|
||||
if (fd < 0) {
|
||||
rb->splash(HZ*2, true, "Can not open");
|
||||
LOGF("Invalid sudoku file: %s\n",filename);
|
||||
return(false);
|
||||
}
|
||||
|
@ -617,8 +542,8 @@ bool save_sudoku(struct sudoku_state_t* state)
|
|||
int fd;
|
||||
int r,c;
|
||||
int i;
|
||||
char line[16];
|
||||
char sep[16];
|
||||
char line[13];
|
||||
char sep[13];
|
||||
|
||||
rb->memcpy(line,"...|...|...\r\n",13);
|
||||
rb->memcpy(sep,"-----------\r\n",13);
|
||||
|
@ -644,9 +569,9 @@ bool save_sudoku(struct sudoku_state_t* state)
|
|||
i++;
|
||||
}
|
||||
}
|
||||
rb->write(fd,line,sizeof(line)-1);
|
||||
rb->write(fd,line,sizeof(line));
|
||||
if ((r==2) || (r==5)) {
|
||||
rb->write(fd,sep,sizeof(sep)-1);
|
||||
rb->write(fd,sep,sizeof(sep));
|
||||
}
|
||||
}
|
||||
/* Add a blank line at end */
|
||||
|
@ -899,6 +824,23 @@ bool check_status(struct sudoku_state_t* state)
|
|||
return false;
|
||||
}
|
||||
|
||||
void sudoku_generate(struct sudoku_state_t* state)
|
||||
{
|
||||
char* difficulty;
|
||||
char str[80];
|
||||
|
||||
clear_state(state);
|
||||
display_board(state);
|
||||
rb->splash(0, true, "Generating...");
|
||||
|
||||
sudoku_generate_board(state,&difficulty);
|
||||
|
||||
rb->snprintf(str,sizeof(str),"Difficulty: %s",difficulty);
|
||||
display_board(state);
|
||||
rb->splash(3*HZ, true, str);
|
||||
rb->strncpy(state->filename,GAME_FILE,MAX_PATH);
|
||||
}
|
||||
|
||||
int sudoku_menu_cb(int key, int m)
|
||||
{
|
||||
(void)m;
|
||||
|
@ -932,7 +874,9 @@ bool sudoku_menu(struct sudoku_state_t* state)
|
|||
{ "Reload", NULL },
|
||||
{ "Clear", NULL },
|
||||
{ "Solve", NULL },
|
||||
{ "Generate", NULL },
|
||||
{ "New", NULL },
|
||||
{ "Quit", NULL },
|
||||
};
|
||||
|
||||
m = rb->menu_init(items, sizeof(items) / sizeof(*items),
|
||||
|
@ -957,11 +901,21 @@ bool sudoku_menu(struct sudoku_state_t* state)
|
|||
sudoku_solve(state);
|
||||
break;
|
||||
|
||||
case 4: /* Create a new game manually */
|
||||
case 4: /* Generate Game */
|
||||
sudoku_generate(state);
|
||||
break;
|
||||
|
||||
case 5: /* Create a new game manually */
|
||||
clear_state(state);
|
||||
state->editmode=1;
|
||||
break;
|
||||
|
||||
case 6: /* Quit */
|
||||
save_sudoku(state);
|
||||
rb->menu_exit(m);
|
||||
return true;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@ -1010,7 +964,11 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
|
|||
clear_state(&state);
|
||||
|
||||
if (parameter==NULL) {
|
||||
state.editmode=1;
|
||||
/* We have been started as a plugin - try default sudoku.ss */
|
||||
if (!load_sudoku(&state,GAME_FILE)) {
|
||||
/* No previous game saved, generate one */
|
||||
sudoku_generate(&state);
|
||||
}
|
||||
} else {
|
||||
if (!load_sudoku(&state,(char*)parameter)) {
|
||||
rb->splash(HZ*2, true, "Load error");
|
104
apps/plugins/sudoku/sudoku.h
Normal file
104
apps/plugins/sudoku/sudoku.h
Normal file
|
@ -0,0 +1,104 @@
|
|||
/***************************************************************************
|
||||
* __________ __ ___.
|
||||
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||
* \/ \/ \/ \/ \/
|
||||
* $Id$
|
||||
*
|
||||
* Copyright (C) 2005 Dave Chapman
|
||||
*
|
||||
* All files in this archive are subject to the GNU General Public License.
|
||||
* See the file COPYING in the source tree root for full license agreement.
|
||||
*
|
||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||
* KIND, either express or implied.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef _SUDOKU_H
|
||||
#define _SUDOKU_H
|
||||
|
||||
#include "plugin.h"
|
||||
|
||||
/* here is a global api struct pointer. while not strictly necessary,
|
||||
it's nice not to have to pass the api pointer in all function calls
|
||||
in the plugin */
|
||||
|
||||
#define STATE_FILE PLUGIN_DIR "/sudoku.state"
|
||||
#define GAME_FILE PLUGIN_DIR "/sudoku.ss"
|
||||
|
||||
/* variable button definitions */
|
||||
#if CONFIG_KEYPAD == RECORDER_PAD
|
||||
#define SUDOKU_BUTTON_QUIT BUTTON_OFF
|
||||
#define SUDOKU_BUTTON_UP BUTTON_UP
|
||||
#define SUDOKU_BUTTON_DOWN BUTTON_DOWN
|
||||
#define SUDOKU_BUTTON_TOGGLE BUTTON_PLAY
|
||||
#define SUDOKU_BUTTON_MENU BUTTON_F1
|
||||
#define SUDOKU_BUTTON_POSSIBLE BUTTON_F2
|
||||
|
||||
#elif CONFIG_KEYPAD == ONDIO_PAD
|
||||
#define SUDOKU_BUTTON_QUIT BUTTON_OFF
|
||||
#define SUDOKU_BUTTON_UP BUTTON_UP
|
||||
#define SUDOKU_BUTTON_DOWN BUTTON_DOWN
|
||||
#define SUDOKU_BUTTON_ALTTOGGLE (BUTTON_MENU | BUTTON_DOWN)
|
||||
#define SUDOKU_BUTTON_TOGGLE_PRE BUTTON_MENU
|
||||
#define SUDOKU_BUTTON_TOGGLE (BUTTON_MENU | BUTTON_REL)
|
||||
#define SUDOKU_BUTTON_MENU_PRE BUTTON_MENU
|
||||
#define SUDOKU_BUTTON_MENU (BUTTON_MENU | BUTTON_REPEAT)
|
||||
#define SUDOKU_BUTTON_POSSIBLE (BUTTON_MENU | BUTTON_LEFT)
|
||||
|
||||
#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
|
||||
(CONFIG_KEYPAD == IRIVER_H300_PAD)
|
||||
#define SUDOKU_BUTTON_QUIT BUTTON_OFF
|
||||
#define SUDOKU_BUTTON_UP BUTTON_UP
|
||||
#define SUDOKU_BUTTON_DOWN BUTTON_DOWN
|
||||
#define SUDOKU_BUTTON_ALTTOGGLE BUTTON_ON
|
||||
#define SUDOKU_BUTTON_TOGGLE BUTTON_SELECT
|
||||
#define SUDOKU_BUTTON_MENU BUTTON_MODE
|
||||
#define SUDOKU_BUTTON_POSSIBLE BUTTON_REC
|
||||
|
||||
#elif (CONFIG_KEYPAD == IPOD_4G_PAD) || \
|
||||
(CONFIG_KEYPAD == IPOD_3G_PAD)
|
||||
#define SUDOKU_BUTTON_QUIT (BUTTON_SELECT | BUTTON_MENU)
|
||||
#define SUDOKU_BUTTON_UP BUTTON_SCROLL_BACK
|
||||
#define SUDOKU_BUTTON_DOWN BUTTON_SCROLL_FWD
|
||||
#define SUDOKU_BUTTON_TOGGLE BUTTON_SELECT
|
||||
#define SUDOKU_BUTTON_MENU BUTTON_MENU
|
||||
#define SUDOKU_BUTTON_POSSIBLE (BUTTON_SELECT | BUTTON_LEFT)
|
||||
|
||||
#elif (CONFIG_KEYPAD == IAUDIO_X5_PAD)
|
||||
#define SUDOKU_BUTTON_QUIT BUTTON_POWER
|
||||
#define SUDOKU_BUTTON_UP BUTTON_UP
|
||||
#define SUDOKU_BUTTON_DOWN BUTTON_DOWN
|
||||
#define SUDOKU_BUTTON_TOGGLE BUTTON_SELECT
|
||||
#define SUDOKU_BUTTON_MENU BUTTON_PLAY
|
||||
#define SUDOKU_BUTTON_POSSIBLE BUTTON_REC
|
||||
|
||||
#elif (CONFIG_KEYPAD == GIGABEAT_PAD)
|
||||
#define SUDOKU_BUTTON_QUIT BUTTON_A
|
||||
#define SUDOKU_BUTTON_UP BUTTON_UP
|
||||
#define SUDOKU_BUTTON_DOWN BUTTON_DOWN
|
||||
#define SUDOKU_BUTTON_TOGGLE BUTTON_SELECT
|
||||
#define SUDOKU_BUTTON_MENU BUTTON_MENU
|
||||
#define SUDOKU_BUTTON_POSSIBLE BUTTON_POWER
|
||||
|
||||
#elif
|
||||
#error SUDOKU: Unsupported keypad
|
||||
#endif
|
||||
|
||||
struct sudoku_state_t {
|
||||
char filename[MAX_PATH]; /* Filename */
|
||||
char startboard[9][9]; /* The initial state of the game */
|
||||
char currentboard[9][9]; /* The current state of the game */
|
||||
char savedboard[9][9]; /* Cached copy of saved state */
|
||||
int x,y; /* Cursor position */
|
||||
int editmode; /* We are editing the start board */
|
||||
#ifdef SUDOKU_BUTTON_POSSIBLE
|
||||
short possiblevals[9][9]; /* possible values a cell could be, user sets them */
|
||||
#endif
|
||||
};
|
||||
|
||||
|
||||
#endif
|
2877
apps/plugins/sudoku/templates.c
Normal file
2877
apps/plugins/sudoku/templates.c
Normal file
File diff suppressed because it is too large
Load diff
8
apps/plugins/sudoku/templates.h
Normal file
8
apps/plugins/sudoku/templates.h
Normal file
|
@ -0,0 +1,8 @@
|
|||
|
||||
#ifndef _TEMPLATES_H
|
||||
#define _TEMPLATES_H
|
||||
|
||||
#define NUM_TEMPLATES 261
|
||||
extern const unsigned short templates[NUM_TEMPLATES][9];
|
||||
|
||||
#endif
|
Loading…
Add table
Add a link
Reference in a new issue