mirror of
https://github.com/jongtao/hp-minehunt
synced 2024-11-16 07:47:21 +01:00
initial
This commit is contained in:
parent
5a14b21ad1
commit
4a3af551c9
4 changed files with 179 additions and 0 deletions
9
Makefile
Normal file
9
Makefile
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
CC=gcc
|
||||||
|
LIBS=-lncurses
|
||||||
|
CFLAGS=$(LIBS) -Wall -ansi #-g
|
||||||
|
|
||||||
|
all:
|
||||||
|
gcc $(CFLAGS) main.c -o minehunt
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -rf *.o minehunt
|
|
@ -2,3 +2,9 @@ hp-minehunt
|
||||||
===========
|
===========
|
||||||
|
|
||||||
A "port" of the minehunt easter egg from the HP-48 series calculators
|
A "port" of the minehunt easter egg from the HP-48 series calculators
|
||||||
|
|
||||||
|
The build was compiled on a 64-bit Debian machine. Run with ncurses library
|
||||||
|
installed
|
||||||
|
|
||||||
|
You can build the game yourself from the makefile. Make sure you have the
|
||||||
|
ncurses development library installed to do this.
|
||||||
|
|
BIN
build/minehunt
Executable file
BIN
build/minehunt
Executable file
Binary file not shown.
164
main.c
Normal file
164
main.c
Normal file
|
@ -0,0 +1,164 @@
|
||||||
|
/* MINEHUNT
|
||||||
|
A port of the famous easter egg on the HP-48 Series calculators.
|
||||||
|
|
||||||
|
Jonathan Tao.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "curses.h"
|
||||||
|
|
||||||
|
#define CHK(x) (mines[x/32]&(1<<(x%32)))
|
||||||
|
|
||||||
|
const char* title="MINEHUNT";
|
||||||
|
|
||||||
|
int main(int argc, char** argv)
|
||||||
|
{
|
||||||
|
short i, j, near, score, posx, posy;
|
||||||
|
char key, state;
|
||||||
|
uint32_t mines[4], seed;
|
||||||
|
memset(mines,0,32);
|
||||||
|
|
||||||
|
posx = posy = 0;
|
||||||
|
near = state = 0;
|
||||||
|
key = 0;
|
||||||
|
score = 1;
|
||||||
|
|
||||||
|
/*Generate*/
|
||||||
|
if(argc>1)
|
||||||
|
{
|
||||||
|
seed = atoi(argv[1]);
|
||||||
|
srand(seed);
|
||||||
|
printf("Seed:\t%d", seed);
|
||||||
|
} /*if a seed is provided*/
|
||||||
|
else
|
||||||
|
{
|
||||||
|
srand((unsigned)(long)&seed);
|
||||||
|
printf("Seed:\t%d", (unsigned)(long)&seed);
|
||||||
|
} /*else create seed from seed via "random" memory address*/
|
||||||
|
|
||||||
|
for(i=0;i<20;i++)
|
||||||
|
{
|
||||||
|
do {j=rand()&0X7F;} while(j==0 || j==127 || CHK(j));
|
||||||
|
mines[j/32]|=(1<<(j%32));
|
||||||
|
} /* 20 mines to place*/
|
||||||
|
|
||||||
|
/* Init ncurses*/
|
||||||
|
initscr();
|
||||||
|
noecho();
|
||||||
|
curs_set(0);
|
||||||
|
|
||||||
|
mvaddch(0,0,ACS_LEQUAL);
|
||||||
|
for(i=0;i<8;i++)
|
||||||
|
mvaddch(i+2,0,*(title+i));
|
||||||
|
mvaddch(10,0,164|A_ALTCHARSET);
|
||||||
|
|
||||||
|
mvaddch(0,21,ACS_GEQUAL);
|
||||||
|
for(i=0;i<8;i++)
|
||||||
|
mvaddch(i+2,21,*(title+i));
|
||||||
|
mvaddch(10,21,164|A_ALTCHARSET);
|
||||||
|
|
||||||
|
mvaddch(1,2,ACS_ULCORNER); mvaddch(1,19,ACS_URCORNER);
|
||||||
|
mvaddch(10,2,ACS_LLCORNER); mvaddch(10,19,ACS_LRCORNER);
|
||||||
|
mvhline(1,3,ACS_HLINE,16);
|
||||||
|
mvhline(10,3,ACS_HLINE,16);
|
||||||
|
mvvline(2,2,ACS_VLINE,8);
|
||||||
|
mvvline(2,19,ACS_VLINE,8);
|
||||||
|
for(i=0;i<8;i++)
|
||||||
|
mvhline(i+2,3,' '|A_STANDOUT,16);
|
||||||
|
|
||||||
|
mvaddch(9,18,ACS_CKBOARD);
|
||||||
|
mvprintw(0,3,"Near %d",near);
|
||||||
|
mvprintw(0,11,"Score %d",score);
|
||||||
|
mvaddch(2,3,ACS_DIAMOND);
|
||||||
|
refresh();
|
||||||
|
|
||||||
|
while(state==0)
|
||||||
|
{
|
||||||
|
key=getch();
|
||||||
|
mvaddch(posy+2,posx+3,'.');
|
||||||
|
|
||||||
|
repoll:
|
||||||
|
switch(key)
|
||||||
|
{
|
||||||
|
case 'h': if(posx!=0) posx--; break;
|
||||||
|
case 'j': if(posy!=7) posy++; break;
|
||||||
|
case 'k': if(posy!=0) posy--; break;
|
||||||
|
case 'l': if(posx!=15) posx++; break;
|
||||||
|
case 'y': if(posx!=0 && posy!=0) {posx--; posy--;} break;
|
||||||
|
case 'u': if(posx!=15 && posy!=0) {posx++; posy--;} break;
|
||||||
|
case 'b': if(posx!=0 && posy!=7) {posx--; posy++;} break;
|
||||||
|
case 'n': if(posx!=15 && posy!=7) {posx++; posy++;} break;
|
||||||
|
case 27: state=1; break;
|
||||||
|
default:
|
||||||
|
mvaddch(posy+2,posx+3,ACS_DIAMOND);
|
||||||
|
key = getch();
|
||||||
|
goto repoll;
|
||||||
|
}; /*switch key*/
|
||||||
|
|
||||||
|
mvaddch(posy+2,posx+3,ACS_DIAMOND);
|
||||||
|
score++;
|
||||||
|
|
||||||
|
j = posy*16+posx;
|
||||||
|
if(state || mines[j/32]&(1<<(j%32)))
|
||||||
|
{
|
||||||
|
score--;
|
||||||
|
for(i=0;i<128;i++)
|
||||||
|
if(CHK(i))
|
||||||
|
mvaddch((i/16)+2,(i%16)+3,164|A_ALTCHARSET);
|
||||||
|
mvprintw(0,11,"Score %d",score);
|
||||||
|
mvprintw(0,3,"YOU BLEW UP!!");
|
||||||
|
mvaddch(posy+2,posx+3,'X');
|
||||||
|
state=1;
|
||||||
|
getch();
|
||||||
|
} /*if lose*/
|
||||||
|
else
|
||||||
|
if(posx==15 && posy==7)
|
||||||
|
{
|
||||||
|
for(i=0;i<128;i++)
|
||||||
|
if(CHK(i))
|
||||||
|
mvaddch((i/16)+2,(i%16)+3,164|A_ALTCHARSET);
|
||||||
|
mvprintw(0,11,"Score %d",score);
|
||||||
|
mvprintw(0,3,"YOU MADE IT!!");
|
||||||
|
mvaddch(posy+2,posx+3,'@');
|
||||||
|
state=1;
|
||||||
|
getch();
|
||||||
|
} /*if win*/
|
||||||
|
else
|
||||||
|
{
|
||||||
|
near=0;
|
||||||
|
j=(posy-1)*16+(posx-1); /*Upper Left*/
|
||||||
|
if(posy!=0 && posx!=0 && CHK(j)) near++;
|
||||||
|
|
||||||
|
j=(posy-1)*16+posx; /*Up*/
|
||||||
|
if(posy!=0 && CHK(j)) near++;
|
||||||
|
|
||||||
|
j=(posy-1)*16+(posx+1); /*Upper Right*/
|
||||||
|
if(posy!=0 && posx!=15 && CHK(j)) near++;
|
||||||
|
|
||||||
|
j=posy*16+(posx+1); /*Right*/
|
||||||
|
if(posx!=15 && CHK(j)) near++;
|
||||||
|
|
||||||
|
j=(posy+1)*16+(posx+1); /*Lower Right*/
|
||||||
|
if(posy!=7 && posx!=15 && CHK(j)) near++;
|
||||||
|
|
||||||
|
j=(posy+1)*16+posx; /*Down*/
|
||||||
|
if(posy!=7 && CHK(j)) near++;
|
||||||
|
|
||||||
|
j=(posy+1)*16+(posx-1); /*Lower Left*/
|
||||||
|
if(posy!=7 && posx!=0 && CHK(j)) near++;
|
||||||
|
|
||||||
|
j=posy*16+(posx-1); /*Left*/
|
||||||
|
if(posx!=0 && CHK(j)) near++;
|
||||||
|
|
||||||
|
mvprintw(0,3,"Near %d",near);
|
||||||
|
mvprintw(0,11,"Score %d",score);
|
||||||
|
} /*else continue play*/
|
||||||
|
} /*while continue*/
|
||||||
|
|
||||||
|
endwin();
|
||||||
|
printf("\nScore:\t%d\n",score);
|
||||||
|
return 0;
|
||||||
|
} /* main() */
|
Loading…
Reference in a new issue