日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

用c语言写双人贪吃蛇,试图写了一个双人贪吃蛇,结果蛇竖着跑正常,横着跑就只有头了,求解~...

發布時間:2023/12/14 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用c语言写双人贪吃蛇,试图写了一个双人贪吃蛇,结果蛇竖着跑正常,横着跑就只有头了,求解~... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

#include

#include

#include

#include

#include

#include

#define W 70

#define H 22

#define N 2

#define MAX_LEN 400

typedef struct PLAYER

{

char key;//保存玩家輸入 int head;//記錄長度 int a[2];//記錄蛇尾位置 int direct;

int snake [MAX_LEN][3];//每個點有三個屬性 snake[i][0]=1用于表示頭,0表示身體,snake【i】【1】表示橫坐標。snake【i】【2】表示縱坐標。}player;

/******光標移到指定位置**************************************************************/

void gotoxy(HANDLE hOut, int x, int y)

{

COORD pos;

pos.X = x; //橫坐標 pos.Y = y; //縱坐標 SetConsoleCursorPosition(hOut, pos);

}

/******制作游戲窗口******************************************************************/

void make_frame()

{

int i;

HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); //定義顯示器句柄變量 gotoxy(hOut,0,0); //打印框角 printf("*");

gotoxy(hOut,W,0);

printf("*");

gotoxy(hOut,0,H-1);

printf("*");

gotoxy(hOut,W,H-1);

printf("*");

for(i=0;i

{

gotoxy(hOut,i,0);

printf("*"); //打印上橫框 }

for(i=1;i

{

gotoxy(hOut,i,H-1);

printf("*"); //打印下橫框 }

for(i=0;i

{

gotoxy(hOut,0,i);

printf("*"); //打印左豎框 }

for(i=1;i

{

gotoxy(hOut,W,i);

printf("*"); //打印右豎框 }

}

//初始化void init(char map[H][W],player stu[N])

{

int i,j;

//初始化蛇//玩家一 stu[0].snake[0][0] = 0,stu[0].snake[0][1] = 9,stu[0].snake[0][2] = 7;

stu[0].snake[1][0] = 0,stu[0].snake[1][1] = 9,stu[0].snake[1][2] = 8;

stu[0].snake[2][0] = 1,stu[0].snake[2][1] = 9,stu[0].snake[2][2] = 9;

stu[0].direct=4;

//玩家二 stu[1].snake[0][0] = 0,stu[1].snake[0][1] = 13,stu[1].snake[0][2] = 7;

stu[1].snake[1][0] = 0,stu[1].snake[1][1] = 13,stu[1].snake[1][2] = 8;

stu[1].snake[2][0] = 1,stu[1].snake[2][1] = 13,stu[1].snake[2][2] = 9;

stu[1].direct=4;

}

//蛇的移動void move(player stu[N],int number,int food[2])//number 表示玩家幾{

int x,y;//x,y作為臨時交換的值,head作為蛇頭 int i,j;

for(i=0;i

if(stu[number].snake[i][0]==1)

{

stu[number].head = i;

break;

}

}

//將找到的蛇頭坐標保存下來 x = stu[number].snake[stu[number].head][1];

y = stu[number].snake[stu[number].head][2];

//頭移動 switch(stu[number].direct)

{

case 1://向上 stu[number].snake[stu[number].head][1]--;

break;

case 2://向下 stu[number].snake[stu[number].head][1]++;

break;

case 3://向左 stu[number].snake[stu[number].head][2]--;

break;

case 4:

stu[number].snake[stu[number].head][2]++;

break;

}

//判斷是否吃到食物 if(ifEat(stu,number,food))

{

//將原來食物的位置變為蛇頭 stu[number].snake[stu[number].head+1][0] = 1;

stu[number].snake[stu[number].head+1][1] = food[0];

stu[number].snake[stu[number].head+1][2] = food[1];

//將原來的蛇頭變為身體 stu[number].snake[stu[number].head][0] = 0;

//將原來的食物置空 food[0] = 0;

food[1] = 0;

}

//身體移動,從頭開始把前一個塊的位置賦給后一個塊,并保存后一個塊的位置 stu[number].a[0]=stu[number].snake[0][1];

stu[number].a[1]=stu[number].snake[0][2];

for(j=stu[number].head-1;j>=0;j--)

{

int temp;

temp = x;

x = stu[number].snake[j][1];

stu[number].snake[j][1] = temp;

temp = y;

y = stu[number].snake[j][2];

stu[number].snake[j][2] = temp;

}

}

//判斷是否吃到食物int ifEat(player stu[N],int number,int food[2])

{

//判斷頭的位置和食物位置是否重合 if(stu[number].snake[stu[number].head][1]==food[0]&&stu[number].snake[stu[number].head][2]==food[1])

{

return 1;

}

else

{

return 0;

}

}

void makeFood(int food[2],player stu[N])

{

int x,y;

srand(time(0));

//生成一個隨機坐標 x = rand() % (H-3) + 2;

y = rand() % (W-3) + 2;

while(ifReprat(stu,x,y))//如果重復再次生成,直到不重復 {

x = rand() % (H-3) + 2;

y = rand() % (W-3) + 2;

}

//!!!!!!!!!!!!!!!!!!!!!!! food[0] = y;

food[1] = x;

}

int ifReprat(player stu[N],int x,int y)

{

int i,j;

for(i = 0;i

{

for(j = 0;j

{

if(stu[i].snake[j][0]==1)//到蛇頭結束判斷 {

break;

}

if((stu[i].snake[j][1] == x)&&(stu[i].snake[j][2] == y))//有重復 {

return 1;

}

}

}

return 0;

}

//繪制現在畫面void makeMap(HANDLE hOut,char map[H][W],player stu[N],int food[2])

{

int i,j;

/*//重繪地圖

for(i=0;i

{

for(j=0;j

{

if(i==0||j==0||i==H-1||j==W-1)

{

map[i][j] = '*';

}

else

{

map[i][j] = ' ';

}

}

}*/

//重繪蛇 for(i=0;i

{

if(i==0)//不同的蛇,身體不同便于區分 {

gotoxy(hOut,stu[i].a[0],stu[i].a[1]);

printf("");

for(j=0;j

{

gotoxy(hOut,stu[i].snake[j][1],stu[i].snake[j][2]);

if(j==0)

{

printf("○");

}

else

{

//if(stu[i].snake[j][0] == 1) break;//遇到頭停止繪制 printf("⊙");

}

}

gotoxy(hOut,stu[i].snake[j][1],stu[i].snake[j][2]);

printf("¤");

}

if(i==1)

{

gotoxy(hOut,stu[i].a[0],stu[i].a[1]);

printf("");

gotoxy(hOut,stu[i].snake[0][1],stu[i].snake[0][2]);

printf("○");

for(j=1;j

{

if(stu[i].snake[j][0] == 1) break;//遇到頭停止繪制 gotoxy(hOut,stu[i].snake[j][1],stu[i].snake[j][2]);

printf("⊙");

gotoxy(hOut,W,H);

}

gotoxy(hOut,stu[i].snake[j][1],stu[i].snake[j][2]);

printf("¤");

}

}

}

//判斷是否撞(墻、自己、其他玩家)(判定方式待優化)int ifBump(player stu[2],int number,int other)

{

int i,j;

if((stu[number].snake[stu[number].head][2]==0)||(stu[number].snake[stu[number].head][2]==H-1)||(stu[number].snake[stu[number].head][1]==0)||(stu[number].snake[stu[number].head][1]==W-1))

{//判斷是否與墻相撞 printf("sifa1");

return 1;

}

for(j=0;j

{//判斷是不是與自己相撞 if(stu[number].snake[j][1]==stu[number].snake[stu[number].head][1]&&stu[number].snake[number][2]==stu[number].snake[stu[number].head][2])

{

printf("sifa2");

return 1;

}

}

for(i=0;i

{//判斷是不是與別人的身體相撞 if(stu[other].snake[i][1]==stu[number].snake[stu[number].head][1]&&stu[other].snake[i][2]==stu[number].snake[stu[number].head][2])

{

printf("sifa3");

return 1;

}

}

if(stu[other].snake[stu[other].head][1]==stu[number].snake[stu[number].head][1]&&stu[other].snake[stu[other].head][2]==stu[number].snake[stu[number].head][2])

{//判斷是否與別人頭相撞 if(stu[number].head<=stu[other].head)

{

printf("sifa4");

return 1;

}

}

return 0;

}

void getKey(player stu[N])

{

char choice;

if (_kbhit())

{

choice = _getch();

}

switch(choice)

{

case 'H':

//case 'w'://用戶一按上鍵 if(stu[0].direct!=4)

{

stu[0].direct = 3;

}

break;

case 'P':

//case 's'://用戶一按下鍵 if(stu[0].direct!=3)

{

stu[0].direct = 4;

}

break;

case 'K':

//case 'a'://用戶一按左鍵 if(stu[0].direct!=2)

{

stu[0].direct = 1;

}

break;

case 'M':

//case 'd'://用戶一按右鍵 if(stu[0].direct!=1)

{

stu[0].direct = 2;

}

break;

case '5':

//case 'i'://用戶二按上鍵 if(stu[1].direct!=3)

{

stu[1].direct = 4;

}

break;

case '2':

//case 'k'://用戶二按下鍵 if(stu[1].direct!=4)

{

stu[1].direct = 3;

}

break;

case '4':

//case 'j'://用戶二按左鍵 if(stu[1].direct!=2)

{

stu[1].direct = 1;

}

break;

case '6':

//case 'l'://用戶二按右鍵 if(stu[1].direct!=1)

{

stu[1].direct = 2;

}

break;

}

}

//存檔void Leaderboard(player stu[N],char rank[7])

{

int i,j,temp;

char ch;

FILE*fp;

if((fp=fopen("排行榜.txt","r"))==NULL)

{

printf("讀取失敗!\n");

exit(0);

}

ch=fgetc(fp);

i=0;

while(ch!=EOF)

{

rank[i]=ch;

ch=fgetc(fp);

i++;

}

fclose(fp);

rank[6]=stu[0].head;

rank[5]=stu[1].head;

for(i=0;i<6;i++)

{

for(j=i+1;j<7;j++)

{

if(rank[i]

{

temp=rank[i];

rank[i]=rank[j];

rank[j]=temp;

}

}

}

if((fp=fopen("排行榜.txt","w"))==NULL)

{

printf("緩存失敗!\n");

exit(0);

}

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

{

fputc(rank[i],fp);

}

fclose(fp);

}

//判斷輸入是否合法char ifLegal(char a,int low,int high)

{

a=_getch();

while(a>high||a

{

a=_getch();

}

printf("%c",a);

return a;

}

int main()

{

int w;

char win;

HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);

char map[H][W];

int food[2];

char rank[7];

player stu[N];

int sign = 0;

food[0] = 2;

food[1] = 9;

//while(1)//{ init(map,stu);

make_frame();

makeMap(hOut,map,stu,food);

//showview(map);//繪制食物 gotoxy(hOut,food[0],food[1]);

printf("⊙");

while(1)

{

getKey(stu);

//system("cls"); Sleep(1000);

move(stu,0,food);

move(stu,1,food);

if (!food[0]&&!food[1])

{//食物已經被吃掉--重新生成食物 makeFood(food,stu);//生成食物坐標 gotoxy(hOut,food[0],food[1]);

printf("⊙");

}

//showview(map); if (ifBump(stu,0,1))

{

printf("游戲結束,玩家二勝\n");

sign = 2;

break;

}

if (ifBump(stu,1,0))

{

printf("游戲結束,玩家一勝\n");

sign = 1;

break;

}

makeMap(hOut,map,stu,food);

getKey(stu);

}

//Leaderboard(stu,rank); if(sign==1)

{

win='1';

}

else if(sign==2)

{

win='2';

}

//system("cls");//again(map,food,rank,stu,win);//} gotoxy(hOut,0,H+2);// return 0;

}

總結

以上是生活随笔為你收集整理的用c语言写双人贪吃蛇,试图写了一个双人贪吃蛇,结果蛇竖着跑正常,横着跑就只有头了,求解~...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。