1
0
Fork 0
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:
Dave Chapman 2006-04-01 18:38:34 +00:00
parent 9fad701934
commit 0f619c65ba
10 changed files with 4254 additions and 89 deletions

View file

@ -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

View file

@ -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 */

View 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)

View file

@ -0,0 +1,3 @@
sudoku.c
generator.c
templates.c

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1 @@
bool sudoku_generate_board(struct sudoku_state_t* state, char** difficulty);

View file

@ -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");

View 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

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,8 @@
#ifndef _TEMPLATES_H
#define _TEMPLATES_H
#define NUM_TEMPLATES 261
extern const unsigned short templates[NUM_TEMPLATES][9];
#endif