250 lines
4.7 KiB
C
250 lines
4.7 KiB
C
|
|
|||
|
#include "../config.h"
|
|||
|
#include "../pixel.h"
|
|||
|
#include "../util.h"
|
|||
|
#include "../random/prng.h"
|
|||
|
#include "snake.h"
|
|||
|
#include "../joystick.h"
|
|||
|
|
|||
|
#define RANDOM8() (random8())
|
|||
|
|
|||
|
void snake(){
|
|||
|
pixel pixels[64];
|
|||
|
pixels[0] = (pixel){NUM_COLS/2, NUM_ROWS/2};
|
|||
|
pixels[1] = (pixel){NUM_COLS/2, (NUM_ROWS/2)-1};
|
|||
|
|
|||
|
pixel * head = &pixels[1];
|
|||
|
pixel * tail = &pixels[0];
|
|||
|
pixel old_head;
|
|||
|
|
|||
|
pixel apples[10];
|
|||
|
unsigned char apple_num = 0;
|
|||
|
|
|||
|
direction dir = up;
|
|||
|
|
|||
|
clear_screen(0);
|
|||
|
|
|||
|
unsigned char x=0, dead=0;
|
|||
|
while(1){
|
|||
|
x++;
|
|||
|
old_head = *head;
|
|||
|
if(++head == pixels + 64) head = pixels;
|
|||
|
|
|||
|
unsigned char dead_cnt=0;
|
|||
|
|
|||
|
unsigned char apple_found = 0, j;
|
|||
|
for(j=0;j<apple_num;j++){
|
|||
|
unsigned char i;
|
|||
|
for(i=0;i<4;i++){
|
|||
|
if ( (next_pixel(old_head, i).x == apples[j].x) && (next_pixel(old_head, i).y == apples[j].y) ){
|
|||
|
apple_found = 1;
|
|||
|
dir = i;
|
|||
|
for(;j<apple_num-1;j++){
|
|||
|
apples[j]=apples[j+1];
|
|||
|
}
|
|||
|
apple_num--;
|
|||
|
goto apple_se;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
apple_se:
|
|||
|
|
|||
|
if(apple_found){
|
|||
|
|
|||
|
}else{
|
|||
|
while(get_next_pixel(old_head, dir)){
|
|||
|
if((dead_cnt++)==4){
|
|||
|
dead = 1;
|
|||
|
break;
|
|||
|
}
|
|||
|
dir = direction_r(dir);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if(!dead){
|
|||
|
*head = next_pixel(old_head, dir);
|
|||
|
setpixel(*head, 3);
|
|||
|
|
|||
|
if((RANDOM8()&0xff)<80){
|
|||
|
unsigned char j;
|
|||
|
unsigned char nextapple=0, distx, disty, shortdist=255, xy=0;
|
|||
|
if(!apple_num){
|
|||
|
dir = RANDOM8()%4;
|
|||
|
}else{
|
|||
|
for(j=0;j<apple_num;j++){
|
|||
|
if(head->x > apples[j].x){
|
|||
|
distx = head->x - apples[j].x;
|
|||
|
}else{
|
|||
|
distx = apples[j].x - head->x;
|
|||
|
}
|
|||
|
if(head->y > apples[j].y){
|
|||
|
disty = head->y - apples[j].y;
|
|||
|
}else{
|
|||
|
disty = apples[j].y - head->y;
|
|||
|
}
|
|||
|
if ((distx + disty) < shortdist){
|
|||
|
shortdist = distx + disty;
|
|||
|
nextapple = j;
|
|||
|
xy = (distx > disty)?1:0;
|
|||
|
}
|
|||
|
}
|
|||
|
if(xy){
|
|||
|
dir = (apples[nextapple].x > head->x)?left:right;
|
|||
|
}else{
|
|||
|
dir = (apples[nextapple].y > head->y)?down:up;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if( (apple_num<9) && ((RANDOM8()&0xff)<10) ){
|
|||
|
pixel new_apple = (pixel){RANDOM8()%NUM_COLS,RANDOM8()%NUM_ROWS};
|
|||
|
if(!get_pixel(new_apple)){
|
|||
|
apples[apple_num++]=new_apple;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if(!apple_found){
|
|||
|
clearpixel(*tail);
|
|||
|
if(++tail == pixels + 64) tail = pixels;
|
|||
|
}
|
|||
|
}else{
|
|||
|
while(tail != head){
|
|||
|
clearpixel(*tail);
|
|||
|
if((++tail)>pixels+64) tail = pixels;
|
|||
|
wait (60);
|
|||
|
}
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
for(j=0;j<apple_num;j++){
|
|||
|
if(x%2){
|
|||
|
setpixel(apples[j], 3);
|
|||
|
}else{
|
|||
|
clearpixel(apples[j]);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
wait (SNAKE_DELAY);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void snake_game() {
|
|||
|
pixel pixels[64] = {{4, 14},{4, 13}};
|
|||
|
pixel * head = &pixels[1];
|
|||
|
pixel * tail = &pixels[0];
|
|||
|
pixel old_head;
|
|||
|
pixel apples[10];
|
|||
|
uint8_t joy, joy_old=0xff, joy_cmd=0xff;
|
|||
|
|
|||
|
unsigned char x, y, dead = 0;
|
|||
|
unsigned char apple_num = 0;
|
|||
|
direction dir = up;
|
|||
|
|
|||
|
unsigned char apple_found = 0;
|
|||
|
unsigned char j;
|
|||
|
|
|||
|
clear_screen(0);
|
|||
|
|
|||
|
// zeichne Rahmen
|
|||
|
for (x = 0; x < NUM_COLS; x++) {
|
|||
|
for (y = 0; y < NUM_ROWS; y++) {
|
|||
|
if (((x == 0) || (x == NUM_COLS-1)) ||
|
|||
|
((y == 0) || (y == NUM_ROWS-1))) {
|
|||
|
setpixel((pixel) {x, y}, 3);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
x = 0;
|
|||
|
while (1) {
|
|||
|
|
|||
|
x++;
|
|||
|
old_head = *head;
|
|||
|
++head;
|
|||
|
if (head == pixels + 64)
|
|||
|
head = pixels;
|
|||
|
|
|||
|
if (joy_cmd == right) {
|
|||
|
dir = direction_r(dir);
|
|||
|
joy_cmd = 0xff;
|
|||
|
} else if (joy_cmd == left) {
|
|||
|
dir = direction_r(dir);
|
|||
|
dir = direction_r(dir);
|
|||
|
dir = direction_r(dir);
|
|||
|
joy_cmd = 0xff;
|
|||
|
}
|
|||
|
|
|||
|
// kopf einen weiter bewegen
|
|||
|
*head = next_pixel(old_head, dir);
|
|||
|
|
|||
|
apple_found = 0;
|
|||
|
|
|||
|
// prfen ob man auf nen Apfel drauf ist
|
|||
|
for (j = 0; j < apple_num; j++) {
|
|||
|
if ( ( head->x == apples[j].x) &&
|
|||
|
(head->y == apples[j].y) ){
|
|||
|
apple_found = 1;
|
|||
|
for(; j < apple_num - 1; j++) {
|
|||
|
apples[j] = apples[j+1];
|
|||
|
}
|
|||
|
apple_num--;
|
|||
|
goto apple_se;
|
|||
|
}
|
|||
|
}
|
|||
|
if (get_pixel(*head)) {
|
|||
|
dead = 1;
|
|||
|
}
|
|||
|
apple_se:
|
|||
|
|
|||
|
if (!dead) {
|
|||
|
setpixel(*head, 3);
|
|||
|
|
|||
|
// setze neue pfel
|
|||
|
if ( (apple_num < 9) && (random8() < 10) ) {
|
|||
|
pixel new_apple = (pixel) {(random8() % (NUM_COLS-2))+1,
|
|||
|
(random8() % (NUM_ROWS-2))+1};
|
|||
|
if (!get_pixel(new_apple)){
|
|||
|
apples[apple_num++] = new_apple;
|
|||
|
}
|
|||
|
}
|
|||
|
// lsche Ende
|
|||
|
if (!apple_found && !dead) {
|
|||
|
clearpixel(*tail);
|
|||
|
if (++tail == pixels + 64)
|
|||
|
tail = pixels;
|
|||
|
}
|
|||
|
} else {
|
|||
|
while (tail != head) {
|
|||
|
clearpixel(*tail);
|
|||
|
if ((++tail) > pixels + 64)
|
|||
|
tail = pixels;
|
|||
|
wait (60);
|
|||
|
}
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
for (j = 0; j < apple_num; j++) {
|
|||
|
if (x % 2) {
|
|||
|
setpixel(apples[j], 3);
|
|||
|
} else {
|
|||
|
clearpixel(apples[j]);
|
|||
|
}
|
|||
|
}
|
|||
|
for(j=0;j<20;j++){
|
|||
|
if(JOYISLEFT){
|
|||
|
joy = left;
|
|||
|
}else if(JOYISRIGHT){
|
|||
|
joy = right;
|
|||
|
}else{
|
|||
|
joy = 0xff;
|
|||
|
}
|
|||
|
if(joy != joy_old){
|
|||
|
joy_cmd = joy;
|
|||
|
}
|
|||
|
joy_old = joy;
|
|||
|
wait (5);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|