Python開發(fā)象棋小游戲(繪制棋子)

上一篇中,我們已經(jīng)畫出了棋盤,那這一篇呢,我們就一起來看看如何在棋盤上繪制棋子~~~

寫前準(zhǔn)備,下載一套字體,先來看看下面的代碼:

#畫‘悔棋’,‘重新開始’和‘退出’按鈕
    #定義按鍵顏色
    button_color = (163,80,21)

    #繪制三個矩形來做按鍵
    pygame.draw.rect(screen,button_color,[980,300,200,100],5)
    pygame.draw.rect(screen,button_color,[980,500,200,100],5)
    pygame.draw.rect(screen,button_color,[980,700,200,100],5)
    #調(diào)用包,導(dǎo)入字體
    s_font = pygame.font.Font('anjian_font.ttf',45)
    #打印字體
    text1 = s_font.render("悔    棋",True,button_color)
    text2 = s_font.render("重新開始",True,button_color)
    text3 = s_font.render("退出游戲",True,button_color)
    screen.blit(text1,(1000,320))
    screen.blit(text2,(980,520))
    screen.blit(text3,(980,720))

上面這段代碼呢,就已經(jīng)告訴了你字體的用法,意圖呢,就是打印出你想打印的字體,下面打印象棋的棋子時我們還會用到這個方法,關(guān)于字體詳細(xì)的介紹,大家去博客搜,相關(guān)篇幅很多,在此我就不再多說,下面,我們進(jìn)入正題:

import pygame
import pygame.font
import sys
import traceback
from pygame.locals import *

pygame.font.init()
pygame.init()

#繪制棋盤
def Draw_a_chessboard(screen):
    #填充背景色
    screen.fill((233,204,138))
    #畫外框
    outer_frame_color = (60,20,0)
    pygame.draw.rect(screen,outer_frame_color,[80,80,830,740],5)
    #行
    inner_frame_color = (0,0,0)
    for i in range(1,10):
        pygame.draw.line(screen, inner_frame_color, (90, 90*i), (900, 90*i)) 
    #列
    for i in range(1,11):
        pygame.draw.line(screen,inner_frame_color, (90*i, 90), (90*i, 810))
    #‘將’
    jiang_rote_color = (0,0,0)
    pygame.draw.lines(screen, jiang_rote_color, True,[(90, 360),(270, 360),(270,540),(90,540)],3)
    pygame.draw.lines(screen, jiang_rote_color, True,[(720, 360),(900, 360),(900,540),(720,540)],3)
    #‘士’路線
    shi_rote_color = (0,0,0)
    pygame.draw.line(screen, shi_rote_color, (90, 360), (270, 540),3)
    pygame.draw.line(screen, shi_rote_color, (90, 540), (270, 360),3) 
    pygame.draw.line(screen, shi_rote_color, (720, 360), (900, 540),3)
    pygame.draw.line(screen, shi_rote_color, (720, 540), (900, 360),3)
    #‘象’路線
    xiang_rote_color = (0,0,0)
    pygame.draw.lines(screen, xiang_rote_color, True,[(270, 450),(90, 270),(270,90),(450,270)])
    pygame.draw.lines(screen, xiang_rote_color, True,[(270, 450),(90, 630),(270,810),(450,630)])
    pygame.draw.lines(screen, xiang_rote_color, True,[(720, 450),(900, 270),(720,90),(540,270)])
    pygame.draw.lines(screen, xiang_rote_color, True,[(720, 450),(900, 630),(720,810),(540,630)])
    #‘兵’,用抗鋸齒連續(xù)線段
    bing_rote_color = (255,0,0)
    for j in range(0,2):
        for k in range(0,4):
            pygame.draw.aalines(screen, bing_rote_color, False,[(330+270*j, 260+180*k),(350+270*j, 260+180*k),(350+270*j,240+180*k)],3)
            pygame.draw.aalines(screen, bing_rote_color, False,[(390+270*j, 260+180*k),(370+270*j, 260+180*k),(370+270*j,240+180*k)],3)
            pygame.draw.aalines(screen, bing_rote_color, False,[(330+270*j, 100+180*k),(350+270*j, 100+180*k),(350+270*j,120+180*k)],3)
            pygame.draw.aalines(screen, bing_rote_color, False,[(390+270*j, 100+180*k),(370+270*j, 100+180*k),(370+270*j,120+180*k)],3)
    #‘炮’
    pao_rote_color = (255,0,0)
    for m in range(0,2):
        for n in range(0,2):
            pygame.draw.aalines(screen, pao_rote_color, False,[(240+450*m, 170+540*n),(260+450*m, 170+540*n),(260+450*m,150+540*n)],3)
            pygame.draw.aalines(screen, pao_rote_color, False,[(300+450*m, 170+540*n),(280+450*m, 170+540*n),(280+450*m,150+540*n)],3)
            pygame.draw.aalines(screen, pao_rote_color, False,[(240+450*m, 190+540*n),(260+450*m, 190+540*n),(260+450*m,210+540*n)],3)
            pygame.draw.aalines(screen, pao_rote_color, False,[(300+450*m, 190+540*n),(280+450*m, 190+540*n),(280+450*m,210+540*n)],3)

    #繪制‘楚河漢界’
    pygame.draw.rect(screen,[233,204,138],[451,91,89,719])
    chuhehanjie = pygame.image.load("楚河漢界.png").convert_alpha()
    screen.blit(chuhehanjie,(451,91))
    #畫‘悔棋’,‘重新開始’和‘退出’按鈕
    button_color = (163,80,21)
    pygame.draw.rect(screen,button_color,[980,300,200,100],5)
    pygame.draw.rect(screen,button_color,[980,500,200,100],5)
    pygame.draw.rect(screen,button_color,[980,700,200,100],5)

    s_font = pygame.font.Font('anjian_font.ttf',45)

    text1 = s_font.render("悔    棋",True,button_color)
    text2 = s_font.render("重新開始",True,button_color)
    text3 = s_font.render("退出游戲",True,button_color)
    screen.blit(text1,(1000,320))
    screen.blit(text2,(980,520))
    screen.blit(text3,(980,720))
#繪制棋子
def Draw_a_chessman(screen,color,qizi,x,y):
    red_color = (255,0,0)
    black_color = (0,0,0)

    pygame.draw.circle(screen,(0,0,0),(x,y),46)
    pygame.draw.circle(screen,(247,157,12),(x,y),45)
    pygame.draw.circle(screen,(0,0,0),(x,y),40,3)
    pygame.draw.circle(screen,(181,131,16),(x,y),35)

    q_font = pygame.font.Font('qizi_font.ttf',60)

    if color == 'red':
        q_color = red_color
    elif color == 'black':
        q_color = black_color
    screen.blit(q_font.render(qizi[0],True,q_color),(x-30,y-40))
#繪制帶有棋盤的棋子
def Draw_a_chessboard_with_chessman(screen):  
    Draw_a_chessboard(screen)
    for each_qizi in hongqi.keys():
        Draw_a_chessman(screen,hongqi[each_qizi]['color'],each_qizi,hongqi[each_qizi]['now_weizhi'][0],hongqi[each_qizi]['now_weizhi'][1])
    for each_qizi in heiqi.keys():
        Draw_a_chessman(screen,heiqi[each_qizi]['color'],each_qizi,heiqi[each_qizi]['now_weizhi'][0],heiqi[each_qizi]['now_weizhi'][1])

def main():
    #將'hongqi','heiqi'設(shè)置為可改
    global hongqi,heiqi
    #棋子初始位置
    hongqi = {'將':{'color':'red','now_weizhi':[90,450]},'士1':{'color':'red','now_weizhi':[90,360]},'士2':{'color':'red','now_weizhi':[90,540]},'相1':{'color':'red','now_weizhi':[90,270]},
              '相2':{'color':'red','now_weizhi':[90,630]},'馬1':{'color':'red','now_weizhi':[90,180]},'馬2':{'color':'red','now_weizhi':[90,720]},'車1':{'color':'red','now_weizhi':[90,90]},
              '車2':{'color':'red','now_weizhi':[90,810]},'炮1':{'color':'red','now_weizhi':[270,180]},'炮2':{'color':'red','now_weizhi':[270,720]},'兵1':{'color':'red','now_weizhi':[360,90]},
              '兵2':{'color':'red','now_weizhi':[360,270]},'兵3':{'color':'red','now_weizhi':[360,450]},'兵4':{'color':'red','now_weizhi':[360,630]},'兵5':{'color':'red','now_weizhi':[360,810]}
             }
    heiqi = {'將':{'color':'black','now_weizhi':[900,450]},'士1':{'color':'black','now_weizhi':[900,360]},'士2':{'color':'black','now_weizhi':[900,540]},'相1':{'color':'black','now_weizhi':[900,270]},
             '相2':{'color':'black','now_weizhi':[900,630]},'馬1':{'color':'black','now_weizhi':[900,180]},'馬2':{'color':'black','now_weizhi':[900,720]},'車1':{'color':'black','now_weizhi':[900,90]},
             '車2':{'color':'black','now_weizhi':[900,810]},'炮1':{'color':'black','now_weizhi':[720,180]},'炮2':{'color':'black','now_weizhi':[720,720]},'兵1':{'color':'black','now_weizhi':[630,90]},
             '兵2':{'color':'black','now_weizhi':[630,270]},'兵3':{'color':'black','now_weizhi':[630,450]},'兵4':{'color':'black','now_weizhi':[630,630]},'兵5':{'color':'black','now_weizhi':[630,810]}
            }

    #創(chuàng)建一個窗口
    screen = pygame.display.set_mode([1200,900])
    # 設(shè)置窗口標(biāo)題
    pygame.display.set_caption("中國象棋")
    while True:
        #在窗口畫出棋盤以及按鈕
        Draw_a_chessboard_with_chessman(screen)
        pygame.display.flip()
        clock = pygame.time.Clock()
        #監(jiān)聽所有事件
        for event in pygame.event.get():
            #點(diǎn)擊x則關(guān)閉窗口
            if event.type ==pygame.QUIT:
                pygame.quit()
                sys.exit()

if __name__ == "__main__":
    try:
        main()
    except SystemExit:
        pass
    except:
        traceback.print_exc()
        pygame.quit()
        input()

細(xì)心的你可能已經(jīng)發(fā)現(xiàn)了,沒錯,我在這里已經(jīng)把繪制棋盤和繪制棋子合并成了一個總函數(shù),先繪制棋盤,再繪制棋子,為什么要總呢?讀懂了繪制棋子的函數(shù)你就懂了,棋子是一個一個畫的,也就是說執(zhí)行一次繪制棋子的函數(shù),就畫出一個棋子,難道我們要執(zhí)行32次繪制棋子的函數(shù)?另外,后面你下一步棋,棋子就會更新一遍,那得畫多少遍?

來看看執(zhí)行效果:

1

順便說下,如果要應(yīng)用這段代碼,怎么辦呢?認(rèn)真看過前面的博文的朋友都知道,對啦,下載一套字體,用你下載的字體命名替換此文章中的字體命名,或者直接把你下載的字體命名為此文章中的字體命名就OK了,當(dāng)然,前提是在同一文件夾下,哦,不要忘了,還有前面的‘楚河漢界’喲!

好了,今天的博文就到這里啦,是不是有點(diǎn)樣子了呢?下一篇博客,我們就讓棋子跑起來~~~

文章中有任何不懂的問題,歡迎大家騷擾,博主很愿意和大家共同進(jìn)步喲,整理不易,喜歡的話就打賞一下吧~~~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 上一篇中,我們縷清了思路,知道了如何寫,怎么做,從哪入手,這一篇,我們就正式開始敲代碼了,編程使我快樂,對吧,em...
    cce5ac8fdafb閱讀 4,073評論 1 5
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,634評論 1 32
  • 看著彭小六最開始的文章,確實(shí)也是沒有插圖,字?jǐn)?shù)不多,好像水平也確實(shí)不是那么高,但是他每周讀一本書,認(rèn)真的在簡書上...
    透過樹縫的陽光閱讀 181評論 0 1
  • 一個大家熟知的詞語,隨著認(rèn)知不斷進(jìn)步,會發(fā)覺新的意義。 以前只是以為做人要寬宏大量,沒有世俗的欲求一個人就會越來越...
    千面英雄俠閱讀 634評論 0 0
  • 2017接近尾聲了,是時候總結(jié)和反思一下我的2017。也許你也會和我有一樣的感受,那就是,時間過得太快了! 我的2...
    Andy0222閱讀 326評論 3 1

友情鏈接更多精彩內(nèi)容