数组游戏——三子棋
Posted 张同学吧
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数组游戏——三子棋相关的知识,希望对你有一定的参考价值。
·功能介绍
三子棋的基本功能有,电脑下棋,玩家落点是否合法,以及判赢机制。
·代码实现及注释
1、主函数的实现以及三子棋的构思框架(test.c)
简单的一个选择菜单,玩家选完选项后,用switch语句分支。
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
int main() {
srand((unsigned)time(NULL));
int a;
do
{
menu();
printf("请选择选项\\n");
scanf("%d", &a);
switch (a)
{
case 1:
game();
break;
case 2:
printf("游戏结束\\n");
break;
default:
break;
}
} while (a != 2);
return 0;
}
其次在main函数中,有menu()函数,和game()函数。其中menu函数就是菜单的输出界面,比较简单,如下:
void menu() {
printf("---------------------------------\\n");
printf("*********************************\\n");
printf("**********1、开始游戏************\\n");
printf("**********2、退出游戏************\\n");
printf("*********************************\\n");
printf("---------------------------------\\n");
}
2、三子棋功能的实现(game.c)
而game()函数则是游戏的主体,各个功能的实现都是在这个函数中实现。
注意:我们用二维数组来实现棋盘,row和rol分别表示行和列。玩家棋子:‘X’, 电脑棋子:‘O’。
首先,第一个功能是重置棋盘initBoard();因为每一轮新的游戏都得是一个清空的棋盘。这个函数的主要功能就是在游戏开始前将我们的棋盘进行初始化。初始化的结果就是,每一个数组都被重置为" "(空格),
void initBoard(char board[ROW][COL], int row, int col)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
board[i][j] = ' ';
}
}
}
Showboard();重置完棋盘之后,就需要把棋盘打印出来了。因为玩家需要看到棋盘的样子再决定下一步该怎么走。
void ShowBoard(char board[ROW][COL], int row, int col)
{
printf("=====================\\n");
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
//三个空格
printf(" %c ", board[i][j]);
//两列竖线
if (j < col - 1)
{
printf("|");
}
}
//换行
printf("\\n");
//横线只有2行
if (i < row - 1)
{
for (int j = 0; j < col; j++)
{
printf("---");
//
if (j < col - 1)
{
printf("|");
}
}
printf("\\n");
}
}
printf("=====================\\n");
}
Playertime();玩家回合,玩家通过输入坐标落子,但是需要判断落子的位置是否合法、是否已经被其他棋子占用。
void ShowBoard(char board[ROW][COL], int row, int col)
{
printf("=====================\\n");
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
//三个空格
printf(" %c ", board[i][j]);
//两列竖线
if (j < col - 1)
{
printf("|");
}
}
//换行
printf("\\n");
//横线只有2行
if (i < row - 1)
{
for (int j = 0; j < col; j++)
{
printf("---");
//
if (j < col - 1)
{
printf("|");
}
}
printf("\\n");
}
}
printf("=====================\\n");
}
Computertime();
在玩家下完棋后,电脑随机选定一个坐标落子,坐标在[row] [col]范围内通过rand()函数随机选定。
void Computertime(char board[ROW][COL], int row, int col)
{
while (1)
{
int x = rand() % row;
int y = rand() % col;;
if (board[x][y] == ' ')
{
board[x][y] = 'O';
break;
}
}
}
IsWin/isFull();判断结果函数。每一次玩家或电脑落子之后,都需要判断是否满足获胜条件或者平局条件。
获胜的条件就是有任意一种棋子满足了某一行或这某一列,以及正副对角线全部占满。在判定某一行时,行数是不变的,所以我们只需要一个for循环,遍历所有的行数就可以判定。判定某一列同理。判断正副对角线也不难,只需要指定坐标下的棋子一样就满足条件。满足了条件之后,通过返回’X’和’O‘来区分玩家获胜还是电脑获胜。
然后就是判断棋盘是否还有空间下,那么只要有“ ”(空格)的数组,就有空间可以下,如果没有空间,返回一个特定值,在main的game()函数中,依据不同的返回值,来确定游戏结果。
static int isFull(char board[ROW][COL], int row, int col)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
if (board[i][j] == ' ')
{
return -1;
}
}
}
return 1;
}
char IsWin(char board[ROW][COL], int row, int col)
{
//行
for (int i = 0; i < row; i++) {
if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][2] != ' ') {
return board[i][0];
}
}
//列
for (int j = 0; j < col; j++) {
if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[2][j] != ' ') {
return board[0][j];
}
}
//正对角线、副对角线
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[2][2] != ' ') {
return board[1][1];
}
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[2][0] != ' ') {
return board[1][1];
}
//是否是平局
if (isFull(board, row, col) == 1)
{
return 'Q';
}
return ' ';
}
3、头文件的引用(game.h)
·头文件中,我们需要定义所有的头文件以及引用的各种函数,这边添加了相关的注释方便大家观看。
·其中的define定义了行和列的大小
#pragma once
#define ROW 3
#define COL 3
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void initBoard(char board[ROW][COL], int row, int col);
void ShowBoard(char board[ROW][COL], int row, int col);
void Playertime(char board[ROW][COL], int row, int col);
void Computertime(char board[ROW][COL], int row, int col);
char IsWin(char board[ROW][COL], int row, int col);
·代码展示
game.h
#pragma once
#define ROW 3
#define COL 3
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void initBoard(char board[ROW][COL], int row, int col);
void ShowBoard(char board[ROW][COL], int row, int col);
void Playertime(char board[ROW][COL], int row, int col);
void Computertime(char board[ROW][COL], int row, int col);
char IsWin(char board[ROW][COL], int row, int col);
game.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void initBoard(char board[ROW][COL], int row, int col)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
board[i][j] = ' ';
}
}
}
void ShowBoard(char board[ROW][COL], int row, int col)
{
printf("=====================\\n");
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
//三个空格
printf(" %c ", board[i][j]);
//两列竖线
if (j < col - 1)
{
printf("|");
}
}
//换行
printf("\\n");
//横线只有2行
if (i < row - 1)
{
for (int j = 0; j < col; j++)
{
printf("---");
//
if (j < col - 1)
{
printf("|");
}
}
printf("\\n");
}
}
printf("=====================\\n");
}
void Playertime(char board[ROW][COL], int row, int col)
{
while (1)
{
printf("请输入坐标");
int x = 0, y = 0;
scanf("%d%d", &x, &y);
if (x >= 1 && x <= 3 && y >= 1 && y <= 3)
{
if (board[x - 1][y - 1] == ' ') {
board[x - 1][y - 1] = 'X';
break;
}
else
{
printf("坐标已经有棋子,请重新输入。");
}
}
else
{
printf("坐标不合法");
}
}
}
void Computertime(char board[ROW][COL], int row, int col)
{
while (1)
{
int x = rand() % row;
int y = rand() % col;;
if (board[x][y] == ' ')
{
board[x][y] = 'O';
break;
}
}
}
static int isFull(char board[ROW][COL], int row, int col)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
if (board[i][j] == ' ')
{
return -1;
}
}
}
return 1;
}
char IsWin(char board[ROW][COL], int row, int col)
{
//行
for (int i = 0; i < row; i++) {
if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][2] != ' ') {
return board[i][0];
}
}
//列
for (int j = 0; j < col; j++) {
if以上是关于数组游戏——三子棋的主要内容,如果未能解决你的问题,请参考以下文章