summaryrefslogtreecommitdiff
path: root/src/game.c
blob: 39dcec70d22cda63534a0f6a68a097dc016a0efa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include "game.h"
#include "card.h"
#include <stdlib.h>
#include <stdbool.h>
#include <time.h>
#include <unistd.h>
#include <assert.h>
#include <curses.h>

void init_mainstack(card* stack, const uint32_t size)
{
	// assign card values to main stack
	for(uint32_t i=0, val=MIN_CARD; i<size; i++, val++)
		stack[i] = val;

	// shuffle stack
	for(uint32_t i=0; i<3*size; i++)
	{
		uint32_t x = rand() % size;
		uint32_t y = rand() % size;
		card tmp = stack[x];
		stack[x] = stack[y];
		stack[y] = tmp;
	}
}

void start_game(void)
{
	bool running = true;
	int cards = MAX_CARD - MIN_CARD + 1;
	card mainstack[cards];
	enum gamestate state = STATE_DEALCARDS;

	srand(time(0));

	init_mainstack(mainstack, cards);

	// main game loop
	while(running)
	{
		switch(state)
		{
			case STATE_DEALCARDS: // deal cards to players (on host)
				// dealcards(mainstack);
				state = STATE_SELECTCARD;
				break;
			case STATE_WAIT_CARDS: // wait on client until host has dealt cards
				break;
			case STATE_SELECTCARD: // player has to select own card, if done, set state to STATE_WAIT_OPPONENTCARDS
				break;
			case STATE_WAIT_OPPONENTCARDS: // wait until all opponents have selected their open card. Then check if we have the lowest open card. If so, set state to STATE_SELECTSTACK, otherwise to STATE_WAIT_OPPONENTSTACK
				break;
			case STATE_WAIT_OPPONENTSTACK: // wait until opponent has selected a stack
				break;
			case STATE_SELECTSTACK: // player has to select a stack and update it (add card/take whole stack). If it was the last player's turn, set state to STATE_SELECTCARD, otherwise to STATE_WAIT_OPPONENTSTACK
				break;
			default:
				assert(false); // should never happen
		}
	}
}