You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tqt3/examples/tetrix/tpiece.cpp

181 lines
5.7 KiB

/****************************************************************************
**
** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
**
** This file is part of an example program for TQt. This example
** program may be used, distributed and modified without limitation.
**
*****************************************************************************/
#include "tpiece.h"
#include "qstring.h"
#include <stdlib.h>
void TetrixPiece::rotateLeft()
{
if ( pieceType == 5 ) // don't rotate square piece type
return;
int tmp;
for (int i = 0 ; i < 4 ; i++) {
tmp = getXCoord(i);
setXCoord(i,getYCoord(i));
setYCoord(i,-tmp);
}
}
void TetrixPiece::rotateRight()
{
if ( pieceType == 5 ) // don't rotate square piece type
return;
int tmp;
for (int i = 0 ; i < 4 ; i++) {
tmp = getXCoord(i);
setXCoord(i,-getYCoord(i));
setYCoord(i,tmp);
}
}
int TetrixPiece::getMinX()
{
int tmp = coordinates[0][0];
for(int i = 1 ; i < 4 ; i++)
if (tmp > coordinates[i][0])
tmp = coordinates[i][0];
return tmp;
}
int TetrixPiece::getMaxX()
{
int tmp = coordinates[0][0];
for(int i = 1 ; i < 4 ; i++)
if (tmp < coordinates[i][0])
tmp = coordinates[i][0];
return tmp;
}
int TetrixPiece::getMinY()
{
int tmp = coordinates[0][1];
for(int i = 1 ; i < 4 ; i++)
if (tmp > coordinates[i][1])
tmp = coordinates[i][1];
return tmp;
}
int TetrixPiece::getMaxY()
{
int tmp = coordinates[0][1];
for(int i = 1 ; i < 4 ; i++)
if (tmp < coordinates[i][1])
tmp = coordinates[i][1];
return tmp;
}
void TetrixPiece::initialize(int type)
{
static int pieceTypes[7][4][2] = {{{ 0,-1},
{ 0, 0},
{-1, 0},
{-1, 1}},
{{ 0,-1},
{ 0, 0},
{ 1, 0},
{ 1, 1}},
{{ 0,-1},
{ 0, 0},
{ 0, 1},
{ 0, 2}},
{{-1, 0},
{ 0, 0},
{ 1, 0},
{ 0, 1}},
{{ 0, 0},
{ 1, 0},
{ 0, 1},
{ 1, 1}},
{{-1,-1},
{ 0,-1},
{ 0, 0},
{ 0, 1}},
{{ 1,-1},
{ 0,-1},
{ 0, 0},
{ 0, 1}}};
if (type < 1 || type > 7)
type = 1;
pieceType = type;
for(int i = 0 ; i < 4 ; i++) {
coordinates[i][0] = pieceTypes[type - 1][i][0];
coordinates[i][1] = pieceTypes[type - 1][i][1];
}
}
/*
* Sigh, oh beautiful nostalgia! This random algorithm has
* been taken from the book "Adventures with your pocket calculator"
* and I used it in my first implemented and machine-
* run program of any size to speak of. Imagine how hungry I
* was after having programmed BASIC on paper for
* half a year?!!?!?!?!?!? The first program I typed in was a
* slot machine game and was made in BASIC on a SHARP
* PC-1211 with 1,47 KB RAM (one point four seven kilobytes) and
* a one-line LCD-display (I think it had 32 characters) in the
* year of our lord 1981. The man I had bought the machine from worked
* as a COBOL programmer and was amazed and impressed
* when I demonstrated the program 2 days after I had
* bought the machine, quote: "Gees, I have been looking so long
* for a "random" command in that BASIC, what is it called?"
* Oh, how I still get a thrill out of the thought of the
* explanation I then gave him...
*/
/*
* Sukk, aa vakre nostalgi! Denne random algoritmen er
* tatt fra boka "Adventures with your pocket calculator"
* og den brukte jeg i mitt foerste implementerte og maskin-
* kjoerte program av nevneverdig stoerrelse. Tror du jeg var
* noe sulten etter aa ha programmert BASIC paa papir i et
* halvt aar?!!?!?!?!?!? Programmet jeg tasta inn foerst var et
* "enarmet banditt" spill og ble laget i BASIC paa en SHARP
* PC-1211 med 1,47 KB RAM (en komma foertisju kilobyte) og
* et en-linjers LCD-display (tror det hadde 32 karakterer) i det
* herrens aar 1981. Mannen jeg kjoepte maskinen av jobbet til
* daglig med COBOL programmering og var forbloeffet og imponert
* da jeg demonstrerte programmet 2 dager etter at jeg hadde
* kjoept maskinen, sitat: "Joess, jeg som har leita saa lenge
* etter en random kommando i den BASICen, hva var det den
* het?" Aa, jeg frydes ennaa ved tanken paa forklaringen jeg
* deretter ga ham...
*/
double TetrixPiece::randomSeed = 0.33333;
void TetrixPiece::setRandomSeed(double seed)
{
TQCString buffer;
if (seed < 0)
seed = - seed;
if (seed >= 1)
seed = seed - (double) ((int) seed);
buffer.sprintf("%1.5f",(float) seed);
for (int i = 0 ; i < 5 ; i++)
if ((buffer[i + 2] - '0') % 2 == 0)
buffer[i + 2]++;
randomSeed = atof(buffer);
}
int TetrixPiece::randomValue(int maxPlusOne)
{
randomSeed = randomSeed*147;
randomSeed = randomSeed - (double) ((int) randomSeed);
return (int) (randomSeed*maxPlusOne);
}