会员可以在此提问,百战程序员老师有问必答
对大家有帮助的问答会被标记为“推荐”
看完课程过来浏览一下别人提的问题,会帮你学得更全面
截止目前,同学们一共提了 133476个问题
JAVA 全系列/第十八阶段:亿级高并发电商项目_架构/编码(旧)/电商:基于SpringSecurity实现后台登录功能 1622楼
Python 全系列/第一阶段:Python入门/编程基本概念 1623楼
JAVA 全系列/预科阶段:职业规划/学习方法/程序员的基本素养和职业规划 1624楼

import pygame,time,random

SCREEN_WIDTH = 700

SCREEN_HEIGHT = 500

BG_COLOR=pygame.Color((0,0,0))

TEXT_COLOR=pygame.Color(255,0,0)

 

class MainGame():

    window=None

    my_tank = None

    # 存储敌方坦克的列表

    enemyTankList=[]

    #定义敌方坦克的数量

    enemyTankCount=5

    def __init__(self):

        pass

    #开始游戏

    def startGame(self):

        #加载主窗口

        #初始化主窗口

        pygame.display.init()

        #设置窗口的大小及显示

        MainGame.window=pygame.display.set_mode([SCREEN_WIDTH,SCREEN_HEIGHT])

        #初始化我方坦克

        MainGame.my_tank=Tank(350,250)

        #初始化敌方坦克,并将敌方坦克添加到列表中

        self.createEnemyTank()

 

        # 设置窗口标题

        pygame.display.set_caption("坦克大战")

        while True:

            #式坦克移动的速度慢一点

            time.sleep(0.02)

            # 设置填充色

            MainGame.window.fill(BG_COLOR)

            #获取事件

            self.getEvent()

            #绘制文字

            MainGame.window.blit(self.getTextSurface("敌方坦克剩余数量%d"%len(MainGame.enemyTankList)),(10,10))

            #调用坦克显示的方法

            MainGame.my_tank.displayTank()

            #循环遍历地方坦克列表,展示敌方坦克

            self.blitEnemyTank()

            #调用移动方法

            #如果坦克的开关是开启,才可以移动

            if not MainGame.my_tank.stop:

                MainGame.my_tank.move()

            pygame.display.update()

 

    # 初始化敌方坦克,并将敌方坦克添加到列表中

    def createEnemyTank(self):

        top=100

        #循环生成敌方坦克

        for i in range(MainGame.enemyTankCount):

            left = random.randint(0,600)

            speed = random.randint(1,4)

            enemy = EnemyTank(left,top,speed)

            MainGame.enemyTankList.append(enemy)

 

    # 循环遍历地方坦克列表,展示敌方坦克

    def blitEnemyTank(self):

        for enemyTank in MainGame.enemyTankList:

            enemyTank.displayTank()

            enemyTank.randMove()

 

    #结束游戏

    def endGame(self):

        print("再见")

        exit()

    #左上角文字的绘制

    def getTextSurface(self,text):

        #初始化字体模块

        pygame.font.init()

        #查案所有字体的名称

        #print(pygame.font.get_fonts())

        #获取字体Font对象

        font=pygame.font.SysFont('kaiti',18)

        #获取文字信息

        textSurface=font.render(text,True,TEXT_COLOR)

        return textSurface

 

        #获取事件

 

    def getEvent(self):

        #获取所有事件

        eventList = pygame.event.get()

        #遍历事件

        for event in eventList:

            #判断按下的间是关闭还是键盘按下

            #如果按退出,关闭窗口

            if event.type == pygame.QUIT:

                self.endGame()

            if event.type == pygame.KEYDOWN:

                #判断按下的键盘朝向

                if event.key == pygame.K_LEFT:

                    # 切换方向

                    MainGame.my_tank.direction = 'L'

                    #修改坦克的开关状态

                    MainGame.my_tank.stop=False

                    #MainGame.my_tank.move()

                    print('按下左键,坦克向左移动')

                elif event.key == pygame.K_RIGHT:

                    # 切换方向

                    MainGame.my_tank.direction = 'R'

                    # 修改坦克的开关状态

                    MainGame.my_tank.stop = False

                    #MainGame.my_tank.move()

                    print('按下右键,坦克向右移动')

                elif event.key == pygame.K_UP:

                    # 切换方向

                    MainGame.my_tank.direction = 'U'

                    # 修改坦克的开关状态

                    MainGame.my_tank.stop = False

                    # MainGame.my_tank.move()

                    print('按下上键,坦克向上移动')

                elif event.key == pygame.K_DOWN:

                    # 切换方向

                    MainGame.my_tank.direction = 'D'

                    # 修改坦克的开关状态

                    MainGame.my_tank.stop = False

                    # MainGame.my_tank.move()

                    print('按下左键,坦克向下移动')

                elif event.key==pygame.K_SPACE:

                    print("发射子弹")

 

 

            #松开方向键,坦克停止移动,修改坦克的开关状态

            if event.type == pygame.KEYUP:

                #判断松开是键是上下左右的时候才停止坦克移动

                if event.key==pygame.K_UP or event.key==pygame.K_LEFT or event.key==pygame.K_RIGHT or event.key==pygame.K_DOWN:

                    MainGame.my_tank.stop=True

 

class Tank():

    #添加距离左边,距离上边

    def __init__(self,left,top):

        self.images={

            'U':pygame.image.load('learning/img/p1tankU.gif'),

            'D':pygame.image.load('learning/img/p1tankD.gif'),

            'L':pygame.image.load('learning/img/p1tankL.gif'),

            'R':pygame.image.load('learning/img/p1tankR.gif'),

        }

        #方向

        self.direction='U'

        #根据当前图片的方向获取图片

        self.image =self.images[self.direction]

        #获取区域

        self.rect=self.image.get_rect()

        #设置区域的lefttop

        self.rect.left = left

        self.rect.top = top

        #速度

        self.speed=5

        #坦克移动的开关

        self.stop=True

 

 

    #移动

    def move(self):

        # 判断坦克的方向进行移动

        if self.direction == 'L':

            if self.rect.left>0:

                self.rect.left -= self.speed

        elif self.direction == 'U':

            if self.rect.top>0:

                self.rect.top -= self.speed

        elif self.direction == 'D':

            if self.rect.top+self.rect.height<SCREEN_HEIGHT:

                self.rect.top += self.speed

        elif self.direction == 'R':

            if self.rect.left+self.rect.height<SCREEN_WIDTH:

                self.rect.left += self.speed

 

 

    #射击

    def shot(self):

        pass

    #展示坦克的方法

    def displayTank(self):

        #获取展示的对象

        self.image=self.images[self.direction]

        #调用blit方法展示

        MainGame.window.blit(self.image,self.rect)

 

#我方坦克

class MyTank(Tank):

    def __init(self):

        pass

 

#敌方坦克

class EnemyTank(Tank):

    def __init(self,left,top,speed):

        #加载图片集

        self.imges={

            'U': pygame.image.load('learning/img/enemy1U.gif'),

            'D': pygame.image.load('learning/img/enemy1D.gif'),

            'L': pygame.image.load('learning/img/enemy1L.gif'),

            'R': pygame.image.load('learning/img/enemy1R.gif'),

        }

        #方向,随机生成敌方坦克的方向

        self.direction=self.randDirection()

        #根据方向获取图片

        self.image=self.images[self.direction]

        #区域

        self.rect=self.image.get_rect()

        #lefttop进行赋值

        self.rect.left=left

        self.rect.top=top

        #速度

        self.speed=speed

        #移动开关键

        self.flag=True

        #新增步数变量

        self.step=60

 

    def randDirection(self):

        num=random.randint(1,4)

        if num == 1:

            return'U'

        elif num == 2:

            return 'D'

        elif num == 3:

            return 'L'

        elif num == 4:

            return 'R'

 

    #敌方坦克随即移动的方法

    def randMove(self):

        if self.step<=0:

            #修改方向

            self.direction=self.randDirection()

            #让步数复位

            self.step=60

        else:

            self.move()

            #让步数递减

            self.step-=1

 

 

class Bullet():

    def __init__(self):

        pass

    #移动

    def move(self):

        pass

    #展示子弹的方法

    def displayBullet(self):

        pass

 

class Wall():

    def __init__(self):

        pass

    #展示墙壁的方法

    def displayWall(self):

        pass

 

class Explode():

    def __init__(self):

        pass

    #展示爆炸效果的方法

    def displayExplode(self):

        pass

 

class Music():

    def __init__(self):

        pass

    #播方音乐

    def play(self):

        pass

 

 

if __name__=='__main__':

    MainGame().startGame()

    #MainGame().getTextSurface()


Python 全系列/第二阶段:Python 深入与提高/游戏开发-坦克大战 1627楼
Python 全系列/第七阶段:生产环境部署与协同开发/Linux系统概述与安装 1629楼

问题点:为什么消费者会乱序呢,不是同步类吗?



 商品类:

package cn.sxt.thread9;

public class Goods {
	private String name;
	private String brand;
	public Goods() {
		super();
		// TODO Auto-generated constructor stub
	}
	public Goods(String name, String brand) {
		super();
		this.name = name;
		this.brand = brand;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getBrand() {
		return brand;
	}
	public void setBrand(String brand) {
		this.brand = brand;
	}


}

 生产者:

package cn.sxt.thread9;

public class Producer implements Runnable {
	private Goods goods;
	private int i;
	public Producer(Goods goods){
		this.goods = goods;
	}

	@Override
	public void run() {
		//生产商品
		for(int i=0;i<10;i++){
			if(i%2!=0){				
				this.get("小馒头","旺仔");		
				
			}else{
				this.get("矿泉水","娃哈哈");			
		   }
		   }		
	}
	
	public synchronized void get(String name,String brand){
		goods.setName(name);			
			try {
				Thread.sleep(300);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			goods.setBrand(brand);
			
		
		System.out.println("生产者线程生产了:"+goods.getBrand()+"--------"+goods.getName());
		
	}



}

 消费者:

package cn.sxt.thread9;

public class Consumer implements Runnable {
	private Goods goods;
	public Consumer(Goods goods){
		this.goods = goods;
	}

	@Override
	public void run() {
		// 获取商品
		for(int i=0;i<10;i++){
			this.get();
	
		
	}
	}
	public synchronized void get(){
		try {
			Thread.sleep(300);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("-----消费者线程取得了"+goods.getBrand()+"---------"+goods.getName());
	}



}

 测试类

package cn.sxt.thread9;

public class TestGoods {
	
	public static void main(String[] args){
		Goods g= new Goods();
		Thread t = new Thread(new Producer(g));
		Thread t1 = new Thread(new Consumer(g));
		t.start();
		t1.start();
		
	}

}

image.png

源代码

MyThread.rar


JAVA 全系列/第二阶段:JAVA 基础深化和提高/多线程技术(旧) 1630楼

1631088693(1).jpg

1631088743(1).jpg

老师,运行完idea后点击按钮 未找到资源,我发的上面的URL的端口号为什么不是8080,您帮我看看是什么原因呢?

JAVA 全系列/第六阶段:JavaWeb开发/Servlet技术详解(旧) 1632楼
JAVA 全系列/第二阶段:JAVA 基础深化和提高/IO 流技术(旧) 1633楼
微服务/第二十一阶段:数据结构和算法/线性表 1634楼

课程分类

百战程序员微信公众号

百战程序员微信小程序

©2014-2025百战汇智(北京)科技有限公司 All Rights Reserved 北京亦庄经济开发区科创十四街 赛蒂国际工业园
网站维护:百战汇智(北京)科技有限公司
京公网安备 11011402011233号    京ICP备18060230号-3    营业执照    经营许可证:京B2-20212637