Bilspel på 8x8 matris

I metoden MoveGata räknar 'GataSteg' upp ett steg varje gång vägen flyttas ett

steg. När 'GataSteg' kommit upp till 8 räknar 'GataByte' upp ett steg

och en ny RAD från 'GataStruktur' används.

När 'GataByte' räknat upp till 8 slumpas ett nytt val

av SEGMENT fram. 'GataByte' börjar om igen.

Se hur det fungerar genom att sätta '#define RaceDebug 6'

GataSegment, GataByte, GataSteg

0-0-1

0-0-2

0-0-3

0-0-4

0-0-5

0-0-6

0-1-0

...

0-7-4

0-7-5

0-7-6

1-0-0 <-- GataSegment sätts till 1 genom slumpning

1-0-1

1-0-2

GataStruktur[0 + 7] = B10000000;<--Upp och ner, detta är sista raden

GataStruktur[0 + 6] = B10000000;

GataStruktur[0 + 5] = B10000000;

GataStruktur[0 + 4] = B10000000;

GataStruktur[0 + 3] = B00000000;

GataStruktur[0 + 2] = B00000000;

GataStruktur[0 + 1] = B00000000;<--Nästa rad används när GataByte är 1

GataStruktur[0 + 0] = B10000000;<--Alla rader repeteras 8 gånger (0-7).

Metoden 'MoveHinder' använder 'GataSteg' och 'GataSegment' men styr dem inte.

Lägger bara ut hinder i de två första 'GataSteg'. Då 'GataSteg' är 0 eller 1.

HinderStruktur[0 + 7] = B00000000;

HinderStruktur[0 + 6] = B00000000;

HinderStruktur[0 + 5] = B00000000;

HinderStruktur[0 + 4] = B00000000;

HinderStruktur[0 + 3] = B00000000;

HinderStruktur[0 + 2] = B00000000;

HinderStruktur[0 + 1] = B00000011;<--Läggs ut 2 gånger, resten inget.

HinderStruktur[0 + 0] = B00000000;

Metoden 'MoveBling' använder 'GataSteg', 'GataByte' och 'GataSegment' men styr

dem inte.

Lägger bara ut en bling, Då 'GataSteg' är 4. Kan ändras till annat tal(0-7).

BlingStruktur[8 + 7] = B00000000;<--GataSegment är 1 och gångras med 8

BlingStruktur[8 + 6] = B00000000;

BlingStruktur[8 + 5] = B00000000;

BlingStruktur[8 + 4] = B00000000;

BlingStruktur[8 + 3] = B00000010;

BlingStruktur[8 + 2] = B00000001;

BlingStruktur[8 + 1] = B00000000;

BlingStruktur[8 + 0] = B00000010;<--Lägger ut 1 på GataSteg 4, resten inget.

Metoden 'MoveBil' läser av Joystickens analoga värde och sätter bilens acceleration efter det. Negativt värde är broms.

Bilens position på skärmen är längre fram vid hög acceleration.

En bug i spelet, om en bling är framför bilen när bilen flyttas fram, hoppar bilen över blingen och ingen poäng delas ut. Bug eller inte så är det lika för alla.

Motstånd till högtalaren är 220-470 Ohm.

Lättare att spela, när alla delar är fastskruvade och fastlimmade.

I detta fall en skärbräda från Jula för 19 Kr

/*

Experiment med Arduino Uno R3

8x8 matris display och drivare

Joystick

Högtalare

Detta spel och program är skapat av Per-Anders Hult.

Denna skript ar publicerad för det kit och komponenter som vi

säljer på PchButik.se

Denna skript får av andra personer endast användas i privat bruk.

Om all text i denna anmärking bibehålls, får denna skript ändras och förbättras och publiceras igen.

Om den översätts till annat språk måste även denna text översättas.

Om du publicerar denna skript igen, så skriv ditt namn eller alias här.

Denna skript är ändrad av: (skriv ditt namn här)

*/

#include <SPI.h>

#define RaceDebug 0

//Adressen anges i Hex-värde

#define max7219_reg_noop 0x00

#define max7219_reg_digit0 0x01

#define max7219_reg_decodeMode 0x09

#define max7219_reg_intensity 0x0a

#define max7219_reg_scanLimit 0x0b

#define max7219_reg_shutdown 0x0c

#define max7219_reg_displayTest 0x0f

#define SPI_PIN_MOSI 11 //Master Out Slave In

#define SPI_PIN_MISO 12 //Master In Slave Out

#define SPI_PIN_SCK 13 //Serial Clock

#define SPI_PIN_SS 10 //Slave Select

#define JOYSTICK_PIN_X 2 //Analog 2

#define JOYSTICK_PIN_Y 3 //Analog 3

//Bilens bild

#define BilRow0 B11100000

#define BilRow1 B01000000

#define BilRow2 B11100000

#define BilRow3 B11100000

#define GataStegAntal 0x07 //Dec=7

#define BilMaxHastighet 500

byte Poang = 0;

int JoyY, JoyX;

int BilAccY;

int BilSpeedY;

byte BilX;

byte BilY;

int GataSteg = 0;

byte GataByte = 0;

byte GataSegment = 0;

byte RitaBuffer[8];

byte GataBuffer[8];

byte HinderBuffer[8];

byte BlingBuffer[8];

byte SiffrorBuffer[8];

#define AntalVagSegment 2

byte GataStruktur[AntalVagSegment * 8];

byte BlingStruktur[AntalVagSegment * 8];

byte HinderStruktur[AntalVagSegment * 8];

byte SiffrorStruktur[10 * 5];

int OldSpeedFrequency = 0;

boolean SpelSlut = false;

unsigned long StartTime;

void setup() {

SPI.begin();

#if RaceDebug > 0

Serial.begin(9600);

#endif

pinMode(9, OUTPUT);

writeRegister(max7219_reg_decodeMode, 0x00);

writeRegister(max7219_reg_intensity, 0x2);

writeRegister(max7219_reg_scanLimit, 0x07);

writeRegister(max7219_reg_shutdown, 0x01);

BilX = 4;

BilY = 4;

BilSpeedY = 0;

randomSeed(666);

GataStruktur[0 + 7] = B10000000;

GataStruktur[0 + 6] = B10000000;

GataStruktur[0 + 5] = B10000000;

GataStruktur[0 + 4] = B10000000;

GataStruktur[0 + 3] = B00000000;

GataStruktur[0 + 2] = B00000000;

GataStruktur[0 + 1] = B00000000;

GataStruktur[0 + 0] = B10000000;

GataStruktur[8 + 7] = B10000000;

GataStruktur[8 + 6] = B00000000;

GataStruktur[8 + 5] = B10000000;

GataStruktur[8 + 4] = B10000000;

GataStruktur[8 + 3] = B10000000;

GataStruktur[8 + 2] = B10000000;

GataStruktur[8 + 1] = B00000000;

GataStruktur[8 + 0] = B10000000;

HinderStruktur[0 + 7] = B00000000;

HinderStruktur[0 + 6] = B00000000;

HinderStruktur[0 + 5] = B00000000;

HinderStruktur[0 + 4] = B00000000;

HinderStruktur[0 + 3] = B00000000;

HinderStruktur[0 + 2] = B00000000;

HinderStruktur[0 + 1] = B00000011;

HinderStruktur[0 + 0] = B00000000;

HinderStruktur[8 + 7] = B00000000;

HinderStruktur[8 + 6] = B00000000;

HinderStruktur[8 + 5] = B00000000;

HinderStruktur[8 + 4] = B00000000;

HinderStruktur[8 + 3] = B00110000;

HinderStruktur[8 + 2] = B00110000;

HinderStruktur[8 + 1] = B00000000;

HinderStruktur[8 + 0] = B00000000;

BlingStruktur[0 + 7] = B00000000;

BlingStruktur[0 + 6] = B00001000;

BlingStruktur[0 + 5] = B00010000;

BlingStruktur[0 + 4] = B00100000;

BlingStruktur[0 + 3] = B00000001;

BlingStruktur[0 + 2] = B00000010;

BlingStruktur[0 + 1] = B00000100;

BlingStruktur[0 + 0] = B00001000;

BlingStruktur[8 + 7] = B00000000;

BlingStruktur[8 + 6] = B00000000;

BlingStruktur[8 + 5] = B00000000;

BlingStruktur[8 + 4] = B00000000;

BlingStruktur[8 + 3] = B00000010;

BlingStruktur[8 + 2] = B00000001;

BlingStruktur[8 + 1] = B00000000;

BlingStruktur[8 + 0] = B00000010;

SiffrorStruktur[0 + 0] = B00000111;

SiffrorStruktur[0 + 1] = B00000101;

SiffrorStruktur[0 + 2] = B00000101;

SiffrorStruktur[0 + 3] = B00000101;

SiffrorStruktur[0 + 4] = B00000111;

SiffrorStruktur[5 + 0] = B00000010;

SiffrorStruktur[5 + 1] = B00000010;

SiffrorStruktur[5 + 2] = B00000010;

SiffrorStruktur[5 + 3] = B00000010;

SiffrorStruktur[5 + 4] = B00000010;

SiffrorStruktur[10 + 0] = B00000111;

SiffrorStruktur[10 + 1] = B00000001;

SiffrorStruktur[10 + 2] = B00000111;

SiffrorStruktur[10 + 3] = B00000100;

SiffrorStruktur[10 + 4] = B00000111;

SiffrorStruktur[15 + 0] = B00000111;

SiffrorStruktur[15 + 1] = B00000001;

SiffrorStruktur[15 + 2] = B00000111;

SiffrorStruktur[15 + 3] = B00000001;

SiffrorStruktur[15 + 4] = B00000111;

SiffrorStruktur[20 + 0] = B00000101;

SiffrorStruktur[20 + 1] = B00000101;

SiffrorStruktur[20 + 2] = B00000111;

SiffrorStruktur[20 + 3] = B00000001;

SiffrorStruktur[20 + 4] = B00000001;

SiffrorStruktur[25 + 0] = B00000111;

SiffrorStruktur[25 + 1] = B00000100;

SiffrorStruktur[25 + 2] = B00000111;

SiffrorStruktur[25 + 3] = B00000001;

SiffrorStruktur[25 + 4] = B00000111;

SiffrorStruktur[30 + 0] = B00000110;

SiffrorStruktur[30 + 1] = B00000100;

SiffrorStruktur[30 + 2] = B00000111;

SiffrorStruktur[30 + 3] = B00000101;

SiffrorStruktur[30 + 4] = B00000111;

SiffrorStruktur[35 + 0] = B00000111;

SiffrorStruktur[35 + 1] = B00000001;

SiffrorStruktur[35 + 2] = B00000001;

SiffrorStruktur[35 + 3] = B00000001;

SiffrorStruktur[35 + 4] = B00000001;

SiffrorStruktur[40 + 0] = B00000111;

SiffrorStruktur[40 + 1] = B00000101;

SiffrorStruktur[40 + 2] = B00000111;

SiffrorStruktur[40 + 3] = B00000101;

SiffrorStruktur[40 + 4] = B00000111;

SiffrorStruktur[45 + 0] = B00000111;

SiffrorStruktur[45 + 1] = B00000101;

SiffrorStruktur[45 + 2] = B00000111;

SiffrorStruktur[45 + 3] = B00000001;

SiffrorStruktur[45 + 4] = B00000001;

SiffraRensa();

RitaRensa();

LaggTillSiffra(2, 1 ,3 );

RitaSiffra();

Rita();

delay(1000);

SiffraRensa();

RitaRensa();

LaggTillSiffra(2, 1 ,2 );

RitaSiffra();

Rita();

delay(1000);

SiffraRensa();

RitaRensa();

LaggTillSiffra(2, 1 ,1 );

RitaSiffra();

Rita();

delay(1000);

StartTime = millis();

}

void loop() {

RitaRensa();

if(SpelSlut == false){

if(BilSpeedY > 0){

MoveGata();

MoveBling();

MoveHinder();

}

RitaGata();

RitaHinder();

RitaBling();

MoveBil();

RitaBil();

KrockTestGata();

KrockTestHinder();

KrockTestBling();

Rita();

delay(100-(BilSpeedY / 25));

if(millis() > StartTime + 60000){

SpelSlut = true;

noTone(9);

}

}else{

RitaPoang();

}

}

void RitaPoang(){

int s = Poang;

if(s > 99) s = 99;

byte TioTal = s / 10;

s = s - (TioTal *10);

RitaRensa();

SiffraRensa();

LaggTillSiffra(1, 0, TioTal);

LaggTillSiffra(5, 0, s);

RitaSiffra();

Rita();

#if RaceDebug == 1

Serial.print("TioTal"); Serial.print("="); Serial.println(TioTal);

Serial.print("s"); Serial.print("="); Serial.println(s);

#endif

}

void SiffraRensa(){

for (int i=0; i <= 7; i++){

SiffrorBuffer[i] = 0;

}

}

void LaggTillSiffra(byte x, byte y ,byte Siffra){

for (int i=0; i <= 4; i++){

SiffrorBuffer[i + y] = SiffrorBuffer[i + y] | (SiffrorStruktur[(Siffra * 5) + i] << (5 - x));

#if RaceDebug == 2

Serial.print((Siffra * 5) + i); Serial.print("-"); Serial.println(SiffrorStruktur[(Siffra * 5) + i]);

#endif

}

}

void RitaRensa(){

for (int i=0; i <= 7; i++){

RitaBuffer[i] = 0;

}

}

void RitaSiffra(){

for (int i=0; i <= 7; i++){

RitaBuffer[i] = RitaBuffer[i] | SiffrorBuffer[i];

}

}

void KrockTestHinder(){

if(bitRead(HinderBuffer[BilY], 7-BilX) ){

HinderTone();

BilSpeedY = 0;

}

if(bitRead(HinderBuffer[BilY], 7-BilX - 2) ){

HinderTone();

BilSpeedY = 0;

}

#if RaceDebug == 3

Serial.print(GataSegment); Serial.print("-"); Serial.println(GataByte);

#endif

}

void KrockTestBling(){

if(bitRead(BlingBuffer[BilY], 7-BilX) ){

BlingTone();

Poang ++;

bitWrite(BlingBuffer[BilY], 7-BilX, 0);

}

if(bitRead(BlingBuffer[BilY], 7-BilX - 1) ){

BlingTone();

Poang ++;

bitWrite(BlingBuffer[BilY], 7-BilX - 1, 0);

}

if(bitRead(BlingBuffer[BilY], 7-BilX - 2) ){

BlingTone();

Poang ++;

bitWrite(BlingBuffer[BilY], 7-BilX - 2, 0);

}

#if RaceDebug == 4

Serial.print(GataSegment); Serial.print("-"); Serial.println(GataByte);

#endif

}

void KrockTestGata(){

if(bitRead(GataBuffer[BilY], 7-BilX) ){

BilSpeedY = 0;

CrachTone();

}

if(bitRead(GataBuffer[BilY], 7-BilX - 2) ){

BilSpeedY = 0;

CrachTone();

}

#if RaceDebug == 5

Serial.print(GataSegment); Serial.print("-"); Serial.println(GataByte);

#endif

}

void MoveHinder(){

for (int i=6; i >= 0; i--){

HinderBuffer[i + 1] = HinderBuffer[i];

}

HinderBuffer[0] = 0;

if(GataSteg == 0){

HinderBuffer[0] = HinderStruktur[(GataSegment * 8) + GataByte];

}

if(GataSteg == 1){

HinderBuffer[0] = HinderStruktur[(GataSegment * 8) + GataByte];

}

}

void MoveBling(){

for (int i=6; i >= 0; i--){

BlingBuffer[i + 1] = BlingBuffer[i];

}

BlingBuffer[0] = 0;

if(GataSteg == 4){

BlingBuffer[0] = BlingStruktur[(GataSegment * 8) + GataByte];

}

}

void MoveGata(){

GataSteg ++;

if(GataSteg > GataStegAntal){

GataSteg = 0;

GataByte ++;

}

if(GataByte > 7){

GataByte = 0;

GataSegment = random(0, AntalVagSegment);

}

for (int i=6; i >= 0; i--){

GataBuffer[i + 1] = GataBuffer[i];

}

GataBuffer[0] = GataStruktur[(GataSegment * 8) + GataByte];

if(GataSteg == 0){

//Raderar en pixel på varje sida av vägen var 8:de gång

GataBuffer[0] = GataBuffer[0] & 0x7E;

}

#if RaceDebug == 6

Serial.print(GataSegment); Serial.print("-"); Serial.print(GataByte); Serial.print("-"); Serial.println(GataSteg);

#endif

}

void MoveBil(){

JoyY = analogRead(JOYSTICK_PIN_Y);

if(JoyY < 510){

BilAccY = (510 - JoyY) / 17;

}else if(JoyY > 522){

BilAccY = ((522 - JoyY) / 4);

}else{

BilAccY = -1;

}

BilSpeedY = BilSpeedY + (1 * BilAccY);

if(BilSpeedY < 0) BilSpeedY = 0;

if(BilSpeedY > BilMaxHastighet) BilSpeedY = BilMaxHastighet;

SpeedTone(100 + BilSpeedY/50);

if(BilAccY < -1 & BilSpeedY > 200 ){

BromsTone();

}

if(BilSpeedY == 0) noTone(9);

if(BilAccY < -2){

BilY = 4;

}else if(BilAccY > 10){

BilY = 3 - (BilAccY / 9);

}else{

BilY = 3;

}

if (BilY < 0 ) BilY = 0;

if (BilY > 5 ) BilY = 5;

JoyX = analogRead(JOYSTICK_PIN_X);

BilX = JoyX / 172;

#if RaceDebug == 7

Serial.println(BilSpeedY);

#endif

}

void RitaGata(){

for (int i=0; i <= 7; i++){

RitaBuffer[i] = RitaBuffer[i] | GataBuffer[i];

}

}

void RitaHinder(){

for (int i=0; i <= 7; i++){

RitaBuffer[i] = RitaBuffer[i] | HinderBuffer[i];

}

}

void RitaBling(){

for (int i=0; i <= 7; i++){

RitaBuffer[i] = RitaBuffer[i] | BlingBuffer[i];

}

}

void RitaBil(){

RitaBuffer[BilY] = RitaBuffer[BilY] | BilRow0 >> BilX;

RitaBuffer[BilY + 1] = RitaBuffer[BilY + 1] | BilRow1 >> BilX;

RitaBuffer[BilY + 2] = RitaBuffer[BilY + 2] | BilRow2 >> BilX;

RitaBuffer[BilY + 3] = RitaBuffer[BilY + 3] | BilRow3 >> BilX;

}

void Rita(){

for (int i=0; i <= 7; i++){

writeRegister(max7219_reg_digit0 + i, RitaBuffer[i]);

}

}

void writeRegister(byte thisRegister, byte thisValue) {

digitalWrite(SPI_PIN_SS, LOW);

SPI.transfer(thisRegister);

SPI.transfer(thisValue);

digitalWrite(SPI_PIN_SS, HIGH);

}

void SpeedTone(int SpeedFrequency){

if(OldSpeedFrequency != SpeedFrequency){

OldSpeedFrequency = SpeedFrequency;

tone(9, SpeedFrequency);

}

}

void CrachTone(){

tone(9, 30 ,100);

delay(100);

tone(9, 60,100);

}

void BromsTone(){

tone(9, 2000 ,100);

}

void BlingTone(){

tone(9, 6000,100);

}

void HinderTone(){

tone(9, 90 ,100);

delay(100);

tone(9, 30,100);

}