C/C++ 手写“90坦克大战游戏”

C++坦克大战源代码 【代码】C++坦克大战源代码。 阅读详情

今天给大家分享使用C语言配合easy-x图形库开发的一款控制台桌面小游戏。(IDE:请使用vs2010或者vs2019)

资源下载链接:

百度网盘
链接:https://pan.baidu.com/s/1KYtZDYwbR_X62k_Swl3anQ
提取码:8qa4

或者点击这里!!!

相信不管是80后还是90后,更或者是00后,应该都玩过“09坦克大战”这款经典的FP游戏吧,现在,给大家分享这款游戏的运行代码。(个人观点)

程序还有许多地方需要去优化的,有兴趣的小伙伴可以下载回去自己琢磨琢磨,修改完善。

当然,地图也是只有一份,有兴趣的小伙伴,可以自行下载资源回去,对地图进行增加。

由于代码量有点大,在这里就不一一讲解了。

当然本款小游戏也是在腾讯课堂骑牛学院martin老师的指点下完成的,有兴趣学习C/C++语言的小伙伴可以去腾讯课堂官网搜索骑牛学院!

废话不多说,先上游戏截图:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

好了,游戏的效果图已经展现给大家看了,那么下面请看代码:

#include <graphics.h>
#include <conio.h>
#include <Windows.h>
#include <time.h>
#include <MMSystem.h>

#pragma comment (lib, "winmm.lib")	// 导入声音库

#define ENEMY_NUM 10

enum DIRECTION {
	UP,
	DOWN,
	LEFT,
	RIGHT
};

// 坦克结构体
struct tank_s {
	int x;	// 坦克在地图数组中所在的列
	int y;	// 坦克在地图数组中所在的行
	DIRECTION direction;	// 坦克的方向,上、下、左、右
	int live;	// 坦克是否生存  1 -- 活着   0 -- 死了
};

// 子弹结构体
struct bullet_s {
	int pos_x;		// 子弹再窗口上的横坐标
	int pos_y;		// 子弹再窗口上的纵坐标
	DIRECTION direction;	// 子弹方向
	int status;		// 子弹的状态
};


// 定义地图数组
int map[26][26] = { 
	{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
	{ 0, 0, 0, 0, 0, 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, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0 },
	{ 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0 },
	{ 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0 },
	{ 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0 },
	{ 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 2, 2, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0 },
	{ 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 2, 2, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0 },
	{ 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0 },
	{ 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0 },
	{ 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0 },
	{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
	{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
	{ 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1 },
	{ 2, 2, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 2, 2 },
	{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
	{ 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0 },
	{ 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0 },
	{ 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0 },
	{ 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0 },
	{ 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0 },
	{ 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0 },
	{ 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0 },
	{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
	{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
};

void set_prop_map(int x, int y, int value) {
	map[y][x] = value;
	map[y][x + 1] = value;
	map[y + 1][x] = value;
	map[y + 1][x + 1] = value;
}

void menu() {
	// 显示logo
	IMAGE logo_img;
	loadimage(&logo_img, _T("logo.bmp"), 433, 174);	// 将图片加载进logo_img变量中
	putimage(110, 20, &logo_img);

	// 实现导航按钮
	setlinecolor(WHITE);
	setfillcolor(BLACK);

	fillrectangle(230, 200, 310, 240);
	settextstyle(25, 0, _T("宋体"));
	outtextxy(240, 210, _T("说 明"));

	fillrectangle(350, 200, 430, 240);
	outtextxy(360, 210, _T("开 始"));

	MOUSEMSG mouse;	// 定义鼠标
	IMAGE illustrate_img;
	loadimage(&illustrate_img, _T("illustrate.jpg"), 300, 300);

	while (1) {
		mouse = GetMouseMsg();	// 获取鼠标消息

		switch (mouse.uMsg) {
		case WM_MOUSEMOVE:	// 鼠标移动事件
			if ((mouse.x > 230 && mouse.x < 310) && (mouse.y > 200 && mouse.y < 240)) {
				putimage(150, 250, &illustrate_img);
			}
			else {
				solidrectangle(150, 250, 450, 550);	// 绘制一个无边框的矩形
			}
			break;
		case WM_LBUTTONDOWN:	// 鼠标左键点击事件
			if ((mouse.x > 350 && mouse.x < 430) && (mouse.y > 200 && mouse.y < 240)) {
				cleardevice();
				return;
			}
		}
	}
}

// 初始化地图
// 可消除的墙1;不可消除的墙2;碉堡(3,4)
void initMap(int *map, int rows, int cols) {

	IMAGE img_home, img_wall_1, img_wall_2;
	loadimage(&img_home, _T("home.jpg"), 50, 50);		// 碉堡
	loadimage(&img_wall_1, _T("wall1.jpg"), 25, 25);	// 不可消除的墙
	loadimage(&img_wall_2, _T("wall2.jpg"), 25, 25);	// 可消除的墙


	for (int i = 0; i < rows; i++) {
		for (int j = 0; j < cols; j++) {
			if (*(map + cols * i + j) == 1) {
				putimage(25 * j, 25 * i, &img_wall_2);
			} else if (*(map + cols * i + j) == 2) {
				putimage(25 * j, 25 * i, &img_wall_1);
			} else if (*(map + cols * i + j) == 3) {
				putimage(25 * j, 25 * i, &img_home);

				set_prop_map(j, i, 4);
			}
		}
	}
}

// 控制坦克按相应的位置前进一步
// 成功返回1;失败返回0
int do_tank_walk(tank_s *tank, DIRECTION direction, IMAGE *img, int step) {

	int new_x = tank->x;
	int new_y = tank->y;

	int old_prop = map[tank->y][tank->x];

	if (step) {
		if (direction == UP) {
			new_y -= 1;
		} else if (direction == DOWN) {
			new_y += 1;
		} else if (direction == LEFT) {
			new_x -= 1;
		} else if (direction == RIGHT) {
			new_x += 1;
		} else {
			return 0;	// 无效方向
		}

		set_prop_map(tank->x, tank->y, 0);
	}
	

	setfillcolor(BLACK);
	solidrectangle(tank->x * 25, tank->y * 25, tank->x * 25 + 50, tank->y * 25 + 50);
	
	if (step) {
		set_prop_map(new_x, new_y, old_prop);

		tank->x = new_x;
		tank->y = new_y;
	}
	
	putimage(tank->x * 25, tank->y * 25, img);

	return 1;
}

// 实现子弹运行和碰撞检测,并反馈游戏结果
// 返回:1 - 表示游戏失败  0 - 继续游戏
int bullet_ation(bullet_s *bullet, tank_s *enemy_tank) {
	int x, y, x1, y1;	// 子弹目前所在的二维数组的坐标

	x = bullet->pos_x / 25;
	y = bullet->pos_y / 25;



	// 1.擦除上一次绘制的子弹
	setfillcolor(BLACK);
	solidrectangle(bullet->pos_x, bullet->pos_y, bullet->pos_x + 3, bullet->pos_y + 3);

	// 2.根据方向计算子弹在地图上的坐标
	if (bullet->direction == UP) {
		bullet->pos_y -= 2;
		x1 = x + 1;
		y1 = y;
	} else if (bullet->direction == DOWN) {
		bullet->pos_y += 2;
		x1 = x + 1;
		y1 = y;
	} else if (bullet->direction == LEFT) {
		bullet->pos_x -= 2;
		x1 = x;
		y1 = y + 1;
	} else if (bullet->direction == RIGHT) {
		bullet->pos_x += 2;
		x1 = x;
		y1 = y + 1;
	} else {
		return 0;
	}


	if (bullet->pos_x < 0 || bullet->pos_x > 650 || bullet->pos_y < 0 || bullet->pos_y > 650) {
		bullet->status = 0;
		return 0;
	}

	// 碰撞检查
	if (map[y][x] == 4 || map[y1][x1] == 4) {	// 子弹击中碉堡
		//bullet->status = 0;
		return 1;
	} 

	if (map[y][x] == 200 || map[y1][x1] == 200) {	// 击中我方坦克
		return 1;
	}

	if ((map[y][x] >= 100 && map[y][x] <= 109) || (map[y1][x1] >= 100 && map[y1][x1] <= 109)) {
		tank_s *tank = NULL;
		bullet->status = 0;

		if (map[y][x] >= 100 && map[y][x] <= 109) {
			tank = enemy_tank + (map[y][x] - 100);
		} else {
			tank = enemy_tank + (map[y1][x1] - 100);
		}

		tank->live = 0;
		set_prop_map(tank->x, tank->y, 0);
		setfillcolor(BLACK);
		solidrectangle(tank->x * 25, tank->y * 25, tank->x * 25 + 50, tank->y * 25 + 50);
	}

	if (map[y][x] == 1) {	// 子弹击中可消除的墙
		map[y][x] = 0;
		bullet->status = 0;
		setfillcolor(BLACK);
		solidrectangle(x * 25, y * 25, x * 25 + 25, y * 25 + 25);
	} else if (map[y][x] == 2) { // 不可消除的墙
		//PlaySound(_T("hit.wav"), NULL, SND_FILENAME | SND_ASYNC);
		bullet->status = 0;
	}

	if (map[y1][x1] == 1) {	// 子弹击中可消除的墙
		map[y1][x1] = 0;
		bullet->status = 0;
		setfillcolor(BLACK);
		solidrectangle(x1 * 25, y1 * 25, x1 * 25 + 25, y1 * 25 + 25);
	} else if (map[y1][x1] == 2) { // 不可消除的墙
		bullet->status = 0;
	}



	// 3.重新绘制子弹
	if (bullet->status == 1) {
		setfillcolor(WHITE);
		solidrectangle(bullet->pos_x, bullet->pos_y, bullet->pos_x + 3, bullet->pos_y + 3);
	}

	return 0;
	
}


// 坦克前进一步
void tank_walk(tank_s *tank, DIRECTION direction, IMAGE *img) {
	switch (direction) {
		case UP:	// 上					
			if (tank->direction == UP && (tank->y - 1) >= 0 && map[tank->y - 1][tank->x] == 0 && map[tank->y - 1][tank->x + 1] == 0) {
				do_tank_walk(tank, UP, img, 1);
			}
			else if (tank->direction != UP) {
				tank->direction = UP;
				do_tank_walk(tank, UP, img, 0);
			} 
			break;
		case DOWN:	// 下
			if (tank->direction == DOWN && (tank->y + 2) <= 25 && map[tank->y + 2][tank->x] == 0 && map[tank->y + 2][tank->x + 1] == 0) {
				do_tank_walk(tank, DOWN, img, 1);
			}
			else if (tank->direction != DOWN) {
				tank->direction = DOWN;
				do_tank_walk(tank, DOWN, img, 0);
			}
			break;
		case LEFT:	// 左
			if (tank->direction == LEFT && (tank->x - 1) >= 0 && map[tank->y][tank->x - 1] == 0 && map[tank->y + 1][tank->x - 1] == 0) {
				do_tank_walk(tank, LEFT, img, 1);
			}
			else if (tank->direction != LEFT) {
				tank->direction = LEFT;
				do_tank_walk(tank, LEFT, img, 0);
			}
			break;
		case RIGHT:	// 右
			if (tank->direction == RIGHT && (tank->x + 2) <= 25 && map[tank->y][tank->x + 2] == 0 && map[tank->y + 1][tank->x + 2] == 0) {
				do_tank_walk(tank, RIGHT, img, 1);
			}
			else if (tank->direction != RIGHT) {
				tank->direction = RIGHT;
				do_tank_walk(tank, RIGHT, img, 0);
			}
			break;
		default:	// 其他键无需操作
			break;
	}

}

// 根据目标位置,调整敌方坦克的方向
DIRECTION enemy_direction(tank_s *tank, int x, int y) {
	int r = rand() % 100;

	if (tank->x > x) {	// 目标再左边
		if (tank->y > y) {	// 目标在左上方
			if (r <= 50) return UP;
			return LEFT;
		} else {	// 目标在左下方
			if (r <= 50) return DOWN;
			return LEFT;
		}
	} else {	// 目标再右边
		if (tank->y > y) {	// 目标在右上方
			if (r <= 50) return UP;
			return RIGHT;
		} else {	// 目标在右下方
			if (r <= 50) return DOWN;
			return RIGHT;
		}
	}
}

// 坦克开火
void tank_fire(tank_s *tank, bullet_s *bullet, int need_sound) {
	if (bullet->status == 0) {
		if (need_sound) {
			PlaySound(_T("fire.wav"), NULL, SND_FILENAME | SND_ASYNC);
		}
		if (tank->direction == UP) {
			bullet->pos_x = tank->x * 25 + 23;
			bullet->pos_y = tank->y * 25 - 3;
		}
		else if (tank->direction == DOWN) {
			bullet->pos_x = tank->x * 25 + 23;
			bullet->pos_y = tank->y * 25 + 53;
		}
		else if (tank->direction == LEFT) {
			bullet->pos_x = tank->x * 25 - 3;
			bullet->pos_y = tank->y * 25 + 23;
		}
		else if (tank->direction == RIGHT) {
			bullet->pos_x = tank->x * 25 + 53;
			bullet->pos_y = tank->y * 25 + 23;
		}

		bullet->direction = tank->direction;
		bullet->status = 1;
	}
}




/****************************************
* 实现游戏场景
*****************************************/
int play() {
	tank_s my_tank;		// 我方坦克
	bullet_s my_bullet;	// 我方坦克发射的子弹

	tank_s enemy_tank[ENEMY_NUM];		// 敌方坦克
	bullet_s enemy_bullet[ENEMY_NUM];	// 敌方坦克发射的子弹


	IMAGE my_tank_img[4];	// 我方坦克的显示图片
	IMAGE enemy_tank_img[4];// 地方坦克的显示图片
	int key;
	int times = 0;	// 记录当前程序的休眠次数,每次10ms
	int enemy_total = 0;

	// 初始化随机种子
	srand(time(NULL));

	// 游戏背景音乐
	mciSendString(_T("play background.wav"), 0, 0, 0);


	// 加载我方坦克的图片
	loadimage(&my_tank_img[UP], _T("tank_up.jpg"), 50, 50);
	loadimage(&my_tank_img[DOWN], _T("tank_down.jpg"), 50, 50);
	loadimage(&my_tank_img[LEFT], _T("tank_left.jpg"), 50, 50);
	loadimage(&my_tank_img[RIGHT], _T("tank_right.jpg"), 50, 50);

	// 加载地方坦克的图片
	loadimage(&enemy_tank_img[UP], _T("enemy_tank_up.jpg"), 50, 50);
	loadimage(&enemy_tank_img[DOWN], _T("enemy_tank_down.jpg"), 50, 50);
	loadimage(&enemy_tank_img[LEFT], _T("enemy_tank_left.jpg"), 50, 50);
	loadimage(&enemy_tank_img[RIGHT], _T("enemy_tank_right.jpg"), 50, 50);

	// 1 :子弹存在   0 : 子弹不存在
	my_bullet.status = 0;

	// 我方坦克出现的位置
	my_tank.x = 8;
	my_tank.y = 24;
	my_tank.live = 1;
	my_tank.direction = UP;

	// 敌方坦克出现的位置
	for (int i = 0; i < ENEMY_NUM; i++) {
		if (i % 3 == 0) {
			enemy_tank[i].x = 0;
		}
		else if (i % 3 == 1) {
			enemy_tank[i].x = 12;
		}
		else if (i % 3 == 2) {
			enemy_tank[i].x = 24;
		}

		enemy_tank[i].direction = DOWN;
		enemy_tank[i].y = 0;
		enemy_tank[i].live = 1;
		//set_prop_map(enemy_tank[i].x, enemy_tank[i].y, 100 + i);
		enemy_bullet[i].status = 0;
	}

	// 前三辆坦克出现
	do_tank_walk(&enemy_tank[0], DOWN, &enemy_tank_img[DOWN], 0);
	set_prop_map(enemy_tank[0].x, enemy_tank[0].y, 100);
	do_tank_walk(&enemy_tank[1], DOWN, &enemy_tank_img[DOWN], 0);
	set_prop_map(enemy_tank[1].x, enemy_tank[1].y, 101);
	do_tank_walk(&enemy_tank[2], DOWN, &enemy_tank_img[DOWN], 0);
	set_prop_map(enemy_tank[2].x, enemy_tank[2].y, 102);
	enemy_total = 3;


	set_prop_map(my_tank.x, my_tank.y, 200);

	// 显示我方坦克
	putimage(25 * my_tank.x, 25 * my_tank.y, &my_tank_img[my_tank.direction]);


	while (1) {
		if (times > 0 && times % 1000 == 0 && enemy_total < ENEMY_NUM) {
			set_prop_map(enemy_tank[enemy_total].x, enemy_tank[enemy_total].y, 100 + enemy_total);
			enemy_total++;
		}

		if (times % 100 == 0) {
			for (int i = 0; i < enemy_total; i++) {
				if (enemy_tank[i].live == 0) continue;

				if (i % 2 == 0) {	// 双数攻击我方老鹰
					DIRECTION d = enemy_direction(&enemy_tank[i], 12, 24);
					tank_walk(&enemy_tank[i], d, &enemy_tank_img[d]);
				} else {	// 单数攻击我方坦克
					DIRECTION d = enemy_direction(&enemy_tank[i], my_tank.x, my_tank.y);
					tank_walk(&enemy_tank[i], d, &enemy_tank_img[d]);
				}

				tank_fire(&enemy_tank[i], &enemy_bullet[i], 0);
			}
		} else if (times % 100 == 0) {	// 敌方坦克还生存
				for (int i = 0; i < enemy_total; i++) {
					if (enemy_tank[i].live) {
						tank_walk(&enemy_tank[i], enemy_tank[i].direction, &enemy_tank_img[enemy_tank->direction]);
					}
				}
		}


		if (_kbhit()) {
			key = _getch();

			switch (key) {
				case 'w':	// 上					
					tank_walk(&my_tank, UP, &my_tank_img[UP]);
					break;
				case 's':	// 下
					tank_walk(&my_tank, DOWN, &my_tank_img[DOWN]);
					break;
				case 'a':	// 左
					tank_walk(&my_tank, LEFT, &my_tank_img[LEFT]);
					break;
				case 'd':	// 右
					tank_walk(&my_tank, RIGHT, &my_tank_img[RIGHT]);
					break;
				case 'j':	// 开火
					tank_fire(&my_tank, &my_bullet, 1);					
					break;
				case 'p':	// 暂停
					system("pause");
					break;
				default:	// 其他键无需操作
					break;
			}
		}
		if (my_bullet.status == 1) {
			if (bullet_ation(&my_bullet, enemy_tank)) {
				return 1;
			}
		}

		for (int i = 0; i < ENEMY_NUM; i++) {
			if (enemy_bullet[i].status == 1) {
				if (bullet_ation(&enemy_bullet[i], enemy_tank)) {
					return 1;
				}
			}
		}

		// 判断敌方坦克是否全部被消灭
		int isWin = 1;
		for (int i = 0; i < ENEMY_NUM; i++) {
			if (enemy_tank[i].live == 1) {
				isWin = 0;
				break;
			}
		}
		if (isWin) return 0;

		Sleep(5);
		times++;
	}
}

void game_voer(int result) {
	IMAGE img;

	if (result == 1) {	// 等于1表示失败
		loadimage(&img, _T("failure.jpg"), 500, 250);
		putimage(80, 200, &img);
	} else if (result == 0) {	// 等于0表示成功
		loadimage(&img, _T("success.jpg"), 500, 250);
		putimage(80, 200, &img);
	}

	_getch();
}




int main(void) {
	int result = 0;
	initgraph(650, 650);

	// 开始场景,显示菜单
	menu();
	
	// 初始化地图
	initMap(*map, 26, 26);

	result = play();

	// 显示游戏结果
	game_voer(result);

	system("pause");
	closegraph();
	return 0;
}

最后祝csdn的各位,五一快乐!

C++控制台编程“坦克大战” 新手C++ 坦克大战 本人新手写的比较乱,不喜勿喷, 1、首先,先用图片介绍下代码运行逻辑, 2、这是控制台的界面,展示一下各个功能的界面 开始界面 单人模式界面 双人模式界面 自定义地图 3、以下是代码展示 这是菜单类 #include "Menu.h" #include <windows.h> #include "Game.h" //显示欢迎界面 void Menu::S... 阅读详情

相关推荐

坦克大战(c++)

/设置随机数种子(若不设置种子而调用rand会使每次运行的随机数序列一致)随机数序列指:如首次调用rand得到1,第二次得2,第三次3,则此次随机数序列为1,2,3。

#@学生小羊的博客 3072

C++游戏开发——坦克大战

坦克大战

小木鱼的博客 4339

java学习笔记-窗口绘图(坦克大战)

坦克大战,金典小霸王游戏。 主框架的搭建,,刚开始使用的是awt下的类来创建窗口,但在图片刷新的时候会卡,不知道怎么解决,然后就换了swing.Jframe来进行创建. AWT 是抽象窗口组件工具包,是 java 最早的用于编写图形节目应用程序的开发包,提供了一套与本地图形界面进行交互的接口,利用 AWT 来构件图形用户界面的时候,我们实际

kul的博客 2406

绝对可以运行的C++经典坦克大战游戏代码【原创】

【代码】绝对可以运行的C++游戏代码【原创】

lucas7532的博客 2473

C++坦克大战完整代码.zip

这是我找来的坦克大战完整代码,拿去参考 玩法如下:按P发射,按WASD进行移动,消灭敌人,守护阵营

坦克大战(含项目VS2010工程文件sln,双击打开)

有同学可能不会创建工程,原来的只有代码和资源,这次新上传的用VS2010打了个包,直接双击sln打开工程。由于代码没有添加unicode编译支持。编译通不过的把项目工程属性的字符集改成"使用多字节字符集"即可。

QT(C++)游戏之坦克大战(一)

前言 坦克大战算是我们90后童年时的经典游戏了,当时是那种插卡游戏机。每次星期天,我都会玩游戏机,真的是童年的回忆了。我当时玩的是1990版坦克大战,如今学了QT,就想着实现一个我的坦克大战,致敬我的童年时光。 先上一幅图片: 实现 ...

优快云-ZCL 1万+

C++控制台版坦克大战源码.rar

用C++写的一个控制台版本的坦克大战游戏,支持单双人对战,可以自己编辑地图,有存档读档功能,有一个小小的bug,在两颗敌方子弹在同一个地方坦克体内碰撞后有1/2概率被固定在原地,bug触发几率很低,没有碰到过,只是我自己想到的,有碰撞检测,经过反复测试,碰撞检测无bug

有手就能学会- C语言零基础手写坦克大战

1.2 项目介绍 2.1. 项目需求 实现1款和经典的《90坦克大战》一样的游戏,任务是消灭敌对坦克,保护己方领地。防止敌方打破你的老窝围墙而把你的鹰打坏。 2.2. 学习目标 回顾经典,按照软件开发的标准流程,零基础开发第一个完整项目,快速提高编程能力和水平,真正理解软件开发的概念和基本流程! 2.3. 授课方式 手把手方式教大家完整的实现项目所有源码并进行讲解,不懂之处,随时可以咨询M...

C语言实战大全 1252

C++开发项目实战-坦克大战游戏资源包,C++初学者练习项目

资源简介: “坦克大战”是一个经典的射击游戏,这款游戏为C++初学者提供了一个极好的实战练习平台。此资源包包含了完整的游戏源代码、设计文档及详细的使用说明,旨在帮助学习者更好地理解和应用C++编程。 资源详细内容: 游戏源代码:完整的C++代码,包括游戏逻辑、图形界面、音效等,均已模块化,易于学习和理解。 设计文档:详细的游戏设计文档,包括游戏规则、角色设定、关卡设计等内容,帮助学习者了解游戏的整体架构和设计思路。 使用说明:针对源代码和使用中可能遇到的问题,提供了一系列详细的说明和解答,为学习者提供全面的学习支持。 适用对象: 本资源适用于C++初学者,特别是那些希望通过实战项目提高自己编程能力的学习者。无论你是编程新手,还是有一定基础的开发者,都可以从这款游戏中学习和收获。 使用方式: 学习者可以从头开始逐步了解和掌握游戏的整个开发过程,包括代码编写、调试和优化等。同时,结合设计文档和使用说明,深入理解游戏开发的各个环节。 资源特点: 实战性强:与传统的理论学习不同,这款游戏实战项目可以让学习者真正动手编写代码,实现游戏功能。 内容丰富:除了代码,还提供了详细的设计文档。

c++坦克大战源码_写的不错

写的非常好的坦克大战,用c++编写的坦克大战源码,非常有学习价值,用作期末课程设计,分数非常美丽。一起学习,一起学习。

C/C++编程笔记:C语言开发坦克大战!纪念我们逝去的小霸王游戏

今日微博官宣:近日,小霸王文化发展有限公司被申请破产重整,申请人为殷小云,案号为(2020)粤20破申131号。同时,法定代表人冯宝伦已被法院列为限制高消费人员,限制消费令由中山市第一人民法院下发。至此,带给我们游戏童年的小霸王游戏机也慢慢消失在我们的世界里。 说到小霸王游戏,相信最让我们难忘的几种游戏,我们到现在也不会忘记:坦克大战、魂斗罗、超级玛丽等等。小霸王游戏在中国真正火起来是在上世纪的90年代,那个时代差不多一半左右的孩子都接触过小霸王,也是小霸王奠定了中国最基础的游戏受众。 ..

致力于C语言C++知识分享! 1273

基于C++语言开发的坦克大战游戏源代码(含exe可执行文件)

基于C++语言开发的坦克大战游戏源代码(含exe可执行文件) 基于C++语言开发的坦克大战游戏源代码(含exe可执行文件) 基于C++语言开发的坦克大战游戏源代码(含exe可执行文件) 基于C++语言开发的坦克大战游戏源代码(含exe可执行文件) 基于C++语言开发的坦克大战游戏源代码(含exe可执行文件) 基于C++语言开发的坦克大战游戏源代码(含exe可执行文件) 基于C++语言开发的坦克大战游戏源代码(含exe可执行文件) 基于C++语言开发的坦克大战游戏源代码(含exe可执行文件) 基于C++语言开发的坦克大战游戏源代码(含exe可执行文件) 基于C++语言开发的坦克大战游戏源代码(含exe可执行文件) 基于C++语言开发的坦克大战游戏源代码(含exe可执行文件) 基于C++语言开发的坦克大战游戏源代码(含exe可执行文件) 基于C++语言开发的坦克大战游戏源代码(含exe可执行文件) 基于C++语言开发的坦克大战游戏源代码(含exe可执行文件) 基于C++语言开发的坦克大战游戏源代码(含exe可执行文件) 基于C++语言开发的坦克大战游戏源代码(含exe可执行文件) 基于C+

最新坦克大战2022-全程开发笔记-1

坦克大战2022,高清无码,C语言/C++入门必备项目,大学课设必备项目!从零开始到项目发布,记录完整开发过程,快速提升开发技能!

程序员Rock的博客 5115

【第六届起重机创意大赛国一作品——资料分享】

文章目录前言一、比赛内容分析二、确定方案与作品模型1.方案简图2.作品模型三、电控部分控制思路单片机选择与资源分配拓展板的设计接线与走线代码分享总结

qq_19308801的博客 7781

UE5实战技巧:TextRender高效集成中文字体与材质优化

本文针对UE5中TextRender组件显示中文的常见问题,提供了一套完整的实战解决方案。详细讲解了如何通过手动创建字体资产、精准控制字符集来优化性能,并重点介绍了通过调整材质中的Lerp节点参数(如设为-85, 92)来解决中文字体显示残缺和边缘模糊等核心难题,帮助开发者实现高效且美观的中文文本渲染。

weixin_28040125的博客 379

【第十五节】C语言小项目(windows控制台版本坦克大战)

大家可以先关注一波,后续继续更新各种技术免费专栏,涉及数据结构与算法,c/c++ QT/duilib等客户端开发,服务器开发,音视频开发,驱动开发,逆向安全,游戏开发等等有关技术栈,还有各种热门编程技术如rust, java,go, javascript, python, php, c#等等,遍及各种平台如android, ios, windows, unix, linux等等,让新手从入门到实战,从IT学习者身份顺利过渡到职场人士。为了巩固之前学习的C语言知识点,提高C语言的实践能力,锻炼逻辑思维。

攻城狮7号的博客 1020

10BASE-T1S协议中的PLCA机制:实现无碰撞网络传输的关键

本文深入解析了10BASE-T1S协议中的PLCA(物理层冲突避免)机制。作为IEEE 802.3cg标准的关键部分,PLCA通过循环调度与机会传递,从根源上避免了网络碰撞,为工业与汽车等场景提供了确定性的低延迟传输保障,是实现可靠实时通信的核心技术。

weixin_29250403的博客 209

基于java的坦克大战游戏的设计与实现--开题报告--【毕业论文】

本系列校训 互相伤害互相卷,玩命学习要你管,天生我才必有用,我命由我不由天! 毕业论文不怕难,毕业设计来铺垫!打磨技术精心写,拿证之后尽开颜!

dearmite的专栏 1001

告别U盘!在Ubuntu 22.04上从零搭建PXE网络装机服务器(支持UEFI/Legacy双启动)

本文详细介绍了在Ubuntu 22.04上搭建PXE网络装机服务器的完整流程,支持UEFI/Legacy双启动模式。通过配置DHCP、TFTP和HTTP服务,实现无需U盘的高效批量系统部署,解决传统安装方式的介质依赖、版本控制和时间成本问题,显著提升机房维护和设备部署效率。

weixin_42569329的博客 248

Windows系统的Mamba环境配置详细教程(状态空间模型)

causal_conv1d也是安装mamba的依赖必须库。安装完成后,通过pip list可以查看到安装的库。Triton是安装mamba的依赖,需要先安装。上述工作准备好后,按下面步骤安装。直接根据离线文件安装即可。是自己的虚拟环境名字。

2301_77831163的博客 3673

c++坦克游戏直接代码

太长啦但还是祝你玩的开心嘿嘿好啦拜拜(爱心。

HXY_baby的博客 870

伺服电机的位置控制模式:PP模式与CSP模式的比较

在轮廓位置模式下,上位机给定目标绝对位置(或相对位置)、速度、加速度等参数,伺服内部的轨迹发生器根据这些参数生成目标位置曲线指令,通过伺服驱动器内部实现三环控制(位置环、速度环、力矩环)。如果还不理解,不妨看看下面的类比:轮廓位置模式中,上位控制器对伺服电机说,我给你个位置,怎么去哪,走那条路,那是你自己的事,这个时候伺服电机是有自己的思想的。同期同步位置模式红,上位机控制器对伺服电机的管理就和 严格,除了告诉你目标位置,走那条路都是控制器说的算,伺服电机就是个没有灵魂的工具。重点关注,轮廓位置模式。

m0_49968063的博客 5799
上一篇: 《二十三种设计模式》 第一篇 “适配器模式” (C++实现)
下一篇: C/C++ 入门算法,“栈”的全面剖析
cpp_learners
博客等级 码龄7年 1526粉丝 274原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cpp_learners

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值