目录
概要
本章给大家介绍简单三子棋的写法和思路,主要讲解思路,我希望各位同僚可以在这篇文章中有所收获-_- -_- -_- -_ - -_-记得点个赞哦
整体架构流程
我们需要三个文件;
1:test.c文件————用来测试游戏
在这个文件中,首先对游戏界面开始的初始化,然后,选择玩游戏/退出,其次,通过调用game.h文件调用game.c文件中的游戏部分(游戏棋牌的初始化,玩家玩,电脑玩,每一次玩都要进行判断输赢)
2,game.c文件----------用来编所需游戏的函数
这个文件中主要编写游戏中,,棋牌初始化,玩家下棋,电脑下棋,判断,这些函数被test.c文件调用,就需要下面的头文件的支持
3 game.h 头文件--------用于文件之间函数的调用
在这个文件中,将游戏主要的编码函数进行申明,(game.c文件中的程序不想被别人只知道),并在其他文件进行调用,以及头文件的声明,这样像test.c文件只调用.h文件即可
一.test.c文件
1.#include"game.h"通过这个调用;
2主函数中,游戏界面的打印:
void menu()
{
printf("*****************************\n");
printf("******** 1. play **********\n");
printf("******** 0. exit **********\n");
printf("*****************************\n");
}
下图中menu菜单的调用,游戏的选择,还有电脑玩家的随机值
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请选择:->");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("输入错误,请重新输入\n");
break;
}
} while (input);
return 0;
}
4.test.c中的game函数(调用game.c中的游戏函数)
void game()
{
//初始化
char board[ROW][COL] = { 0 };
intaplayboard(board,ROW, COL);
displayboard(board, ROW, COL);
//play
char ret = 0;
while (1)
{
//玩家下棋
playmove(board, ROW, COL);
displayboard(board, ROW, COL);
//判断
ret = iswin(board, ROW, COL);
if (ret != 'C')
{
break;
}
//电脑下棋
computemove(board, ROW,COL);
displayboard(board, ROW, COL);
ret = iswin(board, ROW, COL);
if (ret != 'C')
{
break;
}
}
if (ret == '*')
{
printf("玩家赢\n");
}
else if (ret == '#')
{
printf("电脑赢\n");
}
else
{
printf("平局\n");
}
}
二. game.h文件
定义棋牌行,列
包含需要的头文件,test.c文件和game.c文件中的#include"game.h起一个桥梁的作用
#pragma once #include<stdio.h> #include<time.h> #include <stdlib.h> #define ROW 3 #define COL 3 //初始化棋牌 void intaplayboard(char board[ROW][COL], int row, int col); //打印棋牌 void displayboard(char board[ROW][COL], int row, int col); //玩家玩 void playmove(char[ROW][COL], int row, int col); //电脑玩 void computemove(char[ROW][COL], int row, int col); //判断输赢 //玩家赢 - '*' //电脑赢 - '#' //平局 - 'Q' //继续 - 'C' //判断输赢 char iswin(char board[ROW][COL], int row, int col);
三. game.c文件
#define _CRT_SECURE_NO_WARNINGS
#include"game.h"
//initial board棋牌初始化
void intaplayboard(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]=' ';
}
printf("\n");
}
}
//版本1打印棋牌
// ------------------------------------------------
//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]);
//
// }
// printf("\n");
// }
//}
//版本2
// --------------------------------------------
//void displayboard(char board[ROW][COL], int row, int col)
//{
// int i= 0;
// for (i = 0; i < row; i++)
// {
// printf(" %c | %c | %c \n", board[i][0],board[i][1],board[i][2]);
// if (i < row - 1)
// {
// printf("---|---|---\n");
// }
// }
//}
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 (int j = 0; j < col; j++)
{
printf("---");
if (j < col - 1)
{
printf("|");
}
}
printf("\n");
}
}
}
void playmove(char board[ROW][COL], int row, int col)
{
int x=0;
int y=0;
printf("玩家下棋:->\n");
while (1)
{
printf("请输入下棋坐标,中间使用空格\n");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (board[x - 1][y - 1] ==' ')
{
board[x - 1][y - 1] = '*';
break;
}
else
{
printf("坐标被占有,不能落子,重新输入坐标\n");
}
}
else
{
printf("坐标非法,重新输入\n");
}
}
}
//电脑下棋
void computemove(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("电脑下棋:->\n");
while (1)
{
x = rand() % row;
y = rand() % col;
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
int IsFull(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++)
{
if (board[i][j] == ' ')
{
return 0;
}
}
}
return 1;
}
char iswin(char board[ROW][COL], int row, int col)
{
int i = 0;//行
for (i = 0; i < row;i++)
{
if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ')
{
return 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];
//平局 --->IsFull函数进行判断有无空位
if (IsFull(board, row, col) == 1)
{
return 'Q';
}
return 'C';
}
}
.h中函数声明和.c中调用中的参数大小写注意一下,.c中小写是为了更加方便,
小结
看起来很复杂,其实只要将他们单独放出来,大家也是可以自己完成,这里只是将三个文件的内容共享。希望大家会有所收获!!点个关注哦¥¥