鱼C论坛

 找回密码
 立即注册

地图设计

  [复制链接]
发表于 2024-10-15 16:17:34 | 显示全部楼层
卷帘红尘亦爱她 发表于 2024-10-15 16:17
@FishC 用c++使用opengl完成设计一款2D的小游戏,数独 ...


好的,设计一个简单的2D数独小游戏可以分为以下几个步骤:

### 1. 环境设置

- **安装GLFW和GLAD**:确保你的开发环境中已经安装了GLFW(用于创建窗口和处理用户输入)和GLAD(用于管理OpenGL函数的指针)。

### 2. 初始化OpenGL
#include <glad/glad.h>
#include <GLFW/glfw3.h>

void framebuffer_size_callback(GLFWwindow* window, int width, int height) {
    glViewport(0, 0, width, height);
}

int main() {
    if (!glfwInit()) {
        return -1;
    }

    GLFWwindow* window = glfwCreateWindow(800, 600, "Sudoku Game", nullptr, nullptr);
    if (!window) {
        glfwTerminate();
        return -1;
    }

    glfwMakeContextCurrent(window);
    glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);

    if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) {
        return -1;
    }

    glViewport(0, 0, 800, 600);

    while (!glfwWindowShouldClose(window)) {
        glClear(GL_COLOR_BUFFER_BIT);

        // 绘制和输入处理写在这里

        glfwSwapBuffers(window);
        glfwPollEvents();
    }

    glfwTerminate();
    return 0;
}

### 3. 绘制数独板

- 创建一个二位数组表示数独初始状态和用户输入。
- 使用OpenGL绘制网格和数字。

### 4. 处理用户输入

- **鼠标交互**:用鼠标选择网格。
- **键盘交互**:键盘输入数字。

### 5. 游戏逻辑

- 检查用户输入的有效性(例如,确保输入的数字在行、列和3x3小格子中唯一)。
- 实现胜利机制,当数独板完全正确填充时给出提示。

### 6. 代码实战

以下是一些OpenGL和C++伪代码,用于实现数独逻辑和界面:
int sudokuBoard[9][9] = { /* 初始数独板,0表示空格 */ };

// 鼠标点击识别(按下左键)
void mouse_callback(GLFWwindow* window, int button, int action, int mods) {
    if (button == GLFW_MOUSE_BUTTON_LEFT && action == GLFW_PRESS) {
        double xpos, ypos;
        glfwGetCursorPos(window, &xpos, &ypos);
        
        // 转换为网格坐标
        int gridX = static_cast<int>(xpos / (800 / 9)); // 假设窗口宽800
        int gridY = static_cast<int>(ypos / (600 / 9)); // 假设窗口高600
    }
}

// 键盘输入识别
void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods) {
    if (action == GLFW_PRESS) {
        // 检查输入键与游戏逻辑相结合
        if (key >= GLFW_KEY_1 && key <= GLFW_KEY_9) {
            int num = key - GLFW_KEY_0;
            // 更新选中单元格的值
        }
    }
}

// 主循环中加入
glfwSetMouseButtonCallback(window, mouse_callback);
glfwSetKeyCallback(window, key_callback);

这个框架提供了基本的条目,你可据此展开。需要将更多的游戏逻辑、用户界面、输入响应以及胜利检测等功能加入代码中。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-15 16:22:03 | 显示全部楼层
@FishC 用基础的代码实现数独固定,输出整体代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-10-15 16:22:13 | 显示全部楼层
卷帘红尘亦爱她 发表于 2024-10-15 16:22
@FishC 用基础的代码实现数独固定,输出整体代码


实现一个简单的数独求解问题,你可以使用回溯算法。以下是一个基础的 Python 实现:
def print_board(board):
    for row in board:
        print(" ".join(str(num) for num in row))

def find_empty(board):
    for i in range(9):
        for j in range(9):
            if board[i][j] == 0:  # 0 表示空
                return i, j
    return None

def is_valid(board, num, pos):
    row, col = pos
    
    # 检查行
    if num in board[row]:
        return False

    # 检查列
    if num in [board[i][col] for i in range(9)]:
        return False

    # 检查3x3方格
    box_x = row // 3
    box_y = col // 3
    for i in range(box_x*3, box_x*3 + 3):
        for j in range(box_y*3, box_y*3 + 3):
            if board[i][j] == num:
                return False

    return True

def solve_sudoku(board):
    empty = find_empty(board)
    if not empty:  # 没有空位置,求解成功
        return True
    else:
        row, col = empty

    for num in range(1, 10):
        if is_valid(board, num, (row, col)):
            board[row][col] = num

            if solve_sudoku(board):
                return True

            board[row][col] = 0  # 重置

    return False

# 示例数独棋盘
sudoku_board = [
    [5, 3, 0, 0, 7, 0, 0, 0, 0],
    [6, 0, 0, 1, 9, 5, 0, 0, 0],
    [0, 9, 8, 0, 0, 0, 0, 6, 0],
    [8, 0, 0, 0, 6, 0, 0, 0, 3],
    [4, 0, 0, 8, 0, 3, 0, 0, 1],
    [7, 0, 0, 0, 2, 0, 0, 0, 6],
    [0, 6, 0, 0, 0, 0, 2, 8, 0],
    [0, 0, 0, 4, 1, 9, 0, 0, 5],
    [0, 0, 0, 0, 8, 0, 0, 7, 9]
]

if solve_sudoku(sudoku_board):
    print_board(sudoku_board)
else:
    print("无解")

这个代码定义了一个数独求解函数 `solve_sudoku`,通过回溯算法尝试填充空白位置,直到找到一个完整的解决方案。希望这能帮到你!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 7 天前 | 显示全部楼层
@FishC 用c++实现1.实现合并排序算法。要排序的整型数组元素可以用随机数生成器生成,运行程序,分别记录对十万,一百万,五千万,一千万个数据排序所用的时间,列出表格显示统计出来的时间。并单独显示一个100个数据的排序结果。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 7 天前 | 显示全部楼层
卷帘红尘亦爱她 发表于 2024-10-16 14:01
@FishC 用c++实现1.实现合并排序算法。要排序的整型数 ...


好的,下面是一个用 C++ 实现的合并排序算法,并记录对不同数量元素进行排序的时间。

首先,确保你有一个随机数生成器用来填充数组。然后是合并排序的实现和性能测试:
#include <iostream>
#include <vector>
#include <ctime>
#include <cstdlib>
#include <algorithm> // for std::copy
#include <iomanip>   // for std::setw

// 合并两个子数组
void merge(std::vector<int>& array, int left, int mid, int right) {
    int n1 = mid - left + 1;
    int n2 = right - mid;

    std::vector<int> L(n1), R(n2);

    for(int i = 0; i < n1; ++i)
        L[i] = array[left + i];
    for(int i = 0; i < n2; ++i)
        R[i] = array[mid + 1 + i];

    int i = 0, j = 0, k = left;
    while(i < n1 && j < n2) {
        if(L[i] <= R[j]) {
            array[k] = L[i];
            i++;
        } else {
            array[k] = R[j];
            j++;
        }
        k++;
    }

    while(i < n1) {
        array[k] = L[i];
        i++;
        k++;
    }

    while(j < n2) {
        array[k] = R[j];
        j++;
        k++;
    }
}

// 合并排序
void mergeSort(std::vector<int>& array, int left, int right) {
    if(left < right) {
        int mid = left + (right - left) / 2;

        mergeSort(array, left, mid);
        mergeSort(array, mid + 1, right);
        merge(array, left, mid, right);
    }
}

// 生成随机数组
std::vector<int> generateRandomArray(int size) {
    std::vector<int> array(size);
    for (int i = 0; i < size; ++i) {
        array[i] = rand() % 100000;
    }
    return array;
}

// 测试排序性能
void testSortPerformance(int size) {
    std::vector<int> array = generateRandomArray(size);
    clock_t start = clock();
    mergeSort(array, 0, size - 1);
    clock_t end = clock();
    std::cout << "Size: " << std::setw(10) << size 
              << " Time: " << std::setw(10) << static_cast<double>(end - start) / CLOCKS_PER_SEC << " seconds" << std::endl;
}

int main() {
    srand(time(0));  // 初始化随机数种子

    // 测试不同大小的数组
    std::cout << "Merge Sort Performance:\n";
    testSortPerformance(100000);
    testSortPerformance(1000000);
    testSortPerformance(5000000);
    testSortPerformance(10000000);

    // 排序100个数据,并输出结果
    std::vector<int> smallArray = generateRandomArray(100);
    mergeSort(smallArray, 0, smallArray.size() - 1);
    std::cout << "\nSorted 100 elements:\n";
    for (int num : smallArray) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    return 0;
}

### 说明:
1. **合并排序**:代码实现了基本的合并排序算法,时间复杂度为 O(n log n)。
2. **随机数生成**:使用`rand()`来生成随机数组。
3. **性能测试**:通过 `clock()` 函数测量排序时间,并在控制台中输出不同数据量的排序时间。
4. **输出结果**:在最后输出了一个100个元素的已排序数组。

你可以直接在你的 C++ 开发环境中使用这个代码,编译并运行,注意随机数的 seed 初始化以获得不同数据。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-23 02:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表