school/ecen427/score.c

619 lines
15 KiB
C
Raw Permalink Normal View History

#include "score.h"
#include "xintc_l.h" // Provides handy macros for the interrupt controller.
#define SCORE_START1 20
#define SCORE_START2 360
int score_position[10] = {SCORE_START1, SCORE_START1+12, SCORE_START1+24, SCORE_START1+36, SCORE_START1+48, \
SCORE_START2, SCORE_START2+12, SCORE_START2+24, SCORE_START2+36, SCORE_START2+48};
int score_x = 20;
int score_y = 10;
int number_position[4] = {100, 116, 132, 148};
int number_x = 100;
int number_y = 10;
int tank_position[3] = {440, 480, 520};
int tank_x = 440;
int tank_y = 10;
int lives = 3;
#define GAMEOVER_X 250
int gameover_position[8] = {GAMEOVER_X, GAMEOVER_X+12, GAMEOVER_X+24, GAMEOVER_X+36, GAMEOVER_X+64, GAMEOVER_X+76, GAMEOVER_X+88, GAMEOVER_X+100};
int game_x = 250;
int game_y = 200;
int total_score = 0;
#define TANK_HEIGHT 16
#define TANK_WIDTH 32
extern int tank[TANK_HEIGHT];
void renderScore(unsigned int* framePointer) { // draw for the first time
short x=0, y=0;
int i;
for(i=0; i<10; i++){
score_x = score_position[i];
switch(i){
case 0:
for(x = 0; x < SCORE_HEIGHT; x++) {
for(y = 0; y < SCORE_WIDTH; y++){
if ((s_block[x%SCORE_HEIGHT] & (1<<(SCORE_WIDTH-1-y)))) {
framePointer[(score_y+x)*640 + score_x+y] = 0x00FFFFFF;
} else {
framePointer[(score_y+x)*640 + score_x+y] = 0x00000000;
}
}
}
break;
case 1:
for(x = 0; x < SCORE_HEIGHT; x++) {
for(y = 0; y < SCORE_WIDTH; y++){
if ((c_block[x%SCORE_HEIGHT] & (1<<(SCORE_WIDTH-1-y)))) {
framePointer[(score_y+x)*640 + score_x+y] = 0x00FFFFFF;
} else {
framePointer[(score_y+x)*640 + score_x+y] = 0x00000000;
}
}
}
break;
case 2:
for(x = 0; x < SCORE_HEIGHT; x++) {
for(y = 0; y < SCORE_WIDTH; y++){
if ((o_block[x%SCORE_HEIGHT] & (1<<(SCORE_WIDTH-1-y)))) {
framePointer[(score_y+x)*640 + score_x+y] = 0x00FFFFFF;
} else {
framePointer[(score_y+x)*640 + score_x+y] = 0x00000000;
}
}
}
break;
case 3:
for(x = 0; x < SCORE_HEIGHT; x++) {
for(y = 0; y < SCORE_WIDTH; y++){
if ((r_block[x%SCORE_HEIGHT] & (1<<(SCORE_WIDTH-1-y)))) {
framePointer[(score_y+x)*640 + score_x+y] = 0x00FFFFFF;
} else {
framePointer[(score_y+x)*640 + score_x+y] = 0x00000000;
}
}
}
break;
case 4:
for(x = 0; x < SCORE_HEIGHT; x++) {
for(y = 0; y < SCORE_WIDTH; y++){
if ((e_block[x%SCORE_HEIGHT] & (1<<(SCORE_WIDTH-1-y)))) {
framePointer[(score_y+x)*640 + score_x+y] = 0x00FFFFFF;
} else {
framePointer[(score_y+x)*640 + score_x+y] = 0x00000000;
}
}
}
break;
case 5:
for(x = 0; x < SCORE_HEIGHT; x++) {
for(y = 0; y < SCORE_WIDTH; y++){
if ((l_block[x%SCORE_HEIGHT] & (1<<(SCORE_WIDTH-1-y)))) {
framePointer[(score_y+x)*640 + score_x+y] = 0x00FFFFFF;
} else {
framePointer[(score_y+x)*640 + score_x+y] = 0x00000000;
}
}
}
break;
case 6:
for(x = 0; x < SCORE_HEIGHT; x++) {
for(y = 0; y < SCORE_WIDTH; y++){
if ((i_block[x%SCORE_HEIGHT] & (1<<(SCORE_WIDTH-1-y)))) {
framePointer[(score_y+x)*640 + score_x+y] = 0x00FFFFFF;
} else {
framePointer[(score_y+x)*640 + score_x+y] = 0x00000000;
}
}
}
break;
case 7:
for(x = 0; x < SCORE_HEIGHT; x++) {
for(y = 0; y < SCORE_WIDTH; y++){
if ((v_block[x%SCORE_HEIGHT] & (1<<(SCORE_WIDTH-1-y)))) {
framePointer[(score_y+x)*640 + score_x+y] = 0x00FFFFFF;
} else {
framePointer[(score_y+x)*640 + score_x+y] = 0x00000000;
}
}
}
break;
case 8:
for(x = 0; x < SCORE_HEIGHT; x++) {
for(y = 0; y < SCORE_WIDTH; y++){
if ((e_block[x%SCORE_HEIGHT] & (1<<(SCORE_WIDTH-1-y)))) {
framePointer[(score_y+x)*640 + score_x+y] = 0x00FFFFFF;
} else {
framePointer[(score_y+x)*640 + score_x+y] = 0x00000000;
}
}
}
break;
case 9:
for(x = 0; x < SCORE_HEIGHT; x++) {
for(y = 0; y < SCORE_WIDTH; y++){
if ((s_block[x%SCORE_HEIGHT] & (1<<(SCORE_WIDTH-1-y)))) {
framePointer[(score_y+x)*640 + score_x+y] = 0x00FFFFFF;
} else {
framePointer[(score_y+x)*640 + score_x+y] = 0x00000000;
}
}
}
break;
default :
break;
}
}
}
void updateMyscore(int adding_score){
total_score += adding_score;
}
void drawNumber(unsigned int* framePointer, int digit, int number){
short x=0, y=0;
for(x = 0; x < SCORE_HEIGHT; x++) {
for(y = 0; y < SCORE_WIDTH; y++){
framePointer[(number_y+x)*640 + number_position[digit]+y] = 0x00000000;
}
}
switch(number){
case 0:
for(x = 0; x < SCORE_HEIGHT; x++) {
for(y = 0; y < SCORE_WIDTH; y++){
if ((o_block[x%SCORE_HEIGHT] & (1<<(SCORE_WIDTH-1-y)))) {
framePointer[(number_y+x)*640 + number_position[digit]+y] = 0x0000FF00;
} else {
framePointer[(number_y+x)*640 + number_position[digit]+y] = 0x00000000;
}
}
}
break;
case 1:
for(x = 0; x < SCORE_HEIGHT; x++) {
for(y = 0; y < SCORE_WIDTH; y++){
if ((one_block[x%SCORE_HEIGHT] & (1<<(SCORE_WIDTH-1-y)))) {
framePointer[(number_y+x)*640 + number_position[digit]+y] = 0x0000FF00;
} else {
framePointer[(number_y+x)*640 + number_position[digit]+y] = 0x00000000;
}
}
}
break;
case 2:
for(x = 0; x < SCORE_HEIGHT; x++) {
for(y = 0; y < SCORE_WIDTH; y++){
if ((two_block[x%SCORE_HEIGHT] & (1<<(SCORE_WIDTH-1-y)))) {
framePointer[(number_y+x)*640 + number_position[digit]+y] = 0x0000FF00;
} else {
framePointer[(number_y+x)*640 + number_position[digit]+y] = 0x00000000;
}
}
}
break;
case 3:
for(x = 0; x < SCORE_HEIGHT; x++) {
for(y = 0; y < SCORE_WIDTH; y++){
if ((three_block[x%SCORE_HEIGHT] & (1<<(SCORE_WIDTH-1-y)))) {
framePointer[(number_y+x)*640 + number_position[digit]+y] = 0x0000FF00;
} else {
framePointer[(number_y+x)*640 + number_position[digit]+y] = 0x00000000;
}
}
}
break;
case 4:
for(x = 0; x < SCORE_HEIGHT; x++) {
for(y = 0; y < SCORE_WIDTH; y++){
if ((four_block[x%SCORE_HEIGHT] & (1<<(SCORE_WIDTH-1-y)))) {
framePointer[(number_y+x)*640 + number_position[digit]+y] = 0x0000FF00;
} else {
framePointer[(number_y+x)*640 + number_position[digit]+y] = 0x00000000;
}
}
}
break;
case 5:
for(x = 0; x < SCORE_HEIGHT; x++) {
for(y = 0; y < SCORE_WIDTH; y++){
if ((five_block[x%SCORE_HEIGHT] & (1<<(SCORE_WIDTH-1-y)))) {
framePointer[(number_y+x)*640 + number_position[digit]+y] = 0x0000FF00;
} else {
framePointer[(number_y+x)*640 + number_position[digit]+y] = 0x00000000;
}
}
}
break;
case 6:
for(x = 0; x < SCORE_HEIGHT; x++) {
for(y = 0; y < SCORE_WIDTH; y++){
if ((six_block[x%SCORE_HEIGHT] & (1<<(SCORE_WIDTH-1-y)))) {
framePointer[(number_y+x)*640 + number_position[digit]+y] = 0x0000FF00;
} else {
framePointer[(number_y+x)*640 + number_position[digit]+y] = 0x00000000;
}
}
}
break;
case 7:
for(x = 0; x < SCORE_HEIGHT; x++) {
for(y = 0; y < SCORE_WIDTH; y++){
if ((seven_block[x%SCORE_HEIGHT] & (1<<(SCORE_WIDTH-1-y)))) {
framePointer[(number_y+x)*640 + number_position[digit]+y] = 0x0000FF00;
} else {
framePointer[(number_y+x)*640 + number_position[digit]+y] = 0x00000000;
}
}
}
break;
case 8:
for(x = 0; x < SCORE_HEIGHT; x++) {
for(y = 0; y < SCORE_WIDTH; y++){
if ((eight_block[x%SCORE_HEIGHT] & (1<<(SCORE_WIDTH-1-y)))) {
framePointer[(number_y+x)*640 + number_position[digit]+y] = 0x0000FF00;
} else {
framePointer[(number_y+x)*640 + number_position[digit]+y] = 0x00000000;
}
}
}
break;
case 9:
for(x = 0; x < SCORE_HEIGHT; x++) {
for(y = 0; y < SCORE_WIDTH; y++){
if ((nine_block[x%SCORE_HEIGHT] & (1<<(SCORE_WIDTH-1-y)))) {
framePointer[(number_y+x)*640 + number_position[digit]+y] = 0x0000FF00;
} else {
framePointer[(number_y+x)*640 + number_position[digit]+y] = 0x00000000;
}
}
}
break;
default:
break;
}
}
void updateNumber(unsigned int* framePointer){
int i;
int first;
int second;
int third;
int fourth;
int temp_score = total_score;
if(temp_score >= 1000){ // 4-digit scores
for(i = 0; i < 4; i++){
switch(i){
case 0:
fourth = 0;
drawNumber(framePointer, 3, fourth);
break;
case 1:
third = temp_score % 10;
temp_score -= third;
drawNumber(framePointer, 2, third);
break;
case 2:
second = temp_score % 10;
temp_score -= second;
drawNumber(framePointer, 1, second);
break;
case 3:
first = temp_score;
drawNumber(framePointer, 0, first);
break;
default:
break;
}
temp_score = temp_score / 10;
}
}
else if(temp_score >= 100 && temp_score < 1000){ // 3-digit scores
for(i = 0; i < 3; i++){
switch(i){
case 0:
third = temp_score % 10;
temp_score -= third;
drawNumber(framePointer, 2, third);
break;
case 1:
second = temp_score % 10;
temp_score -= second;
drawNumber(framePointer, 1, second);
break;
case 2:
first = temp_score;
drawNumber(framePointer, 0, first);
break;
default:
break;
}
temp_score = temp_score / 10;
}
}
else if(temp_score >= 10 && temp_score < 100){ // 2-digit scores
for(i = 0; i < 2; i++){
switch(i){
case 0:
second = temp_score % 10;
temp_score -= second;
drawNumber(framePointer, 1, second);
break;
case 1:
first = temp_score;
drawNumber(framePointer, 0, first);
break;
default:
break;
}
temp_score = temp_score / 10;
}
}
}
void renderNumber(unsigned int* framePointer) { // draw for the first time
short x=0, y=0;
for(x = 0; x < SCORE_HEIGHT; x++) {
for(y = 0; y < SCORE_WIDTH; y++){
if ((o_block[x%SCORE_HEIGHT] & (1<<(SCORE_WIDTH-1-y)))) {
framePointer[(number_y+x)*640 + number_position[0]+y] = 0x0000FF00;
} else {
framePointer[(number_y+x)*640 + number_position[0]+y] = 0x00000000;
}
}
}
}
void renderTanks(unsigned int* framePointer) { // draw for the first time
short x=0, y=0;
int i;
for(i=0; i<3; i++){
tank_x = tank_position[i];
switch(i){
case 0:
for(x = 0; x < TANK_HEIGHT; x++) {
for(y = 0; y < TANK_WIDTH; y++){
if ((tank[x%TANK_HEIGHT] & (1<<(TANK_WIDTH-1-y)))) {
framePointer[(tank_y+x)*640 + tank_x+y] = 0x0000FF00;
} else {
framePointer[(tank_y+x)*640 + tank_x+y] = 0x00000000;
}
}
}
break;
case 1:
for(x = 0; x < TANK_HEIGHT; x++) {
for(y = 0; y < TANK_WIDTH; y++){
if ((tank[x%TANK_HEIGHT] & (1<<(TANK_WIDTH-1-y)))) {
framePointer[(tank_y+x)*640 + tank_x+y] = 0x0000FF00;
} else {
framePointer[(tank_y+x)*640 + tank_x+y] = 0x00000000;
}
}
}
break;
case 2:
for(x = 0; x < TANK_HEIGHT; x++) {
for(y = 0; y < TANK_WIDTH; y++){
if ((tank[x%TANK_HEIGHT] & (1<<(TANK_WIDTH-1-y)))) {
framePointer[(tank_y+x)*640 + tank_x+y] = 0x0000FF00;
} else {
framePointer[(tank_y+x)*640 + tank_x+y] = 0x00000000;
}
}
}
break;
default :
break;
}
}
}
void blankTanks(unsigned int* framePointer, int which_tank){
short x=0, y=0;
tank_x = tank_position[which_tank];
for(x = 0; x < TANK_HEIGHT; x++) {
for(y = 0; y < TANK_WIDTH; y++){
framePointer[(tank_y+x)*640 + tank_x+y] = 0x00000000;
}
}
}
void gameOver(unsigned int* framePointer){
short x=0, y=0;
int i;
int counter;
XIntc_MasterDisable(XPAR_INTC_0_BASEADDR);
setGameState(0);
int row = 0;
int col = 0;
for(row=0; row<480; row++) {
for(col=0; col<640; col++) {
framePointer[row*640 + col] = 0x00000000;
}
}
for(i=0; i<8; i++){
counter = 0;
game_x = gameover_position[i];
switch(i){
case 0:
for(x = 0; x < SCORE_HEIGHT; x++) {
for(y = 0; y < SCORE_WIDTH; y++){
if ((g_block[x%SCORE_HEIGHT] & (1<<(SCORE_WIDTH-1-y)))) {
framePointer[(game_y+x)*640 + game_x+y] = 0x00FF0000;
} else {
framePointer[(game_y+x)*640 + game_x+y] = 0x00000000;
}
}
}
break;
case 1:
for(x = 0; x < SCORE_HEIGHT; x++) {
for(y = 0; y < SCORE_WIDTH; y++){
if ((a_block[x%SCORE_HEIGHT] & (1<<(SCORE_WIDTH-1-y)))) {
framePointer[(game_y+x)*640 + game_x+y] = 0x0000FF00;
} else {
framePointer[(game_y+x)*640 + game_x+y] = 0x00000000;
}
}
}
break;
case 2:
for(x = 0; x < SCORE_HEIGHT; x++) {
for(y = 0; y < SCORE_WIDTH; y++){
if ((m_block[x%SCORE_HEIGHT] & (1<<(SCORE_WIDTH-1-y)))) {
framePointer[(game_y+x)*640 + game_x+y] = 0x000000FF;
} else {
framePointer[(game_y+x)*640 + game_x+y] = 0x00000000;
}
}
}
break;
case 3:
for(x = 0; x < SCORE_HEIGHT; x++) {
for(y = 0; y < SCORE_WIDTH; y++){
if ((e_block[x%SCORE_HEIGHT] & (1<<(SCORE_WIDTH-1-y)))) {
framePointer[(game_y+x)*640 + game_x+y] = 0x00FFFF00;
} else {
framePointer[(game_y+x)*640 + game_x+y] = 0x00000000;
}
}
}
break;
case 4:
for(x = 0; x < SCORE_HEIGHT; x++) {
for(y = 0; y < SCORE_WIDTH; y++){
if ((o_block[x%SCORE_HEIGHT] & (1<<(SCORE_WIDTH-1-y)))) {
framePointer[(game_y+x)*640 + game_x+y] = 0x0000FFFF;
} else {
framePointer[(game_y+x)*640 + game_x+y] = 0x00000000;
}
}
}
break;
case 5:
for(x = 0; x < SCORE_HEIGHT; x++) {
for(y = 0; y < SCORE_WIDTH; y++){
if ((v_block[x%SCORE_HEIGHT] & (1<<(SCORE_WIDTH-1-y)))) {
framePointer[(game_y+x)*640 + game_x+y] = 0x00FF00FF;
} else {
framePointer[(game_y+x)*640 + game_x+y] = 0x00000000;
}
}
}
break;
case 6:
for(x = 0; x < SCORE_HEIGHT; x++) {
for(y = 0; y < SCORE_WIDTH; y++){
if ((e_block[x%SCORE_HEIGHT] & (1<<(SCORE_WIDTH-1-y)))) {
framePointer[(game_y+x)*640 + game_x+y] = 0x008888FF;
} else {
framePointer[(game_y+x)*640 + game_x+y] = 0x00000000;
}
}
}
break;
case 7:
for(x = 0; x < SCORE_HEIGHT; x++) {
for(y = 0; y < SCORE_WIDTH; y++){
if ((r_block[x%SCORE_HEIGHT] & (1<<(SCORE_WIDTH-1-y)))) {
framePointer[(game_y+x)*640 + game_x+y] = 0x00448844;
} else {
framePointer[(game_y+x)*640 + game_x+y] = 0x00000000;
}
}
}
break;
default :
break;
}
while(counter < 3000000){
counter++;
}
}
exit(0);
}
int tankDied(unsigned int* framePointer){
switch(lives){
case 3:
blankTanks(framePointer, 2);
break;
case 2:
blankTanks(framePointer, 1);
break;
case 1:
blankTanks(framePointer, 0);
break;
case 0:
gameOver(framePointer);
return 1;
break;
default:
break;
}
lives--;
return 0;
}