经典游戏3 源代码 南京大学
- 格式:doc
- 大小:49.00 KB
- 文档页数:6
13个有趣⼜好玩的Python游戏代码分享⽬录1、吃⾦币2、打乒乓3、滑雪4、并⼣⼣版飞机⼤战5、打地⿏6、⼩恐龙7、消消乐8、俄罗斯⽅块9、贪吃蛇10、24点⼩游戏11、平衡⽊12、外星⼈⼊侵13、井字棋888经常听到有朋友说,学习编程是⼀件⾮常枯燥⽆味的事情。
其实,⼤家有没有认真想过,可能是我们的学习⽅法不对?⽐⽅说,你有没有想过,可以通过打游戏来学编程?今天我想跟⼤家分享⼏个Python⼩游戏,教你如何通过边打游戏边学编程!1、吃⾦币源码分享:import osimport cfgimport sysimport pygameimport randomfrom modules import *'''游戏初始化'''def initGame():# 初始化pygame, 设置展⽰窗⼝pygame.init()screen = pygame.display.set_mode(cfg.SCREENSIZE)pygame.display.set_caption('catch coins —— 九歌')# 加载必要的游戏素材game_images = {}for key, value in cfg.IMAGE_PATHS.items():if isinstance(value, list):images = []for item in value: images.append(pygame.image.load(item))game_images[key] = imageselse:game_images[key] = pygame.image.load(value)game_sounds = {}for key, value in cfg.AUDIO_PATHS.items():if key == 'bgm': continuegame_sounds[key] = pygame.mixer.Sound(value)# 返回初始化数据return screen, game_images, game_sounds'''主函数'''def main():# 初始化screen, game_images, game_sounds = initGame()# 播放背景⾳乐pygame.mixer.music.load(cfg.AUDIO_PATHS['bgm'])pygame.mixer.music.play(-1, 0.0)# 字体加载font = pygame.font.Font(cfg.FONT_PATH, 40)# 定义herohero = Hero(game_images['hero'], position=(375, 520))# 定义⾷物组food_sprites_group = pygame.sprite.Group()generate_food_freq = random.randint(10, 20)generate_food_count = 0# 当前分数/历史最⾼分score = 0highest_score = 0 if not os.path.exists(cfg.HIGHEST_SCORE_RECORD_FILEPATH) else int(open(cfg.HIGHEST_SCORE_RECORD_FILEPATH).read()) # 游戏主循环clock = pygame.time.Clock()while True:# --填充背景screen.fill(0)screen.blit(game_images['background'], (0, 0))# --倒计时信息countdown_text = 'Count down: ' + str((90000 - pygame.time.get_ticks()) // 60000) + ":" + str((90000 - pygame.time.get_ticks()) // 1000 % 60).zfill(2) countdown_text = font.render(countdown_text, True, (0, 0, 0))countdown_rect = countdown_text.get_rect()countdown_rect.topright = [cfg.SCREENSIZE[0]-30, 5]screen.blit(countdown_text, countdown_rect)# --按键检测for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()key_pressed = pygame.key.get_pressed()if key_pressed[pygame.K_a] or key_pressed[pygame.K_LEFT]:hero.move(cfg.SCREENSIZE, 'left')if key_pressed[pygame.K_d] or key_pressed[pygame.K_RIGHT]:hero.move(cfg.SCREENSIZE, 'right')# --随机⽣成⾷物generate_food_count += 1if generate_food_count > generate_food_freq:generate_food_freq = random.randint(10, 20)generate_food_count = 0food = Food(game_images, random.choice(['gold',] * 10 + ['apple']), cfg.SCREENSIZE)food_sprites_group.add(food)# --更新⾷物for food in food_sprites_group:if food.update(): food_sprites_group.remove(food)# --碰撞检测for food in food_sprites_group:if pygame.sprite.collide_mask(food, hero):game_sounds['get'].play()food_sprites_group.remove(food)score += food.scoreif score > highest_score: highest_score = score# --画herohero.draw(screen)# --画⾷物food_sprites_group.draw(screen)# --显⽰得分score_text = f'Score: {score}, Highest: {highest_score}'score_text = font.render(score_text, True, (0, 0, 0))score_rect = score_text.get_rect()score_rect.topleft = [5, 5]screen.blit(score_text, score_rect)# --判断游戏是否结束if pygame.time.get_ticks() >= 90000:break# --更新屏幕pygame.display.flip()clock.tick(cfg.FPS)# 游戏结束, 记录最⾼分并显⽰游戏结束画⾯fp = open(cfg.HIGHEST_SCORE_RECORD_FILEPATH, 'w')fp.write(str(highest_score))fp.close()return showEndGameInterface(screen, cfg, score, highest_score)'''run'''if __name__ == '__main__':while main():pass2、打乒乓源码分享:import sysimport cfgimport pygamefrom modules import *'''定义按钮'''def Button(screen, position, text, button_size=(200, 50)):left, top = positionbwidth, bheight = button_sizepygame.draw.line(screen, (150, 150, 150), (left, top), (left+bwidth, top), 5)pygame.draw.line(screen, (150, 150, 150), (left, top-2), (left, top+bheight), 5)pygame.draw.line(screen, (50, 50, 50), (left, top+bheight), (left+bwidth, top+bheight), 5)pygame.draw.line(screen, (50, 50, 50), (left+bwidth, top+bheight), (left+bwidth, top), 5)pygame.draw.rect(screen, (100, 100, 100), (left, top, bwidth, bheight))font = pygame.font.Font(cfg.FONTPATH, 30)text_render = font.render(text, 1, (255, 235, 205))return screen.blit(text_render, (left+50, top+10))'''Function:开始界⾯Input:--screen: 游戏界⾯Return:--game_mode: 1(单⼈模式)/2(双⼈模式)'''def startInterface(screen):clock = pygame.time.Clock()while True:screen.fill((41, 36, 33))button_1 = Button(screen, (150, 175), '1 Player')button_2 = Button(screen, (150, 275), '2 Player')for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()if event.type == pygame.MOUSEBUTTONDOWN:if button_1.collidepoint(pygame.mouse.get_pos()):return 1elif button_2.collidepoint(pygame.mouse.get_pos()):return 2clock.tick(10)pygame.display.update()'''结束界⾯'''def endInterface(screen, score_left, score_right):clock = pygame.time.Clock()font1 = pygame.font.Font(cfg.FONTPATH, 30)font2 = pygame.font.Font(cfg.FONTPATH, 20)msg = 'Player on left won!' if score_left > score_right else 'Player on right won!' texts = [font1.render(msg, True, cfg.WHITE),font2.render('Press ESCAPE to quit.', True, cfg.WHITE),font2.render('Press ENTER to continue or play again.', True, cfg.WHITE)] positions = [[120, 200], [155, 270], [80, 300]]while True:screen.fill((41, 36, 33))for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()if event.type == pygame.KEYDOWN:if event.key == pygame.K_RETURN:returnelif event.key == pygame.K_ESCAPE:sys.exit()pygame.quit()for text, pos in zip(texts, positions):screen.blit(text, pos)clock.tick(10)pygame.display.update()'''运⾏游戏Demo'''def runDemo(screen):# 加载游戏素材hit_sound = pygame.mixer.Sound(cfg.HITSOUNDPATH)goal_sound = pygame.mixer.Sound(cfg.GOALSOUNDPATH)pygame.mixer.music.load(cfg.BGMPATH)pygame.mixer.music.play(-1, 0.0)font = pygame.font.Font(cfg.FONTPATH, 50)# 开始界⾯game_mode = startInterface(screen)# 游戏主循环# --左边球拍(ws控制, 仅双⼈模式时可控制)score_left = 0racket_left = Racket(cfg.RACKETPICPATH, 'LEFT', cfg)# --右边球拍(↑↓控制)score_right = 0racket_right = Racket(cfg.RACKETPICPATH, 'RIGHT', cfg)# --球ball = Ball(cfg.BALLPICPATH, cfg)clock = pygame.time.Clock()while True:for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit(-1)screen.fill((41, 36, 33))# 玩家操作pressed_keys = pygame.key.get_pressed()if pressed_keys[pygame.K_UP]:racket_right.move('UP')elif pressed_keys[pygame.K_DOWN]:racket_right.move('DOWN')if game_mode == 2:if pressed_keys[pygame.K_w]:racket_left.move('UP')elif pressed_keys[pygame.K_s]:racket_left.move('DOWN')else:racket_left.automove(ball)# 球运动scores = ball.move(ball, racket_left, racket_right, hit_sound, goal_sound) score_left += scores[0]score_right += scores[1]# 显⽰# --分隔线pygame.draw.rect(screen, cfg.WHITE, (247, 0, 6, 500))# --球ball.draw(screen)# --拍racket_left.draw(screen)racket_right.draw(screen)# --得分screen.blit(font.render(str(score_left), False, cfg.WHITE), (150, 10))screen.blit(font.render(str(score_right), False, cfg.WHITE), (300, 10))if score_left == 11 or score_right == 11:return score_left, score_rightclock.tick(100)pygame.display.update()'''主函数'''def main():# 初始化pygame.init()pygame.mixer.init()screen = pygame.display.set_mode((cfg.WIDTH, cfg.HEIGHT))pygame.display.set_caption('pingpong —— 九歌')# 开始游戏while True:score_left, score_right = runDemo(screen)endInterface(screen, score_left, score_right)'''run'''if __name__ == '__main__':main()3、滑雪源码分享:import sysimport cfgimport pygameimport random'''滑雪者类'''class SkierClass(pygame.sprite.Sprite):def __init__(self):pygame.sprite.Sprite.__init__(self)# 滑雪者的朝向(-2到2)self.direction = 0self.imagepaths = cfg.SKIER_IMAGE_PATHS[:-1]self.image = pygame.image.load(self.imagepaths[self.direction])self.rect = self.image.get_rect()self.rect.center = [320, 100]self.speed = [self.direction, 6-abs(self.direction)*2]'''改变滑雪者的朝向. 负数为向左,正数为向右,0为向前'''def turn(self, num):self.direction += numself.direction = max(-2, self.direction)self.direction = min(2, self.direction)center = self.rect.centerself.image = pygame.image.load(self.imagepaths[self.direction])self.rect = self.image.get_rect()self.rect.center = centerself.speed = [self.direction, 6-abs(self.direction)*2]return self.speed'''移动滑雪者'''def move(self):self.rect.centerx += self.speed[0]self.rect.centerx = max(20, self.rect.centerx)self.rect.centerx = min(620, self.rect.centerx)'''设置为摔倒状态'''def setFall(self):self.image = pygame.image.load(cfg.SKIER_IMAGE_PATHS[-1])'''设置为站⽴状态'''def setForward(self):self.direction = 0self.image = pygame.image.load(self.imagepaths[self.direction]) '''Function:障碍物类Input:img_path: 障碍物图⽚路径location: 障碍物位置attribute: 障碍物类别属性'''class ObstacleClass(pygame.sprite.Sprite):def __init__(self, img_path, location, attribute):pygame.sprite.Sprite.__init__(self)self.img_path = img_pathself.image = pygame.image.load(self.img_path)self.location = locationself.rect = self.image.get_rect()self.rect.center = self.locationself.attribute = attributeself.passed = False'''移动'''def move(self, num):self.rect.centery = self.location[1] - num'''创建障碍物'''def createObstacles(s, e, num=10):obstacles = pygame.sprite.Group()locations = []for i in range(num):row = random.randint(s, e)col = random.randint(0, 9)location = [col*64+20, row*64+20]if location not in locations:locations.append(location)attribute = random.choice(list(cfg.OBSTACLE_PATHS.keys())) img_path = cfg.OBSTACLE_PATHS[attribute]obstacle = ObstacleClass(img_path, location, attribute)obstacles.add(obstacle)return obstacles'''合并障碍物'''def AddObstacles(obstacles0, obstacles1):obstacles = pygame.sprite.Group()for obstacle in obstacles0:obstacles.add(obstacle)for obstacle in obstacles1:obstacles.add(obstacle)return obstacles'''显⽰游戏开始界⾯'''def ShowStartInterface(screen, screensize):screen.fill((255, 255, 255))tfont = pygame.font.Font(cfg.FONTPATH, screensize[0]//5)cfont = pygame.font.Font(cfg.FONTPATH, screensize[0]//20)title = tfont.render(u'滑雪游戏', True, (255, 0, 0))content = cfont.render(u'按任意键开始游戏', True, (0, 0, 255))trect = title.get_rect()trect.midtop = (screensize[0]/2, screensize[1]/5)crect = content.get_rect()crect.midtop = (screensize[0]/2, screensize[1]/2)screen.blit(title, trect)screen.blit(content, crect)while True:for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()elif event.type == pygame.KEYDOWN:returnpygame.display.update()'''显⽰分数'''def showScore(screen, score, pos=(10, 10)):font = pygame.font.Font(cfg.FONTPATH, 30)score_text = font.render("Score: %s" % score, True, (0, 0, 0))screen.blit(score_text, pos)'''更新当前帧的游戏画⾯'''def updateFrame(screen, obstacles, skier, score):screen.fill((255, 255, 255))obstacles.draw(screen)screen.blit(skier.image, skier.rect)showScore(screen, score)pygame.display.update()'''主程序'''def main():# 游戏初始化pygame.init()pygame.mixer.init()pygame.mixer.music.load(cfg.BGMPATH)pygame.mixer.music.set_volume(0.4)pygame.mixer.music.play(-1)# 设置屏幕screen = pygame.display.set_mode(cfg.SCREENSIZE)pygame.display.set_caption('滑雪游戏 —— 九歌')# 游戏开始界⾯ShowStartInterface(screen, cfg.SCREENSIZE)# 实例化游戏精灵# --滑雪者skier = SkierClass()# --创建障碍物obstacles0 = createObstacles(20, 29)obstacles1 = createObstacles(10, 19)obstaclesflag = 0obstacles = AddObstacles(obstacles0, obstacles1)# 游戏clockclock = pygame.time.Clock()# 记录滑雪的距离distance = 0# 记录当前的分数score = 0# 记录当前的速度speed = [0, 6]# 游戏主循环while True:# --事件捕获for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()if event.type == pygame.KEYDOWN:if event.key == pygame.K_LEFT or event.key == pygame.K_a:speed = skier.turn(-1)elif event.key == pygame.K_RIGHT or event.key == pygame.K_d:speed = skier.turn(1)# --更新当前游戏帧的数据skier.move()distance += speed[1]if distance >= 640 and obstaclesflag == 0:obstaclesflag = 1obstacles0 = createObstacles(20, 29)obstacles = AddObstacles(obstacles0, obstacles1)if distance >= 1280 and obstaclesflag == 1:obstaclesflag = 0distance -= 1280for obstacle in obstacles0:obstacle.location[1] = obstacle.location[1] - 1280obstacles1 = createObstacles(10, 19)obstacles = AddObstacles(obstacles0, obstacles1)for obstacle in obstacles:obstacle.move(distance)# --碰撞检测hitted_obstacles = pygame.sprite.spritecollide(skier, obstacles, False)if hitted_obstacles:if hitted_obstacles[0].attribute == "tree" and not hitted_obstacles[0].passed: score -= 50skier.setFall()updateFrame(screen, obstacles, skier, score)pygame.time.delay(1000)skier.setForward()speed = [0, 6]hitted_obstacles[0].passed = Trueelif hitted_obstacles[0].attribute == "flag" and not hitted_obstacles[0].passed: score += 10obstacles.remove(hitted_obstacles[0])# --更新屏幕updateFrame(screen, obstacles, skier, score)clock.tick(cfg.FPS)'''run'''if __name__ == '__main__':main();4、并⼣⼣版飞机⼤战源码分享:import sysimport cfgimport pygamefrom modules import *'''游戏界⾯'''def GamingInterface(num_player, screen):# 初始化pygame.mixer.music.load(cfg.SOUNDPATHS['Cool Space Music'])pygame.mixer.music.set_volume(0.4)pygame.mixer.music.play(-1)explosion_sound = pygame.mixer.Sound(cfg.SOUNDPATHS['boom'])fire_sound = pygame.mixer.Sound(cfg.SOUNDPATHS['shot'])font = pygame.font.Font(cfg.FONTPATH, 20)# 游戏背景图bg_imgs = [cfg.IMAGEPATHS['bg_big'], cfg.IMAGEPATHS['seamless_space'], cfg.IMAGEPATHS['space3']] bg_move_dis = 0bg_1 = pygame.image.load(bg_imgs[0]).convert()bg_2 = pygame.image.load(bg_imgs[1]).convert()bg_3 = pygame.image.load(bg_imgs[2]).convert()# 玩家, ⼦弹和⼩⾏星精灵组player_group = pygame.sprite.Group()bullet_group = pygame.sprite.Group()asteroid_group = pygame.sprite.Group()# 产⽣⼩⾏星的时间间隔asteroid_ticks = 90for i in range(num_player):player_group.add(Ship(i+1, cfg))clock = pygame.time.Clock()# 分数score_1, score_2 = 0, 0# 游戏主循环while True:for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()# --玩家⼀: ↑↓←→控制, j射击; 玩家⼆: wsad控制, 空格射击pressed_keys = pygame.key.get_pressed()for idx, player in enumerate(player_group):direction = Noneif idx == 0:if pressed_keys[pygame.K_UP]:direction = 'up'elif pressed_keys[pygame.K_DOWN]:direction = 'down'elif pressed_keys[pygame.K_LEFT]:direction = 'left'elif pressed_keys[pygame.K_RIGHT]:direction = 'right'if direction:player.move(direction)if pressed_keys[pygame.K_j]:if player.cooling_time == 0:fire_sound.play()bullet_group.add(player.shot())player.cooling_time = 20elif idx == 1:if pressed_keys[pygame.K_w]:direction = 'up'elif pressed_keys[pygame.K_s]:direction = 'down'elif pressed_keys[pygame.K_a]:direction = 'left'elif pressed_keys[pygame.K_d]:direction = 'right'if direction:player.move(direction)if pressed_keys[pygame.K_SPACE]:if player.cooling_time == 0:fire_sound.play()bullet_group.add(player.shot())player.cooling_time = 20if player.cooling_time > 0:player.cooling_time -= 1if (score_1 + score_2) < 500:background = bg_1elif (score_1 + score_2) < 1500:background = bg_2else:background = bg_3# --向下移动背景图实现飞船向上移动的效果screen.blit(background, (0, -background.get_rect().height + bg_move_dis))screen.blit(background, (0, bg_move_dis))bg_move_dis = (bg_move_dis + 2) % background.get_rect().height# --⽣成⼩⾏星if asteroid_ticks == 0:asteroid_ticks = 90asteroid_group.add(Asteroid(cfg))else:asteroid_ticks -= 1# --画飞船for player in player_group:if pygame.sprite.spritecollide(player, asteroid_group, True, None): player.explode_step = 1explosion_sound.play()elif player.explode_step > 0:if player.explode_step > 3:player_group.remove(player)if len(player_group) == 0:returnelse:player.explode(screen)else:player.draw(screen)# --画⼦弹for bullet in bullet_group:bullet.move()if pygame.sprite.spritecollide(bullet, asteroid_group, True, None): bullet_group.remove(bullet)if bullet.player_idx == 1:score_1 += 1else:score_2 += 1else:bullet.draw(screen)# --画⼩⾏星for asteroid in asteroid_group:asteroid.move()asteroid.rotate()asteroid.draw(screen)# --显⽰分数score_1_text = '玩家⼀得分: %s' % score_1score_2_text = '玩家⼆得分: %s' % score_2text_1 = font.render(score_1_text, True, (0, 0, 255))text_2 = font.render(score_2_text, True, (255, 0, 0))screen.blit(text_1, (2, 5))screen.blit(text_2, (2, 35))# --屏幕刷新pygame.display.update()clock.tick(60)'''主函数'''def main():pygame.init()pygame.font.init()pygame.mixer.init()screen = pygame.display.set_mode(cfg.SCREENSIZE)pygame.display.set_caption('飞机⼤战 —— 九歌')num_player = StartInterface(screen, cfg)if num_player == 1:while True:GamingInterface(num_player=1, screen=screen)EndInterface(screen, cfg)else:while True:GamingInterface(num_player=2, screen=screen)EndInterface(screen, cfg)'''run'''if __name__ == '__main__':main()5、打地⿏源码分享:import cfgimport sysimport pygameimport randomfrom modules import *'''游戏初始化'''def initGame():pygame.init()pygame.mixer.init()screen = pygame.display.set_mode(cfg.SCREENSIZE)pygame.display.set_caption('打地⿏ —— 九歌')'''主函数'''def main():# 初始化screen = initGame()# 加载背景⾳乐和其他⾳效pygame.mixer.music.load(cfg.BGM_PATH)pygame.mixer.music.play(-1)audios = {'count_down': pygame.mixer.Sound(cfg.COUNT_DOWN_SOUND_PATH), 'hammering': pygame.mixer.Sound(cfg.HAMMERING_SOUND_PATH)}# 加载字体font = pygame.font.Font(cfg.FONT_PATH, 40)# 加载背景图⽚bg_img = pygame.image.load(cfg.GAME_BG_IMAGEPATH)# 开始界⾯startInterface(screen, cfg.GAME_BEGIN_IMAGEPATHS)# 地⿏改变位置的计时hole_pos = random.choice(cfg.HOLE_POSITIONS)change_hole_event = EREVENTpygame.time.set_timer(change_hole_event, 800)# 地⿏mole = Mole(cfg.MOLE_IMAGEPATHS, hole_pos)# 锤⼦hammer = Hammer(cfg.HAMMER_IMAGEPATHS, (500, 250))# 时钟clock = pygame.time.Clock()# 分数your_score = 0flag = False# 初始时间init_time = pygame.time.get_ticks()# 游戏主循环while True:# --游戏时间为60stime_remain = round((61000 - (pygame.time.get_ticks() - init_time)) / 1000.) # --游戏时间减少, 地⿏变位置速度变快if time_remain == 40 and not flag:hole_pos = random.choice(cfg.HOLE_POSITIONS)mole.reset()mole.setPosition(hole_pos)pygame.time.set_timer(change_hole_event, 650)flag = Trueelif time_remain == 20 and flag:hole_pos = random.choice(cfg.HOLE_POSITIONS)mole.reset()mole.setPosition(hole_pos)pygame.time.set_timer(change_hole_event, 500)flag = False# --倒计时⾳效if time_remain == 10:audios['count_down'].play()# --游戏结束if time_remain < 0: breakcount_down_text = font.render('Time: '+str(time_remain), True, cfg.WHITE) # --按键检测for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()elif event.type == pygame.MOUSEMOTION:hammer.setPosition(pygame.mouse.get_pos())elif event.type == pygame.MOUSEBUTTONDOWN:if event.button == 1:hammer.setHammering()elif event.type == change_hole_event:hole_pos = random.choice(cfg.HOLE_POSITIONS)mole.reset()mole.setPosition(hole_pos)# --碰撞检测if hammer.is_hammering and not mole.is_hammer:is_hammer = pygame.sprite.collide_mask(hammer, mole)if is_hammer:audios['hammering'].play()mole.setBeHammered()your_score += 10# --分数your_score_text = font.render('Score: '+str(your_score), True, cfg.BROWN) # --绑定必要的游戏元素到屏幕(注意顺序)screen.blit(bg_img, (0, 0))screen.blit(count_down_text, (875, 8))screen.blit(your_score_text, (800, 430))mole.draw(screen)hammer.draw(screen)# --更新pygame.display.flip()# 读取最佳分数(try块避免第⼀次游戏⽆.rec⽂件)try:best_score = int(open(cfg.RECORD_PATH).read())except:best_score = 0# 若当前分数⼤于最佳分数则更新最佳分数if your_score > best_score:f = open(cfg.RECORD_PATH, 'w')f.write(str(your_score))f.close()# 结束界⾯score_info = {'your_score': your_score, 'best_score': best_score}is_restart = endInterface(screen, cfg.GAME_END_IMAGEPATH, cfg.GAME_AGAIN_IMAGEPATHS, score_info, cfg.FONT_PATH, [cfg.WHITE, cfg.RED], cfg.SCREENSIZE) return is_restart'''run'''if __name__ == '__main__':while True:is_restart = main()if not is_restart:break6、⼩恐龙玩法:上下控制起跳躲避源码分享:import cfgimport sysimport randomimport pygamefrom modules import *'''main'''def main(highest_score):# 游戏初始化pygame.init()screen = pygame.display.set_mode(cfg.SCREENSIZE)pygame.display.set_caption('九歌')# 导⼊所有声⾳⽂件sounds = {}for key, value in cfg.AUDIO_PATHS.items():sounds[key] = pygame.mixer.Sound(value)# 游戏开始界⾯GameStartInterface(screen, sounds, cfg)# 定义⼀些游戏中必要的元素和变量score = 0score_board = Scoreboard(cfg.IMAGE_PATHS['numbers'], position=(534, 15), bg_color=cfg.BACKGROUND_COLOR)highest_score = highest_scorehighest_score_board = Scoreboard(cfg.IMAGE_PATHS['numbers'], position=(435, 15), bg_color=cfg.BACKGROUND_COLOR, is_highest=True)dino = Dinosaur(cfg.IMAGE_PATHS['dino'])ground = Ground(cfg.IMAGE_PATHS['ground'], position=(0, cfg.SCREENSIZE[1]))cloud_sprites_group = pygame.sprite.Group()cactus_sprites_group = pygame.sprite.Group()ptera_sprites_group = pygame.sprite.Group()add_obstacle_timer = 0score_timer = 0# 游戏主循环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_SPACE or event.key == pygame.K_UP:dino.jump(sounds)elif event.key == pygame.K_DOWN:dino.duck()elif event.type == pygame.KEYUP and event.key == pygame.K_DOWN:dino.unduck()screen.fill(cfg.BACKGROUND_COLOR)# --随机添加云if len(cloud_sprites_group) < 5 and random.randrange(0, 300) == 10:cloud_sprites_group.add(Cloud(cfg.IMAGE_PATHS['cloud'], position=(cfg.SCREENSIZE[0], random.randrange(30, 75))))# --随机添加仙⼈掌/飞龙add_obstacle_timer += 1if add_obstacle_timer > random.randrange(50, 150):add_obstacle_timer = 0random_value = random.randrange(0, 10)if random_value >= 5 and random_value <= 7:cactus_sprites_group.add(Cactus(cfg.IMAGE_PATHS['cacti']))else:position_ys = [cfg.SCREENSIZE[1]*0.82, cfg.SCREENSIZE[1]*0.75, cfg.SCREENSIZE[1]*0.60, cfg.SCREENSIZE[1]*0.20] ptera_sprites_group.add(Ptera(cfg.IMAGE_PATHS['ptera'], position=(600, random.choice(position_ys))))# --更新游戏元素dino.update()ground.update()cloud_sprites_group.update()cactus_sprites_group.update()ptera_sprites_group.update()score_timer += 1if score_timer > (cfg.FPS//12):score_timer = 0score += 1score = min(score, 99999)if score > highest_score:highest_score = scoreif score % 100 == 0:sounds['point'].play()if score % 1000 == 0:ground.speed -= 1for item in cloud_sprites_group:item.speed -= 1for item in cactus_sprites_group:item.speed -= 1for item in ptera_sprites_group:item.speed -= 1# --碰撞检测for item in cactus_sprites_group:if pygame.sprite.collide_mask(dino, item):dino.die(sounds)for item in ptera_sprites_group:if pygame.sprite.collide_mask(dino, item):dino.die(sounds)# --将游戏元素画到屏幕上dino.draw(screen)ground.draw(screen)cloud_sprites_group.draw(screen)cactus_sprites_group.draw(screen)ptera_sprites_group.draw(screen)score_board.set(score)highest_score_board.set(highest_score)score_board.draw(screen)highest_score_board.draw(screen)# --更新屏幕pygame.display.update()clock.tick(cfg.FPS)# --游戏是否结束if dino.is_dead:break# 游戏结束界⾯return GameEndInterface(screen, cfg), highest_score'''run'''if __name__ == '__main__':highest_score = 0while True:flag, highest_score = main(highest_score)if not flag: break7、消消乐玩法:三个相连就能消除源码分享:import osimport sysimport cfgimport pygamefrom modules import *'''游戏主程序'''def main():pygame.init()screen = pygame.display.set_mode(cfg.SCREENSIZE)pygame.display.set_caption('Gemgem —— 九歌')# 加载背景⾳乐pygame.mixer.init()pygame.mixer.music.load(os.path.join(cfg.ROOTDIR, "resources/audios/bg.mp3"))pygame.mixer.music.set_volume(0.6)pygame.mixer.music.play(-1)# 加载⾳效sounds = {}sounds['mismatch'] = pygame.mixer.Sound(os.path.join(cfg.ROOTDIR, 'resources/audios/badswap.wav'))sounds['match'] = []for i in range(6):sounds['match'].append(pygame.mixer.Sound(os.path.join(cfg.ROOTDIR, 'resources/audios/match%s.wav' % i))) # 加载字体font = pygame.font.Font(os.path.join(cfg.ROOTDIR, 'resources/font/font.TTF'), 25)# 图⽚加载gem_imgs = []for i in range(1, 8):gem_imgs.append(os.path.join(cfg.ROOTDIR, 'resources/images/gem%s.png' % i))# 主循环game = gemGame(screen, sounds, font, gem_imgs, cfg)while True:score = game.start()flag = False# ⼀轮游戏结束后玩家选择重玩或者退出while True:for event in pygame.event.get():if event.type == pygame.QUIT or (event.type == pygame.KEYUP and event.key == pygame.K_ESCAPE): pygame.quit()sys.exit()elif event.type == pygame.KEYUP and event.key == pygame.K_r:flag = Trueif flag:breakscreen.fill((135, 206, 235))text0 = 'Final score: %s' % scoretext1 = 'Press <R> to restart the game.'text2 = 'Press <Esc> to quit the game.'y = 150for idx, text in enumerate([text0, text1, text2]):text_render = font.render(text, 1, (85, 65, 0))rect = text_render.get_rect()if idx == 0:rect.left, rect.top = (212, y)elif idx == 1:rect.left, rect.top = (122.5, y)else:rect.left, rect.top = (126.5, y)y += 100screen.blit(text_render, rect)pygame.display.update()game.reset()'''run'''if __name__ == '__main__':main()8、俄罗斯⽅块玩法:童年经典,普通模式没啥意思,⼩时候我们都是玩加速的。
游戏代码大全可复制在游戏开发领域,代码一直是至关重要和不可或缺的一部分。
无论是编写游戏的逻辑、实现游戏的功能,还是优化游戏的性能,都需要我们编写大量的代码来实现。
而对于许多游戏开发者来说,有一个游戏代码大全可供参考和复制,将会极大地提高他们的效率和开发速度。
代码示例以下是一些常见的游戏开发代码示例,供大家参考和使用:1. 创建游戏角色class Player:def__init__(self, name, health): = nameself.health = healthdef take_damage(self, damage):self.health -= damagedef is_alive(self):return self.health >02. 实现游戏循环while True:# 处理用户输入user_input = get_user_input()# 更新游戏状态update_game_state(user_input)# 渲染游戏画面render_game_screen()3. 碰撞检测def check_collision(obj1, obj2):if obj1.x < obj2.x + obj2.width and obj1.x + obj1.width > obj2.x an d obj1.y < obj2.y + obj2.height and obj1.y + obj1.height > obj2.y:return Trueelse:return False总结游戏代码大全是游戏开发过程中非常有价值的资源。
通过学习和参考他人的代码,我们可以更快地掌握游戏开发的技巧和方法,提高自己的编程能力。
希望以上代码示例能对你有所帮助,也欢迎大家分享自己的游戏代码,共同学习和进步!。
java扫雷源代码和课程设计一、课程目标知识目标:1. 学生能理解Java语言中面向对象编程的基本概念,包括类、对象、继承、封装和多态。
2. 学生能掌握Java的基本语法,如条件语句、循环语句、数组的使用。
3. 学生能运用所学知识实现扫雷游戏的逻辑设计。
技能目标:1. 学生通过分析扫雷游戏的规则,能自主设计游戏的类和对象,提升问题分析能力。
2. 学生能编写并调试扫雷游戏的源代码,培养编程实践能力。
3. 学生能通过课堂讨论和协作,提高团队协作和沟通能力。
情感态度价值观目标:1. 学生在探索Java编程的过程中,培养对计算机科学的兴趣和热情。
2. 学生通过解决编程问题,锻炼克服困难的意志,增强自信心。
3. 学生在团队合作中,学会尊重他人意见,培养良好的合作精神和沟通技巧。
课程性质:本课程为信息技术课程,旨在通过实际操作和项目实践,帮助学生掌握Java编程的基本知识和技能。
学生特点:学生处于高年级阶段,具备一定的编程基础和逻辑思维能力,对实际项目开发有较高的兴趣。
教学要求:教师应注重理论与实践相结合,引导学生主动探索,关注学生个体差异,提供针对性的指导。
在教学过程中,关注学生的情感态度,激发学生的学习兴趣,培养其良好的编程习惯和团队合作精神。
通过课程目标的分解和实施,确保学生达到预期的学习成果。
二、教学内容1. 面向对象编程基础:- 类的定义与使用- 对象的创建与操作- 继承、封装和多态的概念与应用2. Java基本语法:- 条件语句(if-else,switch)- 循环语句(for,while,do-while)- 数组的使用与操作3. 扫雷游戏逻辑设计:- 游戏规则分析- 类的设计与实现(如:雷区类、格子类、游戏界面类等)- 游戏逻辑的编写与调试4. 项目实践:- 分组讨论与协作- 源代码编写与调试- 游戏功能测试与优化教学内容安排和进度:1. 第1-2课时:面向对象编程基础,引入类和对象的概念,讲解继承、封装和多态。
JAVA实现经典游戏坦克⼤战的⽰例代码⽬录前⾔主要设计功能截图代码实现总结前⾔⼩时候⼤家都玩过坦克⼤战吧,熟悉的旋律和丰富的关卡陪伴了我们⼀整个寒暑假,还记得传说中的经典坦克⼤战吗?那些怀旧的记忆,伴随着我们⼀起⾛过来的经典坦克⼤战,刚开始那战战兢兢,屡屡被敌⼈坦克击毁的情景历历在⽬。
现在好了,再也不⽤担⼼敌⼈坦克了,可以横冲直撞,横扫敌⼈坦克了。
快哉《坦克⼤战》游戏以坦克战⽃为主题,⽤java语⾔实现,采⽤了swing技术进⾏了界⾯化处理,设计思路⽤了⾯向对象思想。
主要需求可以⽣成不同的地图,消灭地图上的所有坦克为胜利;可以设置关卡地图,不断增加难度。
主要设计1、要有难度关卡:第⼀关,第⼆关,第三关,第四关,第五关;第⼀关地图最简单,第五关地图最难;2、坦克要有⾎条,打多次才会死3、地图要我有我⽅坦克四辆(相当于4条命)和多辆敌⽅坦克4、我⽅坦克的炮弹数量是固定的,设置为5005、地图右边显⽰基本信息6、地图上要在砖块,铁块,河流功能截图游戏开始页⾯代码实现窗⼝布局public class GameFrame extends JFrame {/*** serialVersionUID*/private static final long serialVersionUID = -1176914786963603304L;public GameFrame() {super();this.setSize(800, 700);this.setTitle("坦克⼤战");this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);this.setResizable(false);// 显⽰器屏幕⼤⼩Dimension screenSizeInfo = Toolkit.getDefaultToolkit().getScreenSize();int leftTopX = ((int) screenSizeInfo.getWidth() - this.getWidth()) / 2;int leftTopY = ((int) screenSizeInfo.getHeight() - this.getHeight()) / 2;// 设置显⽰的位置在屏幕中间this.setLocation(leftTopX, leftTopY);}}地图渲染核⼼算法@Servicepublic class PaintService {@Autowiredprivate GameContext context;private Brick rightBrick = new Brick(700, 50);private Iron rightIron = new Iron(700, 50);private Water rightWater = new Water(700, 50);/*** 画出东西(包括坦克、障碍物。
JAVA实现经典扫雷游戏的⽰例代码⽬录前⾔主要设计功能截图代码实现总结前⾔windows⾃带的游戏《扫雷》是陪伴了⽆数⼈的经典游戏,本程序参考《扫雷》的规则进⾏了简化,⽤java语⾔实现,采⽤了swing技术进⾏了界⾯化处理,设计思路⽤了⾯向对象思想。
主要需求1、要有难度等级,初级,中级,⾼级2、由玩家逐个翻开⽅块,以找出所有地雷为最终游戏⽬标。
如果玩家翻开的⽅块有地雷,则游戏结束3、游戏主区域由很多个⽅格组成。
使⽤⿏标左键随机点击⼀个⽅格,⽅格即被打开并显⽰出⽅格中的数字;⽅格中数字则表⽰其周围的8个⽅格隐藏了⼏颗雷。
4、⽤户右键可标记雷的位置5、雷都被标记出来则胜利主要设计1、格⼦格数固定为10*10格2、难度等级,初级:12,中级:24,⾼级:363、点击格⼦时,产⽣没有引爆的地图效果;4、点击格⼦时,此格⼦是雷,则显⽰所有雷的位置,并递归清空⾮雷格⼦,结束游戏5、实现检查所有的雷是否都被标记出来了,如果是,则胜利算法。
6、实现计时器算法,⽤来计时显⽰游戏开始多少秒7、实现难度等级,雷数的显⽰8、实现⿏标左键的实现逻辑9、实现⿏标右键的标记逻辑功能截图开始界⾯左键选中格⼦效果左键选中雷效果右键标记雷效果胜利效果代码实现程序启动类public class JMine extends JFrame implements MouseListener, ActionListener {private JMineArth mine;private JMineButton[][] mineButton;private GridBagConstraints constraints;private JPanel pane;private GridBagLayout gridbag;private boolean gameStarted;private static JCounter mineCounter;private static JCounter timeCounter;private Timer timer;private Timer winTimer = new Timer();public int numMine;public int numFlaged;private JMenuBar mb;private JMenu mGame;private JMenuItem miEasy;private JMenuItem miMiddle;private JMenuItem miHard;private JMenuItem miExit;private JMenu mHelp;private JMenuItem miAbout;private JPanel controlPane;private JButton bTest;private AboutFrame about;private WinFrame winFrame;private ImageIcon[] mineNumIcon = { new ImageIcon(JMine.class.getClassLoader().getResource("blank1.gif")),new ImageIcon(JMine.class.getClassLoader().getResource("1.gif")), new ImageIcon(JMine.class.getClassLoader().getResource("2.gif")),new ImageIcon(JMine.class.getClassLoader().getResource("3.gif")), new ImageIcon(JMine.class.getClassLoader().getResource("4.gif")),new ImageIcon(JMine.class.getClassLoader().getResource("5.gif")), new ImageIcon(JMine.class.getClassLoader().getResource("6.gif")),new ImageIcon(JMine.class.getClassLoader().getResource("7.gif")), new ImageIcon(JMine.class.getClassLoader().getResource("8.gif")),new ImageIcon(JMine.class.getClassLoader().getResource("0.gif"))};private ImageIcon[] mineStatus = { new ImageIcon(JMine.class.getClassLoader().getResource("blank1.gif")),new ImageIcon(JMine.class.getClassLoader().getResource("flag.gif")), new ImageIcon(JMine.class.getClassLoader().getResource("question.gif")) }; private ImageIcon[] mineBombStatus = { new ImageIcon(JMine.class.getClassLoader().getResource("0.gif")),new ImageIcon(JMine.class.getClassLoader().getResource("mine.gif")), new ImageIcon(JMine.class.getClassLoader().getResource("wrongmine.gif")), new ImageIcon(JMine.class.getClassLoader().getResource("bomb.gif")) };private ImageIcon[] faceIcon = { new ImageIcon(JMine.class.getClassLoader().getResource("smile.gif")),new ImageIcon(JMine.class.getClassLoader().getResource("Ooo.gif")) };// You loseprivate void bomb(int row, int col){try{//System.out.println("Bomb!");for (int i = 0; i < 10; i++) {for (int j = 0; j < 10; j++) {mineButton[i][j].setIcon(mineBombStatus[0]);int toShow;toShow = mine.mine[i][j] != 9 ? 0 : 1;mineButton[i][j].setClickFlag(true);if (toShow == 1 && (i != row || j != col)) {mineButton[i][j].setIcon(mineBombStatus[toShow]);mineButton[i][j].setClickFlag(true);} else if (toShow == 1 && (i == row && j == col)) {mineButton[i][j].setIcon(mineBombStatus[3]);mineButton[i][j].setClickFlag(true);} else if (toShow == 0 && mineButton[i][j].getFlag() != 1) { mineButton[i][j].setEnabled(false);} else if (toShow == 0 && mineButton[i][j].getFlag() == 1) { mineButton[i][j].setIcon(mineBombStatus[2]);mineButton[i][j].setClickFlag(true);}}}timer.cancel();}catch (Exception e){}}// check if you win() {private boolean isWin() {for (int i = 0; i < 10; i++) {for (int j = 0; j < 10; j++) {if (mine.mine[i][j] == 9 && mineButton[i][j].getFlag() != 1) { return (false);}if (mine.mine[i][j] != 9 && mineButton[i][j].getFlag() == 1) { return (false);}if (mine.mine[i][j] != 9&& mineButton[i][j].getClickFlag() == false) {return (false);}}}return (true);}// You Winprivate void win(){timer.cancel();winFrame.setVisible(true);winTimer.schedule(new TimerTask(){public void run() {while(!winFrame.getWinOk()){}numMine = winFrame.getMineNum();winFrame.setVisible(false);setNewGame(numMine);//System.out.println("Jerry Debug:"+numMine);this.cancel();winFrame.setWinOk(false);}},0L);}// Constructor of the gamepublic JMine() {super("JMine Game");setSize(250, 350);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);Insets space = new Insets(0, 0, 0, 0);// Game varsgameStarted = false;numMine = 12;numFlaged = 0;ImageIcon myIcon = new ImageIcon(JMine.class.getClassLoader().getResource("blank1.gif")); gridbag = new GridBagLayout();constraints = new GridBagConstraints();pane = new JPanel();pane.setLayout(gridbag);constraints.fill = GridBagConstraints.BOTH;constraints.anchor = GridBagConstraints.CENTER;// Begin Menu Setmb = new JMenuBar();mGame = new JMenu("Game");miEasy = new JMenuItem("Easy");miEasy.addActionListener(this);miMiddle = new JMenuItem("Middle");miMiddle.addActionListener(this);miHard = new JMenuItem("Hard");miHard.addActionListener(this);miExit = new JMenuItem("Exit");miExit.addActionListener(this);mGame.add(miEasy);mGame.add(miMiddle);mGame.add(miHard);mGame.addSeparator();mGame.add(miExit);mb.add(mGame);mHelp = new JMenu("Help");miAbout = new JMenuItem("About...");mHelp.add(miAbout);miAbout.addActionListener(this);mb.add(mHelp);this.setJMenuBar(mb);// end of Menu Set// Control PanelcontrolPane = new JPanel();bTest = new JButton(faceIcon[0]);bTest.setSize(26, 27);bTest.setMargin(space);bTest.addMouseListener(this);bTest.setPressedIcon(faceIcon[1]);mineCounter = new JCounter(numMine);timeCounter = new JCounter();controlPane.add(mineCounter);controlPane.add(bTest);controlPane.add(timeCounter);buildConstraints(constraints, 0, 0, 10, 2, 100, 100);gridbag.setConstraints(controlPane, constraints);pane.add(controlPane);// BottonsmineButton = new JMineButton[10][10];for (int i = 0; i < 10; i++) {for (int j = 0; j < 10; j++) {mineButton[i][j] = new JMineButton(i, j, myIcon);mineButton[i][j].addMouseListener(this);mineButton[i][j].setMargin(space);buildConstraints(constraints, j, i + 3, 1, 1, 100, 100);gridbag.setConstraints(mineButton[i][j], constraints);pane.add(mineButton[i][j]);}}// Content PanesetContentPane(pane);setLocation(200, 150);setVisible(true);// About Frameabout = new AboutFrame("JMine About");winFrame = new WinFrame("You win!");}// Set the GUI objects positionsvoid buildConstraints(GridBagConstraints gbc, int gx, int gy, int gw, int gh, int wx, int wy) {gbc.gridx = gx;gbc.gridy = gy;gbc.gridwidth = gw;gbc.gridheight = gh;gbc.weightx = wx;gbc.weighty = wy;}// the methods to check if there were mines, to be nestedvoid checkMine(int row, int col){int i, j;i = row < 0 ? 0 : row;i = i > 9 ? 9 : i;j = col < 0 ? 0 : col;j = j > 9 ? 9 : j;//System.out.println("Check Mine row:"+i + ",col:" +j);if (mine.mine[i][j] == 9) {bomb(i, j);} else if (mine.mine[i][j] == 0&& mineButton[i][j].getClickFlag() == false) {mineButton[i][j].setClickFlag(true);showLabel(i, j);for (int ii = i - 1; ii <= i + 1; ii++)for (int jj = j - 1; jj <= j + 1; jj++)checkMine(ii, jj);} else {showLabel(i, j);mineButton[i][j].setClickFlag(true);}if (isWin()) {win();}}private void clearAll(int row, int col){int top, bottom, left, right;top = row - 1 > 0 ? row - 1 : 0;bottom = row + 1 < 10 ? row + 1 : 9;left = col - 1 > 0 ? col - 1 : 0;right = col + 1 < 10 ? col + 1 : 9;for (int i = top; i <= bottom; i++) {for (int j = left; j <= right; j++) {if (mineButton[i][j].getFlag() != 1)checkMine(i, j);}}}private void resetAll() {for (int i = 0; i < 10; i++) {for (int j = 0; j < 10; j++) {mineButton[i][j].setFlag(0);mineButton[i][j].setClickFlag(false);mineButton[i][j].setIcon(mineStatus[0]);mineButton[i][j].setEnabled(true);mineButton[i][j].setVisible(true);}}}// to flag the mine you want to flag outvoid flagMine(int row, int col) {//System.out.println("Jerry Arrives here!");int i, j;i = row < 0 ? 0 : row;i = i > 9 ? 9 : i;j = col < 0 ? 0 : col;j = j > 9 ? 9 : j;if (mineButton[i][j].getFlag() == 0) {numFlaged++;} else if (mineButton[i][j].getFlag() == 1) {numFlaged--;}mineCounter.resetCounter(numMine - numFlaged >= 0 ? numMine - numFlaged: 0);mineButton[i][j].setFlag((mineButton[i][j].getFlag() + 1) % 3);showFlag(i, j);if (isWin()) {win();}}// show the numbers of the nearby minesvoid showLabel(int row, int col) {//System.out.println("ShowLabel row:" + row + ",col:" + col);int toShow;toShow = mine.mine[row][col];if (toShow != 0) {mineButton[row][col].setIcon(mineNumIcon[toShow]);mineButton[row][col].setClickFlag(true);//mineButton[row][col].setEnabled(false);} else {//mineButton[row][col].setIcon(mineNumIcon[0]);//mineButton[row][col].setClickFlag(true);mineButton[row][col].setEnabled(false);}}// circle the flag with blank, flaged, questionedvoid showFlag(int row, int col) {mineButton[row][col].setIcon(mineStatus[mineButton[row][col].getFlag()]);}// the mouse events listener methodspublic void mouseEntered(MouseEvent e) {//System.out.println("Jerry Test");}// method to start the new gameprivate void startNewGame(int num, int row, int col){mine = new JMineArth(num, row, col);//mine.printMine();gameStarted = true;timer = new Timer();timer.scheduleAtFixedRate(new TimerTask(){public void run() {timeCounter.counterAdd();//System.out.println(timeCounter.getCounterNum());}},1000,1000);}public void setNewGame(int num) {resetAll();numMine = num;numFlaged = 0;gameStarted = false;mineCounter.resetCounter(numMine);timeCounter.resetCounter(0);}// the event handle to deal with the mouse clickpublic void mouseClicked(MouseEvent e) {if (e.getSource() == bTest) {setNewGame(numMine);return;}int row, col;row = ((JMineButton) e.getSource()).getRow();col = ((JMineButton) e.getSource()).getCol();if (!gameStarted) {startNewGame(numMine, row, col);}if (e.getModifiers() == (InputEvent.BUTTON1_MASK + InputEvent.BUTTON3_MASK)) { //System.out.println("HA");clearAll(row, col);}if (!mineButton[row][col].getClickFlag()) {if (e.getModifiers() == InputEvent.BUTTON1_MASK) {//System.out.println("LeftButton");if (mineButton[row][col].getFlag() == 1) {return;} else {checkMine(row, col);}} else if (e.getModifiers() == InputEvent.BUTTON3_MASK) { //System.out.println("RightButton");flagMine(row, col);} else {//System.out.println("MiddleButton");}}}public void mousePressed(MouseEvent e) {//System.out.println("Jerry Press");}public void mouseReleased(MouseEvent e) {//System.out.println("Jerry Release");}public void mouseExited(MouseEvent e) {//System.out.println("Jerry Exited");}public void actionPerformed(ActionEvent e) {try {if (e.getSource() == miEasy) {setNewGame(12);return;}if (e.getSource() == miMiddle) {setNewGame(24);return;}if (e.getSource() == miHard) {setNewGame(36);return;}if (e.getSource() == miExit) {System.exit(0);}if (e.getSource() == miAbout) {about.setVisible(true);}} catch (Exception ie) {}}public static void main(String [] args) {JMine jmine = new JMine();jmine.setVisible(true);}}地雷分布图算法类public class JMineArth {public int [][] mine;private boolean fMineSet;JMineArth(int mineNum, int row, int col) {mine = new int[10][10];setMine(mineNum, row, col);setMineNum();}private void setMine(int mineNum, int Outrow, int Outcol) {int col=0, row = 0, i=0;//Math.srand(now);while (i < mineNum) {col = (int)(Math.random()*100)%10;row = (int)(Math.random()*100)%10;if (mine[col][row]==0 && (row!=Outrow || col!=Outcol || Outrow==10 )) {mine[row][col]=9;i++;}}}private void setMineNum() {for ( int i=0 ; i <10; i++) {for (int j=0; j < 10; j++) {mine[i][j]=mine[i][j]==9?9:checkMineNum(i,j);}}fMineSet = true;}private int checkMineNum(int ii,int jj) {int top,bottom, left, right, count=0;top=ii-1>0?ii-1:0;bottom=ii+1<10?ii+1:9;left=jj-1>0?jj-1:0;right=jj+1<10?jj+1:9;for (int i=top; i<=bottom; i++) {for(int j=left; j<= right; j++) {if (mine[i][j]==9) count++;}}return(count);}public void printMine() {for (int i = 0; i < 10; i++) {for (int j=0; j < 10; j++) {System.out.print(this.mine[i][j] + " ");}System.out.println();}}public static void main(String[] args) {JMineArth mine = new JMineArth(Integer.parseInt(args[0]),Integer.parseInt(args[1]),Integer.parseInt(args[2]));mine.printMine();}}总结通过此次的《扫雷》游戏实现,让我对swing的相关知识有了进⼀步的了解,对java这门语⾔也有了⽐以前更深刻的认识。
海洋3mud源码下面是一个简单的用中文编写的海洋3mud源码:```pythonimport random# 创建角色类class Character:def __init__(self, name, health): = nameself.health = healthdef attack(self, target):damage = random.randint(1, 10)print(f"{} 攻击了 {},造成了{damage} 点伤害!")target.health -= damageif target.health <= 0:print(f"{} 被击败了!")# 创建怪物类class Monster(Character):def __init__(self, name, health):super().__init__(name, health)# 创建玩家类class Player(Character):def __init__(self, name, health, level):super().__init__(name, health)self.level = level# 创建游戏类class Game:def __init__(self, player, monster):self.player = playerself.monster = monsterdef start(self):print("游戏开始!")print(f"你的角色是 {},初始生命值为{self.player.health},等级为 {self.player.level}。
")print(f"遇到了怪物 {},生命值为{self.monster.health}!")while self.player.health > 0 and self.monster.health > 0:self.player.attack(self.monster)if self.monster.health <= 0:print(f"你击败了怪物 {}!")else:self.monster.attack(self.player)if self.player.health <= 0:print("你被怪物击败了,游戏结束!")print("游戏结束!")# 创建角色和怪物实例player = Player("小明", 100, 1)monster = Monster("海怪", 50)# 创建游戏实例并开始游戏game = Game(player, monster)game.start()```这段源码实现了一个简单的海洋3mud游戏,玩家可以控制一个角色与海洋中的怪物进行战斗。
太空侵略者游戏编程实现太空侵略者是一款经典的射击游戏,玩家需要操作一艘太空飞船,抵抗来自外星侵略者的攻击并摧毁它们。
本文将介绍如何使用Python语言来实现这款游戏的编程部分。
1. 准备工作在开始编写代码之前,我们需要确保计算机已经安装了Python编程环境。
你可以从官方网站上下载并安装Python的最新版本。
2. 游戏界面的绘制太空侵略者游戏的界面主要包括一个玩家控制的太空飞船和一群侵略者。
我们可以使用Python的pygame库来实现图形界面的绘制。
首先,导入pygame库,并初始化游戏,创建一个游戏窗口:```pythonimport pygamefrom pygame.locals import *pygame.init()screen = pygame.display.set_mode((800, 600))pygame.display.set_caption('太空侵略者')```接下来,我们可以定义一个太空飞船的类,并在游戏窗口中绘制它:```pythonclass Spaceship(pygame.sprite.Sprite):def __init__(self):super(Spaceship, self).__init__()self.image = pygame.image.load('spaceship.png')self.rect = self.image.get_rect()self.rect.centerx = screen.get_rect().centerxself.rect.bottom = screen.get_rect().bottomdef draw(self):screen.blit(self.image, self.rect)```3. 控制太空飞船的移动玩家可以使用键盘控制太空飞船的移动。
我们可以在游戏循环中监听键盘事件,并根据按键的状态来改变飞船的位置。
这段源代码实现了在一个窗体中显示一个场景;以一个棋盘格做的地面,在地面上浮着一个蓝色的球体,在场景中有一个环境光和一个直射光,实现了用鼠标全角度的观察场景的功能。
从某种意义上来说这的确实现了一部3D游戏最原始的框架。
代码是照着《Killer Game Programming in Java》一书中关于3D游戏制作的那部分写的,由于此书是英文版的据说在国内也买不到中文翻译版的,看得很费力,本人英文不好。
只能慢慢的研究书中的源代码。
下面说明下源代码的文件功能GameMain.java - 程序的入口。
ScreenManager.Java - 实现一个很简单的窗体类从JFrame派生,目前只返回一个窗体,以后可能实现最复杂的功能。
WrapCheckers3D.Java - 实现一个简单的3D场景类,能实现一个简单的鼠标操作。
CheckerFloor.Java - 实现一个国际象棋般的棋盘格做来场景中的地面。
ColouredTile.Java - 派生自Shape3D类,能实现一个正方体平面,用来为CheckerFl oor类实现棋盘格GameMain.Java1.import java.awt.event.WindowAdapter;2.import java.awt.event.WindowEvent;3.4.import javax.swing.JFrame;5.import javax.swing.JOptionPane;6.7.8.public class GameMain {9. private static int scrWidth = 800;ScreenManager.Javaview plaincopy to clipboardprint?.........10........20........30........40........50........60........70........80.. (9)0........100.......110.......120.......130.......140. (150)1.import java.awt.Dimension;2.import java.awt.DisplayMode;3.import java.awt.GraphicsDevice;4.import java.awt.GraphicsEnvironment;5.import java.awt.Insets;6.import java.awt.Toolkit;7.import java.awt.event.WindowAdapter;8.import java.awt.event.WindowEvent;9.10.import javax.swing.JFrame;11.import javax.swing.JOptionPane;12.13.14.public class ScreenManager {15.16. private GraphicsDevice device;17. private JFrame frame;18. private String title;19. private boolean isResizable;20. private boolean isWindowMode;21. private int scrWidth;22. private int scrHeight;23. private int scrBitdepth;24.25. public ScreenManager(int scrWidth,int scrHeight,int scrBitdepth,String title)26. {27. this.scrWidth = scrWidth;28. this.scrHeight = scrHeight;29. this.scrBitdepth = scrBitdepth;30. this.title = title;31. }32.33. public void setWindowMode()34. {35. frame = new JFrame();36. frame.setResizable(false);//禁止窗体改变大小37. frame.setPreferredSize(new Dimension(scrWidth,scrHeight));38. frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);//响应窗体的关闭事件,但不关闭窗体39. frame.setVisible(true);40.// 侦听窗体事件并捕获窗体关闭中的事件,在用户确认后退出程序41. frame.addWindowListener(new WindowAdapter(){42. public void windowClosing(WindowEvent e)43. {44. int res = JOptionPane.showConfirmDialog(null, "是否退出!","退出",JOptionPane.YES_NO_OPTION);45. if(res == JOptionPane.YES_OPTION)46. closeFrame();47. }48. });49. this.setFrametoCenter();50. }51.52. public void setFullWindowMode()53. {54. if(frame != null)55. {56. device = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();57. DisplayMode displayMode = device.getDisplayMode();58. frame.setPreferredSize(new Dimension(displayMode.getWidth(),displayMode.getHeight()));59. }60. }61.62. public int getWidth()63. {64. return scrWidth;65. }66.67. public int getHeight()68. {69. return scrHeight;70. }71.72. public JFrame getFrame()73. {74. return frame;75. }76.77.// 将窗体在显示屏幕内居中显示78. public void setFrametoCenter()79. {80. if(device!=null)81. return;82. Insets inset = frame.getInsets();83. int scrx=0;84. int scry=0;85. Dimension scrSize = Toolkit.getDefaultToolkit().getScreenSize();86. if(scrSize.width > scrWidth)87. scrx = (scrSize.width-scrWidth)/2;88. if(scrSize.height > scrHeight)89. scry = (scrSize.height-scrHeight)/2;90. frame.setBounds(scrx-inset.left, scry-inset.top, scrWidth+inset.right+inset.left, scrHeight+inset.bottom+inset.top);91. }92.93.// 关闭窗体事件94. public void closeFrame()95. {96. frame.dispose();97. System.exit(0);98. }99.}1.import java.awt.BorderLayout;2.import java.awt.Color;3.import java.awt.GraphicsConfiguration;4.5.import javax.media.j3d.AmbientLight;6.import javax.media.j3d.Appearance;7.import javax.media.j3d.Background;8.import javax.media.j3d.BoundingSphere;9.import javax.media.j3d.BranchGroup;10.import javax.media.j3d.Canvas3D;11.import javax.media.j3d.DirectionalLight;12.import javax.media.j3d.Material;13.import javax.media.j3d.Transform3D;14.import javax.media.j3d.TransformGroup;15.import javax.swing.JPanel;16.import javax.vecmath.Color3f;17.import javax.vecmath.Point3d;18.import javax.vecmath.Vector3d;19.import javax.vecmath.Vector3f;20.21.import com.sun.j3d.utils.behaviors.vp.OrbitBehavior;22.import com.sun.j3d.utils.geometry.Sphere;23.import com.sun.j3d.utils.universe.SimpleUniverse;24.import com.sun.j3d.utils.universe.ViewingPlatform;25.26.27.public class WrapCheckers3D extends JPanel {28.29. private BranchGroup sceneBg;30. private SimpleUniverse su;31. private BoundingSphere bounds;32. private static final float BOUNDSIZE=100.0f;33.34. public WrapCheckers3D(int width,int height)35. {36. this.setLayout(new BorderLayout());37. GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();38. Canvas3D canvas = new Canvas3D(config);39. this.add("Center",canvas);40. canvas.setBounds(0, 0, width, height);41.42. su = new SimpleUniverse(canvas);43. createSceneGroup();44. initUserPosition();45. orbitControls(canvas);46. su.addBranchGraph(sceneBg);47. }48.49. public void createSceneGroup()50. {51. sceneBg = new BranchGroup();52. bounds = new BoundingSphere(new Point3d(0,0,0),BOUNDSIZE);53. lightScene();54. addBackground();55. sceneBg.addChild(new CheckerFloor().getBG());56. floatingSphere();57. pile();58. }59.60. private void lightScene()61. {62. Color3f white = new Color3f(1.0f,1.0f,1.0f);63. AmbientLight ambientLightNode = new AmbientLight(white);64. ambientLightNode.setInfluencingBounds(bounds);65. sceneBg.addChild(ambientLightNode);66.67. Vector3f lightDirection = new Vector3f(-1.0f,-1.0f,-1.0f);68. DirectionalLight light = new DirectionalLight(white,lightDirection);69. light.setInfluencingBounds(bounds);70. sceneBg.addChild(light);71. }72.73. private void addBackground()74. {75. Background back = new Background();76. back.setApplicationBounds(bounds);77. back.setColor(0.17f, 0.62f, 0.92f);78. sceneBg.addChild(back);79. }80.81. private void floatingSphere()82. {83. Color3f black = new Color3f(0.0f,0.0f,0.0f);84. Color3f blue = new Color3f(0.3f,0.3f,0.8f);85. Color3f specular = new Color3f(0.9f,0.9f,0.9f);86.87. Material blueMat = new Material(blue,black,blue,specular,25.0f);88. blueMat.setLightingEnable(true);89.90. Appearance blueApp = new Appearance();91. blueApp.setMaterial(blueMat);92.93. Transform3D t3d = new Transform3D();94. t3d.set(new Vector3f(0,4,0));95. TransformGroup tg = new TransformGroup(t3d);96. tg.addChild(new Sphere(2.0f,blueApp));97. sceneBg.addChild(tg);98. }99.100. private void initUserPosition()101. {102. ViewingPlatform vp = su.getViewingPlatform();103. TransformGroup steerTG = vp.getViewPlatformTransform(); 104.105. Transform3D t3d = new Transform3D();106. steerTG.getTransform(t3d);107.108. t3d.lookAt(new Point3d(0,5,20), new Point3d(0,0,0), new Vecto r3d(0,1,0));109. t3d.invert();110.111. steerTG.setTransform(t3d);112.113. }114.115. private void orbitControls(Canvas3D canvas)116. {117. OrbitBehavior orbit = new OrbitBehavior(canvas, OrbitBehavior.REVERSE_ALL);118. orbit.setSchedulingBounds(bounds);119. ViewingPlatform vp = su.getViewingPlatform( );120. vp.setViewPlatformBehavior(orbit);121. }122.}1.import java.awt.Font;2.import java.util.ArrayList;3.4.import javax.media.j3d.BranchGroup;5.import javax.media.j3d.Transform3D;6.import javax.media.j3d.TransformGroup;7.import javax.vecmath.Color3f;8.import javax.vecmath.Point3d;9.import javax.vecmath.Vector3f;10.11.import com.sun.j3d.utils.geometry.Text2D;12.13.public class CheckerFloor {14.15. private BranchGroup floor;16.17. public CheckerFloor() {18. floor = new BranchGroup();19. }20.21. public BranchGroup getBG() {22. Color3f blue = new Color3f(0, 0, 1);23. Color3f green = new Color3f(0, 1, 0);24.25. boolean isBlue = true;26. for (int j = -10; j < 9; j++) {27. for (int i = -10; i < 9; i++) {28. Point3d t1 = new Point3d(i, 0, j);29. Point3d t2 = new Point3d(i + 1, 0, j);30. Point3d t3 = new Point3d(i + 1, 0, j + 1);31. Point3d t4 = new Point3d(i, 0, j + 1);32. ArrayList<Point3d> tileCoord = new ArrayList<Point3d>();33. tileCoord.add(t1);34. tileCoord.add(t2);35. tileCoord.add(t3);36. tileCoord.add(t4);37. if (isBlue)38. floor.addChild(new ColouredTile(tileCoord, blue));39. else40. floor.addChild(new ColouredTile(tileCoord, green));41. isBlue = !isBlue;42. floor.addChild(makeText(new Vector3f(i,0,j),"("+i+","+j+")"));43. }44. }45. return floor;46. }1.import java.util.ArrayList;2.3.import javax.media.j3d.Appearance;4.import javax.media.j3d.BranchGroup;5.import javax.media.j3d.GeometryArray;6.import javax.media.j3d.PolygonAttributes;7.import javax.media.j3d.QuadArray;8.import javax.media.j3d.Shape3D;9.import javax.vecmath.Color3f;10.import javax.vecmath.Point3d;11.import javax.vecmath.Point3f;12.13.14.public class ColouredTile extends Shape3D {15.16. private ArrayList<Point3d> coord;17. private Color3f color;18. private QuadArray plane;19.20. public ColouredTile(ArrayList<Point3d> coord,Color3f color)21. {22. this.coord = coord;23. this.color = color;24. plane = new QuadArray(coord.size(),GeometryArray.COORDINATES | GeometryArray.COLOR_3);25. createGeometry();26. createAppearance();27. }28.29. public void createGeometry()30. {31. int numPoints = coord.size();32. Point3d[] points = new Point3d[numPoints];。
猜数字#include<stdio.h>#include<stdlib.h>#include<string.h>#include<time.h>#include<conio.h>int x=0,n,ts=0;static sp;int score(int p){ static sw=0;int scor;switch(p){case 1: scor=10;break;case 2: scor=8;break;case 3: scor=7;break;case 4: scor=6;break;case 5: scor=5;break;case 6: scor=4;break;case 7: scor=3;break;case 8: scor=2;break;case 9: scor=0;break;default:scor=-1;return 0;}if(!scor) x++;else if(scor==-1) return -1;else{printf(" ");printf("你本局得分:%d \n",scor);printf(" ");x++;printf("***************************\n");printf(" ");return scor;}}void cmp(char a[] ){ int m;char b[5],t[50]="***************************";int i,j,k=0,r=0,p=0;if(x==0){system("cls");loop: printf(" ");}if(x!=0) printf("\n ***************************\n");if(x==n-1)printf("\n 》最后一局《\n",x++);elseprintf(" 》第%d 局《\n",x+1);printf(" ");printf("***************************\n");printf(" ");printf("****请输入你的猜测数字:****\n");printf(" ");puts(t);////////////////////////////////////////if(x!=0)printf(" ");while(p<=9&&k!=4){gets(b);p++;k=0;r=0;for(i=0;i<4;i++)for(j=0;j<4;j++)if(a[i]==b[j])if(i==j) k++;else r++;if(k!=4&&p!=1){printf(" ");printf(" %dA %dB 还有%d次机会\n",k,r,10-p);printf(" ");printf("***************************\n");}printf(" ");}if(p<=9&&(m=score(p-1)))sp+=m;/*if(p>9||(m=score(p-1))==0)*/else {printf(" 最后一局得%d 分!\n",sp+=m);x=n;}//记录每次得分//printf("You win!!!\n");//if(p<=9) printf(" 总分:%d\n",ts+);}//*********************生成随机数*******************void programme(){int i,j;int a,b,c,d;char s[5]={'\0'};srand((int) time(0));while(1){j=1022+rand()%(9876-1022+1);a=j%10;b=j/10%10;c=j/100%10;d=j/1000%10;if(a==b||b==c||c==d||b==d||a==d||a==c);else break;}s[0]=d+'0';s[1]=c+'0';s[2]=b+'0';s[3]=a+'0';cmp(s);}//************显示规则*************************************void rule(){ system("cls");printf("\n 《猜数字游戏规则》\n\n");printf(" ");printf("1. 一方出数字,另一方来猜这个数字\n");printf(" ");printf("2. 出数字方要先想好一个没有重复数字的4位数作为目\n");printf(" ");printf(" 标数字(不能让猜数字方知道)\n");printf(" ");printf("3. 猜数字方提供一个4位猜测数字\n");printf(" ");printf("4. 出数字方要根据猜测数字和目标数字计算出几A几B,作为\n");printf(" ");printf(" 反馈提供给猜数字方,其中A前面的数字表示位置正确的数的\n");printf(" ");printf(" 个数,B前的数字表示数字正确但位置不正确的数的个数.\n");printf(" ");printf(" 如目标数字为“5234”,猜测数字为“5346”,则反馈是1A2B:\n");printf(" ");printf(" '5'的数字和位置都正确,记为1A;“3”和“4”的数字正确\n");printf(" 但是位置错误,记为2B.\n");printf(" ");printf("5. 如猜测数字和目标数字完全相同(反馈为4A0B),则猜测成功,\n");printf(" 游戏结束\n 6. 如猜测数字和目标数字不一样(反馈中A的个数小于4),猜数字\n");printf(" 的一方要根据已有反馈信息,重复3~4步,直至猜出目标数字\n");printf(" 7. 如猜数字方在限定次数内未猜出目标数字,则猜测失败,游戏结束\n");printf(" 本游戏中,出数字方由电脑来代替.\n");// getchar();}//********************设置属性*****************************void color(){ system("cls");printf(" ");printf("请选择设置(按y确定):\n");printf(" 1--蓝字黄底\n 2--红字蓝底\n 3--红字黄底\n 4--绿字黑底\n");while(1){switch(getch()){case '1':system("color 61");break;case '2':system("color 14");break;case '3':system("color e4");break;case '4':system("color 02");break;case 'y':case 'Y':return;}}}//*********************************************************void meu(){if(x==0){ system("cls");loop: printf("\n ***欢迎使用***\n");printf("\n");printf(" ");printf("********************\n");printf(" ");printf("* 1--开始游戏*\n");printf(" ");printf("* 2--查看游戏规则*\n");printf(" ");printf("* 3--设置背景*\n");printf(" ");printf("* 4--退出游戏*\n");printf(" ");printf("********************\n");printf(" ");switch(getch()){case '1':programme();break;//case '2':rule();break;//case '4':exit(1);case '3':color();break;//default: system("cls");printf(" ");printf("**输入有误,请重新选择**");goto loop;}}else{printf(" ");programme();}}void js(){ int i,s;printf("请输入你要玩的局数:");scanf("%d",&n);while(x<n){ //else printf("第%d 局\n",x+=1);meu();}}void main(){/*char s1[80],s2[80];int i,j;printf("请输入用户名:");scanf("%s",s1);for(i=0;i<strlen(s1);i++)s1[i]=(s1[i]-'\0')%10+'a';//puts(s1);printf("请输入密码:\n");scanf("%s",s2);if(!strcmp(s1,s2)){*/lp: js();printf(" ");printf("总分:%d\n",sp);printf(" ");printf("继续(y/n)");switch(getch()){case 'Y':case 'y':goto lp;case 'N':case 'n':exit(1);default:break;}// }// else printf("无权使用,谢谢!!\n");// getch();}。