C語言/C++編程基礎入門經典小游戲坦克大戰

C語言是面向過程的,而C++是面向對象的

C和C++的區別:

C是一個結構化語言,它的重點在于算法和數據結構。C程序的設計首要考慮的是如何通過一個過程,對輸入(或環境條件)進行運算處理得到輸出(或實現過程(事務)控制)。

C++,首要考慮的是如何構造一個對象模型,讓這個模型能夠契合與之對應的問題域,這樣就可以通過獲取對象的狀態信息得到輸出或實現過程(事務)控制。 所以C與C++的最大區別在于它們的用于解決問題的思想方法不一樣。之所以說C++比C更先進,是因為“ 設計這個概念已經被融入到C++之中 ”。


C與C++的最大區別:在于它們的用于解決問題的思想方法不一樣。之所以說C++比C更先進,是因為“ 設計這個概念已經被融入到C++之中 ”,而就語言本身而言,在C中更多的是算法的概念。那么是不是C就不重要了,錯!算法是程序設計的基礎,好的設計如果沒有好的算法,一樣不行。而且,“C加上好的設計”也能寫出非常好的東西。


小編推薦一個學C語言/C++的學習裙【 二六三,六八八,二七六 】,無論你是大牛還是小白,是想轉行還是想入行都可以來了解一起進步一起學習!裙內有開發工具,很多干貨和技術資料分享!

game.h下的代碼

#ifndef _GAME_

#define _GAME_

#include"tankdef.h"

void ImportMapGameAreaArry();

void ImportHomeGameAreaArry();

void ImportMyTankGameAreaArry();

void DrawGame_Info();

int ConsoleSwtichArrX(int x);

int ConsoleSwtichArrY(int y);

void TankAdjustUp(Tank *ptank, Dir dir);

void TankAdjustLeft(Tank *ptank);

void TankAdjustRight(Tank *ptank);

void TankAdjustDown(Tank *ptank);

void TankAdjustUpE(Tank *ptank, Dir dir);

//發射炮彈,參數為發射改炮彈的坦克

SHELLNODE *shot(Tank *ptank);

//炮彈向上移動

int ShellMoveUP(SHELLNODE *psn);

int ShellMoveDOWN(SHELLNODE *psn);

int ShellMoveLEFT(SHELLNODE *psn);

int ShellMoveRIGHT(SHELLNODE *psn);

//檢查鏈表

SHELLNODE *CheckLinkList(int owner,int x,int y);

//線程處理函數

DWORD WINAPI ShellDispes(LPVOID lpParam);

//void WriteFile1();

void HitTarget(SHELLNODE *psn, int tagert);

//根據炮彈的坐標銷毀相應的坦克

void DestroyEnemy(SHELLNODE *psn);

//清空敵方坦克的數據

void ClearEnemyTank(Tank *ptank);

//炮彈節點的比較函數

int ShellCompareByNum(NODE *pNode1, NODE *pNode2);

//敵方坦克移動函數

DWORD WINAPI EnemyMove(LPVOID lpParam);

#endif

game.c下的代碼

#define _CRT_SECURE_NO_WARNINGS

#include"tankdef.h"

#include"interface.h"

#include

#include

#include

#include

#include "game.h"

int g_start;

void Game_Start()

{

HANDLE hThread;

//初始化臨界區資源

system("mode con cols=95 lines=25");

SetConsoleTitle(TEXT("坦克大戰"));

InitializeCriticalSection(&g_cs);

srand((unsigned int)time(NULL));

DrawGameBord();

DrawGame_Info();

LoadMap();

DrawHome();

InitMyTnak(&MyselfTanke);

DrawTnak(&MyselfTanke);

ImportMapGameAreaArry();

ImportHomeGameAreaArry();

ImportMyTankGameAreaArry();

PlaySound(TEXT("sound/Tnak.wav "), NULL, SND_LOOP);

PlaySound(TEXT("sound/TankMove.wav "), NULL, SND_LOOP);

int i;

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

{

EnemyTank[i] = InitEnemtyTank();

DrawEnmpty(&EnemyTank[i]);

ImportEnemyTankGameAreaArry(&EnemyTank[i]);

}

while (i--)

{

hThread = CreateThread(NULL, 0, EnemyMove, &EnemyTank[i], 0, NULL);

CloseHandle(hThread);

}

//初始化炮彈鏈表

InitLinkList(&g_shell_list);

//WriteFile1();

}

void InitMyTnak(Tank *ptank)

{

ptank->belong = MYSELF;

ptank->dir = UP;

ptank->lief = 1;

ptank->x = Left_Top_X + 24;

ptank->y = Left_Top_Y + 18;

}

Tank InitEnemtyTank()

{

int row, col, overlp;

int i, j;

Tank tank;

tank.belong = ENEMY;

tank.dir = rand() % 4;

tank.lief = 1;

tank.speed = 400;

tank.y = Left_Top_Y + 1;

while (1)

{

overlp = 0;

tank.x = rand() % 29 * 2 + Left_Top_X + 2;

row = ConsoleSwtichArrY(tank.y);

col = ConsoleSwtichArrX(tank.x);

for (i = row; i< row + 3 && !overlp; ++i)

{ //取非為真

for (j = col; j < col + 3 && !overlp; ++j)

{

if (g_area_data[i][j])

{

overlp = 1;

}

}

}

if (!overlp)

break;

}

return tank;

}

Tank InitEnemtyTankSpeed()

{

int row, col, overlp;

int i, j;

Tank tank;

tank.belong = ENEMY;

tank.dir = rand() % 4;

tank.lief = 1;

tank.speed = 100;

tank.y = Left_Top_Y + 1;

while (1)

{

overlp = 0;

tank.x = rand() % 29 * 2 + Left_Top_X + 2;

row = ConsoleSwtichArrY(tank.y);

col = ConsoleSwtichArrX(tank.x);

for (i = row; i < row + 3 && !overlp; ++i)

{ //取非為真

for (j = col; j < col + 3 && !overlp; ++j)

{

if (g_area_data[i][j])

{

overlp = 1;

}

}

}

if (!overlp)

break;

}

return tank;

}

//將地圖導入到二維數組

void ImportMapGameAreaArry()

{

int i, j;

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

{

for (j = 0; j < Game_Arr_Width; ++j)

{

g_area_data[i + 3][j] = map[i][j];

}

}

}

//將老家導入到二維數組

void ImportHomeGameAreaArry()

{

int i, j;

int row, col;

row = ConsoleSwtichArrY(Left_Top_Y + 18);

col = ConsoleSwtichArrX(Left_Top_X + 30);

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

{

for (j = 0; j < 3; ++j)

{

if (i == 1 && j == 1)

g_area_data[row + i][col + j] = AREA_HOME;

else

g_area_data[row + i][col + j] = AREA_WALL;

}

}

}

void ImportMyTankGameAreaArry()

{

int i, j;

int row, col;

row = ConsoleSwtichArrY(MyselfTanke.y);

col = ConsoleSwtichArrX(MyselfTanke.x);

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

{

for (j = 0; j < 3; ++j)

{

if (tank[MyselfTanke.dir][i][j])

{

g_area_data[i + row][j + col] = AREA_SELF;

}

else

g_area_data[i + row][j + col] = AREA_SPACE;

}

}

}

void ImportEnemyTankGameAreaArry(Tank *ptank)

{

int i, j;

int row, col;

row = ConsoleSwtichArrY(ptank->y);

col = ConsoleSwtichArrX(ptank->x);

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

{

for (j = 0; j < 3; ++j)

{

if (tank[ptank->dir][i][j])

{

g_area_data[i + row][j + col] = AREA_ENEMY;

}

else

g_area_data[i + row][j + col] = AREA_SPACE;

}

}

}

void ImportMyClearTankGameAreaArry()

{

int i, j;

int row, col;

row = ConsoleSwtichArrY(MyselfTanke.y);

col = ConsoleSwtichArrX(MyselfTanke.x);

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

{

for (j = 0; j < 3; ++j)

{

if (tank[MyselfTanke.dir][i][j])

{

g_area_data[i + row][j + col] = AREA_SPACE;

}

}

}

}

int ConsoleSwtichArrX(int x)

{

return (x - (Left_Top_X + 2)) / 2;

}

int ConsoleSwtichArrY(int y)

{

return y - (Left_Top_Y + 1);

}

void WriteFile1()

{

int i,j;

FILE *fp = fopen("1.txt", "w");

if (fp == NULL)

return;

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

{

for (j = 0; j < Game_Arr_Width; ++j)

{

fprintf_s(fp, "%2d", g_area_data[i][j]);

}

fprintf_s(fp," ");

}

fclose(fp);

}

void TankAdjustUp(Tank *ptank,Dir dir)

{

ptank->dir = dir;

DrawTnakClear(ptank);

DrawTnak(ptank);

}

void TankAdjustLeft(Tank *ptank)

{

ptank->dir = LEFT;

DrawTnakClear(ptank);

DrawTnak(ptank);

}

void TankAdjustRight(Tank *ptank)

{

ptank->dir = RIGHT;

DrawTnakClear(ptank);

DrawTnak(ptank);

}

void TankAdjustDown(Tank *ptank)

{

ptank->dir = DOWN;

DrawTnakClear(ptank);

DrawTnak(ptank);

}

void TankAdjustUpE(Tank *ptank, Dir dir)

{

ptank->dir = dir;

DrawTnakClear(ptank);

DrawEnmpty(ptank);

}

SHELLNODE *shot(Tank *ptank)

{

static unsigned int num = 0;

SHELLNODE *psn = (SHELLNODE*)malloc(sizeof(SHELLNODE));

if (psn == NULL)

{

return NULL;

}

psn->node.next = NULL;

psn->shell.belong = ptank->belong;

psn->shell.dir = ptank->dir;

psn->shell.isshow = 0;

psn->shell.speed = 70;

psn->shell.left = 1;

psn->shell.num = num++;

switch (ptank->dir)

{

case UP:

psn->shell.x = ptank->x + 2;

psn->shell.y = ptank->y;

break;

case DOWN:

psn->shell.x = ptank->x + 2;

psn->shell.y = ptank->y + 2;

break;

case LEFT:

psn->shell.x = ptank->x;

psn->shell.y = ptank->y + 1;

break;

case RIGHT:

psn->shell.x = ptank->x + 4;

psn->shell.y = ptank->y + 1;

break;

}

//放入鏈表中

AddNode(g_shell_list, (NODE*)psn);

return psn;

}

int ShellMoveUP(SHELLNODE *psn)

{

int x, y;

SHELLNODE *ps;

x = ConsoleSwtichArrX(psn->shell.x);

y = ConsoleSwtichArrY(psn->shell.y);

if (psn->shell.isshow)//如果炮彈之前已經運行

DrawShell(&psn->shell, " ");//擦除炮彈

if (y <= 0)

return OVER_LOW;//越界

//如果上方有墻壁或坦克,就返回

if (g_area_data[y - 1][x] != AREA_SPACE)//撞到其它物體

{

psn->shell.isshow = 0;//停止運行

psn->shell.y -= 1;//調整炮彈坐標

return g_area_data[y - 1][x];

}

//如果上方有對方炮彈,就返回

//遍歷鏈表,查找有無對方炮彈存在

if (ps = CheckLinkList(!psn->shell.belong, psn->shell.x, psn->shell.y - 1))

{

ps->shell.left = 0;//讓對方的炮彈的生命結束

/*sprintf_s(buf, 100, "Owner %d Shell Num %d died of x:%d,y:%d", ps->shell.owner, ps->shell.num, ps->shell.x, ps->shell.y);

WriteToFile(buf);*/

return AREA_SHELL;

}

//其它情況,則顯示該炮彈

psn->shell.y -= 1;//調整炮彈坐標

if (psn->shell.left)

DrawShell(&psn->shell, SHELL_LETTER);

psn->shell.isshow = 1;

return 0;

}

int ShellMoveDOWN(SHELLNODE *pShell)

{

int x, y;

SHELLNODE *ps;

x = ConsoleSwtichArrX(pShell->shell.x);

y = ConsoleSwtichArrY(pShell->shell.y);

if (pShell->shell.isshow)//如果炮彈之前已經運行

DrawShell(&pShell->shell, " ");//擦除炮彈

if (y >= Gmae_Arr_Height - 1)

return OVER_LOW;//越界

//如果上方有墻壁或坦克,就返回

if (g_area_data[y + 1][x] != AREA_SPACE)//撞到其它物體

{

pShell->shell.isshow = 0;//停止運行

pShell->shell.y += 1;//調整炮彈坐標

return g_area_data[y + 1][x];

}//如果上方有對方炮彈,就返回

//遍歷鏈表,查找有無對方炮彈存在

if (ps = CheckLinkList(!pShell->shell.belong, pShell->shell.x, pShell->shell.y + 1))

{

ps->shell.left = 0;//讓對方的炮彈的生命結束

/*sprintf_s(buf, 100, "Owner %d Shell Num %d died of x:%d,y:%d", ps->shell.owner, ps->shell.num, ps->shell.x, ps->shell.y);

WriteToFile(buf);*/

return AREA_SHELL;

}

//其它情況,則顯示該炮彈

pShell->shell.y += 1;//調整炮彈坐標

if (pShell->shell.left)

DrawShell(&pShell->shell, SHELL_LETTER);

pShell->shell.isshow = 1;

return 0;

}

int ShellMoveLEFT(SHELLNODE *pShell)

{

int x, y;

SHELLNODE *ps;

x = ConsoleSwtichArrX(pShell->shell.x);

y = ConsoleSwtichArrY(pShell->shell.y);

if (pShell->shell.isshow)//如果炮彈之前已經運行

DrawShell(&pShell->shell, " ");//擦除炮彈

if (x <= 0)

return OVER_LOW;//越界

//如果上方有墻壁或坦克,就返回

if (g_area_data[y][x - 1] != AREA_SPACE)//撞到其它物體

{

pShell->shell.isshow = 0;//停止運行

pShell->shell.x -= 2;//調整炮彈坐標

return g_area_data[y][x - 1];

}//如果上方有對方炮彈,就返回

//遍歷鏈表,查找有無對方炮彈存在

if (ps = CheckLinkList(!pShell->shell.belong, pShell->shell.x - 2, pShell->shell.y))

{

ps->shell.left = 0;//讓對方的炮彈的生命結束

/*sprintf_s(buf, 100, "Owner %d Shell Num %d died of x:%d,y:%d", ps->shell.owner, ps->shell.num, ps->shell.x, ps->shell.y);

WriteToFile(buf);*/

return AREA_SHELL;

}

//其它情況,則顯示該炮彈

pShell->shell.x -= 2;//調整炮彈坐標

if (pShell->shell.left)

DrawShell(&pShell->shell, SHELL_LETTER);

pShell->shell.isshow = 1;

return 0;

}

int ShellMoveRIGHT(SHELLNODE *pShell)

{

int x, y;

SHELLNODE *ps;

x = ConsoleSwtichArrX(pShell->shell.x);

y = ConsoleSwtichArrY(pShell->shell.y);

if (pShell->shell.isshow)//如果炮彈之前已經運行

DrawShell(&pShell->shell, " ");//擦除炮彈

if (x >= Game_Arr_Width - 1)

return OVER_LOW;//越界

//如果右方有墻壁或坦克,就返回

if (g_area_data[y][x + 1] != AREA_SPACE)//撞到其它物體

{

pShell->shell.isshow = 0;//停止顯示

pShell->shell.x += 2;//調整炮彈坐標

return g_area_data[y][x + 1];

}//如果上方有對方炮彈,就返回

//遍歷鏈表,查找有無對方炮彈存在

if (ps = CheckLinkList(!pShell->shell.belong, pShell->shell.x + 2, pShell->shell.y))

{

ps->shell.left = 0;//讓對方的炮彈的生命結束

/*sprintf_s(buf, 100, "Owner %d Shell Num %d died of x:%d,y:%d", ps->shell.owner, ps->shell.num, ps->shell.x, ps->shell.y);

WriteToFile(buf);*/

return AREA_SHELL;

}

//其它情況,則顯示該炮彈

pShell->shell.x += 2;//調整炮彈坐標

if (pShell->shell.left)

DrawShell(&pShell->shell, SHELL_LETTER);

pShell->shell.isshow = 1;

return 0;

}

//查找鏈表中有沒有敵方的炮彈

SHELLNODE *CheckLinkList(int owner, int x, int y)

{

SHELLNODE *psn = NULL;

int i;

for (i = 0; i < CountOfLinkList(g_shell_list); ++i)

{

psn = (SHELLNODE *)GetNode(g_shell_list, i);

if (psn->shell.x == x && psn->shell.y == y

&& psn->shell.belong == owner)

{

return psn;

}

}

return NULL;

}

DWORD WINAPI ShellDispes(LPVOID lpParam)

{

SHELLNODE *psm = (SHELLNODE *)lpParam;

int ret; //返回值

while (psm->shell.left == 1)

{

if (g_start == 1)

continue;

EnterCriticalSection(&g_cs);

switch (psm->shell.dir)

{

case UP:

if (ret = ShellMoveUP(psm))

{

HitTarget(psm, ret);

}

break;

case DOWN:

if (ret = ShellMoveDOWN(psm))

HitTarget(psm, ret);

break;

case LEFT:

if (ret = ShellMoveLEFT(psm))

HitTarget(psm, ret);

break;

case RIGHT:

if (ret = ShellMoveRIGHT(psm))

HitTarget(psm, ret);

break;

}

LeaveCriticalSection(&g_cs);

Sleep(psm->shell.speed);

}

//為了保護鏈表刪除時要同步

EnterCriticalSection(&g_cs);

if (psm->shell.isshow)

DrawShell(&psm->shell, " ");

if (psm->shell.belong == MYSELF)

--g_self_shell_cout;

if (DeleteNode(g_shell_list, (NODE*)psm, ShellCompareByNum))

free(psm);

LeaveCriticalSection(&g_cs);

return 0;

}

int g_die_Enemy = 0;

void HitTarget(SHELLNODE *psn, int tagert)

{

switch (tagert)

{

case AREA_SHELL:

case OVER_LOW:

psn->shell.left = 0;

break;

case AREA_WALL:

HitWall(&psn->shell);

psn->shell.left = 0;

PlaySound(TEXT("sound/擊碎.wav "), NULL,SND_ASYNC );

break;

case AREA_HOME:

HitHome(&psn->shell);

psn->shell.left = 0;

break;

case AREA_ENEMY:

if (psn->shell.belong == MYSELF)

{

++g_die_Enemy;

psn->shell.left = 0;

DestroyEnemy(psn);

PlaySound(TEXT("sound/爆炸.wav "), NULL, SND_ASYNC );

DrawGame_Info();

}

break;

case AREA_SELF:

if (psn->shell.belong == ENEMY)

{

psn->shell.left = 0;

ClearEnemyTank(&MyselfTanke);

DrawTnakClear(&MyselfTanke);

++g_die_shellf;

DrawGame_Info();

if (g_die_shellf == 3)

{

music = 0;

PrintGameOver();

}

else

{

InitMyTnak(&MyselfTanke);

DrawTnak(&MyselfTanke);

ImportMyTankGameAreaArry();

PlaySound(TEXT("sound/爆炸.wav "), NULL, SND_ASYNC);

}

}

break;

}

}

void DestroyEnemy(SHELLNODE *psn)

{

int i;//用于遍歷數組

Tank t; //一個臨時的坦克

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

{

t = EnemyTank[i];

if (psn->shell.x >= t.x && psn->shell.x <= t.x + 4 &&

psn->shell.y >= t.y && psn->shell.y <= t.y + 2)

{

//清除坦克

DrawTnakClear(&t);

//修改坦克的生命值

EnemyTank[i].lief = 0;

//清空敵方坦克的數據

ClearEnemyTank(&t);

}

}

}

void ClearEnemyTank(Tank *ptank)

{

int row, col;

int i, j;

row = ConsoleSwtichArrY(ptank->y);

col = ConsoleSwtichArrX(ptank->x);

for (i = row; i < row + 3; ++i)

{

for (j = col; j < col + 3; ++j)

{

g_area_data[i][j] = AREA_SPACE;

}

}

}

//炮彈節點比較函數

int ShellCompareByNum(NODE *pNode1, NODE *pNode2)

{

SHELLNODE *p1 = (SHELLNODE*)pNode1;

SHELLNODE *P2 = (SHELLNODE*)pNode2;

return p1->shell.num == P2->shell.num ? 0 : 1;

}

int x = 0;

DWORD WINAPI EnemyMove(LPVOID lpParam)

{

Tank * pTank = (Tank*)lpParam;

SHELLNODE *psn = NULL;

HANDLE hThread;

unsigned int nStep = 0;

unsigned int nShot = 0;

nShot = 2;

int nDir = rand() % 5 + 5;

while (pTank->lief)

{

if(g_start == 1)

continue;

EnterCriticalSection(&g_cs);

++nStep;

if(nStep % nDir == 0)

TankAdjustUpE(pTank, rand()%4);

if (nStep % nShot == 0) //改發射炮彈了

{

if (psn = shot(pTank))

{

hThread = CreateThread(NULL, 0, ShellDispes, psn, 0, NULL);

CloseHandle(hThread);

}

}

switch (pTank->dir)

{

case UP:

if (TankMoveUpE(pTank))

{

TankAdjustUpE(pTank, (pTank->dir + 1) % 4);

}

break;

case DOWN:

if(TankMoveDownE(pTank))

TankAdjustUpE(pTank, (pTank->dir + 1) % 4);

break;

case LEFT: if(TankMoveLeftE(pTank))

TankAdjustUpE(pTank, (pTank->dir + 1) % 4);

break;

case RIGHT: if(TankMoveRightE(pTank))

TankAdjustUpE(pTank, (pTank->dir + 1) % 4);

break;

}

LeaveCriticalSection(&g_cs);

Sleep(pTank->speed);

}

++Die_Enemy_Tank_Count;

// The number of tanks on the map + Number of dead tanks

if (ENEMY_Tank + Die_Enemy_Tank_Count <= ENEMY_Z_ALL_TANK)

{

//Create a new enemy tank

HANDLE hThread;

EnterCriticalSection(&g_cs);

if (Die_Enemy_Tank_Count % 1 == 0)

{

*pTank = InitEnemtyTankSpeed();

ImportEnemyTankGameAreaArry(pTank);

}

else

{

*pTank = InitEnemtyTank();

ImportEnemyTankGameAreaArry(pTank);

}

hThread = CreateThread(NULL, 0, EnemyMove, pTank, 0, NULL);

CloseHandle(hThread);

LeaveCriticalSection(&g_cs);

}

else if(Die_Enemy_Tank_Count == ENEMY_Z_ALL_TANK)

{

EnterCriticalSection(&g_cs);

PrintVictory();

LeaveCriticalSection(&g_cs);

}

return 0;

}

void DrawGame_Info()

{

EnterCriticalSection(&g_cs);

SetConsoleTextAttribute(g_hout, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY);

COORD pos;

pos.X = Left_Top_X + Game_Arr_Width * 2 + 8;

pos.Y = Left_Top_Y + 1;

SetConsoleCursorPosition(g_hout, pos);

printf("C語言坦克大戰項目");

pos.Y += 2;

SetConsoleCursorPosition(g_hout, pos);

printf("信息窗口:");

++pos.Y;

if (g_start == 1)

{

SetConsoleCursorPosition(g_hout, pos);

printf("游戲運行狀態: Pause");

}

if(g_start == 0)

{

SetConsoleCursorPosition(g_hout, pos);

printf("游戲運行狀態: Run ");

}

pos.Y += 2;

SetConsoleCursorPosition(g_hout, pos);

printf("敵方坦克總數:%d", ENEMY_Z_ALL_TANK);

pos.Y++;

SetConsoleCursorPosition(g_hout, pos);

printf("敵方坦克陣亡數量:%d", g_die_Enemy);

pos.Y++;

SetConsoleCursorPosition(g_hout, pos);

printf("敵方坦克剩余數量:%d ",ENEMY_Z_ALL_TANK - g_die_Enemy);

pos.Y += 2;

SetConsoleCursorPosition(g_hout, pos);

printf("我方坦克總數:%d", AREA_SELF);

pos.Y++;

SetConsoleCursorPosition(g_hout, pos);

printf("我方坦克陣亡數量:%d", g_die_shellf);

pos.Y ++;

SetConsoleCursorPosition(g_hout, pos);

printf("我方坦克剩余數量:%d", AREA_SELF - g_die_shellf);

pos.Y += 2;

SetConsoleCursorPosition(g_hout, pos);

printf("游戲暫停或開始:P");

pos.Y ++;

SetConsoleCursorPosition(g_hout, pos);

printf("坦克向上移動:W");

pos.Y++;

SetConsoleCursorPosition(g_hout, pos);

printf("坦克向左移動:A");

pos.Y++;

SetConsoleCursorPosition(g_hout, pos);

printf("坦克向右移動:D");

pos.Y++;

SetConsoleCursorPosition(g_hout, pos);

printf("坦克向下移動:S");

pos.Y++;

SetConsoleCursorPosition(g_hout, pos);

printf("坦克發射炮彈:J");

LeaveCriticalSection(&g_cs);

}

interface.h

#include

#include"tankdef.h"

#ifndef _INTERFACE_

#define _INTERFACE_

//開始游戲

void Game_Start();

小編推薦一個學C語言/C++的學習裙【 二六三,六八八,二七六 】,無論你是大牛還是小白,是想轉行還是想入行都可以來了解一起進步一起學習!裙內有開發工具,很多干貨和技術資料分享!

//畫游戲界面

void DrawGameBord();

void LoadMap();

void DrawHome();

void InitMyTnak(Tank *ptank);

void DrawTnak(Tank *ptank);

Tank InitEnemtyTank();

void DrawEnmpty(Tank *pEtank);

void DrawTnakClear(Tank *ptank);

void ImportEnemyTankGameAreaArry();

void ImportMyClearTankGameAreaArry();

int TankMoveUp(Tank *ptank);

int TankMoveLeft(Tank *ptank);

int TankMoveRight(Tank *ptank);

int TankMoveDown(Tank *ptank);

void DrawShell(SHELL *Pshell,const char *liter);

void WriteFile1();

void HitWall(SHELL *pShell);

void HitHome(SHELL *pShell);

void PrintGameOver();

int TankMoveUpE(Tank *ptank);

int TankMoveDownE(Tank *ptank);

int TankMoveLeftE(Tank *ptank);

int TankMoveRightE(Tank *ptank);

void PrintVictory();

#endif

interface.c

#include"tankdef.h"

#include"interface.h"

#include

#include"game.h"

HANDLE g_hout;

HWND hwnd = NULL;

CONSOLE_SCREEN_BUFFER_INFO csbi;

int music = 1;

void DrawGameBord()

{

g_hout = GetStdHandle(STD_OUTPUT_HANDLE);

CONSOLE_CURSOR_INFO c;

GetConsoleCursorInfo(g_hout, &c);

c.bVisible = 0;

SetConsoleCursorInfo(g_hout, &c);

int row, col;

DWORD count;

COORD pos;

pos.X = Left_Top_X;

pos.Y = Left_Top_Y;

for (row = 0; row < Gmae_Arr_Height + 2; ++row)

{

SetConsoleCursorPosition(g_hout, pos);

for (col = 0; col < Game_Arr_Width + 2; ++col)

{

if (row == 0 || row == Gmae_Arr_Height + 1 ||

col == 0 || col == Game_Arr_Width + 1)

{

GetConsoleScreenBufferInfo(g_hout, &csbi);

printf("□");

FillConsoleOutputAttribute(g_hout, BORDER_Color,2,csbi.dwCursorPosition, &count);

}

else

printf(" ");

}

pos.Y++;

}

pos.X = 34;

SetConsoleCursorPosition(g_hout, pos);

GetConsoleScreenBufferInfo(g_hout, &csbi);

printf("坦克大戰");

FillConsoleOutputAttribute(g_hout, TANKTEXT, 8, csbi.dwCursorPosition, &count);

}

void LoadMap()

{

int row, col;

COORD pos;

DWORD count;

pos.X = Left_Top_X + 2;

pos.Y = Left_Top_Y + 4;

for (row = 0; row < Gmae_Arr_Height - 6; ++row)

{

SetConsoleCursorPosition(g_hout, pos);

for (col = 0; col < Game_Arr_Width; ++col)

{

if (map[row][col])

{

GetConsoleScreenBufferInfo(g_hout, &csbi);

printf("%s", TANKLE_LETTER);

FillConsoleOutputAttribute(g_hout, BORDER_Color1, 2, csbi.dwCursorPosition, &count);

}

else

printf(" ");

}

pos.Y++;

}

}

void DrawHome()

{

int row, col;

COORD pos;

DWORD count;

pos.X = Left_Top_X + 30;

pos.Y = Left_Top_Y + 18;

for (row = 0; row < 3; ++row)

{

SetConsoleCursorPosition(g_hout, pos);

for (col = 0; col < 3; ++col)

{

if (row == 1 && col == 1)

{

GetConsoleScreenBufferInfo(g_hout, &csbi);

printf("%s", HOME_LETTER);

FillConsoleOutputAttribute(g_hout,HOME_Color, 2, csbi.dwCursorPosition, &count);

}

else

printf("%s", BORDER_LEFTER);

}

pos.Y++;

}

}

void DrawTnak(Tank *ptank)

{

COORD pos;

DWORD count;

int row, col;

pos.X = ptank->x;

pos.Y = ptank->y;

for (row = 0; row < 3; ++row)

{

SetConsoleCursorPosition(g_hout, pos);

for (col = 0; col < 3; ++col)

{

if (tank[ptank->dir][row][col] == 1)

{

GetConsoleScreenBufferInfo(g_hout, &csbi);

printf("■");

FillConsoleOutputAttribute(g_hout, Tank_Color, 2, csbi.dwCursorPosition, &count);

}

else

{

if (tank[0][row][col] == 0 || tank[1][row][col] == 0)

printf("│");

if (tank[ptank->dir][row][col] == 2)

{

printf("○");

}

if (tank[3][row][col] == 0 || tank[2][row][col] == 0)

printf("─");

}

}

pos.Y++;

}

}

void DrawEnmpty(Tank *pEtank)

{

COORD pos;

DWORD count;

pos.X = pEtank->x;

pos.Y = pEtank->y;

int row, col;

for (row = 0; row < 3; ++row)

{

SetConsoleCursorPosition(g_hout, pos);

for (col = 0; col < 3; ++col)

{

if (tankE[pEtank->dir][row][col])

{

GetConsoleScreenBufferInfo(g_hout, &csbi);

printf("□");

FillConsoleOutputAttribute(g_hout, FOREGROUND_GREEN | FOREGROUND_INTENSITY, 2, csbi.dwCursorPosition, &count);

}

else

printf(" ");

}

pos.Y++;

}

}

void DrawTnakClear(Tank *ptank)

{

COORD pos;

int row, col;

pos.X = ptank->x;

pos.Y = ptank->y;

for (row = 0; row < 3; ++row)

{

SetConsoleCursorPosition(g_hout, pos);

for (col = 0; col < 3; ++col)

{

if (tank[ptank->dir][row][col])

{

printf(" ");

}

else

printf(" ");

}

pos.Y++;

}

}

int TankMoveUp(Tank *ptank)

{

int row, col;

int i, j;

row = ConsoleSwtichArrY(ptank->y);

col = ConsoleSwtichArrX(ptank->x);

//判斷是否越界

if (row <= 0)

return OVER_LOW;

//判斷是否撞墻

for (i = col; i < col + 3; ++i)

{

if (g_area_data[row - 1][i])

return g_area_data[row - 1][i];

}

for (i = row - 1; i < row + 3; ++i)

{

for (j = col; j < col + 3; ++j)

{

if (i == row + 2)

g_area_data[i][j] = 0;

else

g_area_data[i][j] = g_area_data[i + 1][j];

}

}

DrawTnakClear(ptank);

--ptank->y;

DrawTnak(ptank);

return 0;

}

int TankMoveLeft(Tank *ptank)

{

int row, col;

int i, j;

row = ConsoleSwtichArrY(ptank->y);

col = ConsoleSwtichArrX(ptank->x);

//判斷是否越界

if (col <= 0)

return OVER_LOW;

//判斷是否撞墻

for (i = row; i < row + 3; ++i)

{

if (g_area_data[i][col - 1])

return g_area_data[i][col - 1];

}

for (i = row; i < row + 3; ++i)

{

for (j = col - 1; j <= col + 2; ++j)

{

if (j == col + 2)

g_area_data[i][j] = 0;

else

g_area_data[i][j] = g_area_data[i][j + 1];

}

}

DrawTnakClear(ptank);

ptank->x -= 2;

DrawTnak(ptank);

return 0;

}

int TankMoveRight(Tank *ptank)

{

int row, col;

int i, j;

row = ConsoleSwtichArrY(ptank->y);

col = ConsoleSwtichArrX(ptank->x);

//判斷是否越界

if (col + 2 >= Game_Arr_Width - 1)

return OVER_LOW;

//判斷是否撞墻

for (i = row; i < row + 3; ++i)

{

if (g_area_data[i][col + 3])

return g_area_data[i][col + 3];

}

for (i = row; i < row + 3; ++i)

{

for (j = col + 3; j >= col; --j)

{

if (j == col)

g_area_data[i][j] = 0;

else

g_area_data[i][j] = g_area_data[i][j - 1];

}

}

DrawTnakClear(ptank);

ptank->x += 2;

DrawTnak(ptank);

return 0;

}

int TankMoveDown(Tank *ptank)

{

int row, col;

int i, j;

row = ConsoleSwtichArrY(ptank->y);

col = ConsoleSwtichArrX(ptank->x);

//判斷是否越界

if (row + 2 >= Gmae_Arr_Height - 1)

return OVER_LOW;

//判斷是否撞墻

for (i = col; i < col + 3; ++i)

{

if (g_area_data[row + 3][i])

return g_area_data[row + 3][i];

}

for (i = row + 3; i >= row; --i)

{

for (j = col; j < col + 3; ++j)

{

if (i == row)

g_area_data[i][j] = 0;

else

g_area_data[i][j] = g_area_data[i - 1][j];

}

}

DrawTnakClear(ptank);

++ptank->y;

DrawTnak(ptank);

return 0;

}

int TankMoveUpE(Tank *ptank)

{

int row, col;

int i, j;

row = ConsoleSwtichArrY(ptank->y);

col = ConsoleSwtichArrX(ptank->x);

//判斷是否越界

if (row <= 0)

return OVER_LOW;

//判斷是否撞墻

for (i = col; i < col + 3; ++i)

{

if (g_area_data[row - 1][i])

return g_area_data[row - 1][i];

}

for (i = row - 1; i < row + 3; ++i)

{

for (j = col; j < col + 3; ++j)

{

if (i == row + 2)

g_area_data[i][j] = 0;

else

g_area_data[i][j] = g_area_data[i + 1][j];

}

}

DrawTnakClear(ptank);

--ptank->y;

if (x == 0)

DrawEnmpty(ptank);

/*if (x == 1)

DrawEnmptySpeed(ptank);*/

return 0;

}

int TankMoveDownE(Tank *ptank)

{

int row, col;

int i, j;

row = ConsoleSwtichArrY(ptank->y);

col = ConsoleSwtichArrX(ptank->x);

//判斷是否越界

if (row + 2 >= Gmae_Arr_Height - 1)

return OVER_LOW;

//判斷是否撞墻

for (i = col; i < col + 3; ++i)

{

if (g_area_data[row + 3][i])

return g_area_data[row + 3][i];

}

for (i = row + 3; i >= row; --i)

{

for (j = col; j < col + 3; ++j)

{

if (i == row)

g_area_data[i][j] = 0;

else

g_area_data[i][j] = g_area_data[i - 1][j];

}

}

DrawTnakClear(ptank);

++ptank->y;

if(x == 0)

DrawEnmpty(ptank);

//if (x == 1)

//DrawEnmptySpeed(ptank);

return 0;

}

int TankMoveRightE(Tank *ptank)

{

int row, col;

int i, j;

row = ConsoleSwtichArrY(ptank->y);

col = ConsoleSwtichArrX(ptank->x);

//判斷是否越界

if (col + 2 >= Game_Arr_Width - 1)

return OVER_LOW;

//判斷是否撞墻

for (i = row; i < row + 3; ++i)

{

if (g_area_data[i][col + 3])

return g_area_data[i][col + 3];

}

for (i = row; i < row + 3; ++i)

{

for (j = col + 3; j >= col; --j)

{

if (j == col)

g_area_data[i][j] = 0;

else

g_area_data[i][j] = g_area_data[i][j - 1];

}

}

DrawTnakClear(ptank);

ptank->x += 2;

if (x == 0)

DrawEnmpty(ptank);

/* if (x == 1)

DrawEnmptySpeed(ptank);*/

return 0;

}

int TankMoveLeftE(Tank *ptank)

{

int row, col;

int i, j;

row = ConsoleSwtichArrY(ptank->y);

col = ConsoleSwtichArrX(ptank->x);

//判斷是否越界

if (col <= 0)

return OVER_LOW;

//判斷是否撞墻

for (i = row; i < row + 3; ++i)

{

if (g_area_data[i][col - 1])

return g_area_data[i][col - 1];

}

for (i = row; i < row + 3; ++i)

{

for (j = col - 1; j <= col + 2; ++j)

{

if (j == col + 2)

g_area_data[i][j] = 0;

else

g_area_data[i][j] = g_area_data[i][j + 1];

}

}

DrawTnakClear(ptank);

ptank->x -= 2;

if (x == 0)

DrawEnmpty(ptank);

/* if (x == 1)

DrawEnmptySpeed(ptank);*/

return 0;

}

void DrawShell(SHELL *Pshell,const char *litter)

{

DWORD cout;

COORD pos = { Pshell->x,Pshell->y };

SetConsoleCursorPosition(g_hout, pos);

printf("%s", litter);

FillConsoleOutputAttribute(g_hout, FOREGROUND_RED | FOREGROUND_INTENSITY, 2, pos, &cout);

}

void HitWall(SHELL *pShell)

{

int i;

int row, col;

row = ConsoleSwtichArrY(pShell->y);

col = ConsoleSwtichArrX(pShell->x);

if (pShell->dir == UP || pShell->dir == DOWN)

{

COORD pos = { pShell->x - 2,pShell->y };

for (i = col - 1; i < col + 2; ++i)

{

SetConsoleCursorPosition(g_hout, pos);

if(g_area_data[row][i] == AREA_WALL)

{

printf(" ");

g_area_data[row][i] = AREA_SPACE;

}

pos.X += 2;

}

}

else

{

COORD pos = { pShell->x,pShell->y - 1 };

for (i = row - 1; i < row + 2; ++i)

{

SetConsoleCursorPosition(g_hout, pos);

if(g_area_data[i][col] == AREA_WALL)

{

printf(" ");

g_area_data[i][col] = AREA_SPACE;

}

pos.Y++;

}

}

}

void HitHome(SHELL *pShell)

{

COORD pos = { pShell->x,pShell->y };

SetConsoleCursorPosition(g_hout, pos);

printf(" ");

PrintGameOver();

}

void PrintGameOver()

{

system("cls");

DWORD count;

COORD pos = { 32,10};

SetConsoleCursorPosition(g_hout, pos);

printf("Game Over!");

FillConsoleOutputAttribute(g_hout, FOREGROUND_GREEN | FOREGROUND_INTENSITY |

BACKGROUND_RED | BACKGROUND_INTENSITY, 10, pos, &count);

PlaySound(TEXT("sound/Dath.wav "), NULL, SND_LOOP);

DeleteCriticalSection(&g_cs);

DestroyList(&g_shell_list);

exit(0);

}

void PrintVictory()

{

PlaySound(TEXT("sound/勝利.wav "), NULL, SND_LOOP);

system("cls");

DWORD count;

COORD pos = { 32,10 };

SetConsoleCursorPosition(g_hout, pos);

printf(" Voctiory ");

FillConsoleOutputAttribute(g_hout, FOREGROUND_GREEN | FOREGROUND_INTENSITY |

BACKGROUND_RED | BACKGROUND_INTENSITY, 10, pos, &count);

DeleteCriticalSection(&g_cs);

DestroyList(&g_shell_list);

exit(0);

}

#ifndef _LIKLIST_

#define _LIKLIST_

//定義節點結構

typedef struct node

{

struct node *next; //指向下一個節點

}NODE;

typedef struct linklist

{

NODE head; //頭節點

int size; //大小

}LINKLIST;

//鏈表操作函數

//鏈表初始化

void InitLinkList(LINKLIST **list);

//銷毀鏈表

void DestroyList(LINKLIST **list);

//添加一個節點的鏈表到尾部

void AddNode(LINKLIST *list, NODE *pNode);

//刪除一個指定的節點,刪除成功返回成功節點的指針,失敗返回NULL

NODE *DeleteNode(LINKLIST *list, NODE *pNode, int(*compare)(NODE *, NODE *));

//返回鏈表中節點的個數

int CountOfLinkList(LINKLIST *list);

//返回指定位置的節點

NODE *GetNode(LINKLIST *list, int pos);

#endif

linklist.c 下的代碼

#include"linklist.h"

#include

#include

//鏈表操作函數

//鏈表初始化

void InitLinkList(LINKLIST **list)

{

*list = (LINKLIST*)malloc(sizeof(LINKLIST));

if (*list == NULL)

return;

(*list)->head.next = NULL;

(*list)->size = 0;

}

//銷毀鏈表

void DestroyList(LINKLIST **list)

{

if (list && *list)

{

free(*list);

*list = NULL;

}

}

//添加一個節點的鏈表到尾部

void AddNode(LINKLIST *list, NODE *pNode)

{

NODE *p = &list->head;

while (p->next)

p = p->next;

p->next = pNode;

list->size++; //節點的大小+1

}

//刪除一個指定的節點,刪除成功返回成功節點的指針,失敗返回NULL

NODE *DeleteNode(LINKLIST *list, NODE *pNode, int(*compare)(NODE *, NODE *))

{

NODE *p = &list->head;

NODE *pfree = NULL;

while (p->next)

{

if (compare(p->next, pNode) == 0)

{

pfree = p->next;

p->next = p->next->next;

list->size--;

break;

}

p = p->next;

}

return pfree;

}

//返回鏈表中節點的個數

int CountOfLinkList(LINKLIST *list)

{

return list->size;

}

NODE *GetNode(LINKLIST *list, int pos)

{

int i;

NODE *p = list->head.next;

if (pos < 0)

return NULL;

for (i = 0; i < pos && p; ++i)

{

p = p->next;

}

return p;

}

tankdef.h

#include

#include "linklist.h"

#include"game.h"

#ifndef _TANKDEFH_

#define _TANKDEFH_

#define Game_Arr_Width 31 //游戲區域的寬度

#define Gmae_Arr_Height 20 //游戲區域的高度

#define Left_Top_X 4 //初始x坐標

#define Left_Top_Y 1 //初始y坐標

#define BORDER_LEFTER "□" //游戲邊框字符

#define TANKLE_LETTER "■" //坦克字符

#define HOME_LETTER "★" //老家字符

#define SHELL_LETTER "◎" //炮彈字符

#define MYSELF 1 //我方坦克

#define ENEMY 0 //敵方坦克

#define BORDER_Color FOREGROUND_BLUE | FOREGROUND_INTENSITY //窗口的顏色

#define BORDER_Color1 FOREGROUND_GREEN | FOREGROUND_INTENSITY | FOREGROUND_BLUE//關卡顏色

#define TANKTEXT FOREGROUND_RED | FOREGROUND_INTENSITY //文字

#define HOME_Color FOREGROUND_RED | FOREGROUND_INTENSITY //老家顏色

#define Tank_Color FOREGROUND_RED | FOREGROUND_INTENSITY | FOREGROUND_BLUE | FOREGROUND_GREEN //坦克顏色

#define ENEMY_Tank 4

#define ENEMY_Z_ALL_TANK 10

#define AREA_SPACE 0 //空

#define AREA_WALL 1 //墻

#define AREA_HOME 2 //老家

#define AREA_SELF 3 //自己

#define AREA_ENEMY 4 //敵人

#define AREA_SHELL 5 //炮彈

#define OVER_LOW -1 //越界

#define Game_Over 0 //游戲結束

#define Myself_Shell_Count 3 //我方炮彈的數量

typedef enum { UP, DOWN, LEFT, RIGHT }Dir;

typedef struct

{

int lief; //聲明

int x; //x坐標

int y; //y坐標

Dir dir; //方向

int belong; //屬于

int speed; //速度

}Tank;

typedef struct

{

int x;

int y;

Dir dir;

int left;

int speed;

int belong;

int isshow; //是否顯示

int num;

}SHELL;

//炮彈節點

typedef struct

{

NODE node;

SHELL shell;

}SHELLNODE;

//***********聲明全局變量

extern HANDLE g_hout;

extern char map[14][Game_Arr_Width];

extern char tank[4][3][3];

extern Tank MyselfTanke; //我方坦克

extern Tank EnemyTank[ENEMY_Tank]; //敵方坦克

extern char g_area_data[Gmae_Arr_Height][Game_Arr_Width];

extern LINKLIST * g_shell_list;

extern char tankE[4][3][3];

extern char tankSpeed[4][3][3];

extern int g_self_shell_cout;

extern CRITICAL_SECTION g_cs;

extern int Die_Enemy_Tank_Count;

extern int x;

extern int g_die_shellf;

extern int g_start;

extern int g_die_Enemy;

extern int music;

#endif

gamedata.c 下的文件

#include"tankdef.h"

#include"interface.h"

char map[14][Game_Arr_Width] = {

{ 0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0 },

{ 0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0 },

{ 0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0 },

{ 0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0 },

{ 0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0 },

{ 0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0 },

{ 1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1 },

{ 1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1 },

{ 0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0 },

{ 0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0 },

{ 0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0 },

{ 0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0 },

{ 0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0 },

{ 0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0 }

};

char tank[4][3][3] = {

{

1,0,1,

1,2,1,

1,1,1

},

{

1,1,1,

1,2,1,

1,0,1

},

{

1,1,1,

0,2,1,

1,1,1

},

{

1,1,1,

1,2,0,

1,1,1

}

};

char tankE[4][3][3] = {

{

0,1,0,

1,1,1,

1,0,1

},

{

1,0,1,

1,1,1,

0,1,0

},

{

0,1,1,

1,1,0,

0,1,1

},

{

1,1,0,

0,1,1,

1,1,0

}

};

char tankSpeed[4][3][3] = {

{

0,3,0,

1,2,1,

1,0,1

},

{

1,0,1,

1,2,1,

0,3,0

},

{

0,1,1,

3,2,0,

0,1,1

},

{

1,1,0,

0,2,3,

1,1,0

}

};

char g_area_data[Gmae_Arr_Height][Game_Arr_Width];

Tank MyselfTanke; //我方坦克

Tank EnemyTank[ENEMY_Tank]; //敵方坦克

//炮彈鏈表

LINKLIST * g_shell_list;

// 我放炮彈的數量

int g_self_shell_cout = 0;

int Die_Enemy_Tank_Count = 0; //The number of enemy tank deaths

int g_die_shellf = 0; // 敵方陣亡的坦克數量

CRITICAL_SECTION g_cs;

main.c 下的文件

#include "tankdef.h"

#include "interface.h"

#include

#include

#include "game.h"

#include

#pragma comment(lib,"winmm.lib")

int main()

{

char ch;

HANDLE hThread;

SHELLNODE *psn = NULL;

Game_Start();

//PlaySound(TEXT("G:\vs2015\坦克大戰\坦克大戰\sound\Back.wav "), NULL, SND_ASYNC | SND_LOOP | SND_FILENAME);

/*PlaySound(TEXT("G:\vs2015\坦克大戰\坦克大戰\hit.wav "), NULL, SND_LOOP | SND_FILENAME);

PlaySound(TEXT("G:\vs2015\坦克大戰\坦克大戰\Bang.wav "), NULL, SND_LOOP | SND_FILENAME);

PlaySound(TEXT("G:\vs2015\坦克大戰\坦克大戰\Fanfare.wav "), NULL, SND_LOOP | SND_FILENAME);*/

mciSendString(TEXT("open sound\Back.wav alias music"), NULL, 0, NULL);

mciSendString(TEXT("play music"), NULL, 0, NULL);

while (1)

{

if (_kbhit())

{

ch = _getch();

if(ch == 'p')

while (1)

{

g_start = 1;

DrawGame_Info();

ch = _getch();

if (ch == 'p')

{

g_start = 0;

DrawGame_Info();

break;

}

}

switch (ch)

{

case 'w':

EnterCriticalSection(&g_cs);

if (MyselfTanke.dir != UP)

TankAdjustUp(&MyselfTanke,UP);

else

{

TankMoveUp(&MyselfTanke);

}

LeaveCriticalSection(&g_cs);

break;

case 's':

EnterCriticalSection(&g_cs);

if (MyselfTanke.dir != DOWN)

TankAdjustDown(&MyselfTanke);

else

{

TankMoveDown(&MyselfTanke);

}

LeaveCriticalSection(&g_cs);

break;

case 'a':

EnterCriticalSection(&g_cs);

if (MyselfTanke.dir != LEFT)

TankAdjustLeft(&MyselfTanke);

else

{

TankMoveLeft(&MyselfTanke);

}

LeaveCriticalSection(&g_cs);

break;

case 'd':

EnterCriticalSection(&g_cs);

if (MyselfTanke.dir != RIGHT)

TankAdjustRight(&MyselfTanke);

else

{

TankMoveRight(&MyselfTanke);

}

LeaveCriticalSection(&g_cs);

break;

case 'j':

if (g_self_shell_cout < Myself_Shell_Count)

{

PlaySound(TEXT("sound/hit.wav "), NULL, SND_ASYNC | SND_NOWAIT);

psn = shot(&MyselfTanke);

++g_self_shell_cout;

hThread = CreateThread(NULL, 0, ShellDispes, psn, 0, NULL);

CloseHandle(hThread);

}

break;

}

}

}

mciSendString(TEXT("close music"), NULL, 0, NULL);

while(CountOfLinkList(g_shell_list))

{

EnterCriticalSection(&g_cs);

psn = (SHELLNODE *)GetNode(g_shell_list, 0);

if (psn)

psn->shell.left = 0;

LeaveCriticalSection(&g_cs);

}

return 0;

}

小編推薦一個學C語言/C++的學習裙【 二六三,六八八,二七六 】,無論你是大牛還是小白,是想轉行還是想入行都可以來了解一起進步一起學習!裙內有開發工具,很多干貨和技術資料分享!

這些是C/C++能做的

服務器開發工程師、人工智能、云計算工程師、信息安全(黑客反黑客)、大數據 、數據平臺、嵌入式工程師、流媒體服務器、數據控解、圖像處理、音頻視頻開發工程師、游戲服務器、分布式系統、游戲輔助等

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,837評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,196評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,688評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,654評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,456評論 6 406
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,955評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,044評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,195評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,725評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,608評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,802評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,318評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,048評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,422評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,673評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,424評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,762評論 2 372

推薦閱讀更多精彩內容