本帖最后由 xiaojuan 于 2014-9-17 15:03 編輯
額,這個,今天感覺實在是太亂了,不知道從哪開始,先分割線調整下
——————————————————————————————————————————————
今天的貪吃蛇程序是這樣的吧,感覺還是喲個順序問題,開始程序是一條蛇在一個DOS中運行,然后開始寫多條,多條就是建立一個結構體,這樣就可以設置多個了,然后在考慮多畫幾個圖出來
——————————————————————————————————————————————game.c文件
#include<stdlib.h>
#include <windows.h>
#include <stdio.h>
#include <iostream>
// 自寫庫
# include "game.h"
int changeCursor(int nX, int nY)
{
COORD dwCursorPosition;
HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE); // hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
if (INVALID_HANDLE_VALUE == hOutput)
{
printf ("GetStdHandle error!\n");
return -1;
}
dwCursorPosition.X = nX; //列
dwCursorPosition.Y = nY; //行
if (!SetConsoleCursorPosition(hOutput, dwCursorPosition))//!給的很有味道
{
printf ("SetConsoleCursorPosition!\n");
return -1;
}
}
BOOL drawFrame(int nXStart, int nYStart, int nCol, int nRow) //設定所設的邊框的起始位置與邊框的大小
{
int nColindex = 0;
int nRowindex = 0;
if (nXStart % 2 == 1 || nCol%2 == 1) //因為我們采用的■是中文字符,中文字符占用兩個字節,所以要使初始位是偶數,結束位也是偶數
return FALSE;
if (!(nXStart >= 0 && nXStart + nCol <80 //!用的需要學下
&& nYStart >= 0 && nYStart + nRow <80)) //設定方塊起始位置與終止位置的所在的方框邊緣
return FALSE;
nCol /= 2;
changeCursor(nXStart, nYStart);
for (nColindex = 1; nColindex <= nCol; nColindex++)
printf ("¤");
printf ("\n");
changeCursor(nXStart + 5, nYStart + 3);
// printf ("guanguan a donkey");
for(nRowindex = 1; nRowindex <= nRow-2; nRowindex++)
{
changeCursor(nXStart , nYStart + nRowindex); //出位置
printf("¤");
changeCursor(nXStart+(nCol-1)*2, nYStart + nRowindex); //末位置
printf("¤");
}
changeCursor(nXStart, nYStart + nRow-1);
for (nColindex = 1; nColindex <= nCol; nColindex++)
printf ("¤");
printf ("\n");
}
// 設定邊框的大小 //
//不加typedef就是相當于給這個結構體起了個名字叫 g_frame;
typedef struct
{
int nLeft;
int nTop;
int nHeight;
int nWidth;
}StuFrame; //g開頭全局變量
//設定貪吃蛇的起始位置和蛇的大小 //
//typedef 是給一個變量從新起了個名字typedef long byte_4; 給已知數據類型long起個新名字,叫byte_4。
typedef struct StuPoint
{
int nX;
int nY;
} StuPoint;
typedef enum _EN_DIRECTION
{
EN_UP,
EN_DOWN,
EN_LEFT,
EN_RIGHT,
} EN_DIRECTION;
typedef struct _StuSnake
{
StuFrame frame;
StuPoint snake[100];
int nSnakeLen;
EN_DIRECTION enDirection;
BOOL bContinue;
} StuSnake;
StuSnake g_snake[10];
int g_nSnakeLen = 0;
BOOL init_snake(StuSnake *pSnake,
int nLeft, int nTop,
int nWidth, int nHeight)
{
(*pSnake).frame.nLeft = nLeft;
(*pSnake).frame.nTop = nTop;
(*pSnake).frame.nHeight = nHeight;
(*pSnake).frame.nWidth = nWidth;
//面述方格里面一共有多少格子
// StuPoint *matrixPoint = (StuPoint *)malloc(sizeof(g_frame.nHeight-2)*g_frame.nWidth-2));
drawFrame(nLeft, nTop,
nWidth, nHeight); //畫出格子
//初始化小蛇的位置
(*pSnake).nSnakeLen = 3;
(*pSnake).snake[0].nX = ((*pSnake).frame.nLeft+2) + 0*2;
(*pSnake).snake[0].nY = (*pSnake).frame.nTop + (*pSnake).frame.nHeight/2;
(*pSnake).snake[1].nX = ((*pSnake).frame.nLeft+2) + 1*2;
(*pSnake).snake[1].nY = (*pSnake).frame.nTop + (*pSnake).frame.nHeight/2;
(*pSnake).snake[2].nX = ((*pSnake).frame.nLeft+2) + 2*2;
(*pSnake).snake[2].nY = (*pSnake).frame.nTop + (*pSnake).frame.nHeight/2;
(*pSnake).bContinue = TRUE;
(*pSnake).enDirection = EN_RIGHT;
}
BOOL init()
{
//下面五個數據不再是全局變量,只能在這個地方在初始化
init_snake(&g_snake[0], 28, 5, 20, 9);
init_snake(&g_snake[1], 4, 2, 20, 9);
init_snake(&g_snake[2], 50, 12, 20, 9);
g_nSnakeLen = 3; //蛇的個數
// drawFrame(36,5,nCol,nRow); //畫出格子
return TRUE;
}
BOOL isContinue()
{
return g_snake[0].bContinue;
}
BOOL input( )
{
int nSnakeIndex = 0;
char c = '0';
if (kbhit())
c = getch ();
for (nSnakeIndex = 0; nSnakeIndex< g_nSnakeLen; nSnakeIndex++)
{
switch (c)
{
case 'w':
if (EN_UP == g_snake[nSnakeIndex].enDirection
|| EN_DOWN == g_snake[nSnakeIndex].enDirection) //在直線方向的時候按上下鍵沒有反應
break;
g_snake[nSnakeIndex].enDirection = EN_UP;
break;
case 's':
if (EN_UP == g_snake[nSnakeIndex].enDirection
|| EN_DOWN == g_snake[nSnakeIndex].enDirection) //在直線方向的時候按上下鍵沒有反應
break;
g_snake[nSnakeIndex].enDirection = EN_DOWN;
break;
case 'a':
if (EN_LEFT == g_snake[nSnakeIndex].enDirection
|| EN_RIGHT == g_snake[nSnakeIndex].enDirection) //在水平方向的時候按左右鍵沒有反應
break;
g_snake[nSnakeIndex].enDirection = EN_LEFT;
break;
case 'd':
if (EN_LEFT == g_snake[nSnakeIndex].enDirection
|| EN_RIGHT == g_snake[nSnakeIndex].enDirection) //在水平方向的時候按左右鍵沒有反應
break;
g_snake[nSnakeIndex].enDirection = EN_RIGHT;
break;
default:
break;
}
}
return TRUE;
}
BOOL clean()
{
int nSnakeIndex = 0;
int nIndex = 0;
for (nSnakeIndex = 0; nSnakeIndex< g_nSnakeLen; nSnakeIndex++)
{
for (nIndex = 0; nIndex < g_snake[nSnakeIndex].nSnakeLen; nIndex++)
{
changeCursor(g_snake[nSnakeIndex].snake[nIndex].nX, g_snake[nSnakeIndex].snake[nIndex].nY);
printf (" ");
}
}
return TRUE;
}
BOOL step()
{
int nIndex = 0;
int nSnakeIndex = 0;
for (nSnakeIndex = 0; nSnakeIndex< g_nSnakeLen; nSnakeIndex++)
{
for (nIndex = 0; nIndex < g_snake[nSnakeIndex].nSnakeLen-1; nIndex++)
{ //后一個坐標移到前一個坐標
g_snake[nSnakeIndex].snake[nIndex].nX = g_snake[nSnakeIndex].snake[nIndex+1].nX; //下標為1的坐標移到下標為0的坐標
g_snake[nSnakeIndex].snake[nIndex].nY = g_snake[nSnakeIndex].snake[nIndex+1].nY;
}
switch (g_snake[nSnakeIndex].enDirection)
{
case EN_UP:
g_snake[nSnakeIndex].snake[g_snake[nSnakeIndex].nSnakeLen - 1].nY -= 1;
break;
case EN_DOWN:
g_snake[nSnakeIndex].snake[g_snake[nSnakeIndex].nSnakeLen - 1].nY += 1;
break;
case EN_LEFT:
g_snake[nSnakeIndex].snake[g_snake[nSnakeIndex].nSnakeLen - 1].nX -= 2;
break;
case EN_RIGHT:
g_snake[nSnakeIndex].snake[g_snake[nSnakeIndex].nSnakeLen - 1].nX += 2;
break;
}
//touch frame 計算貌似還是有點問題
if (g_snake[nSnakeIndex].snake[g_snake[nSnakeIndex].nSnakeLen - 1].nY >= g_snake[nSnakeIndex].frame.nTop + g_snake[nSnakeIndex].frame.nHeight-1
||g_snake[nSnakeIndex].snake[g_snake[nSnakeIndex].nSnakeLen - 1].nY < g_snake[nSnakeIndex].frame.nTop
||g_snake[nSnakeIndex].snake[g_snake[nSnakeIndex].nSnakeLen - 1].nX > g_snake[nSnakeIndex].frame.nLeft + g_snake[nSnakeIndex].frame.nWidth - 2
||g_snake[nSnakeIndex].snake[g_snake[nSnakeIndex].nSnakeLen - 1].nX < g_snake[nSnakeIndex].frame.nLeft)
{
g_snake[nSnakeIndex].bContinue = FALSE;
// changeCursor(14, 12);
printf ("YOU ARE LOST");
// init ();
// printf ("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
// return FALSE;
}
}
return TRUE;
}
BOOL draw()
{
int nIndex = 0;
int nSnakeIndex = 0;
for (nSnakeIndex = 0; nSnakeIndex< g_nSnakeLen; nSnakeIndex++)
{
for (nIndex = 0; nIndex < g_snake[nSnakeIndex].nSnakeLen; nIndex++)
{
changeCursor(g_snake[nSnakeIndex].snake[nIndex].nX, g_snake[nSnakeIndex].snake[nIndex].nY);
printf ("■");
}
}
return TRUE;
}
|