C# · 12月 20, 2021

C语言/C艹编程入门经典小游戏坦克大战!

(小编推荐一个学C语言/C++的学习群:788649720,入群即送C/C++全套学习资料,满满的干货!)

game.h下的代码

#ifndef GAME

#define GAME

#include’‘tankdef.h’’

oid ImportMapGameAreaArry();

oid ImportHomeGameAreaArry();

oid ImportMyTankGameAreaArry();

oid DrawGame_Info();

int ConsoleSwtichArrX(int x);

int ConsoleSwtichArrY(int y);

oid TankAdjustUp(Tank *ptank,Dir dir);

oid TankAdjustLeft(Tank *ptank);

oid TankAdjustRight(Tank *ptank);

oid TankAdjustDown(Tank *ptank);

oid TankAdjustUpE(Tank *ptank,Dir dir);

//发射炮弹,参数为发射改炮弹的坦克

SHELLNODE *shot(Tank *ptank);

//炮弹向上移动

int ShellMoeUP(SHELLNODE *psn);

int ShellMoeDOWN(SHELLNODE *psn);

int ShellMoeLEFT(SHELLNODE *psn);

int ShellMoeRIGHT(SHELLNODE *psn);

//检查链表

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

//线程处理函数

DWORD WINAPI ShellDispes(LPO lpParam);

//oid WriteFile1();

oid HitTarget(SHELLNODE *psn,int tagert);

//根据炮弹的坐标销毁相应的坦克

oid DestroyEnemy(SHELLNODE *psn);

//清空敌方坦克的数据

oid ClearEnemyTank(Tank *ptank);

//炮弹节点的比较函数

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

//敌方坦克移动函数

DWORD WINAPI EnemyMoe(LPO 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;

oid 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.wa ‘’),NULL,SND_LOOP);

PlaySound(TEXT(’’sound/TankMoe.wa ‘’),SND_LOOP);

int i;

for (i = 0; i

{

EnemyTank[i] = InitEnemtyTank();

DrawEnmpty(&EnemyTank[i]);

ImportEnemyTankGameAreaArry(&EnemyTank[i]);

}

while (i–)

{

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

CloseHandle(hThread);

}

//初始化炮弹链表

InitLinkList(&g_shell_list);

//WriteFile1();

}

oid 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,oerlp;

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)

{

oerlp = 0;

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

row = ConsoleSwtichArrY(tank.y);

col = ConsoleSwtichArrX(tank.x);

for (i = row; i

{ //取非为真

for (j = col; j

{

if (g_area_data[i][j])

{

oerlp = 1;

}

}

}

if (!oerlp)

break;

}

return tank;

}

Tank InitEnemtyTankSpeed()

{

int row,j;

Tank tank;

tank.belong = ENEMY;

tank.dir = rand() % 4;

tank.lief = 1;

tank.speed = 100;

tank.y = Left_Top_Y 1;

while (1)

{

oerlp = 0;

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

row = ConsoleSwtichArrY(tank.y);

col = ConsoleSwtichArrX(tank.x);

for (i = row; i

{ //取非为真

for (j = col; j

{

if (g_area_data[i][j])

{

oerlp = 1;

}

}

}

if (!oerlp)

break;

}

return tank;

}

//将地图导入到二维数组

oid ImportMapGameAreaArry()

{

int i,j;

for (i = 0; i

{

for (j = 0; j

{

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

}

}

}

//将老家导入到二维数组

oid ImportHomeGameAreaArry()

{

int i,j;

int row,col;

row = ConsoleSwtichArrY(Left_Top_Y 18);

col = ConsoleSwtichArrX(Left_Top_X 30);

for (i = 0; i

{

for (j = 0; 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;

}

}

}

oid ImportMyTankGameAreaArry()

{

int i,col;

row = ConsoleSwtichArrY(MyselfTanke.y);

col = ConsoleSwtichArrX(MyselfTanke.x);

for (i = 0; i

{

for (j = 0; 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;

}

}

}

oid ImportEnemyTankGameAreaArry(Tank *ptank)

{

int i,col;

row = ConsoleSwtichArrY(ptank->y);

col = ConsoleSwtichArrX(ptank->x);

for (i = 0; i

{

for (j = 0; 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;

}

}

}

oid ImportMyClearTankGameAreaArry()

{

int i,col;

row = ConsoleSwtichArrY(MyselfTanke.y);

col = ConsoleSwtichArrX(MyselfTanke.x);

for (i = 0; i

{

for (j = 0; 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);

}

oid WriteFile1()

{

int i,j;

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

if (fp == NULL)

return;

for (i = 0; i

{

for (j = 0; j

{

fprintf_s(fp,‘’-’’,g_area_data[i][j]);

}

fprintf_s(fp,’’ ‘’);

}

fclose(fp);

}

oid TankAdjustUp(Tank *ptank,Dir dir)

{

ptank->dir = dir;

DrawTnakClear(ptank);

DrawTnak(ptank);

}

oid TankAdjustLeft(Tank *ptank)

{

ptank->dir = LEFT;

DrawTnakClear(ptank);

DrawTnak(ptank);

}

oid TankAdjustRight(Tank *ptank)

{

ptank->dir = RIGHT;

DrawTnakClear(ptank);

DrawTnak(ptank);

}

oid TankAdjustDown(Tank *ptank)

{

ptank->dir = DOWN;

DrawTnakClear(ptank);

DrawTnak(ptank);

}

oid 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 ShellMoeUP(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

return OER_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 ShellMoeDOWN(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 OER_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,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 ShellMoeLEFT(SHELLNODE *pShell)

{

int x,‘’ ‘’);//擦除炮弹

if (x

return OER_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,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 ShellMoeRIGHT(SHELLNODE *pShell)

{

int x,‘’ ‘’);//擦除炮弹

if (x >= Game_Arr_Width – 1)

return OER_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,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 y)

{

SHELLNODE *psn = NULL;

int i;

for (i = 0; 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(LPO 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 = ShellMoeUP(psm))

{

HitTarget(psm,ret);

}

break;

case DOWN:

if (ret = ShellMoeDOWN(psm))

HitTarget(psm,ret);

break;

case LEFT:

if (ret = ShellMoeLEFT(psm))

HitTarget(psm,ret);

break;

case RIGHT:

if (ret = ShellMoeRIGHT(psm))

HitTarget(psm,ret);

break;

}

LeaeCriticalSection(&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);

LeaeCriticalSection(&g_cs);

return 0;

}

int g_die_Enemy = 0;

oid HitTarget(SHELLNODE *psn,int tagert)

{

switch (tagert)

{

case AREA_SHELL:

case OER_LOW:

psn->shell.left = 0;

break;

case AREA_WALL:

HitWall(&psn->shell);

psn->shell.left = 0;

PlaySound(TEXT(’’sound/击碎.wa ‘’),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/爆炸.wa ‘’),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;

PrintGameOer();

}

else

{

InitMyTnak(&MyselfTanke);

DrawTnak(&MyselfTanke);

ImportMyTankGameAreaArry();

PlaySound(TEXT(’’sound/爆炸.wa ‘’),SND_ASYNC);

}

}

break;

}

}

oid DestroyEnemy(SHELLNODE *psn)

{

int i;//用于遍历数组

Tank t; //一个临时的坦克

for (i = 0; i

{

t = EnemyTank[i];

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

psn->shell.y >= t.y && psn->shell.y

{

//清除坦克

DrawTnakClear(&t);

//修改坦克的生命值

EnemyTank[i].lief = 0;

//清空敌方坦克的数据

ClearEnemyTank(&t);

}

}

}

oid ClearEnemyTank(Tank *ptank)

{

int row,col;

int i,j;

row = ConsoleSwtichArrY(ptank->y);

col = ConsoleSwtichArrX(ptank->x);

for (i = row; i

{

for (j = col; 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 EnemyMoe(LPO 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,ShellDispes,psn,NULL);

CloseHandle(hThread);

}

}

switch (pTank->dir)

{

case UP:

if (TankMoeUpE(pTank))

{

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

}

break;

case DOWN:

if(TankMoeDownE(pTank))

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

break;

case LEFT: if(TankMoeLeftE(pTank))

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

break;

case RIGHT: if(TankMoeRightE(pTank))

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

break;

}

LeaeCriticalSection(&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

{

//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,pTank,NULL);

CloseHandle(hThread);

LeaeCriticalSection(&g_cs);

}

else if(Die_Enemy_Tank_Count == ENEMY_Z_ALL_TANK)

{

EnterCriticalSection(&g_cs);

Printictory();

LeaeCriticalSection(&g_cs);

}

return 0;

}

oid 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’’);

LeaeCriticalSection(&g_cs);

}

interface.h

#include

#include’‘tankdef.h’’

#ifndef INTERFACE

#define INTERFACE

//开始游戏

oid Game_Start();

C语言/C艹编程入门经典小游戏坦克大战!

//画游戏界面

oid DrawGameBord();

oid LoadMap();

oid DrawHome();

oid InitMyTnak(Tank *ptank);

oid DrawTnak(Tank *ptank);

Tank InitEnemtyTank();

oid DrawEnmpty(Tank *pEtank);

oid DrawTnakClear(Tank *ptank);

oid ImportEnemyTankGameAreaArry();

oid ImportMyClearTankGameAreaArry();

int TankMoeUp(Tank *ptank);

int TankMoeLeft(Tank *ptank);

int TankMoeRight(Tank *ptank);

int TankMoeDown(Tank *ptank);

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

oid WriteFile1();

oid HitWall(SHELL *pShell);

oid HitHome(SHELL *pShell);

oid PrintGameOer();

int TankMoeUpE(Tank *ptank);

int TankMoeDownE(Tank *ptank);

int TankMoeLeftE(Tank *ptank);

int TankMoeRightE(Tank *ptank);

oid Printictory();

#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;

oid DrawGameBord()

{

g_hout = GetStdHandle(STD_OUTPUT_HANDLE);

CONSOLE_CURSOR_INFO c;

GetConsoleCursorInfo(g_hout,&c);

c.bisible = 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

{

SetConsoleCursorPosition(g_hout,pos);

for (col = 0; 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,&count);

}

oid LoadMap()

{

int row,col;

COORD pos;

DWORD count;

pos.X = Left_Top_X 2;

pos.Y = Left_Top_Y 4;

for (row = 0; row

{

SetConsoleCursorPosition(g_hout,pos);

for (col = 0; col

{

if (map[row][col])

{

GetConsoleScreenBufferInfo(g_hout,&csbi);

printf(’’%s’’,TANKLE_LETTER);

FillConsoleOutputAttribute(g_hout,BORDER_Color1,&count);

}

else

printf(’’ ‘’);

}

pos.Y ;

}

}

oid DrawHome()

{

int row,col;

COORD pos;

DWORD count;

pos.X = Left_Top_X 30;

pos.Y = Left_Top_Y 18;

for (row = 0; row

{

SetConsoleCursorPosition(g_hout,pos);

for (col = 0; col

{

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

{

GetConsoleScreenBufferInfo(g_hout,HOME_LETTER);

FillConsoleOutputAttribute(g_hout,HOME_Color,&count);

}

else

printf(’’%s’’,BORDER_LEFTER);

}

pos.Y ;

}

}

oid DrawTnak(Tank *ptank)

{

COORD pos;

DWORD count;

int row,col;

pos.X = ptank->x;

pos.Y = ptank->y;

for (row = 0; row

{

SetConsoleCursorPosition(g_hout,pos);

for (col = 0; col

{

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

{

GetConsoleScreenBufferInfo(g_hout,Tank_Color,&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 ;

}

}

oid DrawEnmpty(Tank *pEtank)

{

COORD pos;

DWORD count;

pos.X = pEtank->x;

pos.Y = pEtank->y;

int row,col;

for (row = 0; row

{

SetConsoleCursorPosition(g_hout,pos);

for (col = 0; col

{

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

{

GetConsoleScreenBufferInfo(g_hout,FOREGROUND_GREEN | FOREGROUND_INTENSITY,&count);

}

else

printf(’’ ‘’);

}

pos.Y ;

}

}

oid DrawTnakClear(Tank *ptank)

{

COORD pos;

int row,pos);

for (col = 0; col

{

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

{

printf(’’ ‘’);

}

else

printf(’’ ‘’);

}

pos.Y ;

}

}

int TankMoeUp(Tank *ptank)

{

int row,j;

row = ConsoleSwtichArrY(ptank->y);

col = ConsoleSwtichArrX(ptank->x);

//判断是否越界

if (row

return OER_LOW;

//判断是否撞墙

for (i = col; i

{

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

return g_area_data[row – 1][i];

}

for (i = row – 1; i

{

for (j = col; 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 TankMoeLeft(Tank *ptank)

{

int row,j;

row = ConsoleSwtichArrY(ptank->y);

col = ConsoleSwtichArrX(ptank->x);

//判断是否越界

if (col

return OER_LOW;

//判断是否撞墙

for (i = row; i

{

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

return g_area_data[i][col – 1];

}

for (i = row; i

{

for (j = col – 1; 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 TankMoeRight(Tank *ptank)

{

int row,j;

row = ConsoleSwtichArrY(ptank->y);

col = ConsoleSwtichArrX(ptank->x);

//判断是否越界

if (col 2 >= Game_Arr_Width – 1)

return OER_LOW;

//判断是否撞墙

for (i = row; i

{

if (g_area_data[i][col 3])

return g_area_data[i][col 3];

}

for (i = row; 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 TankMoeDown(Tank *ptank)

{

int row,j;

row = ConsoleSwtichArrY(ptank->y);

col = ConsoleSwtichArrX(ptank->x);

//判断是否越界

if (row 2 >= Gmae_Arr_Height – 1)

return OER_LOW;

//判断是否撞墙

for (i = col; 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

{

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 TankMoeUpE(Tank *ptank)

{

int row,j;

row = ConsoleSwtichArrY(ptank->y);

col = ConsoleSwtichArrX(ptank->x);

//判断是否越界

if (row

return OER_LOW;

//判断是否撞墙

for (i = col; i

{

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

return g_area_data[row – 1][i];

}

for (i = row – 1; i

{

for (j = col; 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 TankMoeDownE(Tank *ptank)

{

int row,j;

row = ConsoleSwtichArrY(ptank->y);

col = ConsoleSwtichArrX(ptank->x);

//判断是否越界

if (row 2 >= Gmae_Arr_Height – 1)

return OER_LOW;

//判断是否撞墙

for (i = col; 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

{

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 TankMoeRightE(Tank *ptank)

{

int row,j;

row = ConsoleSwtichArrY(ptank->y);

col = ConsoleSwtichArrX(ptank->x);

//判断是否越界

if (col 2 >= Game_Arr_Width – 1)

return OER_LOW;

//判断是否撞墙

for (i = row; i

{

if (g_area_data[i][col 3])

return g_area_data[i][col 3];

}

for (i = row; 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 TankMoeLeftE(Tank *ptank)

{

int row,j;

row = ConsoleSwtichArrY(ptank->y);

col = ConsoleSwtichArrX(ptank->x);

//判断是否越界

if (col

return OER_LOW;

//判断是否撞墙

for (i = row; i

{

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

return g_area_data[i][col – 1];

}

for (i = row; i

{

for (j = col – 1; 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;

}

oid 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,pos,&cout);

}

oid 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

{

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

{

SetConsoleCursorPosition(g_hout,pos);

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

{

printf(’’ ‘’);

g_area_data[i][col] = AREA_SPACE;

}

pos.Y ;

}

}

}

oid HitHome(SHELL *pShell)

{

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

SetConsoleCursorPosition(g_hout,pos);

printf(’’ ‘’);

PrintGameOer();

}

oid PrintGameOer()

{

system(’‘cls’’);

DWORD count;

COORD pos = { 32,10};

SetConsoleCursorPosition(g_hout,pos);

printf(’‘Game Oer!’’);

FillConsoleOutputAttribute(g_hout,FOREGROUND_GREEN | FOREGROUND_INTENSITY |

BACKGROUND_RED | BACKGROUND_INTENSITY,10,&count);

PlaySound(TEXT(’’sound/Dath.wa ‘’),SND_LOOP);

DeleteCriticalSection(&g_cs);

DestroyList(&g_shell_list);

exit(0);

}

oid Printictory()

{

PlaySound(TEXT(’’sound/胜利.wa ‘’),SND_LOOP);

system(’‘cls’’);

DWORD count;

COORD pos = { 32,10 };

SetConsoleCursorPosition(g_hout,pos);

printf(’’ octiory ‘’);

FillConsoleOutputAttribute(g_hout,&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;

//链表操作函数

//链表初始化

oid InitLinkList(LINKLIST **list);

//销毁链表

oid DestroyList(LINKLIST **list);

//添加一个节点的链表到尾部

oid 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

//链表操作函数

//链表初始化

oid InitLinkList(LINKLIST **list)

{

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

if (*list == NULL)

return;

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

(*list)->size = 0;

}

//销毁链表

oid DestroyList(LINKLIST **list)

{

if (list && *list)

{

free(*list);

*list = NULL;

}

}

//添加一个节点的链表到尾部

oid 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 *))

{

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

return NULL;

for (i = 0; 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 OER_LOW -1 //越界

#define Game_Oer 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,1,0 },

{ 0,

{ 1,1 },0 }

};

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

{

1,

1,1

},

{

1,

0,1

}

};

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

{

0,0

},

{

0,0

}

};

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

{

0,3,

3,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:s2015坦克大战坦克大战soundBack.wa ‘’),SND_ASYNC | SND_LOOP | SND_FILENAME);

/*PlaySound(TEXT(’’G:s2015坦克大战坦克大战hit.wa ‘’),SND_LOOP | SND_FILENAME);

PlaySound(TEXT(’’G:s2015坦克大战坦克大战Bang.wa ‘’),SND_LOOP | SND_FILENAME);

PlaySound(TEXT(’’G:s2015坦克大战坦克大战Fanfare.wa ‘’),SND_LOOP | SND_FILENAME);*/

mciSendString(TEXT(’‘open soundBack.wa alias music’’),NULL);

mciSendString(TEXT(’‘play music’’),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

{

TankMoeUp(&MyselfTanke);

}

LeaeCriticalSection(&g_cs);

break;

case ‘s’:

EnterCriticalSection(&g_cs);

if (MyselfTanke.dir != DOWN)

TankAdjustDown(&MyselfTanke);

else

{

TankMoeDown(&MyselfTanke);

}

LeaeCriticalSection(&g_cs);

break;

case ‘a’:

EnterCriticalSection(&g_cs);

if (MyselfTanke.dir != LEFT)

TankAdjustLeft(&MyselfTanke);

else

{

TankMoeLeft(&MyselfTanke);

}

LeaeCriticalSection(&g_cs);

break;

case ‘d’:

EnterCriticalSection(&g_cs);

if (MyselfTanke.dir != RIGHT)

TankAdjustRight(&MyselfTanke);

else

{

TankMoeRight(&MyselfTanke);

}

LeaeCriticalSection(&g_cs);

break;

case ‘j’:

if (g_self_shell_cout

{

PlaySound(TEXT(’’sound/hit.wa ‘’),SND_ASYNC | SND_NowAIT);

psn = shot(&MyselfTanke);

g_self_shell_cout;

hThread = CreateThread(NULL,NULL);

CloseHandle(hThread);

}

break;

}

}

}

mciSendString(TEXT(’‘close music’’),NULL);

while(CountOfLinkList(g_shell_list))

{

EnterCriticalSection(&g_cs);

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

if (psn)

psn->shell.left = 0;

LeaeCriticalSection(&g_cs);

}

return 0;

}