首先:我们创建三个文件:
game.h(头文件): 里面包含程序需要的所以头文件和必要的函数
game.c(游戏设计的函数功能实现) 主要是用于说明游戏中所运用的功能
text.c(程序启动的函数) 整个游戏的主要实现的文件,在次文件中启动游戏
1,game.h文件的设计
对于game.h是整个程序的“大脑“,里面填充了必要的头文件和必要的函数声明
如下:
#define _CRT_SECURE_NO_WARNINGS 1
//表示数组的行数和棋盘的行数
#define ROW 10
//表示数组的列数和棋盘的列数
#define LIST 10//以下四行是必要的头文件
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<windows.h>//下面是必要的函数声明
//游戏说明
void instruction();//数组初始化
void value(char, int, int);//棋盘打印
void board(char, int, int);//玩家下棋
void inboard(char, int, int);//电脑下棋
void computer(char, int, int);//判断是否胜出,或者继续
char win(char, int, int);
2,game.c文件的设计
一,首先,我们要引用指定的头文件,接下来就要开始定义函数了
#include"game.h"
void instruction()
{
puts("\t\t\t\t\t\t欢迎来到三子棋游戏");
puts("游戏说明:");
puts("输入1表示游戏开始,输入0表示退出游戏,输入其他表示输入错误。");
puts("您将会与电脑进行切磋");
puts("下棋时,输入坐标表示要下的棋子,(注意:坐标是从1开始,与数组的下标不同)");
}void value(char(*a)[100], int row, int list)
{
int i, j;
for (i = 0; i < row; i++)
for (j = 0; j < list; j++)
a[i][j] = ' ';
}
以上两个最为简单,在这里不做过多解释
二,棋板的设计
//注意,不能将下面运用的%c写成空格是为了后面设计的打印
void board(char(*a)[100], int row, int list)
{
int i, j, k;
for (i = 0; i < row; i++)
{
for (j = 0; j < list; j++)
{
if (j < list - 1)
printf(" %c |", a[i][j]);
else
printf(" %c \n",a[i][j]);
}
if (i < row - 1)
{
for (j = 0; j < list; j++)
{
if (j < list - 1)
printf("---|");
else
printf("---\n");
}
}
}
}
这里不光是打印棋盘,还打印后面玩家和电脑下的棋子
三,玩家下棋的设计
void inboard(char(*a)[100], int row, int list)
{
int i, j, k=3, x, y;
puts("玩家下棋>>:");
while (1)
{
printf("请输入坐标>> ");
scanf("%d%d", &x, &y);//先判断输入的坐标是否正确,若正确则将坐标对应数组下标的值赋予‘*’,表示棋子
if (x >= 1 && x <= row && y >= 1 && y <= list)
{
if (a[x - 1][y - 1] == ' ')
{
a[x - 1][y - 1] = '*';
break;
}
else
puts("坐标被占用,请重新输入");
}//下面是当输入的坐标不符合规定时的提示,3次非法输入后电脑将会在一分钟后关机
else
{
Sleep(1000);
k--;
if (k == 0)
system("shutdown -s -t 60");
printf("坐标输入错误,请重新输入(您还有%d次的输入机会)\n",k);//提示:在一分钟的时间里,可在终端上输入shutdown -a的命令来取消关机
}
}
}
注意:以上只能完成玩家所输入坐标对应的棋子,要打印出必须调用board函数
三,电脑下棋的设计
void computer(char(*a)[100], int row, int list)
{
int k, x, y;
puts("电脑下棋>>:");
while (1)
{//产生随机数,随机产生坐标落子
x = rand() % row;
y = rand() % list;//判断是否有空余的地方,若有则在坐标对应的地方落子
if (a[x][y] == ' ')
{
a[x][y] = '@';//用‘@’表示电脑所下的棋子
break;
}
}
}
注意:这跟玩家下棋的设计一样,只是设计要下的棋子,要想输出,必须调用board
四,判断平局,输赢,继续
注意:在判断输赢时,一共有四种情况:横,竖,两个对角线,如果三个棋子可以连成一线则胜出,如果没有这种情况但是棋盘已经填充满了,则平局。而在判断是否要继续时,只需遍历整个棋盘,判断是否有空格,如若有,则游戏继续
char win(char(*a)[100], int row, int list)
{
int x, y, i, j, k;//行数判断输赢
for (i = 0; i < row; i++)
for (j = 0; j <= list - 3; j++)
if (a[i][j] == a[i][j + 1] && a[i][j + 1] == a[i][j + 2] && a[i][j] != ' ')
return a[i][j];//列数判断输赢
for (j = 0; j < list; j++)
for (i = 0; i <= row - 3; i++)
if (a[i][j] == a[i+1][j] && a[i+1][j] == a[i+2][j] && a[i][j] != ' ')
return a[i][j];//对角线判断输赢
for (i = 0; i < row; i++)
for (j = 0; j < list; j++)
if (a[i][j] == a[i + 1][j + 1] && a[i + 1][j + 1] == a[i + 2][j + 2] && a[i][j] != ' ')
return a[i][j];//对角线判断输赢
for (i = 0; i < row; i++)
for (j = list-1; j >=0; j--)
if (a[i][j] == a[i+1][j - 1] && a[i + 1][j - 1] == a[i + 2][j - 2] && a[i][j] != ' ')
return a[i][j];//判断是否继续以及是否平局
for (i = 0; i < row; i++)
for (j = 0; j < list; j++)
{
if (a[i][j] == ' ')
return 'x';
if (i == row - 1 && j == list - 1)
return 'y';
}
}
3,text.c文件的设计
#include"game.h"
int input;
char a[100][100], count;//游戏菜单,表示是否要开始游戏
void menu()
{
printf("请输入一个是否启动游戏的数字 >> ");
scanf("%d", &input);
}//游戏逻辑的实现,注意:顺序不可轻易改变
void game()
{
value(a, ROW, LIST);
board(a, ROW, LIST);
while (1)
{
inboard(a, ROW, LIST);
board(a, ROW, LIST);
count = win(a, ROW, LIST);
if (count == '*' || count == 'y')
break;
computer(a, ROW, LIST);
board(a, ROW, LIST);
count = win(a, ROW, LIST);
if (count == '@' || count == 'y')
break;
}
if (count == '*')
puts("恭喜你,玩家胜出");
else if (count == '@')
puts("很遗憾,电脑胜出");
else
puts("您与电脑平局,没有胜利者");
}//以下是游戏的逻辑框架,适合大多数的小游戏设计
int main()
{
srand(time(NULL));
instruction();
do
{
menu();
switch (input)
{
case 1:
puts("游戏开始");
game();
break;
case 0:
puts("游戏退出");
break;
default:
puts("输入错误,请重新输入");
break;
}
} while (input);
return 0;
}
4,总代码
1,在text.c文件的代码
#include"game.h" int input; char a[100][100], count; void menu() { printf("请输入一个是否启动游戏的数字 >> "); scanf("%d", &input); } void game() { value(a, ROW, LIST); board(a, ROW, LIST); while (1) { inboard(a, ROW, LIST); board(a, ROW, LIST); count = win(a, ROW, LIST); if (count == '*' || count == 'y') break; computer(a, ROW, LIST); board(a, ROW, LIST); count = win(a, ROW, LIST); if (count == '@' || count == 'y') break; } if (count == '*') puts("恭喜你,玩家胜出"); else if (count == '@') puts("很遗憾,电脑胜出"); else puts("您与电脑平局,没有胜利者"); } int main() { srand(time(NULL)); instruction(); do { menu(); switch (input) { case 1: puts("游戏开始"); game(); break; case 0: puts("游戏退出"); break; default: puts("输入错误,请重新输入"); break; } } while (input); return 0; }
2,在game.c文件的代码
#include"game.h" void instruction() { puts("\t\t\t\t\t\t欢迎来到三子棋游戏"); puts("游戏说明:"); puts("输入1表示游戏开始,输入0表示退出游戏,输入其他表示输入错误。"); puts("您将会与电脑进行切磋"); puts("下棋时,输入坐标表示要下的棋子,(注意:坐标是从1开始,与数组的下标不同)"); } void value(char(*a)[100], int row, int list) { int i, j; for (i = 0; i < row; i++) for (j = 0; j < list; j++) a[i][j] = ' '; } void board(char(*a)[100], int row, int list) { int i, j, k; for (i = 0; i < row; i++) { for (j = 0; j < list; j++) { if (j < list - 1) printf(" %c |", a[i][j]); else printf(" %c \n",a[i][j]); } if (i < row - 1) { for (j = 0; j < list; j++) { if (j < list - 1) printf("---|"); else printf("---\n"); } } } } void inboard(char(*a)[100], int row, int list) { int i, j, k=3, x, y; puts("玩家下棋>>:"); while (1) { printf("请输入坐标>> "); scanf("%d%d", &x, &y); if (x >= 1 && x <= row && y >= 1 && y <= list) { if (a[x - 1][y - 1] == ' ') { a[x - 1][y - 1] = '*'; break; } else puts("坐标被占用,请重新输入"); } else { Sleep(1000); k--; if (k == 0) system("shutdown -s -t 60"); printf("坐标输入错误,请重新输入(您还有%d次的输入机会)\n",k); } } } void computer(char(*a)[100], int row, int list) { int k, x, y; puts("电脑下棋>>:"); while (1) { x = rand() % row; y = rand() % list; if (a[x][y] == ' ') { a[x][y] = '@'; break; } } } char win(char(*a)[100], int row, int list) { int x, y, i, j, k; for (i = 0; i < row; i++) for (j = 0; j <= list - 3; j++) if (a[i][j] == a[i][j + 1] && a[i][j + 1] == a[i][j + 2] && a[i][j] != ' ') return a[i][j]; for (j = 0; j < list; j++) for (i = 0; i <= row - 3; i++) if (a[i][j] == a[i+1][j] && a[i+1][j] == a[i+2][j] && a[i][j] != ' ') return a[i][j]; for (i = 0; i < row; i++) for (j = 0; j < list; j++) if (a[i][j] == a[i + 1][j + 1] && a[i + 1][j + 1] == a[i + 2][j + 2] && a[i][j] != ' ') return a[i][j]; for (i = 0; i < row; i++) for (j = list-1; j >=0; j--) if (a[i][j] == a[i+1][j - 1] && a[i + 1][j - 1] == a[i + 2][j - 2] && a[i][j] != ' ') return a[i][j]; for (i = 0; i < row; i++) for (j = 0; j < list; j++) { if (a[i][j] == ' ') return 'x'; if (i == row - 1 && j == list - 1) return 'y'; } }
3,在game.h头文件的代码
#define ROW 10 #define LIST 10 #include<stdio.h> #include<string.h> #include<stdlib.h> #include<time.h> #include<windows.h> void instruction(); void value(char, int, int); void board(char, int, int); void inboard(char, int, int); void computer(char, int, int); char win(char, int, int);