【Linux游戏】人机对战五子棋——冷嘲热讽版(C + gtk编写)

cugdream cugdream 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
根据试玩情况看,电脑的棋力不是太弱,也不算强。开发环境是 gcc 4.1.1和gtk 2.0,操作系统是red hat 5虚拟机。有条件的朋友,可以玩玩看。
对文件进行简单说明:
makefile /* make文件 */
renju.c /* 绘制图形界面 */
rjFunction.c /* 后台运算处理 */
renju.h /* 头文件 */

主要流程是,renju.c绘制界面,当用户点击时,获取位置信息,转换为数组坐标信息(x1,y1),然后调用rjFunction.c的play(x1, y1, *x2, *y2)函数,当play( )函数返回1时,(*x2, *y2)保存了电脑走棋的数组坐标信息,由renju.c转换为位置信息并据此绘制电脑棋子。play()返回1,则玩家胜;返回2,则电脑胜;返回-1,应该是平局,呵呵。
rjFunction.c只包含了电脑运算需要的所有函数。renju.c则只包含图形信息。二者通过play()函数配合运行游戏。
renju.h则包含了定义的常量和函数声明,各个函数功能的说明也在此。

不完美之处有二。一是rjFunction.c里基本没写注释,主要是都是一些坐标的判断处理,注释想表达清晰不太容易。这样大家读起来会比较费劲。二是已知的还有两个bug未解决,一个是偶尔会出现玩家落子,电脑不落子,我估计运算正常,只是gtk未绘图造成的,解决办法是棋盘最小化一下,再点开就好了。gtk我不熟,现学现用而已。另一个是玩家2/3双连时,有一种情况未堵子,暂未解决,大家多玩几次就能碰到。



renju.h
#include <gtk/gtk.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define HUMAN 1 /* 玩 家 */
#define COMPUTER 2 /* 电 脑 */
#define EMPTY 3 /* 空 子 */
#define NUM 16 /* 棋盘行数 */
#define MAXSIZE 300 /* 字符数组 */
#define SIZE 28 /* 棋子空间 */
#define CMANSIZE (SIZE-10) /* 棋子尺寸 */
#define WINDOW_BORDER_WIDTH 10 /* 窗口空隙 */
#define DRAWING_AREA_WIDTH (NUM*SIZE+1) /* 棋盘宽度 */
#define DRAWING_AREA_HEIGHT (NUM*SIZE+1) /* 棋盘高度 */
#define LABELWIDTH DRAWING_AREA_WIDTH /* 标签宽度 */
#define LABELHEIGHT 20 /* 标签高度 */
#define WINWIDTH (DRAWING_AREA_WIDTH+20) /* 窗口高度 */
#define WINHEIGHT (DRAWING_AREA_HEIGHT+LABELHEIGHT+25)

#define CURTOPOS(x) (x/SIZE*SIZE+(SIZE-CMANSIZE)/2) /* 鼠标点击转换绘制棋子坐标 */
#define CURTOROW(x) (x/SIZE) /* 鼠标点击转换行数 */
#define ROWTOPOS(x) (x*SIZE+(SIZE-CMANSIZE)/2) /* 行数转换绘制棋子坐标 */

int play(int, int, int *, int *); /* 游戏接口 */
int isWin(int ); /* 判断获胜 */
int firstStep(int, int, int *, int *); /* 首步棋 */
int judge(int, int, int *, int *); /* 判断单行连子 */
int judgePoint(int, int , int, int , int , int *, int *);
int forcast(int, int, int *, int *); /* 预测双行连子 */
int findTwo(int, int, int, int, int, int *, int *); /* 辅助forcast */
int isIllegal(int , int , int ); /* 违反游戏规则 */


makefile
CFLAGS=`pkg-config --libs --cflags gtk+-2.0`

all: rjFunction.o renju.o renju

renju: renju.o rjFunction.o
gcc renju.o rjFunction.o -o renju $(CFLAGS)

renju.o: renju.c renju.h
gcc -c renju.c $(CFLAGS)

rjFunction.o: rjFunction.c renju.h
gcc -c rjFunction.c $(CFLAGS)

lei: lei.o
gcc lei.o -o lei $(CFLAGS)

lei.o: ./src/lei.c
gcc -c ./src/lei.c $(CFLAGS)

clean:
rm -f renju *.o

...全文

相关推荐

基于L inux的嵌入式五子棋游戏_ 6818开 发板五子棋,基于linux

**人机对弈算法**:五子棋游戏中的核心算法是实现人机对战的功能。

幽游白书207

tetris-gtk:Linux下的开源俄罗斯方块游戏

本文还有配套的精品资源,点击获取 简介:tetris-gtk是一款基于GTK+ 2.x图形库的开源俄罗斯方块游戏,为Linux用户带来经典的游戏体验。开发者保持游戏核心玩法的纯粹性,不加入多余功能,与Linux桌面环境的其他应用程序保持一致的外观和交互。作为一个开源项目,用户可以自由查看、修改和分发源代码,参与软件的发展。安装gtktetris-0.6.2b版本需解压并设置...

永远的12

GTK图形界面编程:用C语言实现Linux登录界面

在现代软件开发中,用户界面(UI)是用户与软件进行交互的桥梁,GTK(GIMP Toolkit)库作为一个强大的图形工具包,广泛用于Linux平台下的跨平台GUI开发。它提供了一套完整的控件,用于创建复杂的窗口和对话框,拥有高度的可定制性和良好的扩展性。回调函数是一个用户定义的函数,它由信号触发。在GTK中,当特定的事件发生时,GTK会调用相应的回调函数。用户必须提供这些函数的实现,并在信号与回调函数之间建立连接。

李多田

gtk五子棋——人机对战(内有代码解说文档和gtk文档)

标题中的“gtk五子棋——人机对战”是指使用GTK+库开发的一款五子棋游戏,其中包含人机对战的功能。GTK+是用于创建图形用户界面的跨平台库,广泛应用于Linux操作系统,同时也支持其他平台。

天米

Linux下的五子棋对战游戏

在Linux操作系统中,开发一款五子棋对战游戏是一项结合编程技术、图形用户界面设计以及人工智能算法的应用。本文将深入探讨这款"Linux下的五子棋对战游戏"所涉及的关键技术点。

ligaofeng007
评论 5
收藏 已收藏
分享
返回顶部
cugdream
Linux/Unix社区 23,224 成员 74,535 内容