C語言實現簡單的貪吃蛇遊戲
本文實例為大傢分享瞭C語言實現簡單貪吃蛇遊戲的具體代碼,供大傢參考,具體內容如下
用指針數組來表示蛇,p[0]表示蛇頭
控制方向:w,s,a,d–>上下左右
j,k–>加速、減速
鍵盤控制需要用到線程
編譯時需要在後面加 -lpthread
代碼:
#include <stdio.h> #include <pthread.h> #include <stdlib.h> #include <time.h> #include <unistd.h> #define X 20 #define Y 40 char head='@';//蛇頭的形狀 char body='O';//蛇身的形狀 char a[X][Y]={'O','O','O','@'}; char *p[X*Y]={&a[0][3],&a[0][2],&a[0][1],&a[0][0]};//p[0]表示蛇頭 int n=3; //蛇身的長度(不帶蛇頭) int i,j; int f=1; //標志位:1.右;2.上;3.左;4.下;-1.退出 int us=200000;//用於usleep,延時0.2秒 void right() { *p[n]=0; for(i=n;i>0;i--) { p[i]=p[i-1]; } *p[0]=body; p[0]=p[0]+1;//蛇頭向右移 *p[0]=head; } void left() { *p[n]=0; for(i=n;i>0;i--) { p[i]=p[i-1]; } *p[0]=body; p[0]=p[0]-1; *p[0]=head; } void down() { *p[n]=0; for(i=n;i>0;i--) { p[i]=p[i-1]; } *p[0]=body; p[0]=p[0]+Y; *p[0]=head; } void up() { *p[n]=0; for(i=n;i>0;i--) { p[i]=p[i-1]; } *p[0]=body; p[0]=p[0]-Y; *p[0]=head; } void show() { system("clear"); for(i=0;i<Y;i++) printf("-"); printf("\n"); for(i=0;i<X;i++) { for(j=0;j<Y;j++) { if(a[i][j]==0) printf(" "); else printf("%c",a[i][j]); } printf("\n"); } for(i=0;i<Y;i++) printf("-"); printf("\nw,s,a,d->上下左右;j,k->加減速;ESC退出\n"); } int ran()//隨機數生成* { srand(time(NULL)); lb: i=rand()%X; j=rand()%Y; //隨機位置的值為0,則產生*;否則繼續找隨機位置 if(a[i][j]==0) a[i][j]='*'; else goto lb; } void eat() { if(f==1)//右 { if(*(p[0]+1)=='*') { n++;//長度增加 p[n]=p[n-1]; ran();//隨機數生成* } } if(f==2)//上 { if(*(p[0]-Y)=='*') { n++;//長度增加 p[n]=p[n-1]; ran();//隨機數生成* } } if(f==3)//左 { if(*(p[0]-1)=='*') { n++;//長度增加 p[n]=p[n-1]; ran();//隨機數生成* } } if(f==4)//下 { if(*(p[0]+Y)=='*') { n++;//長度增加 p[n]=p[n-1]; ran();//隨機數生成* } } } void fail() { if(p[0]<&a[0][0]||p[0]>&a[X-1][Y-1])//蛇頭不在矩陣內 { printf("fail!\n"); f=-1; } if(f==1)//右 { for(i=n;i>0;i--) { if((p[0]+1)==p[i])//右邊是自己的身體 { printf("fail!\n"); f=-1; } } } if(f==2)//上 { for(i=n;i>0;i--) { if((p[0]-Y)==p[i])//上邊是自己的身體 { printf("fail!\n"); f=-1; } } } if(f==3)//左 { for(i=n;i>0;i--) { if((p[0]-1)==p[i])//左邊是自己的身體 { printf("fail!\n"); f=-1; } } } if(f==4)//下 { for(i=n;i>0;i--) { if((p[0]+Y)==p[i])//下邊是自己的身體 { printf("fail!\n"); f=-1; } } } } void *key(void *arg)//控制方向:w,s,a,d-->上下左右 { char k; while(1) { k=getchar(); if(k=='w')//上 f=2; if(k=='s')//下 f=4; if(k=='a')//左 f=3; if(k=='d')//右 f=1; if(k=='j')//加速 us=us*4/5; if(k=='k')//減速 us=us*5/4; if(k==27)//ESC { printf("退出!\n"); f=-1; } usleep(100); } } int main() { system("stty -icanon");//關閉緩沖區,輸入字符無需回車直接接受 pthread_t pid; pthread_create(&pid , NULL , key , NULL);//創建線程,鍵盤控制 ran(); while(1) { show(); //顯示 usleep(us); fail(); //判斷是否會咬到自己 eat(); //判斷是否能吃到* if(f==1)//右 right(); if(f==2)//上 up(); if(f==3)//左 left(); if(f==4)//下 down(); if(f==-1)//退出 { pthread_cancel(pid);//關閉線程 return -1; } } return 0; }
以上就是本文的全部內容,希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。