<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
本文範例為大家分享了C語言製作貪吃蛇小遊戲的具體程式碼,供大家參考,具體內容如下
直接上程式碼
#include <stdio.h> #include <stdlib.h> #include <math.h> #include <conio.h> #include <time.h> #include <windows.h> //MAXWIDTH、MAXHEIGHT、INITLEN 以字元記 #define MAXWIDTH (30) #define MAXHEIGHT MAXWIDTH #define INITLEN (3) //貪吃蛇的初始長度 //程式中用到的各種字元,以及它們的顏色和型別(以數位表示) struct{ char *ch; int color; char type; } charBorder = {"□", 4, 1}, //邊框 charBg = {"■", 2, 2}, //背景 charSnake = {"★", 0xe, 3}, //貪吃蛇節點 charFood = {"●", 0xc, 4}; //食物 //用一個結構體陣列儲存地圖中的各個點 struct{ char type; int index; }globalMap[MAXWIDTH][MAXHEIGHT]; //貪吃蛇有效活動範圍地圖的索引 struct{ int x; int y; } snakeMap[ (MAXWIDTH-2)*(MAXHEIGHT-2) ], scoresPostion; int scores = 0; //得分 int snakeMapLen = (MAXWIDTH-2)*(MAXHEIGHT-2); int headerIndex, tailIndex; //蛇頭蛇尾對應的snakeMap中的索引(下標) HANDLE hStdin; //控制檯控制程式碼 // 設定遊標位置,x為行,y為列 void setPosition(int x, int y){ COORD coord; coord.X = 2*y; coord.Y = x; SetConsoleCursorPosition(hStdin, coord); } // 設定顏色 void setColor(int color){ SetConsoleTextAttribute(hStdin, color); } //建立食物 void createFood(){ int index, rang, x, y; //產生亂數,確定 snakeMap 陣列的索引 srand((unsigned)time(NULL)); if(tailIndex<headerIndex){ rang = headerIndex-tailIndex-1; index = rand()%rang + tailIndex + 1; }else{ rang = snakeMapLen - (tailIndex - headerIndex+1); index = rand()%rang; if(index>=headerIndex){ index += (tailIndex-headerIndex+1); } } x = snakeMap[index].x; y = snakeMap[index].y; setPosition(x, y); setColor(charFood.color); printf("%s", charFood.ch); globalMap[x][y].type=charFood.type; } //死掉 void die(){ int xCenter = MAXHEIGHT%2==0 ? MAXHEIGHT/2 : MAXHEIGHT/2+1; int yCenter = MAXWIDTH%2==0 ? MAXWIDTH/2 : MAXWIDTH/2+1; setPosition(xCenter, yCenter-5); setColor(0xC); printf("You die! Game Over!"); getch(); exit(0); } // 蛇移動 void move(char direction){ int newHeaderX, newHeaderY; //新蛇頭的座標 int newHeaderPreIndex; //新蛇頭座標以前對應的索引 int newHeaderPreX, newHeaderPreY; //新蛇頭的索引以前對應的座標 int newHeaderPreType; //新蛇頭以前的型別 int oldTailX, oldTailY; //老蛇尾座標 // ----------------------------------------------- //新蛇頭的座標 switch(direction){ case 'w': newHeaderX = snakeMap[headerIndex].x-1; newHeaderY = snakeMap[headerIndex].y; break; case 's': newHeaderX = snakeMap[headerIndex].x+1; newHeaderY = snakeMap[headerIndex].y; break; case 'a': newHeaderX = snakeMap[headerIndex].x; newHeaderY = snakeMap[headerIndex].y-1; break; case 'd': newHeaderX = snakeMap[headerIndex].x; newHeaderY = snakeMap[headerIndex].y+1; break; } //新蛇頭的索引 headerIndex = headerIndex==0 ? snakeMapLen-1 : headerIndex-1; // ----------------------------------------------- //新蛇頭座標以前對應的索引 newHeaderPreIndex = globalMap[newHeaderX][newHeaderY].index; //新蛇頭的索引以前對應的座標 newHeaderPreX = snakeMap[headerIndex].x; newHeaderPreY = snakeMap[headerIndex].y; //雙向繫結新蛇頭索引與座標的對應關係 snakeMap[headerIndex].x = newHeaderX; snakeMap[headerIndex].y = newHeaderY; globalMap[newHeaderX][newHeaderY].index = headerIndex; //雙向繫結以前的索引與座標的對應關係 snakeMap[newHeaderPreIndex].x = newHeaderPreX; snakeMap[newHeaderPreIndex].y = newHeaderPreY; globalMap[newHeaderPreX][newHeaderPreY].index = newHeaderPreIndex; //新蛇頭以前的型別 newHeaderPreType = globalMap[newHeaderX][newHeaderY].type; //設定新蛇頭型別 globalMap[newHeaderX][newHeaderY].type = charSnake.type; // 判斷是否出界或撞到自己 if(newHeaderPreType==charBorder.type || newHeaderPreType==charSnake.type ){ die(); } //輸出新蛇頭 setPosition(newHeaderX, newHeaderY); setColor(charSnake.color); printf("%s", charSnake.ch); //判斷是否吃到食物 if(newHeaderPreType==charFood.type){ //吃到食物 createFood(); //更改分數 setPosition(scoresPostion.x, scoresPostion.y); printf("%d", ++scores); }else{ //老蛇尾座標 oldTailX = snakeMap[tailIndex].x; oldTailY = snakeMap[tailIndex].y; //刪除蛇尾 setPosition(oldTailX, oldTailY); setColor(charBg.color); printf("%s", charBg.ch); globalMap[oldTailX][oldTailY].type = charBg.type; tailIndex = (tailIndex==0) ? snakeMapLen-1 : tailIndex-1; } } //下次移動的方向 char nextDirection(char ch, char directionOld){ int sum = ch+directionOld; ch = tolower(ch); if( (ch=='w' || ch=='a' || ch=='s' || ch=='d') && sum!=197 && sum!=234 ){ return ch; }else{ return directionOld; } } //暫停 char pause(){ return getch(); } // 初始化 void init(){ // 設定相關變數 int x, y, i, index; int xCenter = MAXHEIGHT%2==0 ? MAXHEIGHT/2 : MAXHEIGHT/2+1; int yCenter = MAXWIDTH%2==0 ? MAXWIDTH/2 : MAXWIDTH/2+1; CONSOLE_CURSOR_INFO cci; //控制檯遊標資訊 //判斷相關設定是否合理 if(MAXWIDTH<16){ printf("'MAXWIDTH' is too small!"); getch(); exit(0); } //設定視窗大小 system("mode con: cols=96 lines=32"); //隱藏遊標 hStdin = GetStdHandle(STD_OUTPUT_HANDLE); GetConsoleCursorInfo(hStdin, &cci); cci.bVisible = 0; SetConsoleCursorInfo(hStdin, &cci); //列印背景 for(x=0; x<MAXHEIGHT; x++){ for(y=0; y<MAXWIDTH; y++){ if(y==0 || y==MAXWIDTH-1 || x==0 || x==MAXHEIGHT-1){ globalMap[x][y].type = charBorder.type; setColor(charBorder.color); printf("%s", charBorder.ch); }else{ index = (x-1)*(MAXWIDTH-2)+(y-1); snakeMap[index].x= x; snakeMap[index].y= y; globalMap[x][y].type = charBg.type; globalMap[x][y].index = index; setColor(charBg.color); printf("%s", charBg.ch); } } printf("n"); } //初始化貪吃蛇 globalMap[xCenter][yCenter-1].type = globalMap[xCenter][yCenter].type = globalMap[xCenter][yCenter+1].type = charSnake.type; headerIndex = (xCenter-1)*(MAXWIDTH-2)+(yCenter-1) - 1; tailIndex = headerIndex+2; setPosition(xCenter, yCenter-1); setColor(charSnake.color); for(y = yCenter-1; y<=yCenter+1; y++){ printf("%s", charSnake.ch); } //生成食物 createFood(); //設定程式資訊 setPosition(xCenter-1, MAXWIDTH+2); printf(" Apples : 0"); setPosition(xCenter, MAXWIDTH+2); printf(" Author : xiao p"); setPosition(xCenter+1, MAXWIDTH+2); printf("Copyright : c.biancheng.net"); scoresPostion.x = xCenter-1; scoresPostion.y = MAXWIDTH+8; } int main(){ char charInput, direction = 'a'; init(); charInput = tolower(getch()); direction = nextDirection(charInput, direction); while(1){ if(kbhit()){ charInput = tolower(getch()); if(charInput == ' '){ charInput = pause(); } direction = nextDirection(charInput, direction); } move(direction); Sleep(500); } getch(); return 0; }
【操作過程】
編譯執行後,先按enter鍵使遊戲開始,然後w,s a d 分別控制上下左右移動
【執行展示】
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45