当前位置: 首页 > 编程日记 > 正文

用Python实现坦克大战游戏 | 干货贴


作者 | 李秋键

出品 | AI科技大本营(rgznai100)

《坦克大战》是1985年日本南梦宫Namco游戏公司在任天堂FC平台上,推出的一款多方位平面射击游戏。游戏以坦克战斗及保卫基地为主题,属于策略型联机类。同时也是FC平台上少有的内建关卡编辑器的几个游戏之一,玩家可自己创建独特的关卡,并通过获取一些道具使坦克和基地得到强化。而今天我们就将利用python还原以下坦克大战的制作。

实验前的准备

首先我们使用的Python版本是3.6.5所用到的模块如下:

  • Pygame模块用来创建游戏整体框架、精灵等基本架构;

  • OS模块用来加载本地文件(包括音乐,背景、图片等素材)。

精灵类程序

其中精灵类设置作为基本程序框架用来主函数的调用,其中包括子弹类程序、食物类、家类、砖墙树木等障碍物类、坦克类。具体程序布局如下:

其中子弹类程序,首先需要建立bullet.py程序,建立类包括子弹位置、方向、图片加载、子弹速度等基本信息。具体代码如下:

'''子弹'''
class Bullet(pygame.sprite.Sprite):def __init__(self, bullet_image_paths, screensize, direction, position, border_len, is_stronger=False, speed=8, **kwargs):pygame.sprite.Sprite.__init__(self)self.bullet_image_paths = bullet_image_pathsself.width, self.height = screensizeself.direction = directionself.position = positionself.image = pygame.image.load(self.bullet_image_paths.get(direction))self.rect = self.image.get_rect()self.rect.center = position# 地图边缘宽度self.border_len = border_len# 是否为加强版子弹(加强版可碎铁墙)self.is_stronger = is_stronger# 子弹速度self.speed = speed'''移动子弹, 若子弹越界, 则返回True, 否则为False'''def move(self):if self.direction == 'up':self.rect = self.rect.move(0, -self.speed)elif self.direction == 'down':self.rect = self.rect.move(0, self.speed)elif self.direction == 'left':self.rect = self.rect.move(-self.speed, 0)elif self.direction == 'right':self.rect = self.rect.move(self.speed, 0)if (self.rect.top < self.border_len) or (self.rect.bottom > self.height) or (self.rect.left < self.border_len) or (self.rect.right > self.width):return Truereturn False

食物奖励类,建立food.py作为坦克吃到食物时增加生命等基本奖励:

'''食物类. 用于获得奖励'''
class Foods(pygame.sprite.Sprite):def __init__(self, food_image_paths, screensize, **kwargs):pygame.sprite.Sprite.__init__(self)self.name = random.choice(list(food_image_paths.keys()))self.image = pygame.image.load(food_image_paths.get(self.name))self.rect = self.image.get_rect()self.rect.left, self.rect.top = random.randint(100, screensize[0]-100), random.randint(100, screensize[1]-100)self.exist_time = 1000def update(self):self.exist_time -= 1return True if self.exist_time < 0 else False

坦克家类,建立home.py存储家基本信息(包括是否存活、图片加载、位置尺寸等)。

'''大本营类'''
class Home(pygame.sprite.Sprite):def __init__(self, position, imagepaths, **kwargs):pygame.sprite.Sprite.__init__(self)self.imagepaths = imagepathsself.image = pygame.image.load(self.imagepaths[0])self.rect = self.image.get_rect()self.rect.left, self.rect.top = positionself.alive = True'''被摧毁'''def setDead(self):self.image = pygame.image.load(self.imagepaths[1])self.alive = False'''画到屏幕上'''def draw(self, screen):screen.blit(self.image, self.rect)

砖墙等障碍物类,建立scenes.py其中也是主要位置尺寸的布局:

'''砖墙'''
class Brick(pygame.sprite.Sprite):def __init__(self, position, imagepath, **kwargs):pygame.sprite.Sprite.__init__(self)self.image = pygame.image.load(imagepath)self.rect = self.image.get_rect()self.rect.left, self.rect.top = position
'''铁墙'''
class Iron(pygame.sprite.Sprite):def __init__(self, position, imagepath, **kwargs):pygame.sprite.Sprite.__init__(self)self.image = pygame.image.load(imagepath)self.rect = self.image.get_rect()self.rect.left, self.rect.top = position
'''冰'''
class Ice(pygame.sprite.Sprite):def __init__(self, position, imagepath, **kwargs):pygame.sprite.Sprite.__init__(self)self.image = pygame.Surface((24, 24))for i in range(2):for j in range(2):self.image.blit(pygame.image.load(imagepath), (12*i, 12*j))self.rect = self.image.get_rect()self.rect.left, self.rect.top = position
'''河流'''
class River(pygame.sprite.Sprite):def __init__(self, position, imagepath, **kwargs):pygame.sprite.Sprite.__init__(self)self.image = pygame.Surface((24, 24))for i in range(2):for j in range(2):self.image.blit(pygame.image.load(imagepath), (12*i, 12*j))self.rect = self.image.get_rect()self.rect.left, self.rect.top = position
'''树'''
class Tree(pygame.sprite.Sprite):def __init__(self, position, imagepath, **kwargs):pygame.sprite.Sprite.__init__(self)self.image = pygame.Surface((24, 24))for i in range(2):for j in range(2):self.image.blit(pygame.image.load(imagepath), (12*i, 12*j))self.rect = self.image.get_rect()self.rect.left, self.rect.top = position

坦克类,建立tanks.py包括坦克数量名称、初始位置等信息:

'''玩家坦克类'''
class PlayerTank(pygame.sprite.Sprite):def __init__(self, name, player_tank_image_paths, position, border_len, screensize, direction='up', bullet_image_paths=None, protected_mask_path=None, boom_image_path=None, **kwargs):pygame.sprite.Sprite.__init__(self)# 玩家1/玩家2self.name = name# 坦克图片路径self.player_tank_image_paths = player_tank_image_paths.get(name)# 地图边缘宽度self.border_len = border_len# 屏幕大小self.screensize = screensize# 初始坦克方向self.init_direction = direction# 初始位置self.init_position = position# 子弹图片self.bullet_image_paths = bullet_image_paths# 保护罩图片路径self.protected_mask = pygame.image.load(protected_mask_path)self.protected_mask_flash_time = 25self.protected_mask_flash_count = 0self.protected_mask_pointer = False# 坦克爆炸图self.boom_image = pygame.image.load(boom_image_path)self.boom_last_time = 5self.booming_flag = Falseself.boom_count = 0# 坦克生命数量self.num_lifes = 3# 重置self.reset()'''移动'''def move(self, direction, scene_elems, player_tanks_group, enemy_tanks_group, home):# 爆炸时无法移动if self.booming_flag:return# 方向不一致先改变方向if self.direction != direction:self.setDirection(direction)self.switch_count = self.switch_timeself.move_cache_count = self.move_cache_time# 移动(使用缓冲)self.move_cache_count += 1if self.move_cache_count < self.move_cache_time:returnself.move_cache_count = 0if self.direction == 'up':speed = (0, -self.speed)elif self.direction == 'down':speed = (0, self.speed)elif self.direction == 'left':speed = (-self.speed, 0)elif self.direction == 'right':speed = (self.speed, 0)rect_ori = self.rectself.rect = self.rect.move(speed)# --碰到场景元素for key, value in scene_elems.items():if key in ['brick_group', 'iron_group', 'river_group']:if pygame.sprite.spritecollide(self, value, False, None):self.rect = rect_orielif key in ['ice_group']:if pygame.sprite.spritecollide(self, value, False, None):self.rect = self.rect.move(speed)# --碰到其他玩家坦克if pygame.sprite.spritecollide(self, player_tanks_group, False, None):self.rect = rect_ori# --碰到敌方坦克if pygame.sprite.spritecollide(self, enemy_tanks_group, False, None):self.rect = rect_ori# --碰到玩家大本营if pygame.sprite.collide_rect(self, home):self.rect = rect_ori# --碰到边界if self.rect.left < self.border_len:self.rect.left = self.border_lenelif self.rect.right > self.screensize[0]-self.border_len:self.rect.right = self.screensize[0] - self.border_lenelif self.rect.top < self.border_len:self.rect.top = self.border_lenelif self.rect.bottom > self.screensize[1]-self.border_len:self.rect.bottom = self.screensize[1] - self.border_len# 为了坦克轮动特效切换图片self.switch_count += 1if self.switch_count > self.switch_time:self.switch_count = 0self.switch_pointer = not self.switch_pointerself.image = self.tank_direction_image.subsurface((48*int(self.switch_pointer), 0), (48, 48))

游戏界面设置

游戏界面设置包括:开始界面设置、结束界面设置和关卡切换界面设置:

其中游戏开始界面包括玩家数的选择和图片音乐的加载:

'''游戏开始界面'''
def gameStartInterface(screen, cfg):background_img = pygame.image.load(cfg.OTHER_IMAGE_PATHS.get('background'))color_white = (255, 255, 255)color_red = (255, 0, 0)font = pygame.font.Font(cfg.FONTPATH, cfg.WIDTH//12)logo_img = pygame.image.load(cfg.OTHER_IMAGE_PATHS.get('logo'))logo_img = pygame.transform.scale(logo_img, (446, 70))logo_rect = logo_img.get_rect()logo_rect.centerx, logo_rect.centery = cfg.WIDTH/2, cfg.HEIGHT//4tank_cursor = pygame.image.load(cfg.PLAYER_TANK_IMAGE_PATHS.get('player1')[0]).convert_alpha().subsurface((0, 144), (48, 48))tank_rect = tank_cursor.get_rect()# 玩家数量选择player_render_white = font.render('1 PLAYER', True, color_white)player_render_red = font.render('1 PLAYER', True, color_red)player_rect = player_render_white.get_rect()player_rect.left, player_rect.top = cfg.WIDTH/2.8, cfg.HEIGHT/2.5players_render_white = font.render('2 PLAYERS', True, color_white)players_render_red = font.render('2 PLAYERS', True, color_red)players_rect = players_render_white.get_rect()players_rect.left, players_rect.top = cfg.WIDTH/2.8, cfg.HEIGHT/2# 游戏提示game_tip = font.render('press <Enter> to start', True, color_white)game_tip_rect = game_tip.get_rect()game_tip_rect.centerx, game_tip_rect.top = cfg.WIDTH/2, cfg.HEIGHT/1.4game_tip_flash_time = 25game_tip_flash_count = 0game_tip_show_flag = True# 主循环clock = pygame.time.Clock()is_dual_mode = Falsewhile True:for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()elif event.type == pygame.KEYDOWN:if event.key == pygame.K_RETURN:return is_dual_modeelif event.key == pygame.K_UP or event.key == pygame.K_DOWN or event.key == pygame.K_w or event.key == pygame.K_s:is_dual_mode = not is_dual_modescreen.blit(background_img, (0, 0))screen.blit(logo_img, logo_rect)game_tip_flash_count += 1if game_tip_flash_count > game_tip_flash_time:game_tip_show_flag = not game_tip_show_flaggame_tip_flash_count = 0if game_tip_show_flag:screen.blit(game_tip, game_tip_rect)if not is_dual_mode:tank_rect.right, tank_rect.top = player_rect.left-10, player_rect.topscreen.blit(tank_cursor, tank_rect)screen.blit(player_render_red, player_rect)screen.blit(players_render_white, players_rect)else:tank_rect.right, tank_rect.top = players_rect.left-10, players_rect.topscreen.blit(tank_cursor, tank_rect)screen.blit(player_render_white, player_rect)screen.blit(players_render_red, players_rect)pygame.display.update()clock.tick(60)

游戏结束界面包括游戏胜利与失败情况判断和是否退出游戏或重新开始的设置:

'''游戏结束界面'''
def gameEndIterface(screen, cfg, is_win=True):background_img = pygame.image.load(cfg.OTHER_IMAGE_PATHS.get('background'))color_white = (255, 255, 255)color_red = (255, 0, 0)font = pygame.font.Font(cfg.FONTPATH, cfg.WIDTH//12)# 游戏失败图gameover_img = pygame.image.load(cfg.OTHER_IMAGE_PATHS.get('gameover'))gameover_img = pygame.transform.scale(gameover_img, (150, 75))gameover_img_rect = gameover_img.get_rect()gameover_img_rect.midtop = cfg.WIDTH/2, cfg.HEIGHT/8gameover_flash_time = 25gameover_flash_count = 0gameover_show_flag = True# 游戏胜利与否的提示if is_win:font_render = font.render('Congratulations, You win!', True, color_white)else:font_render = font.render('Sorry, You fail!', True, color_white)font_rect = font_render.get_rect()font_rect.centerx, font_rect.centery = cfg.WIDTH/2, cfg.HEIGHT/3# 用于选择退出或重新开始tank_cursor = pygame.image.load(cfg.PLAYER_TANK_IMAGE_PATHS.get('player1')[0]).convert_alpha().subsurface((0, 144), (48, 48))tank_rect = tank_cursor.get_rect()restart_render_white = font.render('RESTART', True, color_white)restart_render_red = font.render('RESTART', True, color_red)restart_rect = restart_render_white.get_rect()restart_rect.left, restart_rect.top = cfg.WIDTH/2.4, cfg.HEIGHT/2quit_render_white = font.render('QUIT', True, color_white)quit_render_red = font.render('QUIT', True, color_red)quit_rect = quit_render_white.get_rect()quit_rect.left, quit_rect.top = cfg.WIDTH/2.4, cfg.HEIGHT/1.6is_quit_game = False# 主循环clock = pygame.time.Clock()while True:for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()elif event.type == pygame.KEYDOWN:if event.key == pygame.K_RETURN:return is_quit_gameelif event.key == pygame.K_UP or event.key == pygame.K_DOWN or event.key == pygame.K_w or event.key == pygame.K_s:is_quit_game = not is_quit_gamescreen.blit(background_img, (0, 0))gameover_flash_count += 1if gameover_flash_count > gameover_flash_time:gameover_show_flag = not gameover_show_flaggameover_flash_count = 0if gameover_show_flag:screen.blit(gameover_img, gameover_img_rect)screen.blit(font_render, font_rect)if not is_quit_game:tank_rect.right, tank_rect.top = restart_rect.left-10, restart_rect.topscreen.blit(tank_cursor, tank_rect)screen.blit(restart_render_red, restart_rect)screen.blit(quit_render_white, quit_rect)else:tank_rect.right, tank_rect.top = quit_rect.left-10, quit_rect.topscreen.blit(tank_cursor, tank_rect)screen.blit(restart_render_white, restart_rect)screen.blit(quit_render_red, quit_rect)pygame.display.update()clock.tick(60)

游戏界面切换主要是利用进度条加载:

'''关卡切换界面'''
def switchLevelIterface(screen, cfg, level_next=1):background_img = pygame.image.load(cfg.OTHER_IMAGE_PATHS.get('background'))color_white = (255, 255, 255)color_gray = (192, 192, 192)font = pygame.font.Font(cfg.FONTPATH, cfg.WIDTH//20)logo_img = pygame.image.load(cfg.OTHER_IMAGE_PATHS.get('logo'))logo_img = pygame.transform.scale(logo_img, (446, 70))logo_rect = logo_img.get_rect()logo_rect.centerx, logo_rect.centery = cfg.WIDTH/2, cfg.HEIGHT//4# 游戏加载提示font_render = font.render('Loading game data, You will enter Level-%s' % level_next, True, color_white)font_rect = font_render.get_rect()font_rect.centerx, font_rect.centery = cfg.WIDTH/2, cfg.HEIGHT/2# 游戏加载进度条gamebar = pygame.image.load(cfg.OTHER_IMAGE_PATHS.get('gamebar')).convert_alpha()gamebar_rect = gamebar.get_rect()gamebar_rect.centerx, gamebar_rect.centery = cfg.WIDTH/2, cfg.HEIGHT/1.4tank_cursor = pygame.image.load(cfg.PLAYER_TANK_IMAGE_PATHS.get('player1')[0]).convert_alpha().subsurface((0, 144), (48, 48))tank_rect = tank_cursor.get_rect()tank_rect.left = gamebar_rect.lefttank_rect.centery = gamebar_rect.centery# 加载所需时间load_time_left = gamebar_rect.right - tank_rect.right + 8# 主循环clock = pygame.time.Clock()while True:for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()if load_time_left <= 0:returnscreen.blit(background_img, (0, 0))screen.blit(logo_img, logo_rect)screen.blit(font_render, font_rect)screen.blit(gamebar, gamebar_rect)screen.blit(tank_cursor, tank_rect)pygame.draw.rect(screen, color_gray, (gamebar_rect.left+8, gamebar_rect.top+8, tank_rect.left-gamebar_rect.left-8, tank_rect.bottom-gamebar_rect.top-16))tank_rect.left += 1load_time_left -= 1pygame.display.update()clock.tick(60)

完整代码:

https://pan.baidu.com/s/1BUh9M73AAGkZeDN0IEKdKA

提取码:09bl

作者:李秋键

CSDN博客专家,CSDN达人课作者。硕士在读于中国矿业大学,开发有taptap竞赛获奖等。

更多精彩推荐
  • 300亿美元,AMD为什么要买Xilinx?

  • 无限想象空间,用Python玩转3D人体姿态估计

  • 打通语言理论和统计NLP,Transformers/GNNs架构能做到吗?

  • 神经网络其实和人一样懒惰,喜欢走捷径......

  • 华为出售荣耀为不实消息,赵明曾在内部否认;迅雷前CEO陈磊涉嫌职务侵占罪被调查 ;Python 3.9发布|极客头条

  • “一线城市,年薪30万+,我却裸辞回老家”一个前程序员的 10 年职业思考

相关文章:

SPU、SKU、ARPU是什么,我来记录一下我的理解

在电商系统里经常会提到“商品”、“单品”、“SPU”、“SKU”这几个词&#xff0c;那么这几个词到底是什么意思呢&#xff1f;既然不知道是什么&#xff0c;那么我们就查一下&#xff1a;SPU Standard Product Unit &#xff08;标准化产品单元&#xff09;&#xff0c;SKUst…

用C#操纵IIS(代码)

using System;using System.DirectoryServices;using System.Collections;using System.Text.RegularExpressions;using System.Text;/*** author 吴海燕* email wuhy80-usualyahoo.com* 2004-6-25 第一版*/ namespace Wuhy.ToolBox{/// <summary>/// 这个类是静态类。…

linux 内核参数调整说明

linux 内核参数调整说明 所有的TCP/IP调优参数都位于/proc/sys/net/目录。例如, 下面是最重要的一些调优参数, 后面是它们的含义: 1. /proc/sys/net/core/rmem_max — 最大的TCP数据接收缓冲。2. /proc/sys/net/core/wmem_max — 最大的TCP数据发送缓冲。3. /proc/sys/net/ipv4…

Java 最高均薪 19015 元! 9 月程序员工资出炉,你拖后腿了吗?

在全员争当码农的时代&#xff0c;如果你也想学一门编程语言&#xff0c;那么&#xff0c;我要告诉你&#xff0c;Java 是编程语言中不可撼动的王者。有点难理解&#xff1f;先看个排行榜???? 来自权威开发语言排行榜 TIOBE 的数据&#xff08;截止到 2020 年 4 月&#x…

java 基础知识八 正则表达式

正则表达式 是一种可以用于模式匹配和替换的规范&#xff0c; 一个正则表达式就是由普通的字符&#xff08;例如字符a到z&#xff09;以及特殊字符&#xff08;元字符&#xff09;组成的文字模式&#xff0c; 用以描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为…

PHP中Session的使用

启用配置//修改php.ini中的session.auto_start 0 为 session.auto_start 1session_start();$_SESSION[username]"HM";

《Two Dozen Short Lessons in Haskell》学习(八)- Function Types, Classes, and Polymorphism

《Two Dozen Short Lessons in Haskell》&#xff08;Copyright © 1995, 1996, 1997 by Rex Page&#xff0c;有人翻译为Haskell二十四学时教程&#xff0c;该书如果不用于赢利&#xff0c;可以任意发布&#xff0c;但需要保留他们的copyright&#xff09;这本书是学习 Ha…

图神经网络快速爆发,最新进展都在这里了

译者 | 刘畅出品 | AI科技大本营&#xff08;rgznai100&#xff09;近年来&#xff0c;图神经网络&#xff08;GNNs&#xff09;发展迅速&#xff0c;最近的会议上发表了大量相关的研究论文。本文作者正在整理一个GNN的简短介绍和最新研究报告的摘要。希望这对任何准备进入该领…

css去掉a标签点击后的虚线框

outline是css3的一个属性&#xff0c;用的很少。 声明&#xff0c;这是个不能兼容的css属性&#xff0c;在ie6、ie7、遨游浏览器都不兼容。 outline控制的到底是什么呢&#xff1f; 当聚焦a标签的时候&#xff0c;在a标签的区域周围会有一个虚线的框&#xff0c;这个框不同于bo…

在SQL Server中保存和输出任意类型的文件

我们可以把任意类型的文件保存到SQL Server中&#xff0c;在进行例子之前&#xff0c;先建立测试用表格&#xff0c;TestFile.sql&#xff1a;if exists (select * from dbo.sysobjects where id object_id(N[dbo].[TestFiles]) and OBJECTPROPERTY(id, NIsUserTable) 1) dro…

工作中InnoDB引擎数据库主从复制同步心得

近期将公司的MySQL架构升级了&#xff0c;由原先的一主多从换成了DRBDHeartbeat双主多从&#xff0c;正好手上有一个电子商务网站新项目也要上线了&#xff0c;用的是DRBDHeartbeat双主一从&#xff0c;由于此过程还是有别于以前的MyISAM引擎的&#xff0c;所以这里也将其心得归…

面试官:因为这个语言,我淘汰了90%的人!

很多人都有这样的经历&#xff1a;大量重复性工作&#xff1b;日报、周报、各种报&#xff0c;无穷无尽&#xff1b;不计其数的数据提取琐碎繁杂的事务让工作的效率极低。如果可以一键完成就好了。对这些问题来说&#xff0c;最高效的解决途径就是 Python。1991 年&#xff0c;…

SQL Server不能启动

SQL Server不能正常启动 I had a similar issue after uninstalling Visual Studio 2010 (which autmatically came with a Visual Studio Express 2013 install). I solved it by going through the follwing steps. Installing Visual Studio 2010 shell from here: https://…

ASP.NET 配置节架构

ASP.NET 配置节架构包含控制 ASP.NET Web 应用程序行为的元素。如果为属性指定了默认值&#xff0c;则该默认值是在 Machine.config 文件中设置的&#xff0c;该文件的路径是 systemroot/Microsoft.NET/Framework/versionNumber/CONFIG/Machine.config。 <configuration>…

IEEE迎来首位华人主席,马里兰大学终身教授刘国瑞当选

10月12日&#xff0c;IEEE宣布马里兰大学终身教授刘国瑞&#xff08;K. J. Ray Liu&#xff09;当选为2021年IEEE主席&#xff0c;他也是首位当选IEEE主席的华人学者&#xff0c;他将在明年1月开始接任现任IEEE主席Susan K. Kathy Land的职务。 在此次IEEE候选主席竞选中&#…

Visual C++ 2010 简介

VC是用来创建基于 Microsoft Windows 和 Microsoft .NET 的应用程序 原文地址&#xff1a;http://msdn.microsoft.com/zh-cn/library/60k1461a%28vvs.100%29.aspx提供了强大而灵活的开发环境&#xff0c;用于创建基于 Microsoft Windows 和 Microsoft .NET 的应用程序。您可以在…

Linux网络编程:基于UDP的程序开发回顾篇

基于无连接的UDP程序设计 同样&#xff0c;在开发基于UDP的应用程序时&#xff0c;其主要流程如下&#xff1a; 对于面向无连接的UDP应用程序在开发过程中服务端和客户端的操作流程基本差不多。对比面向连接的TCP程序&#xff0c;服务端少了listen和accept函数。前面我们也说过…

四款5G版iPhone 12齐发,苹果股价却应声而跌

整理 | 郑丽媛、屠敏题图 | 东方IC来源 | CSDN&#xff08;CSDNnews&#xff09;真快&#xff0c;又见面了。北京时间 10 月 14 日凌晨 1 点&#xff0c;Apple 举办的新品发布会如约而至。今年有关 iPhone 新品的到来有些迟&#xff0c;好在「5G just got real」&#xff0c;万…

Linux编译器GCC的使用

嵌入式Linux编译器GCC的使用 1、GCC概述 作为自由软件的旗舰项目&#xff0c;Richard Stallman在十多年前刚开始写作GCC的时候&#xff0c;还只是仅仅把它当作一个C程序语言的编译器&#xff0c;GCC的意思也只是GNU C Compiler而已。 经过了这么多年的发展&#xff0c;GCC已经不…

jquery兼容IE和火狐下focus()事件

<input type"text" id"my" name"my" /> <script type"text/javascript">$("#my").focus(); </script> 上面的代码在IE下是没有任何问题的,但是不兼容FF,在FF没有反应解决办法:兼容写法 IE和FF下focus()事…

Access-Control-Allow-Origin这个header这个头不能设置通配符域名

这个header属性&#xff0c;要么设置为*&#xff0c;即任何域名来源都行&#xff0c;要么就只能设置为一个或多个&#xff0c;确定的域名&#xff0c;不能使用通配符域名转载于:https://www.cnblogs.com/abcbuzhiming/p/6478910.html

MySQL Xtrabackup备份和恢复

简介 Xtrabackup是由percona提供的mysql数据库备份工具&#xff0c;据官方介绍&#xff0c;这也是世界上惟一一款开源的能够对innodb和xtradb数据库进行热备的工具。特点&#xff1a;(1)备份过程快速、可靠&#xff1b;(2)备份过程不会打断正在执行的事务&#xff1b;(3)能够基…

​吐血整理:手拿几个大厂offer的秘密武器!

怎样才能拿到大厂的offer&#xff1f;没有掌握绝对的技术&#xff0c;那么就要不断的学习。如何拿下阿里等大厂的offer呢&#xff0c;今天分享一个秘密武器&#xff0c;资深架构师整理的Java核心知识点&#xff0c;面试时面试官必问的知识点&#xff0c;篇章包括了很多知识点&a…

.NET中获取电脑名,IP地址,当前用户

在.NET中获取一台电脑名&#xff0c;IP地址及当前用户名是非常简单&#xff0c;以下是我常用的几种方法,如果大家还有其它好的方法&#xff0c;可以回复一起整理&#xff1a; 1. 在ASP.NET中专用属性&#xff1a; 获取服务器电脑名: Page.Server.ManchineName 获取用户信息:…

SpringMVC注解整理

2019独角兽企业重金招聘Python工程师标准>>> 使用注解之前要开启自动扫描功能 其中base-package为需要扫描的包(含子包)。 <context:component-scan base-package"cn.test"/> Configuration把一个类作为一个IoC容器&#xff0c;它的某个方法头上如果…

Facebook是如何做搜索的?

作者 | 一块小蛋糕来源 | NewBeeNLP今天要和大家分享的论文是来自Facebook的『Embedding based Retrieval in Facebook Search』。不得不说&#xff0c;F家的文章还是一如既往浓浓的工业风&#xff0c;这篇论文从工程角度讲解了一个召回的全流程&#xff0c;不管是做语义信息检…

JavaScript[对象.属性]集锦

作者&#xff1a; 蓝色理想 SCRIPT 标记? 用于包含JavaScript代码.? 属性? LANGUAGE 定义脚本语言? SRC 定义一个URL用以指定以.JS结尾的文件? windows对象? 每个HTML文档的顶层对象.? 属性? frames[] 子桢数组.每个子桢数组按源文档中定义的顺序存放.? feames…

c++ hook 钩子的使用介绍

一、基本概念&#xff1a; 钩子(Hook)&#xff0c;是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息&#xff0c;而且所监视的窗口可以是其他进程所创建的。当消息到达后&#xff0c;在目标窗口处理函数之前处理它。钩子机制允许应用程序截…

小程序一次性上传多个本地图片,上拉加载照片以及图片加载延迟解决之道

一&#xff1a;小程序之一次性上传多个本地相片 最近由于项目需要所以学了下小程序&#xff0c;也做了一些东西&#xff0c;随后便有了以下的一些总结了&#xff0c;现在说说如何使用小程序一次性上传多个本地相片。 问题描述 最近做项目的时候要实现一个上传相片的功能&#x…

测试项目案例思路

近期帮公司培训部设计测试方向教学案例&#xff0c;原型为我们部门开发的某问卷系统&#xff0c;详情如下&#xff1a; 《**问卷系统》计划授课小时总数为85小时&#xff0c;预计实际授课要根据学生的掌握情况&#xff0c;建议增加5小时&#xff0c;请将此因素考虑到案例使用时…