三子棋是一种受众比较广泛的一种传统民俗类游戏,三字棋又名井字棋或者九宫棋。这篇博客主要介绍的是三子棋的C语言实现。
目标:
打印出类似棋盘,并实现玩家与人机的博弈。
思路:
1.打印菜单。
void menu()
{
printf("****************************\n");
printf("******* 1. 开始游戏 *******\n");
printf("******* 0. 退出游戏 *******\n");
printf("******* 2. 设置 *******\n");
printf("****************************\n");
}
2.打印游戏模式。
void gametapy()
{
printf("****************************\n");
printf("******* 1. 玩家先手 *******\n");
printf("******* 2. 人机先手 *******\n");
printf("****************************\n");
}
3.棋盘初始化。
void initboard(char arr[ROW][COL], int row, int col)
{
int i = 0, j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
arr[i][j] = ' ';
}
}
}
4.打印或者说是显示棋盘。
void printboard(char arr[ROW][COL], int row, int col)
{
int i = 0, 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");
if (i < row - 1)
{
for (j = 0; j < col; j++)
{
printf("---");
if (j < col - 1)
{
printf("|");
}
}
}
printf("\n");
}
}
5.玩家落子。
void playermove(char arr[ROW][COL], int row, int col)
{
while (1)
{
printf("请输入坐标:>");
scanf("%d%d", &row, &col);
if (arr[row-1][col-1] == ' ')
{
arr[row-1][col-1] = '#';
break;
}
else
{
printf("该位置已有棋子请重新落子\n");
}
if (row<1 && row>ROW && col<1 && col>COL)
{
printf("坐标非法,请重新输入!\n");
}
}
}
6.电脑落子。
void computermove(char arr[ROW][COL], int row, int col)
{
while (1)
{
int x = rand() % row;
int y = rand() % col;
if (arr[x][y] == ' ')
{
printf("电脑落子\n");
arr[x][y] = '*';
break;
}
}
}
7.判断输赢。
char judge(char arr[ROW][COL], int row, int col)
{
int i = 0, j = 0;
for (i = 0; i < row; i++)
{
if (arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2] && arr[i][2] != ' ')
{
return arr[i][0];
}
}
for (j = 0; j < col; j++)
{
if (arr[0][j] == arr[1][j] && arr[1][j] == arr[2][j] && arr[2][j] != ' ')
{
return arr[0][j];
}
}
if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[1][1] != ' ')
{
return arr[0][0];
}
if (arr[2][0] == arr[1][1] && arr[1][1] == arr[0][2] && arr[1][1] != ' ')
{
return arr[1][1];
}
full(arr, ROW, COL);
}
char full(char arr[ROW][COL], int row, int col)
{
int i = 0, j = 0,count=0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (arr[i][j] != ' ')
{
count++;
}
}
}
if (count == row * col)
{
return '=';
}
else
{
return '_';
}
}
上述代码均使用C语言来实现。
现在来具体讲解一下过程:1.菜单,菜单就是游戏界面,这个直接暴力打印就行了,2.游戏模式也一样。
3.棋盘初始化,在这个C程序中,主要用的知识点是二维数组和一些常见的库函数。而整个棋盘的打印就是利用二维数组来打印的,棋盘初始化是为了方便把棋盘中的棋子初始化为空格,这样可以使得打印棋盘更加方便。
4.打印棋盘:利用二维数组和分支循环语句实现棋盘的打印。我们要利用‘ ’(空格),‘---’(减号)和‘|’(按位或)来打印棋盘,首先我们把棋盘分为5个单元行列:第一行为" %c | %c | %c "。第三行第五行同上。而我们又把第一行分为5个单元" %c ","|"," %c ","|"," %c ";第二行与第四行为"---|---|---",而第二行的5个单元分别为"---","|","---","|","---"。这样分单元的方法更容易打印棋盘,但是值得注意的是在每一行的最后没有“|”。
5.玩家落子:玩家落子其实就是把已经初始化为数组元素“ ”的进行重新赋值,把数组元素重新赋值成你想的那样,如:“#”,“*”等。但要注意的是数组的类型记得初始化为你想要的类型,千万别设置了一个int类型的数组却把数组元素设置成‘#’‘w’这样的字符。
6.电脑落子:电脑落子其实就是利用随机值(如arr[i][j],让i和j的值进行随机赋值)来进行落子,这一步就要运用时间戳和几个库函数,rand和srand,这两个库函数需要引用一个新的头文件(#include
7.判断输赢:这你只需要把三子棋获胜的条件一一用if语句打上去就可。但同时也要注意棋盘棋子满了的情况。
ps:在C程序中玩家先手与后手的不同只是playermove()函数与computermove()函数的前后顺序罢了。(接下来是具体代码)
头文件:
#pragma once
//头文件game.h
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
#include
#define ROW 3
#define COL 3
void menu();
void gametapy();
void game_1();
void game_2();
void initboard(char arr[ROW][COL], int row, int col);
void printboard(char arr[ROW][COL], int row, int col);
void playermove(char arr[ROW][COL], int row, int col);
void computermove(char arr[ROW][COL], int row, int col);
char judge(char arr[ROW][COL], int row, int col);
char full(char arr[ROW][COL], int row, int col);
游戏内容:
#include "game.h"
void menu()
{
printf("****************************\n");
printf("******* 1. 开始游戏 *******\n");
printf("******* 0. 退出游戏 *******\n");
printf("******* 2. 设置 *******\n");
printf("****************************\n");
}
void gametapy()
{
printf("****************************\n");
printf("******* 1. 玩家先手 *******\n");
printf("******* 2. 人机先手 *******\n");
printf("****************************\n");
}
void game_1()
{
char ret;
char arr[ROW][COL] = {0};
initboard(arr,ROW,COL);
while (1)
{
printboard(arr, ROW, COL);
playermove(arr, ROW, COL);
printboard(arr, ROW, COL);
ret = judge(arr, ROW, COL);
if (ret != '_')
{
break;
}
computermove(arr, ROW, COL);
ret = judge(arr, ROW, COL);
if (ret != '_')
{
break;
}
}
if (ret == '#')
{
printf("玩家胜利\n");
}
else if (ret == '*')
{
printf("电脑胜利\n");
}
else
{
printf("平局\n");
}
}
void game_2()
{
char ret;
char arr[ROW][COL] = { 0 };
initboard(arr, ROW, COL);
while (1)
{
printboard(arr, ROW, COL);
computermove(arr, ROW, COL);
printboard(arr, ROW, COL);
ret = judge(arr, ROW, COL);
if (ret != '_')
{
break;
}
playermove(arr, ROW, COL);
ret = judge(arr, ROW, COL);
if (ret != '_')
{
break;
}
}
if (ret == '#')
{
printf("玩家胜利\n");
}
else if (ret == '*')
{
printf("电脑胜利\n");
}
else
{
printf("平局\n");
}
}
void initboard(char arr[ROW][COL], int row, int col)
{
int i = 0, j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
arr[i][j] = ' ';
}
}
}
void printboard(char arr[ROW][COL], int row, int col)
{
int i = 0, 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");
if (i < row - 1)
{
for (j = 0; j < col; j++)
{
printf("---");
if (j < col - 1)
{
printf("|");
}
}
}
printf("\n");
}
}
void playermove(char arr[ROW][COL], int row, int col)
{
while (1)
{
printf("请输入坐标:>");
scanf("%d%d", &row, &col);
if (arr[row-1][col-1] == ' ')
{
arr[row-1][col-1] = '#';
break;
}
else
{
printf("该位置已有棋子请重新落子\n");
}
if (row<1 && row>ROW && col<1 && col>COL)
{
printf("坐标非法,请重新输入!\n");
}
}
}
void computermove(char arr[ROW][COL], int row, int col)
{
while (1)
{
int x = rand() % row;
int y = rand() % col;
if (arr[x][y] == ' ')
{
printf("电脑落子\n");
arr[x][y] = '*';
break;
}
}
}
char judge(char arr[ROW][COL], int row, int col)
{
int i = 0, j = 0;
for (i = 0; i < row; i++)
{
if (arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2] && arr[i][2] != ' ')
{
return arr[i][0];
}
}
for (j = 0; j < col; j++)
{
if (arr[0][j] == arr[1][j] && arr[1][j] == arr[2][j] && arr[2][j] != ' ')
{
return arr[0][j];
}
}
if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[1][1] != ' ')
{
return arr[0][0];
}
if (arr[2][0] == arr[1][1] && arr[1][1] == arr[0][2] && arr[1][1] != ' ')
{
return arr[1][1];
}
full(arr, ROW, COL);
}
char full(char arr[ROW][COL], int row, int col)
{
int i = 0, j = 0,count=0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (arr[i][j] != ' ')
{
count++;
}
}
}
if (count == row * col)
{
return '=';
}
else
{
return '_';
}
}
函数头尾:
//三子棋实现
#include "game.h"
int main()
{
srand((unsigned int) time (NULL));
int input_1 = 0;
do
{
menu();
printf("请输入(1/0/2):>");
scanf("%d", &input_1);
switch (input_1)
{
case 1:
int input_2 = 0;
gametapy();
printf("请选择游戏模式(1/2):>");
scanf("%d", &input_2);
switch (input_2)
{
again:
case 1:
game_1();
break;
case 2:
game_2();
break;
default:
printf("输入错误,请重新输入!\n");
goto again;
}
break;
case 0:
printf("退出游戏\n");
break;
case 2:
break;
default:
printf("输入错误,请重新输入!\n");
break;
}
} while (input_1);
return 0;
}