C語言是面向過程的整慎,而C++是面向?qū)ο蟮?/b>
C和C++的區(qū)別:
C是一個結(jié)構(gòu)化語言慰于,它的重點在于算法和數(shù)據(jù)結(jié)構(gòu)款咖。C程序的設(shè)計首要考慮的是如何通過一個過程何暮,對輸入(或環(huán)境條件)進行運算處理得到輸出(或?qū)崿F(xiàn)過程(事務(wù))控制)。
C++铐殃,首要考慮的是如何構(gòu)造一個對象模型海洼,讓這個模型能夠契合與之對應(yīng)的問題域,這樣就可以通過獲取對象的狀態(tài)信息得到輸出或?qū)崿F(xiàn)過程(事務(wù))控制富腊。 所以C與C++的最大區(qū)別在于它們的用于解決問題的思想方法不一樣坏逢。之所以說C++比C更先進,是因為“ 設(shè)計這個概念已經(jīng)被融入到C++之中 ”赘被。
C與C++的最大區(qū)別:在于它們的用于解決問題的思想方法不一樣是整。之所以說C++比C更先進,是因為“ 設(shè)計這個概念已經(jīng)被融入到C++之中 ”民假,而就語言本身而言浮入,在C中更多的是算法的概念。那么是不是C就不重要了阳欲,錯舵盈!算法是程序設(shè)計的基礎(chǔ)陋率,好的設(shè)計如果沒有好的算法,一樣不行秽晚。而且瓦糟,“C加上好的設(shè)計”也能寫出非常好的東西。
小編推薦一個學(xué)C語言/C++的學(xué)習(xí)裙【 二六三赴蝇,六八八菩浙,二七六 】,無論你是大牛還是小白句伶,是想轉(zhuǎn)行還是想入行都可以來了解一起進步一起學(xué)習(xí)劲蜻!裙內(nèi)有開發(fā)工具,很多干貨和技術(shù)資料分享考余!
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);
//發(fā)射炮彈先嬉,參數(shù)為發(fā)射改炮彈的坦克
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);
//線程處理函數(shù)
DWORD WINAPI ShellDispes(LPVOID lpParam);
//void WriteFile1();
void HitTarget(SHELLNODE *psn, int tagert);
//根據(jù)炮彈的坐標銷毀相應(yīng)的坦克
void DestroyEnemy(SHELLNODE *psn);
//清空敵方坦克的數(shù)據(jù)
void ClearEnemyTank(Tank *ptank);
//炮彈節(jié)點的比較函數(shù)
int ShellCompareByNum(NODE *pNode1, NODE *pNode2);
//敵方坦克移動函數(shù)
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;
//初始化臨界區(qū)資源
system("mode con cols=95 lines=25");
SetConsoleTitle(TEXT("坦克大戰(zhàn)"));
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;
}
//將地圖導(dǎo)入到二維數(shù)組
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];
}
}
}
//將老家導(dǎo)入到二維數(shù)組
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)//如果炮彈之前已經(jīng)運行
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;//調(diào)整炮彈坐標
return g_area_data[y - 1][x];
}
//如果上方有對方炮彈楚堤,就返回
//遍歷鏈表疫蔓,查找有無對方炮彈存在
if (ps = CheckLinkList(!psn->shell.belong, psn->shell.x, psn->shell.y - 1))
{
ps->shell.left = 0;//讓對方的炮彈的生命結(jié)束
/*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;//調(diào)整炮彈坐標
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)//如果炮彈之前已經(jīng)運行
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;//調(diào)整炮彈坐標
return g_area_data[y + 1][x];
}//如果上方有對方炮彈衅胀,就返回
//遍歷鏈表,查找有無對方炮彈存在
if (ps = CheckLinkList(!pShell->shell.belong, pShell->shell.x, pShell->shell.y + 1))
{
ps->shell.left = 0;//讓對方的炮彈的生命結(jié)束
/*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;//調(diào)整炮彈坐標
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)//如果炮彈之前已經(jīng)運行
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;//調(diào)整炮彈坐標
return g_area_data[y][x - 1];
}//如果上方有對方炮彈,就返回
//遍歷鏈表嘿歌,查找有無對方炮彈存在
if (ps = CheckLinkList(!pShell->shell.belong, pShell->shell.x - 2, pShell->shell.y))
{
ps->shell.left = 0;//讓對方的炮彈的生命結(jié)束
/*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;//調(diào)整炮彈坐標
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)//如果炮彈之前已經(jīng)運行
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;//調(diào)整炮彈坐標
return g_area_data[y][x + 1];
}//如果上方有對方炮彈搅幅,就返回
//遍歷鏈表阅束,查找有無對方炮彈存在
if (ps = CheckLinkList(!pShell->shell.belong, pShell->shell.x + 2, pShell->shell.y))
{
ps->shell.left = 0;//讓對方的炮彈的生命結(jié)束
/*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;//調(diào)整炮彈坐標
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;//用于遍歷數(shù)組
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;
//清空敵方坦克的數(shù)據(jù)
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;
}
}
}
//炮彈節(jié)點比較函數(shù)
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) //改發(fā)射炮彈了
{
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語言坦克大戰(zhàn)項目");
pos.Y += 2;
SetConsoleCursorPosition(g_hout, pos);
printf("信息窗口:");
++pos.Y;
if (g_start == 1)
{
SetConsoleCursorPosition(g_hout, pos);
printf("游戲運行狀態(tài): Pause");
}
if(g_start == 0)
{
SetConsoleCursorPosition(g_hout, pos);
printf("游戲運行狀態(tài): Run ");
}
pos.Y += 2;
SetConsoleCursorPosition(g_hout, pos);
printf("敵方坦克總數(shù):%d", ENEMY_Z_ALL_TANK);
pos.Y++;
SetConsoleCursorPosition(g_hout, pos);
printf("敵方坦克陣亡數(shù)量:%d", g_die_Enemy);
pos.Y++;
SetConsoleCursorPosition(g_hout, pos);
printf("敵方坦克剩余數(shù)量:%d ",ENEMY_Z_ALL_TANK - g_die_Enemy);
pos.Y += 2;
SetConsoleCursorPosition(g_hout, pos);
printf("我方坦克總數(shù):%d", AREA_SELF);
pos.Y++;
SetConsoleCursorPosition(g_hout, pos);
printf("我方坦克陣亡數(shù)量:%d", g_die_shellf);
pos.Y ++;
SetConsoleCursorPosition(g_hout, pos);
printf("我方坦克剩余數(shù)量:%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("坦克發(fā)射炮彈:J");
LeaveCriticalSection(&g_cs);
}
interface.h
#include
#include"tankdef.h"
#ifndef _INTERFACE_
#define _INTERFACE_
//開始游戲
void Game_Start();
小編推薦一個學(xué)C語言/C++的學(xué)習(xí)裙【 二六三息裸,六八八,二七六 】沪编,無論你是大牛還是小白呼盆,是想轉(zhuǎn)行還是想入行都可以來了解一起進步一起學(xué)習(xí)!裙內(nèi)有開發(fā)工具蚁廓,很多干貨和技術(shù)資料分享访圃!
//畫游戲界面
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("坦克大戰(zhàn)");
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_
//定義節(jié)點結(jié)構(gòu)
typedef struct node
{
struct node *next; //指向下一個節(jié)點
}NODE;
typedef struct linklist
{
NODE head; //頭節(jié)點
int size; //大小
}LINKLIST;
//鏈表操作函數(shù)
//鏈表初始化
void InitLinkList(LINKLIST **list);
//銷毀鏈表
void DestroyList(LINKLIST **list);
//添加一個節(jié)點的鏈表到尾部
void AddNode(LINKLIST *list, NODE *pNode);
//刪除一個指定的節(jié)點,刪除成功返回成功節(jié)點的指針相嵌,失敗返回NULL
NODE *DeleteNode(LINKLIST *list, NODE *pNode, int(*compare)(NODE *, NODE *));
//返回鏈表中節(jié)點的個數(shù)
int CountOfLinkList(LINKLIST *list);
//返回指定位置的節(jié)點
NODE *GetNode(LINKLIST *list, int pos);
#endif
linklist.c 下的代碼
#include"linklist.h"
#include
#include
//鏈表操作函數(shù)
//鏈表初始化
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;
}
}
//添加一個節(jié)點的鏈表到尾部
void AddNode(LINKLIST *list, NODE *pNode)
{
NODE *p = &list->head;
while (p->next)
p = p->next;
p->next = pNode;
list->size++; //節(jié)點的大小+1
}
//刪除一個指定的節(jié)點腿时,刪除成功返回成功節(jié)點的指針况脆,失敗返回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;
}
//返回鏈表中節(jié)點的個數(shù)
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 //游戲區(qū)域的寬度
#define Gmae_Arr_Height 20 //游戲區(qū)域的高度
#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//關(guān)卡顏色
#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 //游戲結(jié)束
#define Myself_Shell_Count 3 //我方炮彈的數(shù)量
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;
//炮彈節(jié)點
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;
// 我放炮彈的數(shù)量
int g_self_shell_cout = 0;
int Die_Enemy_Tank_Count = 0; //The number of enemy tank deaths
int g_die_shellf = 0; // 敵方陣亡的坦克數(shù)量
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\坦克大戰(zhàn)\坦克大戰(zhàn)\sound\Back.wav "), NULL, SND_ASYNC | SND_LOOP | SND_FILENAME);
/*PlaySound(TEXT("G:\vs2015\坦克大戰(zhàn)\坦克大戰(zhàn)\hit.wav "), NULL, SND_LOOP | SND_FILENAME);
PlaySound(TEXT("G:\vs2015\坦克大戰(zhàn)\坦克大戰(zhàn)\Bang.wav "), NULL, SND_LOOP | SND_FILENAME);
PlaySound(TEXT("G:\vs2015\坦克大戰(zhàn)\坦克大戰(zhàn)\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;
}
小編推薦一個學(xué)C語言/C++的學(xué)習(xí)裙【 二六三,六八八批糟,二七六 】格了,無論你是大牛還是小白,是想轉(zhuǎn)行還是想入行都可以來了解一起進步一起學(xué)習(xí)徽鼎!裙內(nèi)有開發(fā)工具盛末,很多干貨和技術(shù)資料分享!
這些是C/C++能做的
服務(wù)器開發(fā)工程師否淤、人工智能悄但、云計算工程師、信息安全(黑客反黑客)石抡、大數(shù)據(jù) 檐嚣、數(shù)據(jù)平臺、嵌入式工程師汁雷、流媒體服務(wù)器净嘀、數(shù)據(jù)控解、圖像處理侠讯、音頻視頻開發(fā)工程師、游戲服務(wù)器暑刃、分布式系統(tǒng)厢漩、游戲輔助等