python基础之--人机大战,编程思维

Posted 向测开进阶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python基础之--人机大战,编程思维相关的知识,希望对你有一定的参考价值。

import pygame
import time  #循环里面要sleep一下,不然一会儿就将内存占满了
from pygame.locals import * #检测键盘
import random
import sys  #退出系统
#动态的项目,先截个静态图来分析:化动为静,化难为易,一个西瓜切成块,再拼接起来
#拿到一个大项目,首先把项目的各个元素分成一个个的对象,确定对象具备的属性,方法,然后再组装成为一个项目
#玩家类:
#属性:显示窗口、位置、图片、子弹列表、移动状态
#方法:显示、移动、开火,凡是动作类都搞成方法
class player():
    def __init__(self,screen):
        self.screen=screen#将一个窗口对象作为了属性值
        self.x=150
        self.y=500
        self.img =pygame.image.load("飞机\\\\hero.gif")
        self.bullet_list=[]
        self.ifmoveright=0#0表示不移动,1表示移动
        self.ifmoveleft=0
    def display(self):
        self.screen.blit(self.img,(self.x,self.y))
        print()
        for f in self.bullet_list:
            f.move()
            f.display()
            if f.y<=0:
                self.bullet_list.remove(f)
    def move(self):
        if self.ifmoveleft==1 and self.x>=-30:
            self.x-=20
        if self.ifmoveright==1 and self.x<=270:
            self.x+=20
    def fire(self):
        d=playerzd(self.screen,self.x,self.y)
        self.bullet_list.append(d)
class playerzd():
    def __init__(self,screen,x,y):
        self.screen=screen
        self.x=x
        self.y=y
        self.img=pygame.image.load("飞机\\\\bullet.png")
    def display(self):
        self.screen.blit(self.img,(self.x,self.y))
    def move(self):
        self.y-=20
class diji():
    def __init__(self,screen):
        self.screen=screen#将一个窗口对象作为了属性值
        self.x=0
        self.y=0
        self.img =pygame.image.load("飞机\\\\enemy1.png")
        self.bullet_list=[]
        self.dijimove=0#0表示左移动,1表示右移动
    def display(self):
        self.screen.blit(self.img,(self.x,self.y))
        for b in self.bullet_list:
            b.move()
            b.display()
            if b.y>=600:
                self.bullet_list.remove(b)
    def move(self):
        if self.x<=0:
            self.dijimove=1
        if self.x>280:
            self.dijimove=0
        if self.dijimove==1:
            self.x+=10
        if self.dijimove==0:
            self.x-=10
    def fire(self):
        dijizd1=dijizd(self.screen,self.x,self.y)
        self.bullet_list.append(dijizd1)
class dijizd():
    def __init__(self,screen,x,y):
        self.screen=screen#将一个窗口对象作为了属性值
        self.x=x
        self.y=y
        self.img=pygame.image.load("飞机\\\\bullet-1.gif")
    def display(self):
        self.screen.blit(self.img,(self.x,self.y))
    def move(self):
        self.y+=20
#玩家子弹类
#键盘监控
def jpinput(player):
    for event in pygame.event.get():
        if event.type==QUIT:
            print("正在退出")
            sys.exit(0)#强制退出
        if event.type==KEYDOWN:
            if event.key==K_RIGHT:
                print("正在右移动")
                player.ifmoveright=1
            if event.key==K_LEFT:
                print("正在左移动")
                player.ifmoveleft=1
            if event.key==K_SPACE:
                print("玩家开火")
                player.fire()
        if event.type==KEYUP:
            if event.key==K_RIGHT:
                player.ifmoveright=0
            if event.key==K_LEFT:
                player.ifmoveleft=0
class main():
    screen=pygame.display.set_mode((300,600))
    backimg = pygame.image.load("飞机\\\\background.png")
    a = player(screen)
    b = diji(screen)
    while 1==1:
        screen.blit(backimg,(0,0))
        b.move()
        c=random.randint(1,5)
        if c==1:
            b.fire()
        b.display()
        jpinput(a)
        a.move()
        a.display()
        pygame.display.update()
        time.sleep(0.5)

五指棋人机大战之ui篇

最近做了一个五指棋的demo,今天好好总结一下,以后用。

五指棋主要分为ui部分和ai部分

ui部分主要分为画棋盘和画棋子 流程图如下

技术分享

 

首先在页面上创建一个canvas

技术分享
<canvas id="chess" width="450px" height="450px"></canvas>
View Code

开始js部分

步骤一:初始化一系列工作 + 画背景图

技术分享
var me    = true  // 黑子
var chessBoardArr = []  // 棋盘交叉点
var chess = document.getElementById(‘chess‘)
var ctx   = chess.getContext(‘2d‘)


for(var i = 0;i < 15;i++){
    chessBoardArr[i] = []
    for(var j = 0;j < 15;j++){
        chessBoardArr[i][j] = 0
    }
}

ctx.strokeStyle = ‘#bfbfbf‘  // 棋盘线条

// 画水印  这里需要在画完图片之后在画棋盘  否则  背景图会覆盖棋盘
var logo = new Image()
logo.src = ‘../public/chess/images/whiteBg.png‘
logo.onload = function () {
    ctx.drawImage(logo,0,0,450,450)
    drawChessBoard()  // 画棋盘

}
View Code

步骤二:画棋盘

技术分享
var drawChessBoard = function () {
    for(var i = 0; i < 15; i++){
        // 画横线
        ctx.moveTo(15 + i * 30,15) // 15 是棋盘边缘的留白  30 是一格的大小
        ctx.lineTo(15 + i * 30,435)
        ctx.stroke()

        // 画纵线
        ctx.moveTo(15,15 + i * 30)
        ctx.lineTo(435,15 + i * 30)
        ctx.stroke()
    }
}
View Code

步骤三:画棋子

画棋子时用到了canvas的createRadialGradient(x1,y1,r1,x2,y2,r2)函数,前三个参数表示第一个圆的原点和半径,后面三个参数是第二个圆的原点和半径

gradient.addColorStop(0,‘#0a0a0a‘) // 表示第一个圆的颜色
gradient.addColorStop(1,‘#636766‘) // 表示第二个圆的颜色
技术分享
// i,j 表示当前棋子的索引,me 表示黑棋或者白棋
var oneStep = function (i, j, me) {

    // 画棋子 画圆需要开始路径
    ctx.beginPath()
    ctx.arc(15 + i * 30,15 + j * 30,13,0,2 * Math.PI)
    ctx.closePath()
    //画棋子的渐变
    var gradient = ctx.createRadialGradient(15 + i * 30 - 2,15 + j * 30 - 2,13,15 + i * 30 - 2,15 + j * 30 - 2,0)

    if(me){ // 黑棋
        gradient.addColorStop(0,‘#0a0a0a‘)
        gradient.addColorStop(1,‘#636766‘)
    }else{ // 白棋
        gradient.addColorStop(0,‘#d1d1d1‘)
        gradient.addColorStop(1,‘#f9f9f9‘)
    }

    ctx.fillStyle = gradient
    ctx.fill()
}
View Code

步骤四:当点击棋盘交叉点的时候,画棋子

1. 使用e.offsetX、e.offsetY来获取当前点击位置相对于画布原点的偏移

2. 计算相对于画布原点棋盘坐标i,j  

3. 判断当前chessBoard[i][j]是否已经存在棋子,不存在棋子才画

4.使用me 的值来判断应该画黑棋或者白棋

技术分享
chess.onclick = function (e) {

    var chessX = e.offsetX
    var chessY = e.offsetY

    var i = Math.floor(chessX / 30) // 因为棋盘留白15px 棋子半径15px 所以在30px范围内的点都画棋子
    var j = Math.floor(chessY / 30)

    // 画棋子
    // 没有棋子才能落子
    if(chessBoardArr[i][j] == 0){
        oneStep(i,j,me)
        if(me){  // 黑子
            chessBoardArr[i][j] = 1
         }else{ // 白子
             chessBoardArr[i][j] = 2
         }
        me = !me; // 画完之后  改变棋子颜色
        
    }
}    
View Code

好了现在 简单的五指棋就实现了。。。。

未知AI篇如何,请听下回分解

以上是关于python基础之--人机大战,编程思维的主要内容,如果未能解决你的问题,请参考以下文章

五指棋人机大战之ui篇

人机大战之AlphaGo的硬件配置和算法研究

人机大战之AlphaGo的硬件配置和算法研究

围棋人机大战:为什么AlphaGo不首先挑战中国棋手?(无责任猜测,不幸猜中不胜荣幸)

Canvas制作五子棋人机大战

大数据技术之_23_Python核心基础学习_02_ 流程控制语句 + 序列(10.5小时)