📄 open coding.c
字号:
//doubly link list
#include<stdio.h>
#include<conio.h>
#include<dos.h>
#include<time.h>
#include<stdlib.h>
#include<string.h>
struct node{
int x,y;
struct node *prev,*next;
}*head=NULL,*curr,*tail;
void push(void){
curr = (struct node*)malloc(sizeof(struct node));
if(head==NULL){
head=curr;
head->prev=NULL;
}else{
tail->next=curr;
curr->prev=tail;
}
tail=curr;
tail->next=NULL;
}
void popAll(void) {
curr=tail;
while(curr!=NULL) {
curr=curr->prev;
free(tail);
tail=curr;
}
}
void main() {
int xm,ym; //Posisi Node
int xa,ya; //Posisi Buah
int i; //Push Pertama
int makan;
char tekan;
// clrscr();
randomize();
textcolor(BLUE);
gotoxy((80-strlen("Prototype Ular Nokia"))/2,12);cprintf("Prototype Ular Nokia");
getch();
clrscr();
_setcursortype(0);
textcolor(0);
//ini langkah awal
xm = -1; //Kekiri
ym = 0; //nggak begerak vertikal
//awalnya kita kasi node buat ularnya 4 buah aja
for(i = 1; i <= 4; i++) {
push();
curr->x = 40+i;
curr->y = 3;
}
//buat nyetak
curr = head;
while (curr != NULL) { //nyetak supaya di perulangan ga nyetak semua lagi
textcolor(BLUE);
gotoxy(curr->x, curr->y); cprintf("\1");
curr = curr->prev;
}
//ini posisi buah nya
xa = rand() % 73 + 2;
ya = rand() % 21 + 2;
textcolor(BLUE);
gotoxy(xa, ya); cprintf("\3");
//inisialisasi awal yang dimakan
makan = 0;
do {
/*
//artificial intelligentnya bisa gerak ke mana arah makanan
//ini kalo gerak ke bawah ato ke atas
if ((xm == 0 && ym == -1 || xm == 0 && ym == 1) && head->y == ya) {
if (head->x < xa) { //Ke kanan
xm = 1;
ym = 0;
}
else if(head->x > xa) { //Ke kiri
xm = -1;
ym = 0;
}
}
//Kalo gerak ke kanan ato kiri
if ((xm == 1 && ym == 0 || xm == -1 && ym == 0) && head->x == xa) {
if (head->y > ya) { //Ke atas
xm = 0;
ym = -1;
}
else if(head->y < ya) { //Ke bawah
xm = 0;
ym = 1;
}
}
*/
if(kbhit()) {
tekan = getch();
if(tekan == 0) {
tekan = getch();
}
//pilihan gerak
switch(tekan) {
case 72 : if(ym != 1) { //=-> Ke Atas
xm = 0;
ym = -1;
}
break;
case 75 : if(xm != 1) { //=-> Ke Kiri
xm = -1;
ym = 0;
}
break;
case 77 : if(xm != -1) { //=-> Ke Kanan
xm = 1;
ym = 0;
}
break;
case 80 : if(ym != -1) { //=-> Ke Bawah
xm = 0;
ym = 1;
}
break;
}
}
gotoxy(head->x, head->y); printf("\1"); //node selain head ga usah di cetak
delay(50);
if(tekan != 27) { //Kalo keluar tailnya ga di apus jd jml node bener
gotoxy(tail->x, tail->y); printf(" "); //hapus yg paling akhir
}
//Kalo nabrak makanan push 1 node di ekor & bikin makanan baru
if(head->x == xa && head->y == ya) {
push();
tail->x = tail->x + xm;
tail->y = tail->y + ym;
makan++;
//ini untuk jumlah yg dimakan, bila 15 maka menang
if(makan == 15) {
tekan = 27;
clrscr();
gotoxy((80-strlen("Menang"))/2,12);printf("Menang");
getch();
break;
}else { //kalo else maka akan dirandom lagi posisi makanan baru
xa = rand() % 73 + 2;
ya = rand() % 21 + 2;
textcolor(BLUE);
gotoxy(xa, ya); cprintf("\3");
}
}
//Ngikutin arah belok head utk masing2 node
curr = tail;
do {
if(curr->prev != NULL) {
curr->x = curr->prev->x;
curr->y = curr->prev->y;
curr = curr->prev;
}
}while(curr != head);
//Kalo nabrak badan keluar
curr = tail;
do {
if(curr->prev != NULL) {
if(head->x == curr->x && head->y == curr->y) {
tekan = 27;
break;
}
curr = curr->prev;
}
}while(curr->prev != head);
//buat tembus2
if(head->x == 1 && xm == -1 && ym == 0) {
head->x = 80;
}
if(head->x == 80 && xm == 1 && ym == 0) {
head->x = 1;
}
if(head->y == 1 && xm == 0 && ym == -1) {
head->y = 25;
}
if(head->y == 25 && xm == 0 && ym == 1) {
head->y = 1;
}
head->x += xm;
head->y += ym;
}while(tekan != 27);
//buat free semua
popAll();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -