1. 程式人生 > >貪吃蛇小遊戲

貪吃蛇小遊戲

C/C++

MOVE__BOX部分:代碼如下
#include<iostream>
#include<Windows.h>
#include <conio.h>
using namespace std;
void PutPlace(int x,int y);//設定輸出位置
void color(int a);//設定輸出顏色
//設定輸出位置
void PutPlace(int x, int y)
{
COORD Box;
Box.X=x-1;
Box.Y=y-1;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Box);
}
//設定輸出顏色
void color(int a)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), a);
}
class Move_Box{
int range[20][20];
int Box_X;//箱子橫坐標
int Box_Y;//箱子縱坐標

int Old_X;//記錄上次box的坐標
int Old_Y;

public:
Move_Box();//構造函數
~Move_Box();//析構函數
void Display();//顯示遊戲畫面
void Left();//向左移動
void Right();//向右移動
void Up();//向上移動
void Down();//向下移動
void Playgame();//開始遊戲

};
Move_Box::Move_Box()//初始化參數
{
for(int i=0;i<20;i++)//初始化20*20方格
{
for(int j=0;j<20;j++)
{
range[i][j]=0;
}
}
Box_X=10;
Box_Y=10;
range[Box_X][Box_Y]=1;
}
Move_Box::~Move_Box(){}
//顯示畫面
void Move_Box::Display()
{
system("mode con cols=44 lines=25");
//system("color 5f");
PutPlace(1,1);
color(4);
for(int i=0;i<22;i++)
cout<<"■";
PutPlace(1,2);
for(int i=0;i<20;i++)
{
cout<<"■";
for(int j=0;j<20;j++)
{
switch(range[i][j])
{
case 0:cout<<" ";break;
case 1:color(10); cout<<"●"; break;
}
}color(4);
cout<<"■"<<endl;
}
for(int i=0;i<22;i++)
{
cout<<"■";
}
color(4);
}
//向左移動
void Move_Box::Left()
{
//記錄上次坐標並將range[][]記為0
Old_X=Box_X;
Old_Y=Box_Y;
range[Old_X][Old_Y]=0;
//
Box_X=Box_X;
Box_Y=Box_Y-1;
range[Box_X][Box_Y]=1;
//PutPlace(Box_X,Box_Y);cout<<"●";
Display();
}
//向右移動
void Move_Box::Right()
{
//記錄上次坐標並將range[][]記為0
Old_X=Box_X;
Old_Y=Box_Y;
range[Old_X][Old_Y]=0;
//
Box_X=Box_X;
Box_Y=Box_Y+1;
range[Box_X][Box_Y]=1;
Display();
}
//向上移動
void Move_Box::Up()
{
//記錄上次坐標並將range[][]記為0
Old_X=Box_X;
Old_Y=Box_Y;
range[Old_X][Old_Y]=0;
//
Box_X=Box_X-1;
Box_Y=Box_Y;
range[Box_X][Box_Y]=1;
Display();
}
//向下移動
void Move_Box::Down()
{
//記錄上次坐標並將range[][]記為0
Old_X=Box_X;
Old_Y=Box_Y;
range[Old_X][Old_Y]=0;
//
Box_X=Box_X+1;
Box_Y=Box_Y;
range[Box_X][Box_Y]=1;
Display();
}
//開始遊戲
void Move_Box::Playgame()
{
char input;
Display();
LOGO:input=getch();
//getch(input);
switch(input)
{
case ‘4‘: Left();break;
case ‘6‘: Right();break;
case ‘8‘:Up();break;
case ‘2‘:Down();break;
}
if(range[Box_X][Box_Y]!=0)
{
goto LOGO;
}
else
cout<<"GAME OVER";
//cout<<Box_X<<" "<<Box_Y<<endl;
}
void main()
{
Move_Box Melody;
//Melody.Display();
Melody.Playgame();
system("pause");

}

SNAKE部分:代碼如下
#include <stdio.h>
#include <windows.h>
#include <time.h>
#include <conio.h>
#include <iostream>
using namespace std;

//-------------------------------------------------------------------
void GotoXY(int x, int y) //設定輸出位置
{
COORD color;
color.X = x-1;
color.Y = y-1;
SetConsoleCursorPosition (GetStdHandle(STD_OUTPUT_HANDLE), color);
}
//-----------------------------------------------------------------
void color(int a) //顏色函數
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),a);
}
struct HeroList
{
char Name[10];
int Highscore;
}Hero[10];
//----------------------------------------------------------
void Save() //存儲最高分及名字
{
FILE *fp;
if((fp=fopen("Hero_list","wb"))==NULL)
{cout<<"can not open file!"<<endl;return;}
if(fwrite(&Hero[0],sizeof(struct HeroList),1,fp)!=1)
cout<<"file write error!"<<endl;
fclose(fp);
}
//**
class CSnake
{
int image[20][20]; //遊戲面板,即小蛇活動範圍
int FoodX; //事物出現的X坐標
int FoodY; //事物出現的Y坐標
int snakeX; //記錄小蛇的頭部X坐標
int snakeY; //記錄小蛇的頭部Y坐標
int head; //小蛇頭部下標
int tail; //小蛇尾部下標
int snake[2][2000]; //記錄小蛇所有身體的坐標
int node; //小蛇的節數
int direction; //小蛇頭部的方向
int i,j;
int gamespeed; //速度
int score; //記錄分數
char arrowKey; //接受按鍵的變量
int GameOver; //使遊戲結束的變量
int level; //設置等級
int length; //為了設置等級而與node一樣記錄設的長度
public:

CSnake()        //構造函數初始化部分變量
{
    head=3;                //初始化頭部下標
    tail=0;                //初始化尾部下標
    node=4;                //小蛇初始節數為4節
    gamespeed=300;         //遊戲速度(移動的間隔時間)
    score=0;               //初始化分數為0
    direction=6;           //小蛇的初始方向向右
    GameOver=0;            //進入遊戲初始化為0
    level=1;
    length=4;
}
~CSnake()     //析構函數
{}  
void Init();                //初始化遊戲面板及小蛇的坐標
int  DrawSnake();           //記錄小蛇每次移動後頭部及身體的下一坐標
void  Automove();            //使小蛇自動移動
int  Gameover();            //判斷遊戲是否結束
int  Generatefood();        //產生食物
void display();             //顯示遊戲面板
void shiftLeft();           //控制左移
void shiftRight();          //控制右移
void shiftDown();           //控制下移
void shiftUp();             //控制上移
int  PlayGame();            //執行遊戲的函數
void Setspeed();            //設置速度
int Pause();                //遊戲的暫停

};
//-------------------------------------- -------------------------------
void CSnake::Init() //初始化部分數據
{

for(i=0;i<20;i++) //初始化遊戲面板
for(j=0;j<20;j++)
image[i][j]=0;
for(i=0;i<4;i++) //初始化小蛇初始位置
{ snake[0][i]=1;
snake[1][i]=i+1;
}
for(i=1;i<=3;i++) //初始化小蛇坐標的顯示值(即初始化小蛇顯示圖形對應的值)
image[1][i]=3;
image[1][4]=1;
}
//---------------------------------------------------------------
int CSnake::Gameover() //判斷遊戲是否結束
{
if(snakeX<0 || snakeX>19 ||snakeY<0 || snakeY>19) // 碰到墻壁遊戲結束
{
GotoXY(1,25);
cout << "Game over!" << endl;
GameOver=1;
return GameOver;
}
if((image[snakeX][snakeY]!=0)&&!(snakeX==FoodX&&snakeY==FoodY)) //蛇頭碰到蛇身遊戲結束
{
GotoXY(1,25);
cout << "Game over!" << endl;
GameOver=1;
return GameOver;
}
return 0;
}
//----------------------------------------------------------------
int CSnake::DrawSnake()
{ if(snakeX==FoodX && snakeY==FoodY) //若小蛇頭部坐標與食物坐標重疊則吃掉食物
{
node++; // 小蛇節數增一
score+=10; //分數增加
length++;
if(length>=8) //當小蛇增長到8個時,等級加一
{length-=8;
level++;}
image[snakeX][snakeY]=1; //小蛇頭部移動的下一位置頭部圖像對應的值賦給圖像
image[snake[0][head]][snake[1][head]] = 3; //小蛇頭部其後緊跟的身體一格移動的下一位置頭部圖像對應的值賦給圖像
head=(head+1)%10000;
snake[0][head] = snakeX; //將小蛇頭部此時的坐標值賦給記錄頭部坐標的snake[0][head]
snake[1][head] = snakeY;
Generatefood(); //吃掉食物後再次隨機分布食物
display(); //刷新顯示

  }
 else
 {                                                                    //沒有吃食物
  image[snake[0][tail]][snake[1][tail]]=0;                            //擦去小蛇尾部
  tail=(tail+1)%10000;                                                
  image[snake[0][head]][snake[1][head]]=3;                            //小蛇頭部其後緊跟的身體一格移動的下一位置頭部圖像對應的值賦給圖像
  head=(head+1)%10000;
  snake[0][head]=snakeX;                                              //將小蛇頭部此時的坐標值賦給記錄頭部坐標的snake[0][head]
  snake[1][head]=snakeY;
  image[snake[0][head]][snake[1][head]]=1;                            //小蛇頭部移動的下一位置頭部圖像對應的值賦給圖像
  display(); 
  }

return 0;
}
//-----------------------------------------------------------
void CSnake::shiftLeft() //左移則小蛇蛇頭方向向左
{
direction=4;
}
//++++++++++++++++++++++++++
void CSnake::shiftRight() //右移則小蛇蛇頭方向向右
{
direction=6;
}
//+++++++++++++++++++++++++++
void CSnake::shiftUp() //上移則小蛇蛇頭方向向上
{
direction=8;
}
//+++++++++++++++++++++++++++
void CSnake::shiftDown() //下移則小蛇蛇頭方向向下
{
direction=2;
}
//------------------------------------------------------
void CSnake::Automove()
{
switch(direction)
{
case 6:snakeX= snake[0][head]; snakeY= snake[1][head]+1;break; //接收到向右的信息小蛇頭部Y坐標加一,X坐標不變並賦給記錄頭部坐標的變量
case 4:snakeX= snake[0][head]; snakeY= snake[1][head]-1;break; //接收到向左的信息小蛇頭部Y坐標減一,X坐標不變並賦給記錄頭部坐標的變量
case 8:snakeX= snake[0][head]-1; snakeY= snake[1][head];break; //接收到向上的信息小蛇頭部X坐標加一,Y坐標不變並賦給記錄頭部坐標的變量
case 2:snakeX= snake[0][head]+1; snakeY= snake[1][head];break; //接收到向下的信息小蛇頭部X坐標加一,Y坐標不變並賦給記錄頭部坐標的變量
default:;
}
}
//---------------------------------------------------------------------
int CSnake::Generatefood() // 產生食物
{
srand(time(0)); //以時間為種子生成隨機序列
do{
FoodX=rand()%20; //食物輸出的X坐標
FoodY=rand()%20; //食物輸出的Y坐標
}while(image[FoodX][FoodY]!=0); //產生的食物坐標限定在遊戲面板內,且食物坐標不與小蛇身體坐標重合
image[FoodX][FoodY]=2;
return image[FoodX][FoodY];
}
//----------------------------------------------------------------
void CSnake::display() // 顯示遊戲面板(包括圍墻、食物及小蛇)
{
color(10);
GotoXY(1,1);
for(i=0;i<22;i++)
printf("■");
GotoXY(1,2);
for(i=0;i<20;i++)
{ color(10);
printf("■");
for(j=0;j<20;j++)
{
switch(image[i][j])
{
case 0:color(15);printf(" ");break;
case 1:color(11);printf("●");break;
case 2:color(12);printf("●");break;
case 3:color(13);printf("●");break;
}
} color(10);
printf("■\n");
}
color(10);
for(i=0;i<22;i++)
printf("■"); color(13);
GotoXY(46,9); printf("SCORE:%d",score); //記錄分數
GotoXY(46,10); printf("LEVEL=%d",level); //記錄等級
}
//----------------------------------------------------
void CSnake::Setspeed() //設置小蛇移動的速度
{
int Esc=0;
while(!Esc)
{
int speed;
color(12);
cout<<"1.Very Slow 2.Slow 3.Normal 4.Fast 5.Very Fast "<<endl;
cout<<"請輸入您的選擇:";
cin>>speed;
switch(speed)
{
case 0:
Esc=1;
gamespeed=300;
break;
case 1:
gamespeed=300;
Esc=1;
break;
case 2:
gamespeed=200;
Esc=1;
break;
case 3:
gamespeed=80;
Esc=1;
break;
case 4:
gamespeed=30;
Esc=1;
break;
case 5:
gamespeed=12;
Esc=1;
break;
}
}
}
//-----------------------------------------------------------
int CSnake::Pause() //暫停功能
{
char c;
// GotoXY(1,25);printf("Pause! ");
do
{c=getch();}
while(c!=‘p‘);
arrowKey=0;
return arrowKey;
}
//--------------------------------------------
//**
int CSnake::PlayGame() //執行遊戲函數
{
Init(); //初始化數據
Generatefood(); //產生食物
display(); //顯示遊戲面板
while (!GameOver)
{
if(kbhit()) //接受按鍵
{
arrowKey = getch();
}
if(direction==2||direction==8) //當小蛇的頭部移動方向為上下時,左右鍵才起作用
{
switch(arrowKey)
{
case‘6‘:shiftRight();break;
case‘4‘:shiftLeft();break;
case‘e‘:exit(1);break;
case‘p‘:Pause();break;
default:break;
}
}
else if(direction==4||direction==6) //當小蛇的頭部移動方向為左右時,上下鍵才起作用
{
switch(arrowKey)
{
case‘8‘:shiftUp();break;
case‘5‘:shiftDown();break;
case‘e‘:exit(1);break;
case‘p‘:Pause();break;
default:break;
}
}
Sleep(gamespeed); //小蛇移動一格的速度
Automove(); // 校舍自動移動
Gameover(); //判斷遊戲是否結束
if(GameOver==1) //若遊戲結束,則直接跳出循環
break;
DrawSnake(); //判斷是否吃食物
display(); //顯示遊戲面板
}
Hero[0].Highscore=score;
getch();
return 0;
}
//**
void Welcome(void) //歡迎界面
{
printf(" \n");color(13);
printf("$~~~~~~~~~~~~~~$\n");
printf("$ $\n");
printf("$ $\n");
printf("$ ■■■■■ ■■ ■■ ■■■■■■ ■■■■ ■■$\n");
printf("$■■■■■■■ ■■ ■■ ■■■■■■ ■■■■■ ■■$\n");
printf("$■■■ ■■■ ■■ ■■ ■■ ■■ ■■ ■■$\n");
printf("$■■■ ■■ ■■ ■■ ■■ ■■ ■■$\n");
printf("$ ■■■■ ■■ ■■ ■■■■■■ ■■ ■■ ■■$\n");
printf("$ ■■■■■ ■■ ■■ ■■■■■■ ■■ ■■ ■■$\n");
printf("$ ■■■ ■■ ■■ ■■ ■■ ■■ ■■$\n");
printf("$■■■ ■■■ ■■ ■■ ■■ ■■ ■■ ■■$\n");
printf("$■■■■■■■ ■■ ■■■■■■ ■■■■■■ ■■ ■■■■$\n");
printf("$ ■■■■■ ■■ ■■■■■■ ■■■■■■ ■■ ■■■$\n");
printf("$ $\n");
printf("$ $\n");color(13);
printf("$
~~~~~~~~~~~~~~$\n");
printf("[上移:8 ;下移:5 ;左移:4 ;右移:6 ; 暫停:P; 退出:E]\n");
system("pause");
system("cls");
}

//----------------------------------------------
////////////////////////////////////////////////////////////////////////////////////////////////////
void main() //主函數
{
CSnake SNAKE;
char Name[10]=" ";
// int Highscore=0;
char ch;
char Get=0;
// int i;
Welcome();
while(1)
{
color(14); // 主界面
cout<<" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ "<<endl;
cout<<" ----- - - - - - - ---- "<<endl;
cout<<" $ ▁▁▁▁▁▁▁▁▁▁▁▁▁▁ $ "<<endl;
cout<<" $ ▏ ▏ $ "<<endl;
cout<<" $ ▏ 1.開始遊戲 ▏ $ "<<endl;
cout<<" $ ▏ 2.設置速度 ▏ $ "<<endl;
cout<<" $ ▏ 3.使用說明 ▏ $ "<<endl;
cout<<" $ ▏ 4.英雄榜 ▏ $ "<<endl;
cout<<" $ ▏ 5.退出 ▏ $ "<<endl;
cout<<" $ ▏ ▏ $ "<<endl;
cout<<" $ ▔▔▔▔▔▔▔▔▔▔▔▔▔▔ $ "<<endl;
cout<<" -----
- - - - - - ---- "<<endl;
cout<<" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ "<<endl;
cin>>ch;

    if(ch==‘1‘)
    {   
        system("cls");
        SNAKE.PlayGame();
        system("cls");
        if(Hero[0].Highscore<100)
        {cout<<"您還需努力喲!"<<endl;cout<<endl;}
        else if(400>Hero[0].Highscore&&Hero[0].Highscore>200)
        {cout<<"您一定是高手!"<<endl;cout<<endl;}
        else if(600>Hero[0].Highscore&&Hero[0].Highscore>400)
        {   cout<<"您實在太厲害了!"<<endl;cout<<endl;}
        else
        {   cout<<"您一定是骨灰級玩家!佩服!佩服!"<<endl;cout<<endl;}
        if(Hero[0].Highscore>200)
        {
        cout<<"請輸入您的大名:";
        cin>>Hero[0].Name;          
        Save();     
        }
        system("pause");
        system("cls");  
        break;
    }
    else if(ch==‘2‘)
    {
        system("cls");
        SNAKE.Setspeed();
        system("pause");
        system("cls");
        continue;
    }
    else if(ch==‘3‘)                                               //詳細使用說明
    {
        system("cls");
        cout<<"                                                    "<<endl;
        cout<<"                                                    "<<endl;color(14);
        cout<<"    *********************************************** "<<endl;color(12);
        cout<<"    *   上移:8 ;       左移:4 ;    暫停:P      * "<<endl;
        cout<<"    *   下移:5 ;       右移:6 ;    退出:E      * "<<endl;color(14); 
        cout<<"    *********************************************** "<<endl;color(12);
        cout<<"    $        按相應的鍵可以控制小蛇的移動!        $ "<<endl;
        cout<<"    $         通過控制小蛇的移動來吃食物!        $ "<<endl;
        cout<<"    $當小蛇的頭部撞到墻壁或自己的身體時,遊戲結束!$ "<<endl;color(14);
        cout<<"    #-------------------------------------------- # "<<endl;
        cout<<"    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "<<endl;
        cout<<"                                                    "<<endl;
        cout<<"                                                    "<<endl;
        system("pause");
        system("cls");
        continue;
    }
    else if(ch==‘4‘)                                             // 記錄最高分,顯示英雄榜
    {
        system("cls");
        color(10);
        FILE *fp;
        fp=fopen("Hero_list","rb");
        fread(&Hero[0],sizeof(struct HeroList),1,fp);
        cout<<"$#######_---   英雄榜:  ---_#######$"<<endl;
        cout<<"               名字:"<<Hero[0].Name<<endl;
        cout<<"               最高分:"<<Hero[0].Highscore<<endl;
        cout<<"--------------------------------------------"<<endl;
        fclose(fp);
        system("pause");
        system("cls");          
        continue;
    }
    else if(ch==‘5‘)
    {
        system("cls");
        exit(0);
    }
    else
    {
        system("cls");
        cout<<"請重新輸入!"<<endl;   
        continue;
    }
}   

}

貪吃蛇小遊戲