- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章C语言实现简单的三子棋小游戏由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
学习完数组就能用C语言写出的简单小游戏:
编译器使用的为VS2013 。
代码分为三个部分 。
1、头文件 game.h 2、源文件 game.c 用来存放游戏中所有的函数 3、源文件 test.c 用来存放游戏的主题部分 。
代码如下:
game.h部分 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 3
#define COL 3
//初始化棋盘
void
InitBoard(
char
board[ROW][COL],
int
row,
int
col);
//打印棋盘
void
DisplayBoard(
char
board[ROW][COL],
int
row,
int
col);
//玩家走
void
PlayerMove(
char
board[ROW][COL],
int
row,
int
col);
//电脑走
void
ComputerMove(
char
board[ROW][COL],
int
row,
int
col);
//判断输赢 此时函数有返回值了 不能再用void了,返回值为字符要用char
char
CheckWin(
char
board[ROW][COL],
int
row,
int
col);
|
game.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
|
#include"game.h"
void
InitBoard(
char
board[ROW][COL],
int
row,
int
col)
//将数组全部初始化为空格
{
int
i = 0;
for
(i = 0; i < row; i++)
{
int
j = 0;
for
(j = 0; j < col; j++)
{
board[i][j] =
' '
;
}
}
}
void
DisplayBoard(
char
board[ROW][COL],
int
row,
int
col)
{
int
i = 0;
for
(i = 0; i < row; i++)
{
int
j = 0;
for
(j = 0; j < col; j++)
{
printf
(
" %c "
, board[i][j]);
if
(j<col-1)
//一行三个空格只打印两个'| '即可
printf
(
"|"
);
}
printf
(
"\n"
);
if
(i < row - 1)
//一列三个空格也只需要打印两排‘ --- '即可
{
for
(j = 0; j < col; j++)
{
printf
(
"---"
);
if
(j < col - 1)
printf
(
"|"
);
//同理一行三个空格只打印两个' | '即可
}
printf
(
"\n"
);
}
}
}
void
PlayerMove(
char
board[ROW][COL],
int
row,
int
col)
{
int
x;
//横坐标
int
y;
//纵坐标
while
(1)
{
printf
(
"请输入坐标->\n"
);
scanf
(
"%d%d"
, &x, &y);
if
(x > 0 && x <= row &&y > 0 && y <= col)
//判断坐标的合法性,横纵坐标是否在1到3之间
{
if
(board[x - 1][y - 1] !=
' '
)
{
printf
(
"坐标被占用,请重新输入\n"
);
}
else
{
board[x-1][y-1] =
'*'
;
break
;
//玩家落子后循环跳出
}
}
else
{
printf
(
"坐标非法,请重新输入\n"
);
}
}
}
void
ComputerMove(
char
board[ROW][COL],
int
row,
int
col)
{
printf
(
"电脑走\n"
);
while
(1)
{
int
x =
rand
() % row;
//rand()为获得随机值得函数,获取的随机值模row即3就可以得到在0到2之间的一个随机值
int
y =
rand
() % col;
//纵坐标同理
if
(board[x][y] ==
' '
)
{
board[x][y] =
'#'
;
break
;
//电脑落子后跳出循环
}
}
}
int
IsFull(
char
board[ROW][COL],
int
row,
int
col)
{
int
i = 0;
int
j = 0;
for
(i = 0; i < row; i++)
{
for
(j = 0; j < col; j++)
{
if
(board[i][j] ==
' '
)
{
return
0;
}
}
}
return
1;
}
char
CheckWin(
char
board[ROW][COL],
int
row,
int
col)
//判断赢得情况,返回值为字符
//玩家赢返回值为 * //电脑赢时返回值为 #
//平局时返回值为 Q //仍可以下棋且为分胜负时返回值为 C
{
int
i = 0;
for
(i = 0; i < row; i++)
//一行相同时
{
if
(board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[0][i] !=
' '
)
{
return
board[i][0];
//返回值为board[i][0]不用考虑是返回 * 还是 #两者都可以返回
}
}
for
(i = 0; i < col; i++)
//一列相同时
{
if
(board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] !=
' '
)
{
return
board[0][i];
}
}
//对角线相同时的两种情况
if
(board[0][0] == board[1][1] && board[1][1] == board[2][2] &&board[1][1] !=
' '
)
{
return
board[1][1];
}
if
(board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] !=
' '
)
{
return
board[1][1];
}
//棋盘全部下满仍未分胜负的情况
if
(IsFull(board, row, col) == 1)
//IsFull为判断棋盘是否全满时,当全满时返回值为1,未满时为0
{
return
'Q'
;
}
return
'C'
;
//返回值为C游戏继续
}
|
test.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
|
#include"game.h"
void
menu()
{
printf
(
"**********************\n"
);
printf
(
"****** 1.PIAY ******\n"
);
printf
(
"****** 2.EXIT ******\n"
);
printf
(
"**********************\n"
);
}
void
game()
{
char
ret;
char
board[ROW][COL];
//数据是一个二维数组
InitBoard(board, ROW, COL);
//初始化棋盘,将棋盘全初始化为空格
DisplayBoard(board, ROW, COL);
while
(1)
{
PlayerMove(board, ROW, COL);
//棋手下棋
ret = CheckWin(board, ROW, COL);
if
(ret !=
'C'
)
{
break
;
}
DisplayBoard(board, ROW, COL);
//打印棋盘
ComputerMove(board, ROW, COL);
//电脑移动
ret = CheckWin(board, ROW, COL);
if
(ret !=
'C'
)
{
break
;
}
DisplayBoard(board, ROW, COL);
}
if
(ret ==
'*'
)
{
printf
(
"玩家获胜\n"
);
}
else
if
(ret ==
'#'
)
{
printf
(
"电脑获胜\n"
);
}
else
if
(ret ==
'Q'
)
{
printf
(
"未分胜负,平局\n"
);
}
DisplayBoard(board, ROW, COL);
}
int
main()
{
srand
((unsigned
int
)
time
(NULL));
//srand 函数和rand 函数配合使用可生成一个随机值
int
input = 0;
do
{
menu();
//打印菜单
printf
(
"请输入: 1->开始游戏 0->退出游戏\n"
);
scanf
(
"%d"
, &input);
switch
(input)
{
case
1:
game();
//三子棋游戏
break
;
case
0:
printf
(
"退出游戏\n"
);
break
;
default
:
printf
(
"输入错误,请重新输入.\n"
);
break
;
}
}
while
(input);
return
0;
}
|
注: srand函数是随机数发生器的初始化函数,srand和rand()函数配合使用产生伪随机数序列,但如果只是这两个函数结合则程序每一次运行产生的随机数将会相同,也就达不到随机的目的了,因此在srand函数中要添加一个随时在变动的值,而在计算机中时间是在不断变化的,因此可以用time()函数读取系统时间(此处涉及到一个概念叫:时间戳),time函数中直接用空指针NULL即可,这样就可以达到生成随机数的目的了.
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.
原文链接:https://blog.csdn.net/m0_52089596/article/details/114181721 。
最后此篇关于C语言实现简单的三子棋小游戏的文章就讲到这里了,如果你想了解更多关于C语言实现简单的三子棋小游戏的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在努力实现以下目标, 假设我有字符串: ( z ) ( A ( z ) ( A ( z ) ( A ( z ) ( A ( z ) ( A ) ) ) ) ) 我想编写一个正则
给定: 1 2 3 4 5 6
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
大家好,我卡颂。 Svelte问世很久了,一直想写一篇好懂的原理分析文章,拖了这么久终于写了。 本文会围绕一张流程图和两个Demo讲解,正确的食用方式是用电脑打开本文,跟着流程图、Demo一
身份证为15位或者18位,15位的全为数字,18位的前17位为数字,最后一位为数字或者大写字母”X“。 与之匹配的正则表达式: ?
我们先来最简单的,网页的登录窗口; 不过开始之前,大家先下载jquery的插件 本人习惯用了vs2008来做网页了,先添加一个空白页 这是最简单的的做法。。。先在body里面插入 <
1、MySQL自带的压力测试工具 Mysqlslap mysqlslap是mysql自带的基准测试工具,该工具查询数据,语法简单,灵活容易使用.该工具可以模拟多个客户端同时并发的向服务器发出
前言 今天大姚给大家分享一款.NET开源(MIT License)、免费、简单、实用的数据库文档(字典)生成工具,该工具支持CHM、Word、Excel、PDF、Html、XML、Markdown等
Go语言语法类似于C语言,因此熟悉C语言及其派生语言( C++、 C#、Objective-C 等)的人都会迅速熟悉这门语言。 C语言的有些语法会让代码可读性降低甚至发生歧义。Go语言在C语言的
我正在使用快速将 mkv 转换为 mp4 ffmpeg 命令 ffmpeg -i test.mkv -vcodec copy -acodec copy new.mp4 但不适用于任何 mkv 文件,当
我想计算我的工作簿中的工作表数量,然后从总数中减去特定的工作表。我错过了什么?这给了我一个对象错误: wsCount = ThisWorkbook.Sheets.Count - ThisWorkboo
我有一个 perl 文件,用于查看文件夹中是否存在 ini。如果是,它会从中读取,如果不是,它会根据我为它制作的模板创建一个。 我在 ini 部分使用 Config::Simple。 我的问题是,如果
尝试让一个 ViewController 通过标准 Cocoa 通知与另一个 ViewController 进行通信。 编写了一个简单的测试用例。在我最初的 VC 中,我将以下内容添加到 viewDi
我正在绘制高程剖面图,显示沿路径的高程增益/损失,类似于下面的: Sample Elevation Profile with hand-placed labels http://img38.image
嗨,所以我需要做的是最终让 regStart 和 regPage 根据点击事件交替可见性,我不太担心编写 JavaScript 函数,但我根本无法让我的 regPage 首先隐藏。这是我的代码。请简单
我有一个非常简单的程序来测量一个函数花费了多少时间。 #include #include #include struct Foo { void addSample(uint64_t s)
我需要为 JavaScript 制作简单的 C# BitConverter。我做了一个简单的BitConverter class BitConverter{ constructor(){} GetBy
已关闭。这个问题是 not reproducible or was caused by typos 。目前不接受答案。 这个问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-top
我是 Simple.Data 的新手。但我很难找到如何进行“分组依据”。 我想要的是非常基本的。 表格看起来像: +________+ | cards | +________+ | id |
我现在正在开发一个 JS UDF,它看起来遵循编码。 通常情况下,由于循环计数为 2,Alert Msg 会出现两次。我想要的是即使循环计数为 3,Alert Msg 也只会出现一次。任何想法都
我是一名优秀的程序员,十分优秀!