//game.h 头文件 用来声明函数
#define _CRT_SECURE_NO_WARNINGS
#define line 3
#define column 3
#include<Windows.h>
#include<time.h>
void game();
void threechress();
void model();
void player(char chressboard[line][column], int a, int b);
void computer(char chressboard[line][column], int a, int b);
char win(char chressboard[line][column], int a, int b);
int Isfull(char chessboard[line][column], int a, int b);
//game_function.cpp 源文件 用来写游戏内容函数的源文件
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include"game.h"
void start(char chressboard[line][column], int a, int b) {
int i = 0;
int j = 0;
for (i = 0; i < a; i++) {
for (j = 0; j < b; j++) {
chressboard[i][j]=' ';
}
}
}
void model(char chressboard[line][column], int a, int b) {
int i = 0;
int j = 0;
for (i = 0; i < a-1; i++) {
for (j = 0; j < b; j++) {
printf(" %c ", chressboard[i][j]);
if(j<b-1)
printf("|");
if (j == b - 1)
printf("\n");
}
for (j = 0; j < b; j++) {
printf("--- ");
if (j == b - 1)
printf("\n");
}
}
for (j = 0; j < b; j++) {
printf(" %c ", chressboard[a-1][j]);
if (j < b - 1)
printf("|");
if (j == b - 1)
printf("\n");
}
//Sleep(500000);
}
//玩家回合执行函数
void player(char chressboard[line][column], int a, int b)
{
int m = 0;
int n = 0;
int x = 0;
printf("请玩家走!");
//玩家输入坐标值
do{
printf("请输入你要放入棋子的坐标\n");
scanf("%d%d", &m, &n);
//检验坐标值的合法性 有没有超出棋盘
if ((m > line || n > column)||(m<=0||n<=0)){
printf("您的输入有误,请重新输入!");
}
else if (chressboard[m - 1][n - 1] == ' ') {
chressboard[m - 1][n - 1] = '*';
break;
}
else {
printf("该位置已有棋子了,请重新输入坐标");
}
} while (1);
}
void computer(char chressboard[line][column], int a, int b) {
//让计算机在没有下棋的位置随机下棋 即 在元素为空格的位置产生随机数
printf("电脑回合\n");
int x = 0;
int y = 0;
while (1) {
x = rand() % line;
y = rand() % column;
if (chressboard[x][y] == ' ') {
chressboard[x][y] = '#';
break;
}
}
}
//判断棋盘是否已填满的函数 返回1表示棋盘满了 返回0表示棋盘没满
int Isfull(char chessboard[line][column], int a, int b) {
//遍历数组 判断是否还有空格
int i = 0;
int j = 0;
for (i = 0; i < a; i++) {
for (j = 0; j < b; j++) {
if (chessboard[i][j] == ' ')
return 0;
}
}
return 1;
}
//游戏胜负判断函数
//需要反馈四种状态 1.玩家赢返回* 2,电脑赢返回# 3,平局返回q 4.未分出胜负,继续返回p
char win(char chressboard[line][column], int a, int b) {
int i = 0;
//判断横三行是否都一样 并且都不是空格
for (i = 0; i < line; i++) {
if (chressboard[i][0] == chressboard[i][1] && chressboard[i][1] == chressboard[i][2] && chressboard[i][0] != ' ') {
return chressboard[i][0];
}
}
//判断竖三列是否都一样 并且都不是空格
int j = 0;
for (j = 0; j < column; j++) {
if (chressboard[0][j] == chressboard[1][j] && chressboard[1][j] == chressboard[2][j] && chressboard[0][j] != ' ')
return chressboard[0][j];
}
//判断左斜和右斜
if(chressboard[0][0] == chressboard[1][1] && chressboard[1][1] == chressboard[2][2] && chressboard[0][0] != ' ')
return chressboard[0][0];
if (chressboard[0][2] == chressboard[1][1] && chressboard[1][1] == chressboard[2][0] && chressboard[1][1] != ' ')
return chressboard[1][1];
//判断是否平局 棋盘满了 即棋盘中没有空格存在 在此处添加一个函数 来判断棋盘有没有满
if (1 == Isfull(chressboard, line, column)) {
return 'q';
}
return 'p';
}
void threechress() {
//先创建一个棋盘 建立3x3的二维数组
char chressboard[line][column] = { 0 };
//将棋盘数组遍历初始化 每个元素初始化为空格
start(chressboard, line, column);
//进行整理棋盘的布局 并打印出来
model(chressboard, line, column);
//棋盘已完成打印 开始实现游戏执行内容
//根据分析 在一个循环中实现
while (1) {
//使用玩家函数进行封装玩家回合需要执行的代码
player(chressboard, line, column);
//玩家每次下完棋 需要更新一下棋盘
system("slc");
model(chressboard, line, column);
//此处应该添加胜利判断函数 来判断玩家下完棋后有没有赢
win(chressboard, line, column);
char ret = win(chressboard, line, column);
if (ret != 'p')
break;
//使用函数封装电脑回合需要执行的代码
computer(chressboard, line, column);
//电脑每次下完棋,需要更新一下棋盘
system("slc");
model(chressboard, line, column);
//再此处应添加胜利判断函数 来判断电脑下完棋后有没有赢
win(chressboard, line, column);
if (ret != 'p')
break;
}
char ret = win(chressboard, line, column);
if (ret == '*')
printf("玩家获胜!违背了目的,其实你输了!\n");
if (ret == '#')
printf("你让电脑获胜了,这才是真正的胜利!\n");
if (ret == 'q')
printf("很遗憾,平局!\n");
}
//game_framework.cpp 用于写游戏界面和进入和退出游戏的框架
#define _CRT_SECURE_NO_WARNINGS
#include"game.h"
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<time.h>
//菜单函数和选择函数
//用于开始和结束
//菜单 开始界面
void order() {
printf("\t\t\t\t ********************************************\n");
printf("\t\t\t\t ******* 1.开始游戏 0.退出游戏 *********\n");
printf("\t\t\t\t ********************************************\n");
}
int choose()
{
int b = 0;
int a = 0;
printf("\t\t\t\t\t开始游戏请按1,退出游戏请按0!");
scanf("%d", &a);
system("cls");
switch (a)
{
case 1:
game();
//system("cls");
printf("\t\t\t\t 游戏结束,重新开始请按1,直接退出请按0!");
scanf("%d", &b);
return b;
case 0:
return 0;
default:
system("cls");
printf("\t\t\t\t\t 您的输入有误!请重新输入\n");
choose();
}
}
void game() {
printf("\t\t\t\t\t\t1.三子棋\n\n\n");
printf("\t\t\t\t\t\t2.猜数字\n\n\n");
printf("\t\t\t\t\t\t 3.扫雷\n\n\n");
printf("\t\t\t\t\t\t请您进行选择");
int x = 0;
int r = 0;
int gess = 0;
scanf("%d", &x);
system("cls");
switch (x)
{
case 1:
printf("\t\t\t\t\t\t1.三子棋\n\n\n");
printf("请发挥你的智慧让电脑获胜!");
threechress();
break;
case 2:
printf("\t\t\t\t\t\t2.猜数字\n\n\n");
printf("\t\t\t\t\t\t请您输入数字\n\n\n");
r = rand() % 100 + 1;
while (1) {
scanf("%d", &gess);
if (gess < r)
printf("猜小了");
else if (gess > r)
printf("猜大了");
else
{
printf("恭喜你,猜对了\n");
Sleep(1000);
system("cls");
break;
}
}
break;
case 3:
printf("\t\t\t\t\t\t 3.扫雷\n\n\n");
printf("请慎重选择,不要猜到雷!");
clearplayer();
break;
default:
break;
}
}
int main() {
srand((unsigned int)time(NULL));
int x = 0;
int c = 0;
do {//菜单界面
order();//选择选择选项函数
c=choose();
}while(c);
printf("\t\t\t\t\t\t\t\t\t 欢迎下次再来!");
return 0;
}
通过这次的整体练习对C语言又有了更深层次的认识,将文件代码分类,头文件 函数源文件 测试源文件,对代码进行了封装和模块化,使得代码更容易整理和修改。