【初心者向け】Pythonでゲームを作ろう

#1.はじめに
「プログラミングはとっつきにくい」そんな初学者の方向けに
**「ゲームを作りながらプログラミングが学ぼう」**をテーマに書いていきます。

*筆者がmacユーザーの為、macbookでのプログラミングを想定しています。windows版なども希望があればやっていきたいと思います！

今回は3×4将棋を作ります。
![34将棋の画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271238/741a0d5a-b8b8-40d5-d6b4-3fe87c9ed0c7.png)
**図1:完成図3×4将棋**

#2.準備をしよう
今回は*Pythonのライブラリである*Pygameを活用します。

注1)Pythonとは、プログラミング言語の１つで、割となんでもできる。
注2)Pygameとは、Pythonで2Dゲームを制作する際の最も有名なゲームライブラリです。将棋以外にもブロック崩しやテトリスが作れます。 

ということで**PythonとPygameをお使いのPCに取り込む**必要があります。

Pythonはmacbookには入っているので今回はPygameの取り込み方を説明します。(3ステップで出来ます)

####Step1:まずターミナルを開く
①画面右上の虫眼鏡マークをクリックして②terminalと検索してください。

![ターミナルと検索.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271238/3385817f-87c4-e3d8-a7a6-2930e63d0eec.png)
 
####Step2:ターミナルにpython -m pip install pygameと打ち込む
ターミナルの$の横に-m pip install pygameと打ち込みます。

![pygameのインストール.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271238/5d6fd60c-4955-4066-ea19-926d42e50614.png)
図2:pygameのインストール

####Step3:import pygameと打ち込んで確認する。

$マークの横にpythonと打ち込み、その後>>>マークの横にimport pygameと打ち込みます。（これでエラーがでなければ取り込み完了！）

![pygameの確認.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271238/eb8f9d2f-edb1-72e3-b6cc-d5eb05fa7582.png)
図3:pygameがインポート出来たかの確認

#3.スクリーンを表示しよう
pythonとpygameのインポートが済んだところで、いよいよプログラミングを始めていきます！

Atomという*エディタを使います。下のリンクからatomをダウンロードしてください。
*エディタとはプログラミングを書き込むソフトのことです。
https://atom.io/


```:screen.py
# -*- coding:utf-8 -*-
import pygame
from pygame.locals import*
import sys

def main():
    pygame.init() #初期化
    screen = pygame.display.set_mode((300,400)) # 400*400の画面
    #screen = pygame.display.set_mode((400,400),FULLSCREEN) #フルスクリーン (解除時は大きさ400*300の画面)
    pygame.display.set_caption("Screen") #タイトルバーに表示する名前

    while(1):
        screen.fill((0,0,0)) #画面を黒色(#000000)に塗る
        pygame.display.update() #画面を更新

        #イベント処理
        for event in pygame.event.get():
            if event.type == QUIT: #閉じるボタンが押されたら終了
                pygame.quit() #Pygameの終了(画面閉じられる)
                sys.exit()

if __name__ =="__main__":
    main()
```

Atomに書いたファイルの開き方は下の動画をご覧ください！
https://youtu.be/jQm-aMsN3-w

#4.盤と駒を表示しよう
次に将棋盤と駒を表示します。
![board.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271238/03296bae-332d-5bd2-bc42-a5b4d5dcdc9a.png)
図3:将棋盤の素材(ダウンロードして使ってください)


![king.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271238/29363692-daa7-1593-0aa3-da7e59538245.png)
図4:王将の素材(ダウンロードして使ってください)

![gold.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271238/44d4ee46-0e1d-fab4-c812-9e83b39afcaa.png)
図5:金将の素材(ダウンロードして使ってください)

![silver.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271238/5d799b5a-efd3-58ee-776f-a744734fa79e.png)
図6:銀将の素材(ダウンロードして使ってください)

![pawn.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271238/a5019f19-9cfb-ac50-fd5f-6b6858cf411b.png)
図7:歩兵の素材(ダウンロードして使ってください)

```background.py
# -*- coding: utf-8 -*-
import pygame
from pygame.locals import *
import sys

def main():
    (w,h) = (300, 400) #画面サイズ
    (x,y) = (150, 200) #プレイヤー画像の初期配置(画面中央)
    pygame.init() #pygameの初期化
    pygame.display.set_mode((w,h), 0,32) #画面設定
    screen = pygame.display.get_surface()

    #背景画像 (bg.jpg)の取得
    bg = pygame.image.load("board.png").convert_alpha()
    rect_bg = bg.get_rect()

    while(1):
        pygame.display.update() #画面更新
        pygame.time.wait(100) #更新画面間隔
        screen.fill((0, 0, 0, 0)) #画面の背景色
        screen.blit(bg, rect_bg) #背景画像の描画

        #終了用イベント処理
        for event in pygame.event.get():
            #閉じるボタンが押されたとき
            if event.type == QUIT:
                pygame.quit()
                sys.exit()

if __name__ =="__main__":
        main() 
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271238/80c54203-9bfc-a43f-7daf-6aa3afdabe15.png)
図8:背景が設定できました

次に駒を配置してきます。

```piece.py
# -*- coding: utf-8 -*-
import pygame
from pygame.locals import *
import sys

def main():
    (w,h) = (300, 400) #画面サイズ
    (x,y) = (150, 200) #プレイヤー画像の初期配置(画面中央)
    pygame.init() #pygameの初期化
    pygame.display.set_mode((w,h), 0,32) #画面設定
    screen = pygame.display.get_surface()

    #背景画像 (bg.jpg)の取得
    bg = pygame.image.load("board.png").convert_alpha()
    rect_bg = bg.get_rect()

    #王の画像(king.png)の取得
    king = pygame.image.load("king.png").convert_alpha()
    rect_king = king.get_rect()
    rect_king.center = (150,350) #王の初期配置

    #金の画像(gold.png)の取得
    gold = pygame.image.load("gold.png").convert_alpha()
    rect_gold = gold.get_rect()
    rect_gold.center = (50,350) #金の初期配置

    #銀の画像(silver.png)の取得
    silver = pygame.image.load("silver.png").convert_alpha()
    rect_silver = silver.get_rect()
    rect_silver.center =(250,350) #銀の初期配置

    #歩の画像(pawn.png)の取得
    pawn = pygame.image.load("pawn.png").convert_alpha()
    rect_pawn = pawn.get_rect()
    rect_pawn.center =(150,250)

    while(1):

        pygame.display.update() #画面更新
        pygame.time.wait(100) #更新画面間隔
        screen.fill((0, 0, 0, 0)) #画面の背景色
        screen.blit(bg, rect_bg) #背景画像の描画
        screen.blit(king, rect_king) #王の画像の描画
        screen.blit(gold, rect_gold) #金の画像の描画
        screen.blit(silver, rect_silver) #銀の画像の描画
        screen.blit(pawn, rect_pawn) #歩の画像の描画

        #終了用イベント処理
        for event in pygame.event.get():
            #閉じるボタンが押されたとき
            if event.type == QUIT:
                pygame.quit()
                sys.exit()

if __name__ =="__main__":
        main()
```



#5.駒を動かそう

```:34shogi.py
# -*- coding: utf-8 -*-
import pygame
from pygame.locals import *
import sys

def main():
    (w,h) = (300, 400) #画面サイズ
    (x,y) = (150, 200) #プレイヤー画像の初期配置(画面中央)
    pygame.init() #pygameの初期化
    pygame.display.set_mode((w,h), 0,32) #画面設定
    screen = pygame.display.get_surface()

    #背景画像 (bg.jpg)の取得
    bg = pygame.image.load("board.png").convert_alpha()
    rect_bg = bg.get_rect()

    #王の画像(king.png)の取得
    king = pygame.image.load("king.png").convert_alpha()
    rect_king = king.get_rect()
    rect_king.center = (150,350) #王の初期配置

    #金の画像(gold.png)の取得
    gold = pygame.image.load("gold.png").convert_alpha()
    rect_gold = gold.get_rect()
    rect_gold.center = (50,350) #金の初期配置

    #銀の画像(silver.png)の取得
    silver = pygame.image.load("silver.png").convert_alpha()
    rect_silver = silver.get_rect()
    rect_silver.center =(250,350) #銀の初期配置

    #歩の画像(pawn.png)の取得
    pawn = pygame.image.load("pawn.png").convert_alpha()
    rect_pawn = pawn.get_rect()
    rect_pawn.center =(150,250)

    while(1):

        #キーイベント処理(キャラクタ画像の移動)
        pressed_key = pygame.key.get_pressed()
        #「←」キーが押されたらx座標を-5に移動
        if pressed_key[K_LEFT]:
            rect_king.move_ip(-5,0)
        #「→」キーが押されたらx座標を+5移動
        if pressed_key[K_RIGHT]:
            rect_king.move_ip(5,0)
        #「↑」キーが押されたらy座標を-5移動
        if pressed_key[K_UP]:
            rect_king.move_ip(0,-5)
        #「↓」キーが押されたらy座標を-5移動
        if pressed_key[K_DOWN]:
            rect_king.move_ip(0,5)

        pygame.display.update() #画面更新
        pygame.time.wait(100) #更新画面間隔
        screen.fill((0, 0, 0, 0)) #画面の背景色
        screen.blit(bg, rect_bg) #背景画像の描画
        screen.blit(king, rect_king) #王の画像の描画
        screen.blit(gold, rect_gold) #金の画像の描画
        screen.blit(silver, rect_silver) #銀の画像の描画
        screen.blit(pawn, rect_pawn) #歩の画像の描画

        #終了用イベント処理
        for event in pygame.event.get():
            #閉じるボタンが押されたとき
            if event.type == QUIT:
                pygame.quit()
                sys.exit()

if __name__ =="__main__":
        main()
```

下の動画のように動けば成功です！
https://www.youtube.com/upload