婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 基于flask實現五子棋小游戲

基于flask實現五子棋小游戲

熱門標簽:地圖標注線上如何操作 400電話辦理哪種 天津電話機器人公司 應電話機器人打電話違法嗎 河北防封卡電銷卡 手機網頁嵌入地圖標注位置 電銷機器人的風險 開封語音外呼系統代理商 開封自動外呼系統怎么收費

本文實例為大家分享了基于flask實現五子棋小游戲的具體代碼,供大家參考,具體內容如下

前言

首先說明一下,本人方向是java后端,只因老師布置了一個作業,要用flask來做一個五子棋,沒辦法被逼上梁山,程序不太美觀,但是應付作業還是夠了的。

廢話不多說,下面開錘!

首先整個程序是一個web應用,前端html+css+javaScript(有用到jquery)(基本都是現學的,所以程序很多注釋也很丑),后端用的flask框架。

準備工作

**1.**python環境、安裝flask

**2.**導入需要用到的包

pip install flask_cors
pip install flask_sqlalchemy

**3.**創建一個flask項目,并將一下代碼復制運行

文件結構

圖片資源

不做代碼的生產者,只做代碼的搬運工

前端

游戲頁面

!DOCTYPE html>
html lang="en">
head>
        meta charset="UTF-8">
        title>五子棋/title>
 style>
 * {
    margin: 0;
    padding: 0;
 }

 body {
    margin-top: 20px;
    margin-left: 20px;
 }

 canvas {
    background-image: url("img/backgroud.jpg");
    border: 1px solid #000;
 }

 .mybutton {
            width: 200px;
            line-height: 40px;
            text-align: center;
            background-color: cornflowerblue;
            margin: 0 auto;
            margin-top: 20px;
            font-size: 20px;
            color: #fff;
        }
 /style>
/head>

body>
        canvas width="600" height="600" onclick="play(event)">/canvas>    
        
        div>
            input type="button" value="重新開始" onclick="replay()" class="mybutton">    
        /div>
          

script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js">/script>
script>
 /*準備工作: 1獲取畫布,獲取畫筆對象 */
    var mcanvas = document.querySelector("canvas");
    var ctx = mcanvas.getContext("2d");

    /*準備工作:2創建一個二維數組 用來定義繪制棋盤線*/
    var count = 15;//用來定義棋盤的行數和列數
    var map = new Array(count);

    for (var i = 0; i  map.length; i++) {
        map[i] = new Array(count);
        for (var j = 0; j  map[i].length; j++) {
            map[i][j] = 0;
        }
    }

    /*準備工作:3初始化棋子*/
    var black = new Image();
    var white = new Image();
    black.src = "img/black.png";
    white.src = "img/white.png";


    //開始繪制 1繪制棋盤線
    ctx.strokeStyle = "#fff";
    var rectWH = 40; //設置繪制矩形的大小
    for (var i = 0; i  map.length; i++) {
        for (var j = 0; j  map[i].length; j++) {
            ctx.strokeRect(j * rectWH, i * rectWH, rectWH, rectWH);
        }
    }

    // 用來進行黑白子的切換
    var isBlack = true;

 //開始繪制 2下子
 function play(e) {
    //獲取點擊canvas的位置值默認,canvas的左上角為(0,0) 點
    var leftOffset = 20;//body 的margin
    var x = e.clientX - leftOffset;
    var y = e.clientY - leftOffset;
    // console.log(x+" "+y);
    // 設置點擊點后棋子下在哪里,獲取點擊的位置進行判斷如果超過格子的一半則繪制到下一個點如果小于 則繪制在上一個點上
    var xv = (x - rectWH / 2) / rectWH;
    var yv = (y - rectWH / 2) / rectWH;

    var col = parseInt(xv) + 1;
    var row = parseInt(yv) + 1;
    console.log(xv + " " + yv + " , " + col + " " + row);

    //嚴格點需要驗證 ,驗證所輸入的點是否在數組中已經存在 ,如果存在 則返回
    if (map[row][col] != 0) {
        alert("此處已經落子");
        return;
    }

    // 切換繪制黑白子
    if (isBlack) {
        ctx.drawImage(black, col * 40 - 20, row * 40 - 20);
        isBlack = false;
        map[row][col] = 1;

        $.ajax({
            url: "http://127.0.0.1:5000/yes",//請求的url地址
            type: 'post',//設置請求的http方式,method也可以
            dataType: 'json',//將服務器端返回的數據直接認定為是這個格式,然后會做一些自動的處理(如果是json字符串,會自動轉化為js對象),服務器返回的默認格式是text/html格式
            data: {//向服務器端發送的數據
                t: 1,
                row: row,
                col: col,
                
            },
            success: function (data) {//請求成功之后執行的回調函數
                if(data.code===201){
                    alert('黑棋獲勝')
                }else if(data.code===202){
                    alert('白棋獲勝')
                }
                
            },
            error: function(error){
                console.log(error)
            }
        });

        // Yes(1,row,col)

    } else {
        ctx.drawImage(white, col * 40 - 20, row * 40 - 20);
        isBlack = true;
        map[row][col] = 2;
        $.ajax({
            url: "http://127.0.0.1:5000/yes",//請求的url地址
            type: 'post',//設置請求的http方式,method也可以
            dataType: 'json',//將服務器端返回的數據直接認定為是這個格式,然后會做一些自動的處理(如果是json字符串,會自動轉化為js對象),服務器返回的默認格式是text/html格式
            data: {//向服務器端發送的數據
                t: 2,
                row: row,
                col: col,
              
            },
            success: function (data) {//請求成功之后執行的回調函數
                if(data.code===201){
                    alert('黑棋獲勝')
                }else if(data.code===202){
                    alert('白棋獲勝')
                }
                
            },
            error: function(error){
                console.log(error)
            }
        });
        // Yes(2,row,col)
    }


 }

 function replay(){
    $.ajax({
            url: "http://127.0.0.1:5000/replay",//請求的url地址
            type: 'post',//設置請求的http方式,method也可以
            dataType: 'json',//將服務器端返回的數據直接認定為是這個格式,然后會做一些自動的處理(如果是json字符串,會自動轉化為js對象),服務器返回的默認格式是text/html格式
            data: {//向服務器端發送的數據
                isReplay: true
            },
            success: function (data) {//請求成功之后執行的回調函數
                window.location.href = "game.html";                
            },
            error: function(error){
                console.log(error)
            }
        });
 }


 /*功能擴充:
 1當勝利后 彈框:a是否在來一局 b 精彩回復
 a 如果點擊在來一句 清空數據重新開始
 b 精彩回放將棋盤黑白子按照下棋的順序進行棋子編號2悔棋功能
 3對算法的擴充
 a如果是雙三 則直接彈出勝利
 b若是桶四 則直接彈出勝利
 */
/script>
/body>
/html>

登錄頁面

!DOCTYPE html>
html>
head lang="en">
    meta charset="UTF-8">
    meta content="width=device-width, initial-scale=1.0, user-scalable=no" name="viewport">
    title>/title>
    
    style>
        * {
            margin: 0px;
            padding: 0px;
        }

        .title {
            font-size: 20px;
            background-color: cornflowerblue;
            color: #fff;
           /*
            * 里面的文字居中
            */
            line-height: 50px;
            text-align: center;
            /*
             *絕對定位
             */
            position: fixed;
            top: 0px;
            left: 0px;
            width: 100%;
        }

        .content {
            margin-top: 110px;
        }

        .mybutton {
            width: 200px;
            line-height: 40px;
            text-align: center;
            background-color: cornflowerblue;
            margin: 0 auto;
            margin-top: 20px;
            font-size: 20px;
            color: #fff;
        }

        .shurukuang {
            display: block;
            margin: 0 auto;
            width: 200px;
            height: 25px;
            margin-top: 1px;
            border: none;
            border-bottom: 1px solid;
            margin-top: 5px;
            text-indent: 4px;
            outline: none;
        }
    /style>
/head>
body>


div class="title">
    gobang賬戶登錄
/div>

div class="content">
    input id="username" class="shurukuang" type="text" placeholder="手機號" value="yokna">
    input id="password" class="shurukuang" type="password" placeholder="密碼" value="123456">
/div>
div class="mybutton" onclick="myClick()">登錄/div>


script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js">/script>
script>

    // 請求路徑
    var httpurl = "http://127.0.0.1:5000/login";
    // 數據請求
    function myClick() {
        var usernamestr = document.getElementById("username").value;
        var passwordstr = document.getElementById("password").value;
      

        $.ajax({
            url: httpurl,//請求的url地址
            type: 'post',//設置請求的http方式,method也可以
            dataType: 'json',//將服務器端返回的數據直接認定為是這個格式,然后會做一些自動的處理(如果是json字符串,會自動轉化為js對象),服務器返回的默認格式是text/html格式
            data: {//向服務器端發送的數據
                username: usernamestr,
                password: passwordstr,
            },
            success: function (data) {//請求成功之后執行的回調函數
                console.log(data.code);
                if(data.code!==200){
                    alert("用戶名或密碼錯誤")
                }else{
                    window.location.href = "game.html";
                }
                
            },
            error: function(error){
                console.log(error)
            }
        });
    }

/script>

/body>
/html>

歡迎界面

說明:此界面可有可無,對整個游戲沒有影響

!DOCTYPE html>
html lang="en">
head>
    meta charset="UTF-8">
    title>Title/title>
/head>
body>

script type="text/javascript">

    window.onload = function f(){
        var myDate = new Date();
        document.getElementById('currentTime').innerText = myDate.getTime();
    }

    function loadPage(){
        var targetURL = document.querySelector('#url').value;
        console.log(targetURL);
        document.querySelector('#iframePosition').src = targetURL;
    }

/script>


div>
    
        歡迎來玩五子棋:             
        input type="text" id="url" value="http://127.0.0.1:5500/templates/game.html" hidden>
        input type="button" value="開始游戲" onclick="loadPage()">

/div>

div>
    h3>加載頁面的位置/h3>
    iframe style="width: 100%;height: 600px" id="iframePosition">

    /iframe>
/div>

/body>
/html>

至此,前端的頁面就展示完了

下面是后端的內容

后端

配置文件

SQLALCHEMY_DATABASE_URI = "mysql://root:password@localhost:3306/gobang"
# "數據庫://用戶名:密碼@host:port/數據庫名稱"

SQLALCHEMY_TRACK_MODIFICATIONS = False
# 這一行不加會有警告

啟動類

# -*- coding:utf-8 -*-

#1.導入flask擴展
# 2.創建flask應用程序實例
# 3.定義路由及視圖函數
# 4.啟動程序
from flask import Flask, render_template, request
from flask_cors import  *
import pymysql
pymysql.install_as_MySQLdb()
from flask_sqlalchemy import SQLAlchemy
import config

#需要傳入__name__ 為了確定資源所在路徑
app = Flask(__name__)
CORS(app, supports_credentials=True)
app.config.from_object(config)
db = SQLAlchemy(app)
global map
map = [[0 for i in range(15)] for j in range(15)]
# #flask中定義路由是通過裝飾器來實現的,訪問路由會自動調用路由下跟的方法,并將執行結果返回


@app.route('/login',methods=["GET","POST"])
def login():
    if request.method == "POST":
        # 以POST方式傳參數,通過form取值
        # 如果Key之不存在,報錯KeyError,返回400的頁面
        username = request.form['username']
        password = request.form['password']
        user = queryUser(username,password)
        if len(user) > 0:
            return {"code": 200, "msg": "成功"}
        else:
            return {"code": 400, "msg": "驗證失敗"}
            println('驗證失敗')
        print(username+password)
    else:
        # 以GET方式傳參數,通過args取值
        username = request.args['username']
        print(username)
    return {"code": 200,"msg":"成功"}

class User(db.Model):
    __tablename__ = 'user'
    username = db.Column(db.String(255))
    password = db.Column(db.String(255))
    id = db.Column(db.Integer,primary_key=True)


def index():
    user = User(username='你好你好',password='456456')
    #調用添加方法
    db.session.add(user)
    #提交入庫,上面已經導入了提交配置,所以不需要在提交了
    db.session.commit()
    return '這是首頁'


def queryUser(username,password):
    user = User.query.filter_by(username=username,password=password).all()
    db.session.commit()
    return user

@app.route('/replay',methods=["POST"])
def replay():
    global map
    map = [[0 for i in range(15)] for j in range(15)]
    return {"code": 200,"msg":"成功"}


@app.route('/yes',methods=["POST"])
def yes():
    print('this is yes ')
    t = int(request.form['t'])
    print(t)
    tmprow = request.form['row']
    print(tmprow)
    tmpcol = request.form['col']
    print(tmpcol)
    row = int(tmprow)
    col = int(tmpcol)
    total = 1

    map[int(row)][int(col)] = t
    chessboard = map
    print(chessboard)
    print('this is yes ')
    print(t)
    print(tmprow)
    print(tmpcol)
    #不寫注釋真容易看混,本少俠就勉強寫一點吧
    #這里是要判斷水平方向上是否滿足獲勝條件
    while col - 1 > 0 and chessboard[row][col - 1] == t:
        total = total + 1
        col = col - 1

    row = int(tmprow)
    col = int(tmpcol)
    while col + 1  15 and chessboard[row][col + 1] == t:
        total = total + 1
        col = col + 1
    
    if total >= 5:
        if t == 1:
            return {"code": 201, "msg": "黑棋獲勝"}
        else:
            return {"code": 202, "msg": "白棋獲勝"}

    #判斷垂直方向上是否滿足獲勝條件
    row = int(tmprow)
    col = int(tmpcol)
    while row - 1 > 0 and chessboard[row - 1][col] == t:
        total = total + 1
        row = row - 1

    row = int(tmprow)
    col = int(tmpcol)
    while row + 1  15 and chessboard[row + 1][col] == t:
        total = total + 1
        row = row + 1
    
    if total >= 5:
        if t == 1:
            return {"code": 201, "msg": "黑棋獲勝"}
        else:
            return {"code": 202, "msg": "白棋獲勝"}

    
    #判斷pie上是否滿足獲勝條件
    row = int(tmprow)
    col = int(tmpcol)
    while row - 1 > 0 and col + 1  15 and chessboard[row - 1][col + 1] == t:
        total = total + 1
        row = row - 1
        col = col + 1

    row = int(tmprow)
    col = int(tmpcol)
    while row + 1  15 and col - 1 > 0 and chessboard[row + 1][col - 1] == t:
        total = total + 1
        row = row + 1
        col = col - 1
    
    if total >= 5:
        if t == 1:
            return {"code": 201, "msg": "黑棋獲勝"}
        else:
            return {"code": 202, "msg": "白棋獲勝"}


    #判斷na上是否滿足獲勝條件
    row = int(tmprow)
    col = int(tmpcol)
    while row - 1 > 0 and col - 1 > 0 and chessboard[row - 1][col - 1] == t:
        total = total + 1
        row = row - 1
        col = col - 1

    row = int(tmprow)
    col = int(tmpcol)
    while row + 1  15 and col + 1  15 and chessboard[row + 1][col + 1] == t:
        total = total + 1
        row = row + 1
        col = col + 1
    
    if total >= 5:
        if t == 1:
            return {"code": 201, "msg": "黑棋獲勝"}
        else:
            return {"code": 202, "msg": "白棋獲勝"}

    return {"code": 203, "msg": "繼續"}
           

   

#會運行起一個小型服務器,就會將我們的flask程序運行在一個簡單的服務器上,服務器由flask提供,用于測試

if __name__ == '__main__':
 app.run()

數據庫表

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for `user`
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `username` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `password` varchar(255) NOT NULL,
  `id` int(16) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('yokna', '123456', '1');
INSERT INTO `user` VALUES ('你好你好', '456456', '2');
INSERT INTO `user` VALUES ('你好你好', '456456', '3');
INSERT INTO `user` VALUES ('orange', '123456', '4');

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • python版本五子棋的實現代碼
  • python實現五子棋小游戲
  • python pygame實現五子棋小游戲
  • python實現簡單五子棋游戲
  • python實現五子棋小程序
  • 使用python實現簡單五子棋游戲
  • python實現五子棋游戲
  • python實現五子棋游戲(pygame版)
  • python使用minimax算法實現五子棋
  • python五子棋游戲的設計與實現

標簽:宿遷 駐馬店 江蘇 蘭州 山東 常州 成都 六盤水

巨人網絡通訊聲明:本文標題《基于flask實現五子棋小游戲》,本文關鍵詞  基于,flask,實現,五子棋,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《基于flask實現五子棋小游戲》相關的同類信息!
  • 本頁收集關于基于flask實現五子棋小游戲的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    一区二区三区四区不卡视频| 亚洲已满18点击进入久久| 国产欧美一二三区| 亚洲一级二级三级在线免费观看| 麻豆精品久久久| 91麻豆.com| 久久精品夜色噜噜亚洲a∨| 亚洲在线观看免费视频| 国产成人8x视频一区二区| 欧美精品日韩精品| 一区二区国产盗摄色噜噜| 国产丶欧美丶日本不卡视频| 欧美一级在线视频| 亚洲一区二区高清| 91精品1区2区| 国产精品传媒入口麻豆| 国产高清精品在线| 欧美老女人在线| 亚洲午夜免费福利视频| www.亚洲免费av| 欧美精彩视频一区二区三区| 久久精品国产澳门| 欧美一区二区三区系列电影| 伊人开心综合网| 99视频国产精品| 国产欧美日韩精品a在线观看| 久久国产精品色| 91精品国产全国免费观看| 五月天中文字幕一区二区| 在线免费不卡视频| 亚洲精品成人精品456| 色综合天天综合狠狠| 日韩国产欧美在线视频| 欧美在线不卡视频| 亚洲一区av在线| 一本大道久久a久久精二百| 综合久久国产九一剧情麻豆| 99久久亚洲一区二区三区青草| 国产三级精品在线| 成人一区二区三区| 中文字幕字幕中文在线中不卡视频| 成人av网站免费| 亚洲卡通动漫在线| 欧美成人r级一区二区三区| 欧美国产亚洲另类动漫| 日日夜夜精品免费视频| jizzjizzjizz欧美| 久久综合狠狠综合久久综合88 | 国产精品影视网| 欧美日韩在线三区| 国产精品不卡一区| 久久99精品久久久久婷婷| 色av成人天堂桃色av| 久久一日本道色综合| 热久久久久久久| 色老汉一区二区三区| 精品国产一区二区三区不卡| 亚洲第一久久影院| 在线亚洲+欧美+日本专区| 日本一区二区三区免费乱视频| 日韩国产精品91| 欧美午夜精品一区二区蜜桃| 欧美国产欧美亚州国产日韩mv天天看完整| 午夜精品久久久久久久久久久| 色菇凉天天综合网| 亚洲精选视频免费看| 成人黄色国产精品网站大全在线免费观看 | 一区二区在线观看不卡| 成人av手机在线观看| 久久精品一区二区三区不卡牛牛| 久久国产精品免费| 欧美精品一区二区三区高清aⅴ| 奇米在线7777在线精品 | 经典三级视频一区| 欧美电视剧在线看免费| 欧美电影在哪看比较好| 亚洲小少妇裸体bbw| 欧美日韩高清不卡| 亚洲成人1区2区| 欧美日韩国产精品自在自线| 亚洲国产成人va在线观看天堂| 色综合久久久网| 亚洲小说欧美激情另类| 欧美亚洲精品一区| 日本欧美一区二区| 久久久久久久综合| 成人aaaa免费全部观看| 最新高清无码专区| 在线视频你懂得一区二区三区| 亚洲永久免费视频| 欧美一二三区在线| 国产91精品在线观看| 亚洲精品菠萝久久久久久久| 欧美日韩精品二区第二页| 蜜桃久久久久久| 久久九九全国免费| 在线精品视频免费观看| 免费欧美在线视频| 国产欧美日韩精品在线| 欧美色手机在线观看| 久久国产尿小便嘘嘘| 国产欧美日韩另类一区| 欧美三级欧美一级| 国内精品嫩模私拍在线| 亚洲蜜臀av乱码久久精品蜜桃| 555www色欧美视频| 亚洲理论在线观看| 日韩欧美在线影院| 成人的网站免费观看| 亚洲第一在线综合网站| 国产日韩亚洲欧美综合| 欧美日韩极品在线观看一区| 国产精品综合二区| 午夜精品久久久久久久久| 中文乱码免费一区二区| 911国产精品| 91色在线porny| 久久99国产精品免费网站| 亚洲精选一二三| 2021中文字幕一区亚洲| 欧美三级三级三级爽爽爽| 国产成人免费视| 久久精品免费观看| 亚洲在线观看免费视频| 日韩一区欧美一区| 国产亚洲综合性久久久影院| 91麻豆精品国产自产在线观看一区| 成人精品亚洲人成在线| 精品一区二区三区免费播放| 亚洲免费资源在线播放| 久久精品日韩一区二区三区| 欧美精品久久久久久久多人混战 | 欧美肥妇bbw| 在线视频国内一区二区| av电影在线观看不卡| 国产乱码精品1区2区3区| 日日夜夜一区二区| 五月天丁香久久| 亚洲123区在线观看| 亚洲午夜一二三区视频| 一区二区三区在线不卡| 亚洲免费观看高清完整版在线观看| 久久久精品tv| www激情久久| 精品国产人成亚洲区| 日韩精品一区二区三区四区| 91精品国产一区二区| 欧美一区二区视频观看视频| 91精品啪在线观看国产60岁| 欧美日韩电影在线播放| 欧美色图一区二区三区| 欧美影院精品一区| 欧美日韩成人综合| 91精品国产日韩91久久久久久| 欧美一区二区三区免费| 欧美一级精品在线| 精品日韩一区二区三区免费视频| 欧美成人一级视频| 久久久国产午夜精品 | 亚洲成人精品一区二区| 午夜精品视频一区| 免费美女久久99| 国产精品一区二区视频| 成人av免费在线观看| 在线精品视频小说1| 欧美一级二级三级蜜桃| 国产日韩精品一区二区浪潮av| 国产精品色在线| 亚洲精品国产成人久久av盗摄| 亚洲一区二区成人在线观看| 日本亚洲天堂网| 国产成人午夜精品影院观看视频| 波多野结衣的一区二区三区| 在线看日本不卡| 日韩精品中文字幕一区二区三区 | 午夜电影久久久| 激情成人综合网| 91丝袜美女网| 91精品欧美一区二区三区综合在 | 欧美一区三区四区| 国产欧美日韩不卡| 亚洲国产视频a| 国产精品一二三四| 欧美日韩在线一区二区| 久久久国产午夜精品| 亚洲成人综合在线| 国产盗摄一区二区三区| 欧美日韩在线播放一区| 久久久久久久综合狠狠综合| 亚洲免费观看在线视频| 久久www免费人成看片高清| 91美女在线观看| 久久你懂得1024| 日本特黄久久久高潮| 91在线看国产| 久久蜜桃香蕉精品一区二区三区| 亚洲一区二区三区在线| 国产精品77777竹菊影视小说| 欧美一区午夜精品| 亚洲国产成人av网|