猜数字一个人玩多没意思,试试双人猜数字游戏吧

本文介绍了一个简单的猜数字游戏程序,使用C语言编写,并利用Windows API进行实现。该程序支持两名玩家轮流猜测由计算机生成的随机数,通过比较两者的猜测次数来决定胜负。
#include<stdio.h>
#include<windows.h>
#include<time.h>
int game(int player)
{
    printf("您当前的身份是player%d\n", player);
    int num = 0;
    int cont = 0;
    num = rand() % 100 + 1;
    int tmp = 0;
    switch (player)
    {
    case 1:
    {   
        int i = 0;
        while (1)
        {
            printf("请输入数字\n");
            scanf_s("%d", &cont);
            if (cont == num)
            {
                printf("恭喜,你猜的数字是对的\n");
                i++;
                break;
            }
            else if (cont < num)
            {
                printf("猜小了\n");
                i++;
            }
            else
            {
                printf("猜大了\n");
                i++;
            }
        }
        printf("您一共猜了%d次\n", i);
        tmp = i;
    }
    break;
    case 2:
    {
        int b = 0;
        while (1)
        {
            printf("请输入数字\n");
            scanf_s("%d", &cont);
            if (cont == num)
            {
                printf("恭喜,你猜的数字是对的\n");
                b++;
                break;
            }
            else if (cont < num)
            {
                printf("猜小了\n");
                b++;
            }
            else
            {
                printf("猜大了\n");
                b++;
            }
        }
        printf("您一共猜了%d次\n", b);
        cont = b;
    }

    if (tmp > cont)
    {
        printf("恭喜player2取得胜利\n");
    }
    else if (tmp == cont)
    {
        printf("平局\n");
    }
    else
    {
        printf("恭喜player1取得胜利\n");
    }
    break;
    }
}
int main()
{
    int choice=0;
    void srand(
        unsigned int seed
    );
    do
    {   
        printf("**************************************\n");
        printf("**********1. player1 2.player2   0.exit **********\n");
        printf("**************************************\n");
       printf("请输入选项\n");   
        scanf_s("%d", &choice);
        switch (choice)
        {
        case 1: game(choice);
            break;
        case 2: game(choice);
            break;
        case 0:
            break;
        default:
            printf("选择错误\n");
        }
    } while (choice);
    return 0;
}
<think> 我们来实现一个简单的258游戏(也称为2048游戏,但目标数字是258)。这个游戏一个4x4的网格上进行,家可以通过上下左右滑动来移动数字,相同数字在移动时会合并,每次移动后随机在空白位置生成一个数字(通常是2或4)。游戏目标是将数字合并到258(或更高,但此处以258为目标)。 我们将使用Python和Pygame库来实现图形界面。 游戏规则: 1. 游戏一个4x4的网格中进行。 2. 每次可以选择上下左右其中一个方向去滑动,每滑动一次,所有的数字方块都会往滑动的方向靠拢,相同数字的方块在靠拢相撞时会相加合并。 3. 每次滑动时,空白处会随机出现一个新的数字方块(2或4)。 4. 当出现258(或258以上)的数字时,游戏胜利(也可以继续下去直到无法移动)。 5. 当网格被填满且无法进行合并时,游戏失败。 实现步骤: 1. 初始化游戏窗口 2. 创建4x4的游戏网格,初始时有两个随机位置的数字(2或4) 3. 实现网格的绘制 4. 实现移动和合并逻辑(左、右、上、下) 5. 在移动后,在空白位置随机生成一个新的数字(2或4) 6. 检查游戏是否结束(没有空白并且没有相邻的相同数字) 7. 添加游戏胜利和失败的判断 我们将按照这个步骤来实现。 注意:由于258游戏是2048的变种,只是目标数字不同,因此基本逻辑相同。 代码结构: - 初始化pygame - 定义颜色、窗口大小等 - 创建游戏网格(4x4的二维数组) - 在随机位置生成数字(2或4) - 绘制网格和数字 - 处理移动(左、右、上、下) - 合并相同数字并移动 - 判断游戏是否结束 - 主循环 由于代码较长,我们将分步骤实现。 注意:在移动时,需要按照方向先移除空格,然后合并相邻的相同数字,然后再次移除空格(因为合并后可能产生新的空格),最后在空白位置生成新数字。 我们将实现一个`move`函数,它接收一个方向参数,然后对网格进行变换。 另外,为了简化,我们可能会用到矩阵旋转,这样可以将上下移动转化为左右移动来处理。 开始编写代码: </think> # 258游戏(2048变体)实现 以下是一个258游戏的完整实现,这是2048游戏的变体,目标是将方块合并到258: ```python import pygame import sys import random import math # 初始化pygame pygame.init() # 游戏常量 GRID_SIZE = 4 TILE_SIZE = 100 GRID_PADDING = 10 WINDOW_WIDTH = GRID_SIZE * (TILE_SIZE + GRID_PADDING) + GRID_PADDING + 300 WINDOW_HEIGHT = GRID_SIZE * (TILE_SIZE + GRID_PADDING) + GRID_PADDING FPS = 60 # 颜色定义 BACKGROUND_COLOR = (250, 248, 239) GRID_COLOR = (187, 173, 160) EMPTY_CELL_COLOR = (205, 193, 180) TEXT_COLOR = (119, 110, 101) TEXT_COLOR_LIGHT = (249, 246, 242) SCORE_BG_COLOR = (187, 173, 160) BUTTON_COLOR = (143, 122, 102) BUTTON_HOVER_COLOR = (170, 140, 120) # 方块颜色(根据数字值) TILE_COLORS = { 0: EMPTY_CELL_COLOR, 2: (238, 228, 218), 4: (237, 224, 200), 8: (242, 177, 121), 16: (245, 149, 99), 32: (246, 124, 95), 64: (246, 94, 59), 128: (237, 207, 114), 256: (237, 204, 97), 258: (237, 200, 80), 512: (237, 197, 63), 1024: (237, 194, 46), 2048: (237, 194, 30) } # 创建游戏窗口 screen = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT)) pygame.display.set_caption("258游戏") clock = pygame.time.Clock() # 字体 title_font = pygame.font.SysFont("simhei", 48, bold=True) header_font = pygame.font.SysFont("simhei", 24) tile_font = pygame.font.SysFont("Arial", 36, bold=True) large_tile_font = pygame.font.SysFont("Arial", 30, bold=True) small_font = pygame.font.SysFont("simhei", 18) class Game258: def __init__(self): self.reset() def reset(self): """重置游戏状态""" self.grid = [[0 for _ in range(GRID_SIZE)] for _ in range(GRID_SIZE)] self.score = 0 self.high_score = 0 self.game_over = False self.won = False self.add_new_tile() self.add_new_tile() def add_new_tile(self): """在空位置添加新方块""" empty_cells = [(i, j) for i in range(GRID_SIZE) for j in range(GRID_SIZE) if self.grid[i][j] == 0] if empty_cells: i, j = random.choice(empty_cells) # 90%概率生成2,10%概率生成4 self.grid[i][j] = 2 if random.random() < 0.9 else 4 def move(self, direction): """移动方块 参数: direction: 0-上, 1-右, 2-下, 3-左 """ if self.game_over: return False moved = False # 根据方向处理移动 if direction == 0: # 上 for j in range(GRID_SIZE): # 合并相同数字 for i in range(1, GRID_SIZE): if self.grid[i][j] != 0: row = i while row > 0 and self.grid[row-1][j] == 0: self.grid[row-1][j] = self.grid[row][j] self.grid[row][j] = 0 row -= 1 moved = True if row > 0 and self.grid[row-1][j] == self.grid[row][j]: self.grid[row-1][j] *= 2 self.score += self.grid[row-1][j] if self.grid[row-1][j] == 258: # 达到目标 self.won = True self.grid[row][j] = 0 moved = True elif direction == 1: # 右 for i in range(GRID_SIZE): for j in range(GRID_SIZE-2, -1, -1): if self.grid[i][j] != 0: col = j while col < GRID_SIZE-1 and self.grid[i][col+1] == 0: self.grid[i][col+1] = self.grid[i][col] self.grid[i][col] = 0 col += 1 moved = True if col < GRID_SIZE-1 and self.grid[i][col+1] == self.grid[i][col]: self.grid[i][col+1] *= 2 self.score += self.grid[i][col+1] if self.grid[i][col+1] == 258: self.won = True self.grid[i][col] = 0 moved = True elif direction == 2: # 下 for j in range(GRID_SIZE): for i in range(GRID_SIZE-2, -1, -1): if self.grid[i][j] != 0: row = i while row < GRID_SIZE-1 and self.grid[row+1][j] == 0: self.grid[row+1][j] = self.grid[row][j] self.grid[row][j] = 0 row += 1 moved = True if row < GRID_SIZE-1 and self.grid[row+1][j] == self.grid[row][j]: self.grid[row+1][j] *= 2 self.score += self.grid[row+1][j] if self.grid[row+1][j] == 258: self.won = True self.grid[row][j] = 0 moved = True elif direction == 3: # 左 for i in range(GRID_SIZE): for j in range(1, GRID_SIZE): if self.grid[i][j] != 0: col = j while col > 0 and self.grid[i][col-1] == 0: self.grid[i][col-1] = self.grid[i][col] self.grid[i][col] = 0 col -= 1 moved = True if col > 0 and self.grid[i][col-1] == self.grid[i][col]: self.grid[i][col-1] *= 2 self.score += self.grid[i][col-1] if self.grid[i][col-1] == 258: self.won = True self.grid[i][col] = 0 moved = True if moved: self.add_new_tile() self.check_game_over() return moved def check_game_over(self): """检查游戏是否结束""" # 检查是否有空位 for i in range(GRID_SIZE): for j in range(GRID_SIZE): if self.grid[i][j] == 0: return # 检查是否有可合并的相邻方块 for i in range(GRID_SIZE): for j in range(GRID_SIZE): # 检查右侧 if j < GRID_SIZE-1 and self.grid[i][j] == self.grid[i][j+1]: return # 检查下方 if i < GRID_SIZE-1 and self.grid[i][j] == self.grid[i+1][j]: return self.game_over = True def draw(self, screen): """绘制游戏界面""" # 绘制背景 screen.fill(BACKGROUND_COLOR) # 绘制标题 title = title_font.render("258游戏", True, (118, 110, 102)) screen.blit(title, (50, 30)) # 绘制分数面板 pygame.draw.rect(screen, SCORE_BG_COLOR, (WINDOW_WIDTH - 250, 30, 200, 80), border_radius=10) score_text = header_font.render(f"分数: {self.score}", True, TEXT_COLOR_LIGHT) high_score_text = header_font.render(f"最高分: {self.high_score}", True, TEXT_COLOR_LIGHT) screen.blit(score_text, (WINDOW_WIDTH - 240, 45)) screen.blit(high_score_text, (WINDOW_WIDTH - 240, 75)) # 绘制游戏网格 grid_rect = pygame.Rect(50, 150, GRID_SIZE * (TILE_SIZE + GRID_PADDING) + GRID_PADDING, GRID_SIZE * (TILE_SIZE + GRID_PADDING) + GRID_PADDING) pygame.draw.rect(screen, GRID_COLOR, grid_rect, border_radius=10) # 绘制所有方块 for i in range(GRID_SIZE): for j in range(GRID_SIZE): # 计算方块位置 x = 50 + j * (TILE_SIZE + GRID_PADDING) + GRID_PADDING y = 150 + i * (TILE_SIZE + GRID_PADDING) + GRID_PADDING # 绘制方块背景 value = self.grid[i][j] color = TILE_COLORS.get(value, (60, 58, 50)) # 默认颜色 pygame.draw.rect(screen, color, (x, y, TILE_SIZE, TILE_SIZE), border_radius=5) # 如果有数字,绘制数字 if value != 0: # 根据数字大小选择合适的字体 font = tile_font if value < 128 else large_tile_font text_color = TEXT_COLOR if value < 8 else TEXT_COLOR_LIGHT text = font.render(str(value), True, text_color) text_rect = text.get_rect(center=(x + TILE_SIZE // 2, y + TILE_SIZE // 2)) screen.blit(text, text_rect) # 绘制控制按钮 button_width = 200 button_height = 50 button_x = WINDOW_WIDTH - 250 button_y = 200 # 重置按钮 pygame.draw.rect(screen, BUTTON_COLOR, (button_x, button_y, button_width, button_height), border_radius=8) reset_text = header_font.render("重新开始", True, TEXT_COLOR_LIGHT) screen.blit(reset_text, (button_x + button_width//2 - reset_text.get_width()//2, button_y + button_height//2 - reset_text.get_height()//2)) # 绘制游戏状态 if self.won: overlay = pygame.Surface((WINDOW_WIDTH, WINDOW_HEIGHT), pygame.SRCALPHA) overlay.fill((255, 255, 255, 180)) screen.blit(overlay, (0, 0)) win_text = title_font.render("恭喜获胜!", True, (118, 110, 102)) screen.blit(win_text, (WINDOW_WIDTH//2 - win_text.get_width()//2, HEIGHT//2 - 50)) continue_text = header_font.render("按任意键继续游戏", True, (118, 110, 102)) screen.blit(continue_text, (WINDOW_WIDTH//2 - continue_text.get_width()//2, HEIGHT//2 + 20)) elif self.game_over: overlay = pygame.Surface((WINDOW_WIDTH, WINDOW_HEIGHT), pygame.SRCALPHA) overlay.fill((0, 0, 0, 180)) screen.blit(overlay, (0, 0)) game_over_text = title_font.render("游戏结束!", True, (255, 100, 100)) screen.blit(game_over_text, (WINDOW_WIDTH//2 - game_over_text.get_width()//2, HEIGHT//2 - 50)) restart_text = header_font.render("点击重新开始按钮", True, TEXT_COLOR_LIGHT) screen.blit(restart_text, (WINDOW_WIDTH//2 - restart_text.get_width()//2, HEIGHT//2 + 20)) # 绘制操作提示 controls_y = 400 controls = [ "游戏操作:", "↑ - 向上移动", "↓ - 向下移动", "← - 向左移动", "→ - 向右移动", "", "游戏目标:", "合并方块直到获得258!" ] for i, text in enumerate(controls): control_text = small_font.render(text, True, (118, 110, 102)) screen.blit(control_text, (button_x, controls_y + i * 25)) def main(): game = Game258() # 主游戏循环 while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() if event.type == pygame.KEYDOWN: if event.key == pygame.K_UP: game.move(0) elif event.key == pygame.K_RIGHT: game.move(1) elif event.key == pygame.K_DOWN: game.move(2) elif event.key == pygame.K_LEFT: game.move(3) elif event.key == pygame.K_r: game.reset() if event.type == pygame.MOUSEBUTTONDOWN: mouse_pos = pygame.mouse.get_pos() # 检查是否点击了重新开始按钮 button_x = WINDOW_WIDTH - 250 button_y = 200 button_width = 200 button_height = 50 if (button_x <= mouse_pos[0] <= button_x + button_width and button_y <= mouse_pos[1] <= button_y + button_height): game.reset() # 绘制游戏 game.draw(screen) pygame.display.flip() clock.tick(FPS) if __name__ == "__main__": main() ``` ## 游戏说明 ### 游戏目标 258游戏是2048的变体,目标是通过合并相同数字的方块,最终得到258或更高的数字。 ### 游戏规则 1. 游戏一个4×4的网格中进行 2. 每次移动所有方块会向指定方向滑动 3. 相同数字的方块碰撞时会合并为它们的和 4. 每次移动后会在空白位置随机生成一个新的方块(90%概率为2,10%概率为4) 5. 当网格被填满且无法移动时游戏结束 6. 当创建出258方块时获胜 ### 游戏操作 - **方向键↑**:向上移动方块 - **方向键↓**:向下移动方块 - **方向键←**:向左移动方块 - **方向键→**:向右移动方块 - **R键**:重新开始游戏 - 点击"重新开始"按钮:重新开始游戏 ### 游戏特性 1. 彩色方块系统:不同数字的方块有不同的颜色 2. 分数系统:合并方块获得分数 3. 最高分记录 4. 获胜和失败状态显示 5. 简洁明了的操作提示 ### 技术实现 1. 使用二维数组表示游戏网格状态 2. 实现了四个方向的移动逻辑 3. 使用字典管理不同数字方块的颜色 4. 实现了游戏结束检测算法 5. 使用Pygame实现图形界面
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值