先來說一下基本的思路,希望對各位有所幫助吧,項目編程思路很重要,這個是必須的。先了解一下貪吃蛇由哪些部分組成吧。由C語言寫出來的貪吃蛇然後再加上圖形庫,配上音樂也不錯了哈,寫程序項目的話不要太死板,要更靈活。
貪吃蛇有幾個組成部分:
第一:按鍵的控制,推薦用中斷的方式;
第二:蛇,這是難點,首先蛇是分節的,要注意蛇的變化規律,一次只變化一節,
後節依次變化到前節的位置,所以才會出現蛇頭碰蛇身的問題,相信大家都玩過。
第三:小球,每次碰到後,小球會出現在框內任一隨機的位置。
初次之外,還有邊框,這個簡單;
蛇的速度,筆者是靠延遲和蛇一次移動的距離配合著來控制的,但是限於目前的水平,筆者蛇一次移動的距離,
至少大於等於一節蛇身的直徑,筆者的蛇是用小球所組成的;
蛇每次碰壁或者碰著自己後,要從新開始或者顯示GAME OVER什麼的都行,再多些的就自由發揮吧。
下面給出一下程序,去運行吧。
#include "game.h"
//主函數
int main()
{
GameInit(); //初始化的函數.
//按鍵控制 不按鍵->移動循環 按鍵-->退出移動循環-->改變方向-->回到移動循環
while (1)
{
while (!kbhit()) //kbhit(檢測鍵盤是否有消息) getch conio.h
{
if (food.flag == 0)
FoodCoor();
Sleep(100);
cleardevice();
FoodPaint();
SnakePaint();
SnakeMove();
EatFood();
GameBreak();
}
ChangeSnakeCh();
}
getchar();
return 0;
}
//遊戲初始化
void GameInit()
{
//打開一個窗口
initgraph(640, 480);
srand((unsigned int)time(NULL));
mciSendString(L"open ./res/明天你好.mp3 alias gebilaowang",0,0,0);
mciSendString(L"play gebilaowang repeat", 0, 0, 0);
//設置背景顏色 顏色的三基色 紅R 綠G 藍B
setbkcolor(RGB(220,120,150)); //set bk color
cleardevice(); //使用設置好的背景顏色刷新屏幕 system("cls")
//初始化一條小蛇
rectangle(0, 0, 10, 10);
//蛇的結構初始化
snake.scr[0].x = 0;//蛇頭的x初始化為0
snake.scr[0].y = 0;
snake.n = 1;//當前有一節蛇
snake.ch = down;//方向往右
food.flag = 0; //食物初始化被吃掉的
}
//繪製蛇
void SnakePaint()
{
//n節蛇 最大的下標是多少? n-1 100
for (int i = snake.n - 1; i >= 0; i--)
{
rectangle(snake.scr[i].x, snake.scr[i].y, snake.scr[i].x + 10, snake.scr[i].y + 10);
}
}
//right 往右走 n節蛇 C C++ win32
void SnakeMove()
{
for (int i = snake.n - 1; i > 0; i--)
{
snake.scr[i].x = snake.scr[i - 1].x;
snake.scr[i].y = snake.scr[i - 1].y;
}
switch (snake.ch)
{
case up:
snake.scr[0].y -= 10;
break;
case down:
snake.scr[0].y += 10;
break;
case left:
snake.scr[0].x -= 10;
break;
case right:
snake.scr[0].x += 10;
break;
}
}
//人來控制 檢測到按鍵getchar getch
//通過不同的按鍵(分支結構 switch if)
// snake.scr[0].ch
void ChangeSnakeCh()
{
//鍵值 wasd 上下左右(鍵值!=ASCII)
//上 72 下80 左75 右77
int move;
move = getch(); //頭文件 conio.h
switch(move)
{
case 72: //up
if(snake.ch!=down)
snake.ch = up;
break;
case 80: //down
if (snake.ch != up)
snake.ch = down;
break;
case 75:
if (snake.ch != right)
snake.ch = left;
break;
case 77:
if (snake.ch != left)
snake.ch = right;
break;
}
}
void FoodCoor()
{
food.fsr.x = rand()%64*10; //0 10 20 30 40 50 ... 630 0-630-63 *10
food.fsr.y = rand() % 48*10; //0 10 20 30... 470 0-470-47 *10
food.flag = 1; //食物沒有被吃
}
void FoodPaint()
{
roundrect(food.fsr.x, food.fsr.y, food.fsr.x + 10, food.fsr.y+10, 10, 10);
}
void EatFood()
{
if (snake.scr[0].x == food.fsr.x&&snake.scr[0].y == food.fsr.y)
{
snake.n++;
food.flag = 0;
}
}
//判斷遊戲退出
void GameBreak()
{
//撞牆
if (snake.scr[0].y < -1 || snake.scr[0].y>471 || snake.scr[0].x < -1 || snake.scr[0].x>631)
{
//退出
OverGame();
}
for (int i = snake.n - 1; i > 0; i--)
{
if (snake.scr[0].x == snake.scr[i].x&&snake.scr[0].y == snake.scr[i].y)
{
//退出
OverGame();
}
}
}
void OverGame()
{
cleardevice();
outtextxy(300, 200, L"game over");
getch();
closegraph();
}
全部的代碼發出來了,希望對各位有所幫助,照抄自然是不可能的,希望看了對於有C語言基礎的各位有所幫助吧,自然這還只是一個小的項目,有基礎的話,可以建議加下我的群368282579,群內有各種項目資源,沒基礎的自然也是可以加的哈,基本的C語言資源,沒基礎的也可以學習的,要學的話編程這條路不單單是隻努力還得堅持,兩者具備才行的哈。
閱讀更多 java架構社區 的文章