24点小游戏 socket

为完成课程设计写的比较糙
仅实现基本要求

题目
24点游戏是一种使用扑克牌来进行的益智类游戏。游戏内容是从一
副扑克牌中抽去大小王剩下52张,任意抽取4张牌,把牌面上的数运
用加、减、乘、除和括号等进行运算得出24。每张牌都必须使用一
次,但不能重复使用,在本设计题目中,可以只选取在1-9这九张牌中
随机取牌,降低软件开发的难度。

大概流程

client发起连接
client发送密码
client收到状态码 并产生四个数等待玩家输入表达式 计算分值
client发送分值
client 显示排行榜和本次成绩
server监听端口
server等待接收用户名密码
server端验证账户名密码 并返回状态
server端等待分值数据
收到后判断是否比原来的分值大 如果大就更新 并返回排行榜
server关闭socket连接 和 mysql连接

环境

数据库使用mysql
语言python3

数据库表结构

FieldTypeNullKeyDefaultExtra
usernamechar(10)YESNULL
passwdchar(10)YESNULL
scoreint(10)YESNULL

代码

比较简单详细说了

server
import socket
import pymysql

def select(list_name, user_name):          # 查询用
    sql = "SELECT %s FROM user WHERE username = '%s'" % (list_name, user_name)
    try:
        cursor.execute(sql)
        results = cursor.fetchall()
        data = results[0][0]
        return data
    except:
        print("Error: unable to fetch data")


def login(user_name, passwd):
    passwd_sql = select('passwd', user_name)
    if passwd_sql == passwd:
        return 1
    else:
        return 0


def update(user_score, user_name):          # 更新分数
    sql = "UPDATE user SET score='%s' WHERE  username='%s'" % (user_score, user_name)
    print(sql)
    try:
        cursor.execute(sql)
        db.commit()
        return 1
    except:
        return 2


def paihang():
    return_str, num = '', 1
    sql = "SELECT * FROM user order by score desc"
    cursor.execute(sql)
    results = cursor.fetchall()
    # print(results, results[0])
    for i in results:
        if (i[2] != None):
            print(i)
            return_str += str(num) + '  ' + str(i[0]) + ' ' + str(i[2]) + '\n'
            num += 1
    return return_str


if __name__ == "__main__":
    # 数据库实例化
    db = pymysql.connect("192.168.87.128", "root", "152131", "user")
    cursor = db.cursor()

    # socket实例化
    s = socket.socket()
    s.bind(('', 8885))
    s.listen(5)
    conn, addr = s.accept()

    #等待接收用户名密码
    str_recv = conn.recv(1024)
    user_passwd = str_recv.decode()
    username, passwd = user_passwd.split(sep=' ')
    login_bool = login(username, passwd)
    if login_bool == 1:
        conn.send('1'.encode("gbk"))
    else:
        conn.send('0'.encode("gbk"))
    #接收成绩并更新
    str_recv = conn.recv(1024)
    score = str_recv.decode()
    if select(score)
    update(score, username)
    #发送排行榜
    pai = paihang()
    conn.send(pai.encode("gbk"))
    db.close()




client
from tkinter import *
from socket import *
import random
import time


e, time_1, root, root1, root2, window = 0, 0, 0, 0, 0, 0


def score(formula, user_time):
    a = eval(formula)
    if a == 24:
        return_score = 75 - (user_time / 120) * 75 + 25
        if return_score <= 0:
            return 0
        else:
            return return_score
    else:
        return 0


def send():
    global e, time_1, root, root2, window
    root2 = Tk()
    text = e.get()
    time_2 = time.time() - time_1
    time_2 = int(time_2)
    sc = score(text, time_2)
    sc = int(sc)
    xianshi = '您的分数是%s!\n' % sc
    sc = str(sc)
    tcp_socket_client.send(sc.encode('gbk'))
    data_re = tcp_socket_client.recv(1024)
    data_re = data_re.decode()
    xianshi = xianshi + '排行榜:\n'+data_re
    Label(root2, text=xianshi, bg='red', fg='blue', width=30, height=8, anchor='c').pack()


def random_24():
    return_list = []
    list_1 = [i for i in range(1, 14)]
    list_1 = list_1 + list_1 + list_1 +list_1
    for j in range(4):
        return_list.append(list_1[random.randint(0, 51)])
    return return_list


def game():
    global e, time_1, root, root2, window
    window = Tk()
    window.title('1')
    window.geometry('200x300')
    list_24 = random_24()
    for i in range(4):
        Label(window, text=list_24[i],
                 bg='green',
                 font=('Arial', 12),
                 width=6,
                 height=2).grid(row=i, column=1, padx=10, pady=10)
    e = Entry(window)
    e.grid(row=4, column=1)
    time_1 = time.time()
    Button(window, text='提交', anchor='c', width=6, height=1, command=send).grid(row=5, column=1)
    Button(window, text='提交', anchor='c', width=6, height=1, command=send).grid(row=5, column=1)


def Show():
    global e, time_1, root, root2, window
    root1 = Tk()
    username = En.get()
    passwd = En1.get()
    loginstr = username + ' ' + passwd
    tcp_socket_client.send(loginstr.encode('gbk'))
    data_re = tcp_socket_client.recv(1024)
    if data_re.decode('gbk') == '1':
    # if '1' == '1':
        Label(root1, text='登录成功', bg='Gold', fg='blue', width=30, height=8, anchor='c').pack()
        game()
    else:
        Label(root1, text='用户名或密码错误!', bg='red', fg='blue', width=30, height=8, anchor='c').pack()


# 建立TCP连接
tcp_socket_client = socket(AF_INET, SOCK_STREAM)
tcp_socket_client.connect(('127.0.0.1', 8885))

# GUI
root = Tk()
root.title('24点')
label = Label(root, text='用户名:', anchor='c').grid(row=0)
En = Entry(root)
En.grid(row=0, column=1)
label1 = Label(root, text='密码  :', anchor='c').grid(row=1)
En1 = Entry(root, show='*')
En1.grid(row=1, column=1)
Button(root, text='退出', anchor='c', width=6, height=1, command=root.quit).grid(row=2, column=0)
Button(root, text='确定', anchor='c', width=6, height=1, command=Show).grid(row=2, column=1)

root.mainloop()

结果展示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
好的,我可以给你一个简单的 socket 编程小游戏的例子。我们可以使用 Python 编写一个双人游戏,一个玩家是服务器,另一个玩家是客户端。 游戏规则: 1. 服务器随机生成一个 1 到 100 的数字。 2. 客户端猜数字,服务器会告诉客户端猜的数字是大了还是小了。 3. 客户端最多可以猜 10 次,如果猜中就胜利,否则失败。 以下是服务器和客户端代码: 服务器代码: ```python import socket import random # 创建 socket 对象 server_socket = socket.socket() # 绑定端口号 server_socket.bind(('localhost', 9999)) # 设置最大连接数 server_socket.listen(1) print('等待客户端连接...') # 等待客户端连接 client_socket, addr = server_socket.accept() print('客户端已连接:', addr) # 生成随机数 number = random.randint(1, 100) # 游戏开始 for i in range(1, 11): # 接收客户端猜测的数字 guess = int(client_socket.recv(1024).decode()) print('收到猜测:', guess) # 判断猜测是否正确 if guess == number: client_socket.send('猜对了!'.encode()) print('游戏结束:猜对了') break elif guess < number: client_socket.send('猜小了!'.encode()) else: client_socket.send('猜大了!'.encode()) # 判断是否是最后一次猜测 if i == 10: client_socket.send('您已用完所有机会,游戏结束!'.encode()) print('游戏结束:猜测次数用完') ``` 客户端代码: ```python import socket # 创建 socket 对象 client_socket = socket.socket() # 连接服务器 client_socket.connect(('localhost', 9999)) # 游戏开始 print('猜数字游戏开始!') for i in range(1, 11): # 输入猜测的数字 guess = int(input('请输入您的猜测(1-100):')) # 发送猜测的数字 client_socket.send(str(guess).encode()) # 接收服务器的回复 response = client_socket.recv(1024).decode() print('服务器回复:', response) # 判断是否猜对 if response == '猜对了!': print('恭喜您猜对了!') break # 判断是否是最后一次猜测 if i == 10: print('很遗憾,您已用完所有机会!') ``` 运行服务器代码,然后再运行两个客户端代码,就可以进行游戏了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值