#include"playTris.h"
#include"grid.h"
#include"getInput.h"
#include"gameHistory.h"
#include"AI.h"
#include"integerManip.h"
#include<stdlib.h>
#define VIDEOBUFFER_SIZE consoleBase*consoleHigh
#define ENTER_SCREEN_ANIM_TIME 400
#define IA_LATENCY 1000
#define CELL_DRAW_MIN_TIME 100
#define CELL_DRAW_MAX_TIME 400
#define END_GAME_WAIT 1000
#define INSTRUCTION_ANIM_TIME 200
#define IMAGE_SIZE_H 24
#define IMAGE_SIZE_B 79
#define INSTRUCTION_SIZE_H 18
#define INSTRUCTION_SIZE_B 54
enum GameMode playTrisGameMode;
BOOL playTrisEnterScrAnim;
char *playTrisPreviousScreen;
unsigned long int playTrisTotalTimeElapsed;
unsigned long int playTrisTimeLastMovement;
enum Players playTrisTurn;
const char *humanString = "Human";
const char *AIString = " AI ";
enum PlayerTypes playTrisCircleIntelligence;
enum PlayerTypes playTrisCrossIntelligence;
int playTrisCircleWinCounter;
int playTrisCrossWinCounter;
Grid playTrisGrid;
char **playTrisGridImage;
int playTrisCurrentCellDrawTime;
enum Cell playTrisLastCellSigned;
int consoleBase, consoleHigh;
char playTrisBaseImage[IMAGE_SIZE_H][IMAGE_SIZE_B+1] =
{" ****** ",
" ***** X vs. O ***** _____ _ _ ____ ****** ",
"********************** | | || \\|\\ | / \\ | ****** ",
"********************** | | ||_/| \\ | | ||-- O ****** ",
"********************** | \\_/ | \\| \\| \\_/ | O ****** ",
"********************** ",
"********************** ",
"********************** SCORES: X -> **** ",
"********************** O -> **** ",
"********************** ",
"********************** Last plays: ",
"********************** ",
"********************** ************************************************ ",
"********************** ************************************************ ",
"********************** ************************************************ ",
"********************** ************************************************ ",
"********************** ************************************************ ",
"********************** ************************************************ ",
"********************** ************************************************ ",
"********************** ************************************************ ",
"********************** ---------------------------------------------------- ",
"********************** press 'i' to show the instructions ",
"********************** press 'p' to invert signs of players ",
"********************** press 'm' to return to the main menu "};
struct GameHistory playTrisGameHistory;
char **playTrisGameHistoryImage;
BOOL showInstruction;
int instructionPosition; //da 0 (nascosto) a 100 (visibile)
char instructionImage[INSTRUCTION_SIZE_H][INSTRUCTION_SIZE_B+1] =
{"---------------------------------------------------- ",
" Instruction to play: ",
" Put your sign in a line of three. ",
" Keys: ",
" Use the numeric keypad or the normal keyboard to ",
" put your signs into the grid. Use keys like a cell:",
" q w e 7 8 9 ",
" use a s d or 4 5 6 ",
" z x c 1 2 3 ",
" Lines symbols: ",
" When a player win a match, winning line is showed ",
" in the \"Last plays\" table. The Line is represented ",
" by one of these symbols: ",
" R1 R1 R1 C1 C2 C3 D1 .. .. .. .. D2 ",
" R2 R2 R2 C1 C2 C3 .. D1 .. .. D2 .. ",
" R3 R3 R3 C1 C2 C3 .. .. D1 D2 .. .. ",
" ",
" press the 'i' key to hide the instructions "};
BOOL humanTryToSetCell(enum Cell cell);
void swapPlayers();
void playTrisInitialize(int consoleB, int consoleH, char *prevScreen, enum GameMode gameMode,
enum PlayerTypes circleIntelligence, enum PlayerTypes crossIntelligence)
{
int i;
playTrisGameMode = gameMode;
playTrisEnterScrAnim = prevScreen != 0;
if(playTrisEnterScrAnim)
{
playTrisPreviousScreen = (char*)malloc(sizeof(char)*VIDEOBUFFER_SIZE);
for(i = 0; i < VIDEOBUFFER_SIZE; i++)
playTrisPreviousScreen[i] = prevScreen[i];
}
playTrisTotalTimeElapsed = 0;
playTrisTimeLastMovement = 0;
playTrisTurn = (rand() % 2 == 0 ? circle : cross);
playTrisCircleIntelligence = circleIntelligence;
playTrisCrossIntelligence = crossIntelligence;
playTrisCircleWinCounter = 0;
playTrisCrossWinCounter = 0;
playTrisGrid = createGrid();
playTrisGridImage = (char**)malloc(sizeof(char*)*GRID_IMAGE_SIZE_H);
for(i = 0; i < GRID_IMAGE_SIZE_H; i++)
playTrisGridImage[i] = (char*)malloc(sizeof(char)*GRID_IMAGE_SIZE_B);
consoleBase = consoleB;
consoleHigh = consoleH;
playTrisGameHistory = createGameHistory();
playTrisGameHistoryImage = (char**)malloc(sizeof(char*)*GAMEHISTORY_IMAGE_SIZE_H);
for(i = 0; i < GAMEHISTORY_IMAGE_SIZE_H; i++)
playTrisGameHistoryImage[i] = (char*)malloc(sizeof(char)*GAMEHISTORY_IMAGE_SIZE_B);
showInstruction = FALSE;
instructionPosition = 0;
}
void playTrisDestroy()
{
int i;
deleteGrid(playTrisGrid);
deleteGameHistory(playTrisGameHistory);
for(i = 0; i < GRID_IMAGE_SIZE_H; i++)
free(playTrisGridImage[i]);
free(playTrisGridImage);
for(i = 0; i < GAMEHISTORY_IMAGE_SIZE_H; i++)
free(playTrisGameHistoryImage[i]);
free(playTrisGameHistoryImage);
if(playTrisEnterScrAnim)
free(playTrisPreviousScreen);
}
int playTrisUpdate(int deltaT)
{
char key = '\0';
BOOL enteringAnim;
playTrisTotalTimeElapsed += deltaT;
if(isKeyPressed())
{
key = getChar();
flushInput();
}
enteringAnim = playTrisEnterScrAnim && playTrisTotalTimeElapsed < ENTER_SCREEN_ANIM_TIME;
if(!enteringAnim) //se � finita l'introduzione iniziale
{
struct GameResult gameResult = createGameResult();
//input generali
switch(key)
{
case 'i':
case 'I':
showInstruction = !showInstruction;
break;
case 'p':
case 'P':
swapPlayers();
break;
case 'm':
case 'M':
return -1;
}
//se qualcuno ha vinto o se la griglia � comunque piena
if(won(playTrisGrid, &gameResult) || fullGrid(playTrisGrid))
{
if(playTrisTotalTimeElapsed - playTrisTimeLastMovement >= END_GAME_WAIT)
{
enum Players winner;
enum CellLine winningLine;
addGameResult(&playTrisGameHistory, gameResult); //inserisci nello storico la partita
getGameResultState(gameResult, &winner, &winningLine);
if(winner == circle)
playTrisCircleWinCounter++;
if(winner == cross)
playTrisCrossWinCounter++;
//resetta e prepara per una nuova partita
playTrisTimeLastMovement = playTrisTotalTimeElapsed;
deleteGrid(playTrisGrid);
playTrisGrid = createGrid();
}
}
else //se c'� ancora da giocare
{
BOOL correctlyMoved = FALSE;
enum Cell selectedCell;
//turno dell'uomo
if((playTrisTurn == circle && playTrisCircleIntelligence == human) ||
(playTrisTurn == cross && playTrisCrossIntelligence == human))
{
if(playerSelectedCell(key, &selectedCell))
correctlyMoved =
评论1
最新资源