用c写一个围棋游戏的程序代码
时间: 2023-12-21 19:07:30 浏览: 205
以下是一个基本的围棋游戏程序的代码示例,使用了C语言和SDL库:
```
#include <stdio.h>
#include <stdlib.h>
#include <SDL2/SDL.h>
#define SIZE 19
int stone[SIZE][SIZE]; // 棋盘状态,0表示空,1表示黑,2表示白
int turn = 1; // 当前回合,1表示黑方,2表示白方
SDL_Window *window;
SDL_Renderer *renderer;
// 初始化棋盘状态
void init_board() {
int i, j;
for (i = 0; i < SIZE; i++) {
for (j = 0; j < SIZE; j++) {
stone[i][j] = 0;
}
}
}
// 绘制棋盘
void draw_board() {
int i, j;
SDL_Rect rect;
rect.w = rect.h = 30;
SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); // 设置黑色
SDL_RenderClear(renderer); // 清空画布
SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255); // 设置白色
for (i = 0; i < SIZE; i++) {
for (j = 0; j < SIZE; j++) {
rect.x = i * 30 + 50;
rect.y = j * 30 + 50;
SDL_RenderDrawRect(renderer, &rect);
}
}
SDL_RenderPresent(renderer); // 显示画布
}
// 绘制棋子
void draw_stone(int x, int y) {
SDL_Rect rect;
rect.w = rect.h = 28;
rect.x = x * 30 + 51;
rect.y = y * 30 + 51;
if (stone[x][y] == 1) {
SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); // 设置黑色
SDL_RenderFillEllipse(renderer, &rect);
} else if (stone[x][y] == 2) {
SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255); // 设置白色
SDL_RenderFillEllipse(renderer, &rect);
}
SDL_RenderPresent(renderer); // 显示画布
}
// 判断落子是否合法
int is_valid_move(int x, int y) {
if (x < 0 || x >= SIZE || y < 0 || y >= SIZE) {
return 0;
}
if (stone[x][y] != 0) {
return 0;
}
return 1;
}
// 判断是否形成了气
int has_liberty(int x, int y) {
if (x > 0 && stone[x-1][y] == 0) {
return 1;
}
if (x < SIZE-1 && stone[x+1][y] == 0) {
return 1;
}
if (y > 0 && stone[x][y-1] == 0) {
return 1;
}
if (y < SIZE-1 && stone[x][y+1] == 0) {
return 1;
}
return 0;
}
// 判断是否可以吃掉对方棋子
void eat_stone(int x, int y) {
if (x > 0 && stone[x-1][y] == 3-turn && !has_liberty(x-1, y)) {
stone[x-1][y] = 0;
}
if (x < SIZE-1 && stone[x+1][y] == 3-turn && !has_liberty(x+1, y)) {
stone[x+1][y] = 0;
}
if (y > 0 && stone[x][y-1] == 3-turn && !has_liberty(x, y-1)) {
stone[x][y-1] = 0;
}
if (y < SIZE-1 && stone[x][y+1] == 3-turn && !has_liberty(x, y+1)) {
stone[x][y+1] = 0;
}
}
// 落子
void place_stone(int x, int y) {
stone[x][y] = turn;
eat_stone(x, y);
draw_stone(x, y);
}
// 切换回合
void next_turn() {
turn = 3 - turn; // 1变2,2变1
}
// 处理鼠标事件
void handle_events() {
SDL_Event event;
while (SDL_PollEvent(&event)) {
if (event.type == SDL_QUIT) {
exit(0);
}
if (event.type == SDL_MOUSEBUTTONDOWN) {
int x = (event.button.x - 50) / 30;
int y = (event.button.y - 50) / 30;
if (is_valid_move(x, y)) {
place_stone(x, y);
next_turn();
}
}
}
}
int main() {
SDL_Init(SDL_INIT_VIDEO);
window = SDL_CreateWindow("围棋", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
650, 650, SDL_WINDOW_SHOWN);
renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
init_board();
draw_board();
while (1) {
handle_events();
}
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
SDL_Quit();
return 0;
}
```
这个程序使用了SDL库来实现图形界面和鼠标事件处理。在主函数中,首先初始化SDL和窗口,然后初始化棋盘状态并绘制棋盘。接着进入一个无限循环,在每次循环中处理鼠标事件,如果检测到合法的落子,则落子并切换回合。当用户关闭窗口时,退出程序并释放相关资源。
阅读全文