C语言编写的坦克大战exe小游戏! (含有部分C++函数,不过不需要知道实现细节,主要用于键盘读取等)
适合初学者学习的坦克大战代码,无图片,游戏全部功能画面显示全部由 printf 打印的哦!

C++视频跟笔记都是全网最新最全的,加群玖四捌,玖伍四,四捌四

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


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

int i;

for (i = 0; i

{

EnemyTank[i] = InitEnemtyTank();

DrawEnmpty(&EnemyTank[i]);

ImportEnemyTankGameAreaArry(&EnemyTank[i]);

}

while (i–)

{

hThread = CreateThread(NULL, 0, EnemyMoe, &EnemyTank[i], 0, 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, col, oerlp;

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)

{

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, j;

int row, 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, j;

int row, 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, j;

int row, 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, 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 ShellMoeLEFT(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

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, 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 ShellMoeRIGHT(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 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, 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

{

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 ‘’), 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/爆炸.wa ‘’), 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;

PrintGameOer();

}

else

{

InitMyTnak(&MyselfTanke);

DrawTnak(&MyselfTanke);

ImportMyTankGameAreaArry();

PlaySound(TEXT(’'sound/爆炸.wa ‘’), NULL, 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, 0, ShellDispes, psn, 0, 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, 0, EnemyMoe, pTank, 0, 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, csbi.dwCursorPosition, &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, 2, csbi.dwCursorPosition, &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, &csbi);

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

FillConsoleOutputAttribute(g_hout,HOME_Color, 2, csbi.dwCursorPosition, &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, &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 ;

}

}

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, &csbi);

printf(’’’’);

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

}

else

printf(’’ ‘’);

}

pos.Y ;

}

}

oid DrawTnakClear(Tank *ptank)

{

COORD pos;

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])

{

printf(’’ ‘’);

}

else

printf(’’ ‘’);

}

pos.Y ;

}

}

int TankMoeUp(Tank *ptank)

{

int row, col;

int i, 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, col;

int i, 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, col;

int i, 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, col;

int i, 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, col;

int i, 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, col;

int i, 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, col;

int i, 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, col;

int i, 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, 2, 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, pos, &count);

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

DeleteCriticalSection(&g_cs);

DestroyList(&g_shell_list);

exit(0);

}

oid Printictory()

{

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

system(’‘cls’’);

DWORD count;

COORD pos = { 32,10 };

SetConsoleCursorPosition(g_hout, pos);

printf(’’ octiory ‘’);

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;

//链表操作函数

//链表初始化

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

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

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

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

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

mciSendString(TEXT(’‘open sound\Back.wa 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

{

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 ‘’), 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;

LeaeCriticalSection(&g_cs);

}

return 0;

}
感兴趣的需要更多学习资料可以加郡948,954484

C语言编写的坦克大战exe小游戏相关推荐

  1. 一个C语言编写的坦克大战游戏

    在VC6.0平台下运用一个EasyX的图形库,用C语言编写了一个坦克大战的小游戏,代码和算法都是我自己源生的.文章的两幅配图,分别展示了游戏的开始选择界面和正在游戏界面.这个小游戏,具有游戏背景音乐, ...

  2. 100行JS代码实现❤坦克大战js小游戏源码 HTML5坦克大战游戏代码(HTML+CSS+JavaScript )

    坦克大战js小游戏源码 HTML5坦克大战游戏代码(HTML+CSS+JavaScript ) HTML5坦克大战网页小游戏,完美还原小霸王学习机效果,以坦克战斗及保卫基地为主题,属于策略型类游戏. ...

  3. 【项目展示】自己用C语言编写的汉诺塔小游戏

    本文目录 1.前言 2.什么是汉诺塔? 3.项目规格 4.基本思路 5.源代码 6.运行结果 7.感想与心得 8.未来规划 1.前言 昨儿个把自己大一时候写过的五子棋重构了一下,之后就在想着要不把不知 ...

  4. C语言编写简单的走迷宫小游戏

    走迷宫: 1.定义一个二维数组作为迷宫 2.定义老鼠的坐标 3.获取游戏开始时的时间time(NULL) 4.进入循环 1.system 清理屏幕 2.显示迷宫(遍历二维数组) 3.检查是否走出迷宫 ...

  5. Java实现一个坦克大战的小游戏【附源码】

    博主介绍:

  6. Java坦克大战,基于Swing编写很哇塞的小游戏,可以做课程设计毕业设计

    Java坦克大战,基于Swing编写很哇塞的小游戏,可以做课程设计毕业设计 有图有真相 操作方法:ASDW控制移动,鼠标控制炮筒旋转,鼠标左键开枪,空格发射炮弹, 开发思路是标准的游戏开发思路,单线程 ...

  7. funcode坐标c语言,c语言程序设计_坦克大战(提高篇)(funcode环境)

    C语言课程设计--坦克大战 一.游戏介绍 玩家坦克与敌方坦克在街道中进行巷战,玩家坦克被击中.玩家指挥部被击中或游戏时间到,一局游戏结束. 二.实验目的 综合应用C语言知识和设计知识开发一款小游戏. ...

  8. 【Pygame小游戏】神还原【欢乐无穷的双人坦克大战】小程序游戏,上手开玩~(附完整源码)

    前言 嘿!我是栗子同学,欢迎大家阅读这篇<坦克大战双人版游戏编程>. 我相信这个游戏的话对于大家可能会比较难,刚开始学习的话这个代码就直接发给大家玩一玩的 哈,但是大家可以看看这个代码啦! ...

  9. 转载:HTML编写的坦克大战游戏

    多是讲基础,为了培养兴趣,我们看一个html语言写的坦克大战游戏. 没错,这就是用html语言写的,迫不及待要看看代码了吧.很简单,主体如下: <!DOCTYPE html> <ht ...

最新文章

  1. LeetCode Battleships in a Board
  2. python requests post请求_Pythonrequest发送post请求
  3. php实现单个用户禁止重复登录,防止同一用户同时登陆
  4. 计算机组成原理课设总线,计算机组成原理课程设计(全).doc
  5. C++ opengl GL_QUAD_STRIP的绘制
  6. java 修改final_Java反射有效修改final属性值
  7. png 微软ppt 透明度_工作必备,如何用PPT把logo玩出千种花样?
  8. java项目开发实例基于javaweb+mysql数据库实现的宠物领养|流浪猫狗网站含论文+开题报告
  9. 进制转换表与课程内容
  10. C/C++程序设计题
  11. Pigsty是什么?
  12. 搜索引擎使用技巧详解
  13. MySQL索引原理(标贝科技)
  14. C#实现超市管理系统(进销存--(包含部分用户权限的管理))
  15. 学计算机的的用87键键盘可以吗,键盘87和108键区别
  16. basename函数漏洞之[Zer0pts2020]Can you guess it?
  17. 假定在使用CSMA/CD协议的10Mbit/s以太网中某个站在发送数据时检测到碰撞,执行退避算法时选择了随机数r=100.试问这个站需要等待多长时间后才能再次发送数据?如果是100Mbit/s的以太网
  18. 飞塔60d带宽_飞塔防火墙划分带宽 万兆防火墙
  19. paypal付款,PayPal Subscribe和PayPal Check Out的区别
  20. 树莓派 可用于播放音频的三个软件

热门文章

  1. ramdisk.img文件解析
  2. 网络连接状态断开服务器无响应,已断开(服务器无响应),路由器连不上网什么原因...
  3. Spark作业调度中stage的划分
  4. idea remote debug Source code does not match the bytecode
  5. C语言 乒乓球比赛问题
  6. 三星笔记本如何重装win10系统?分享重装win10系统操作方法
  7. 关于Linux系统网卡流量Tx和Rx的意思详解
  8. HUAWEI(28)——Vxlan_多子网跨子网互访
  9. php如何实现文字闪动,Javascrip实现文字跳动特效
  10. 每条跑道背后,可能都有一个胖子~