纯C语言实现五子棋

2025-05-27 0 72

正在考虑增加一个MFC界面。不是人机对战的。

五子棋.c

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

234

235

236

237

238

239

240

241

242

243

244

245

246

247

248

249

250

251

252

253

254

255

256

257

258

259

260

261

262

263

264

265

266

267
//date 2014年7月7日09:53:24

//willows

//五子棋

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

#include <stdlib.h>

#include <assert.h>

//棋盘初始化函数

//Chessboard棋盘数组,ln=棋盘大小,成功返回Chessboard,不成功NULL

void init_Chessboard(char Chessboard[][7], int ln)

{

if ((Chessboard != NULL) && (ln>0)){

int i = 0, j = 0;

for (i = 0; i<ln; ++i){

for (j = 0; j<ln; ++j){

Chessboard[i][j] = '\\t';

}

}

// return Chessboard;

}

// return NULL;

}

//显示棋盘函数

void show_Chessboard(char Chessboard[][7], int ln)

{

assert((Chessboard != NULL) && (ln > 0));

int i = 0, j = 0;

for (i = 0; i<ln; ++i){

putchar('\\t');

putchar(i + '0');

}//end for1

putchar('\\n');

putchar('\\n');

for (i = 0; i<ln; ++i){

putchar(i + '0');

for (j = 0; j<ln; ++j){

if ('\\t' == Chessboard[i][j]){

putchar(Chessboard[i][j]);

}

else

{

putchar('\\t');

putchar(Chessboard[i][j]);

}

}

putchar('\\n');

putchar('\\n');

}//end for2

}

//棋子下子函数

//下子成功返回1,不成功返回0

int play(char Chessboard[][7], int ln, int x, int y, char ChessPieces)

{

assert(Chessboard); //ChessPieces=NULL跳出

if ((x<ln) && (y<ln) && (x >= 0) && (y >= 0)){

if ('\\t' == Chessboard[x][y]){

Chessboard[x][y] = ChessPieces;

return 1; //成功

}

else

{

return 0;

}//end if2

}//end if1

return 0;

}

//满盘判断

//棋盘满了判断//满了就返回-1

int full_Chess(char Chessboard[][7], int ln)

{

int i = 0, j = 0;

for (i = 0; i<ln; ++i){

for (j = 0; j<ln; ++j){

if ('\\t' == Chessboard[i][j]){

return 0; //棋盘未满

}//end if

}//end for j

}//end for i

return 1;//棋盘满了

}

//是否连成五子线判断函数

//Chessboard=棋盘数组,ln=棋盘宽度,(XS,YS)方向判断起点坐标,(dx,dy)方向增量标记

//连成线返回1,没有返回0

int judga_line(char Chessboard[][7], int ln, int XS, int YS, int dx, int dy)

{

assert((Chessboard != NULL) && (ln > 0));

if((XS <ln) && (YS<ln) //起点坐标在棋盘内

&& (XS >=0) && (YS >=0)

&& (dx != 0 || dy != 0)) //坐标增量不为同时0

{

if (((XS + dx * 4) > ln) || ((XS + dx * 4)<0) || //判断终点坐标

((YS + dy * 4)>ln) || ((YS + dy * 4) < 0) || //在棋盘外

('\\t' == Chessboard[XS][YS]))

{

return 0; //不在棋盘内,或者起点是没下子

}

else

{

int i = 0;

for (i = 1; i < 5; ++i){

if (Chessboard[XS][YS] != Chessboard[XS + (dx * i)][YS + (dy * i)])

{

return 0; //如果不是连续5个一样的

}//end if3

}//end for1

return 1; //五个都一样,且都在棋盘内

}//end if 2

}

return 0; //其他情况

}

//裁判函数

//Chessboard 棋盘数组,ln=棋盘宽度

//赢了返回1,否则返回0

int judga(char Chessboard[][7], int ln)

{

assert((NULL != Chessboard) && (ln>0));

int i = 0, j = 0;

//纵向成五子连线判断

for (i = 0; i<(ln - 4); ++i){

for (j = 0; j<ln; ++j){

if (judga_line(Chessboard, ln, i, j, 1, 0)){

return 1;

}

}//end for_j

}//end for_i

//横向成五子连线判断

for (i = 0; i<ln; ++i){

for (j = 0; j<(ln - 4); ++j){

if (judga_line(Chessboard, ln, i, j, 0, 1)){

return 1;

}

}//end for_j

}//end for_i

//左上到右下成五子连线判断

for (i = 0; i<(ln - 4); ++i){

for (j = 0; j<(ln - 4); ++j){

if (judga_line(Chessboard, ln, i, j, 1, 1)){

return 1;

}

}//end for_j

}//end for_i

//左下到右上成五子连线判断

for (i = ln-1; i>(ln-4); --i){

for (j = 0; j <(ln - 4); ++j){

if (judga_line(Chessboard, ln, i, j, -1, 1)){

return 1;

}

}//end for_j

}//end for_i

return 0; //没能赢

}

//主函数

int main()

{

char CB[7][7];

char nameA[50] = "玩家A";

char nameB[50] = "玩家B";

int x = -1, y = -1;

//初始化

init_Chessboard(CB, 7);

printf("请输入玩家A的名字:");

scanf("%s", nameA);

printf("请输入玩家B的名字:");

scanf("%s", nameB);

//显示棋盘

show_Chessboard(CB, 7);

while (1){

//判断是否棋盘已满

if (full_Chess(CB, 7)){

puts("\\n棋盘已满,下次再战!");

break; //跳出最外层while

}//end if

//玩家A下子

while (1){

printf("\\n请玩家 %s 下子 @\\n", nameA);

printf("棋子行坐标X=");

scanf("%d", &x);

printf("棋子列坐标Y=");

scanf("%d", &y);

if (play(CB, 7, x, y, '@')){ //@ ascii=64

break; //下子成功

}

else

{

puts("下子失败,请重新选定位置下子");

continue; //下子不成功,重新下子

}//end if

}//end while A

//显示棋盘

show_Chessboard(CB, 7);

//判断玩家A是否胜利

if (judga(CB, 7)){

printf("\\n恭喜玩家 %s 成功取得胜利!!鲜花\\n", nameA);

getchar();

getchar();

break; //跳出最外层while

}//不用下了

//玩家B下子

while (1){

printf("\\n请玩家 %s 下子 O\\n", nameB);

printf("棋子行坐标X=");

scanf("%d", &x);

printf("棋子列坐标Y=");

scanf("%d", &y);

if ((play(CB, 7, x, y, 'O'))){ //O ascii=79

break; //下子成功

}

else

{

puts("下子失败,请重新选定位置下子");

continue; //下子不成功,重新下子

}//end if

}//end while B

//显示棋盘

show_Chessboard(CB, 7);

//判断玩家B是否胜利

if (judga(CB, 7)){

printf("\\n恭喜玩家 %s 成功取得胜利!! 鲜花\\n", nameA);

getchar();

getchar();

break; //跳出最外层while

}//不用下了

}

return 0;

}

以上所述就是本文的全部内容了,希望大家能够喜欢。

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 纯C语言实现五子棋 https://www.kuaiidc.com/75665.html

相关文章

发表评论
暂无评论