- C C C语言三子棋的实现
一、前言
- 1、演示三子棋
- 1.三子棋如何玩以及如何胜利
- 2.三子棋实现情景的引入
- 1)打印棋盘
- 2)用什么打印呢?
- 3)头文件的引用与应当实现的功能
二、三子棋的具体实现
- 1.项目的创建
- 2.打印菜单选项
- 3.棋盘的初始化
- 4.玩家下棋
- 5.电脑下棋
- 6.判断胜负
- 7.game方法中和main的代码
三、最后的话
一、前言 1、演示三子棋
1.三子棋如何玩以及如何胜利 我们实现的初级三子棋可以达到,电脑和玩家在一个3x3的棋盘上完成对抗。
要玩一个游戏一定要实现可视化的窗口,所以三子棋也是这样我们应该先打印出一个棋盘让我们方便 *** 作。
结合我们现在所学的知识打印棋盘要把棋盘的整个框架存起来再通过循环的方式打印出来,这里我们用数组的方式将棋盘存储起来。
再利用循环遍历数组实现初始的棋盘。
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
#include
#include
#define ROWS 3 //这是行
#define COLS 3 //这是列
void initboard(char arr[ROWS][COLS],int row,int col);//将棋盘里的各个元素初始化
void print(char arr[ROWS][COLS], int row, int col);//实现打印函数
void peomove(char arr[ROWS][COLS],int row,int col);//人移动
void cmpmove(char arr[ROWS][COLS],int row,int col);//电脑移动
char win(char arr[ROWS][COLS],int row,int col);//判断谁赢了
二、三子棋的具体实现 1.项目的创建
首先我们可以分别创建 g a m e . c game.c game.c、 g a m e . h game.h game.h以及 t e s t . c test.c test.c,其中 g a m e . c game.c game.c用来写实现三子棋功能的代码, t e s t . c test.c test.c则是测试实现的功能, g a m e . h game.h game.h用来存放实现的函数引入到 t e s t . c test.c test.c中
2.打印菜单选项让玩家的游戏体验更好所以打印一个菜单让玩家来选择并且通过 m a i n main main调用
void meau() {
printf("*************************\n");
printf("*******1、Play *****\n");
printf("*******0、Exit *****\n");
printf("*************************\n");
}
int main() {
int input = 0;
meau();
do {
printf("请选择:>");
scanf("%d", &input);
switch (input) {
case PLAY:
game();
break;
case EXIT:
break;
default:
meau();
printf("输入错误,重新输入!\n");
}
}while(input);
}
这里是一步步来所以完全的代码在最后
3.棋盘的初始化 当玩家选择1时即选择玩游戏,我们要初始化棋盘就要通过game来调用实现其他的功能并且打印出棋盘
//将数组初始化
void initboard(int arr[ROWS][COLS],int row,int col) {
int i = 0;//控制行
int j = 0;//控制列
for (i = 0; i < row; i++) {
for (j = 0; j < col; j++) {
arr[i][j] = ' ';//把这个位置初始化为空格 当下棋时再改为其他的
}
}
}
//打印数组
void print(int arr[ROWS][COLS],int row,int col) {
int i = 0;
int j = 0;
for (i = 0; i < row; i++) {
for (j = 0; j < col; j++) {
printf("%c ", arr[i][j]); //这里我们先打印下棋的位置(空格)
if (j != col - 1) { //再打印|因为最后一个不需要打印因此加入一个条件判断语句
printf("|");
}
}
printf("\n");
for (j = 0; j < col; j++) { //为了分清行与列我们再加一个循环打印分割行
printf("--");
if (j != col - 1) {
printf("|");
}
}
printf("\n");
}
}
到此位置我们就可以打印出棋盘了现在要的就是玩家和电脑互相在棋盘上下棋。
然后实现上面的功能也很简单就是把要下棋的位置原本存在数组里面是’ ‘(空格)改为’*'然后再打印即可
//玩家移动
void peomove(int arr[ROWS][COLS], int row, int col) {
printf("该玩家移动\n");
int x, y = 0;
printf("请选择要下的位置:>");//让玩家选择下棋的位置
scanf("%d %d", &x, &y); //x为行 y为列
while (1) {
if (x > row || y > col) {
printf("输入的位置有误重新输入:>");
scanf("%d %d", &x, &y);
}
else {
if (hav(arr, row, col, x, y) == 0) {
printf("该位置已经下过了!\n");
printf("请重新输入:>");
scanf("%d %d", &x, &y);
}
else {
arr[x - 1][y - 1] = '*';
break;
}
}
}
}
需要注意的是我们要判断输入的x和y是否是在棋盘范围内的如果超了的话就让玩家再次输入,同时判断该位置是否已经下过棋了然后我们写一个方法
//判断该位置是否已经有棋子
//如果有我们返回-1
//没有返回1
static int hav(int arr[ROWS][COLS], int row, int col, int x,int y) {
int i = 0;
int j = 0;
if (arr[x - 1][y - 1] != ' ') {
return 0;
}
return 1;
}
因为该方法不用对用户体现所以我们可以用static修饰一下
5.电脑下棋要实现电脑下棋其实也很简单我们可以用到
r
a
n
d
(
)
rand()
rand()这个函数让他的1-3之间随机生两个数分别控制行和列即可。
//电脑移动
void cmpmove(int arr[ROWS][COLS], int row, int col) {
int x = 0;
int y = 0;
int i = 0;
int j = 0;
printf("电脑移动\n");
srand((unsigned int)time(NULL));
x = rand() % row + 1;//%几则那个数就不可能取到大于row,只能在0-row范围内我们的行数是3所以只能为0-2加1就成了1-3
y = rand() % col + 1;
//在实现下棋之前,我们应该要判断该位置是否已经下过所以
while (1) {
if (hav(arr, row, col, x, y) == 0) {
printf("该位置已经下过了!\n");
x = rand() % row + 1;
y = rand() % col + 1;
}
else {
arr[x - 1][y - 1] = '#'; //电脑下的棋子我们用#来表示
break;
}
}
}
通过rand函数就可以很好的实现电脑走棋
6.判断胜负当电脑|玩家的棋子为连续的三个时就胜利
char win(char arr[ROWS][COLS], int row, int col) {
int i = 0;
int j = 0;
int t = 0;
int x = 0;
int count = 0;
if (arr[0][0] == arr[1][0] && arr[1][0] == arr[2][0] && arr[0][0] != ' ') {
if (arr[0][0] == '*') {
return 'p';
}
if (arr[0][0] == '#') {
return 'c';
}
}
if (arr[0][1] == arr[1][1] && arr[1][1] == arr[2][1] && arr[1][1] != ' ') {
if (arr[0][0] == '*') {
return 'p';
}
if (arr[0][0] == '#') {
return 'c';
}
}
if (arr[0][0] == arr[0][1] && arr[0][1] == arr[0][2] && arr[0][0] != ' ') {
if (arr[0][0] == '*') {
return 'p';
}
if(arr[0][0]=='#') {
return 'c';
}
}
if (arr[1][0] == arr[1][1] && arr[1][1] == arr[1][2] && arr[1][0] != ' ') {
if (arr[1][0] == '*') {
return 'p';
}
if(arr[1][0] == '#') {
return 'c';
}
}
if (arr[2][0] == arr[2][1] && arr[2][1] == arr[2][2] && arr[2][2] != ' ') {
if (arr[2][0] == '*') {
return 'p';
}
if (arr[2][0] == '#') {
return 'c';
}
}
if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[1][1] != ' ') {
if (arr[0][0] == '*') {
return 'p';
}
if (arr[0][0] == '#') {
return 'c';
}
}
if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[1][1] != ' ') {
if (arr[2][0] == '*') {
return 'p';
}
if (arr[2][0] == '#') {
return 'c';
}
}
if(arr[0][0]==arr[0][1])
for (i = 0; i < row; i++) {
for (j = 0; j < col; j++) {
if (arr[i][j] != ' ') {
count++;
}
}
}
if (count == 9) {
return 'j';
}
return 'q';
}
7.game方法中和main的代码
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
enum options {
EXIT,
PLAY
};
void meau() {
printf("*************************\n");
printf("*******1、Play *****\n");
printf("*******0、Exit *****\n");
printf("*************************\n");
}
void game() {
int init = 0;
char arr[ROWS][COLS];
//初始化棋盘中的元素
initboard(arr,ROWS,COLS); //传入棋盘对应的元素
//打印棋盘
print(arr, ROWS, COLS);
while (1) {
//玩家移动
peomove(arr, ROWS, COLS);
if ((win(arr, ROWS, COLS)) == 'j') {
initboard(arr, ROWS, COLS);//平均初始化棋盘
printf("棋盘已被初始化!\n");
init = 1;
}
else if ((win(arr, ROWS, COLS)) == 'p') {
printf("恭喜你,你赢了!\n");
break;
}
if (init == 1) {
init = 0;
}
else {
print(arr, ROWS, COLS);
}
//电脑移动
cmpmove(arr, ROWS, COLS);
if ((win(arr, ROWS, COLS)) == 'j') {
initboard(arr, ROWS, COLS);//平均初始化棋盘
printf("棋盘已被初始化!\n");
init = 1;
}
else if ((win(arr, ROWS, COLS)) == 'c') {
printf("你输给了电脑!\n");
break;
}
if (init == 1) {
init = 0;
}
else {
print(arr, ROWS, COLS);
}
}
}
int main() {
int input = 0;
do {
meau();
printf("请选择:>");
scanf("%d", &input);
switch (input) {
case PLAY:
game();
break;
case EXIT:
break;
default:
/*meau();*/
printf("输入错误,重新输入!\n");
}
}while(input);
}
三、最后的话
还有许多不足的地方以及可以改进的地方欢迎大家指出
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)