提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
提示:本文章详细讲三子棋游戏程序的建立
目录
一、代码展示
此为game.h的头文件
#pragma once
//定义全局变量
#define hang 3
#define shu 3
//数组的初始化
void chu_shi(char add[hang][shu], int a, int b);
//棋盘的初始化
void qi_pan(char add[hang][shu], int a, int b);
//玩家走
void wan_jia(char add[hang][shu], int a, int b);
//电脑走
void dian_niao(char add[hang][shu], int a, int b);
//判断输赢
char shu_ying(char add[hang][shu], int a, int b);
此为main函数
#include<stdio.h>
#include"game.h"
#include<time.h>
#include<stdlib.h>
void cai_dan()
{
printf("************************\n");
printf("*******1. 进入游戏*******\n");
printf("*******0. 退出游戏*******\n");
printf("************************\n");
}
void game()
{
char add[hang][shu];
//初始化数组
chu_shi(add,hang,shu);
//初始化棋盘
qi_pan(add, hang, shu);
while (1)
{
//定义变量
char s;
//玩家走
wan_jia(add,hang,shu);
qi_pan(add, hang, shu);
//判断输赢
s = shu_ying(add,hang,shu);
if (s != 'c')
break;
//电脑走
dian_niao(add,hang,shu);
qi_pan(add, hang, shu);
//判断输赢
s = shu_ying(add,hang,shu);
if (s != 'c')
break;
}
}
void main()
{
int num;
srand((unsigned int)time(NULL));
cai_dan();
do
{
scanf_s("%d", &num);
switch (num)
{
case 1:
printf("开始游戏\n");
game();
cai_dan();
break;
case 0:
printf("退出游戏\n");
break;
default :
printf("输入错误\n");
break;
}
} while (num);
}
此为game.c
#include<stdio.h>
#include"game.h"
#include<time.h>
#include<stdlib.h>
void chu_shi(char add[hang][shu], int a, int b)
{
int i = 0;
int j = 0;
for (i=0; i < a; i++)
{
for (j=0; j < b; j++)
{
add[i][j] = ' ';
}
}
}
void qi_pan(char add[hang][shu], int a, int b)
{
int i = 0;
int j = 0;
for (i = 0; i < a; i++)
{
for (j = 0; j < b; j++)
{
printf("%c", add[i][j]);
if(j<b-1)
printf(" |");
}
printf("\n");
if (i < a - 1)
{
for (j = 0; j < b; j++)
{
printf("--");
if (j < b - 1)
printf("|");
}
printf("\n");
}
}
}
void wan_jia(char add[hang][shu], int a, int b)
{
printf("玩家走");
int x;
int y;
while (1)
{
printf("\n请输入坐标");
scanf_s("%d%d", &x, &y);
if (x >= 1 && x <= a && y >= 1 && y <= b)
{
if (add[y - 1][x - 1] == ' ')
{
add[y - 1][x - 1] = '*';
break;
}
else
{
printf("坐标已落子:");
}
}
else
{
printf("坐标不合法:");
}
}}
void dian_niao(char add[hang][shu], int a, int b)
{
printf("电脑走\n");
while(1)
{
int x = rand() % hang;
int y = rand() % shu;
if (add[x][y] == ' ')
{
add[x][y] = '#';
break;
}
}
}
char shu_ying(char add[hang][shu], int a, int b)
{
int i;
for (i = 0; i < a; i++)
{
if (add[i][0] == '*' && add[i][1] == '*' && add[i][2] == '*')
{
printf("玩家赢:\n");
return '*';
}
}
for (i = 0; i < a; i++)
{
if (add[0][i] == '*' && add[1][i] == '*' && add[2][i] == '*')
{
printf("玩家赢:\n");
return '*';
}
}
if (add[0][0] == '*' && add[1][1] == '*' && add[2][2] == '*')
{
printf("玩家赢:\n");
return '*';
}
if (add[0][2] == '*' && add[1][1] == '*' && add[2][0] == '*')
{
printf("玩家赢:\n");
return '*';
}
for (i = 0; i < a; i++)
{
if (add[i][0] == '#' && add[i][1] == '#' && add[i][2] == '#')
{
printf("电脑赢:\n");
return '#';
}
}
for (i = 0; i < a; i++)
{
if (add[0][i] == '#' && add[1][i] == '#' && add[2][i] == '#')
{
printf("电脑赢:\n");
return '#';
}
}
if (add[0][0] == '#' && add[1][1] == '#' && add[2][2] == '#')
{
printf("电脑赢:\n");
return '#';
}
if (add[0][2] == '#' && add[1][1] == '#' && add[2][0] == '#')
{
printf("电脑赢:\n");
return '#';
}
int j;
for (i = 0; i < a; i++)
{
for (j = 0; j < b; j++)
{
if (add[i][j] == ' ')
return 'c';
}
}
printf("平局");
return 'k';
}
二、编写步骤
第一步.先进行main函数的编写。引入建立基础框架
void main()
{
int num;
cai_dan();
do
{
scanf_s("%d", &num);
switch (num)
{
case 1:
printf("开始游戏\n");
break;
case 0:
printf("退出游戏\n");
break;
default :
printf("输入错误\n");
break;
}
} while (num);
}
void cai_dan()
{
printf("************************\n");
printf("*******1. 进入游戏*******\n");
printf("*******0. 退出游戏*******\n");
printf("************************\n");
}
在此完成游戏基础界面的设计,同时对玩家操作进行限制,形成闭环,完成基础框架。
第二步 在编写代码之前要建立游戏运行的基础逻辑。再根据基础逻辑编写游戏的代码。
在这里,我的基础逻辑是先建立游戏主函数game(),再在game()中建立
游戏运行的逻辑。将game()添加到main(),完成循环,,再在game() 游戏运行的逻辑。
void main()
{
int num;
srand((unsigned int)time(NULL));
cai_dan();
do
{
scanf_s("%d", &num);
switch (num)
{
case 1:
printf("开始游戏\n");
game();
cai_dan();
break;
case 0:
printf("退出游戏\n");
break;
default :
printf("输入错误\n");
break;
}
} while (num);
}
void game()
{
char add[hang][shu];
//初始化数组
chu_shi(add,hang,shu);
//初始化棋盘
qi_pan(add, hang, shu);
while (1)
{
//定义变量
char s;
//玩家走
wan_jia(add,hang,shu);
qi_pan(add, hang, shu);
//判断输赢
s = shu_ying(add,hang,shu);
if (s != 'c')
break;
//电脑走
dian_niao(add,hang,shu);
qi_pan(add, hang, shu);
//判断输赢
s = shu_ying(add,hang,shu);
if (s != 'c')
break;
}
}
最后 在另一个.c文件中编写游戏的主体。
#include<stdio.h>
#include"game.h"
#include<time.h>
#include<stdlib.h>
void chu_shi(char add[hang][shu], int a, int b)
{
int i = 0;
int j = 0;
for (i=0; i < a; i++)
{
for (j=0; j < b; j++)
{
add[i][j] = ' ';
}
}
}
void qi_pan(char add[hang][shu], int a, int b)
{
int i = 0;
int j = 0;
for (i = 0; i < a; i++)
{
for (j = 0; j < b; j++)
{
printf("%c", add[i][j]);
if(j<b-1)
printf(" |");
}
printf("\n");
if (i < a - 1)
{
for (j = 0; j < b; j++)
{
printf("--");
if (j < b - 1)
printf("|");
}
printf("\n");
}
}
}
void wan_jia(char add[hang][shu], int a, int b)
{
printf("玩家走");
int x;
int y;
while (1)
{
printf("\n请输入坐标");
scanf_s("%d%d", &x, &y);
if (x >= 1 && x <= a && y >= 1 && y <= b)
{
if (add[y - 1][x - 1] == ' ')
{
add[y - 1][x - 1] = '*';
break;
}
else
{
printf("坐标已落子:");
}
}
else
{
printf("坐标不合法:");
}
}}
void dian_niao(char add[hang][shu], int a, int b)
{
printf("电脑走\n");
while(1)
{
int x = rand() % hang;
int y = rand() % shu;
if (add[x][y] == ' ')
{
add[x][y] = '#';
break;
}
}
}
char shu_ying(char add[hang][shu], int a, int b)
{
int i;
for (i = 0; i < a; i++)
{
if (add[i][0] == '*' && add[i][1] == '*' && add[i][2] == '*')
{
printf("玩家赢:\n");
return '*';
}
}
for (i = 0; i < a; i++)
{
if (add[0][i] == '*' && add[1][i] == '*' && add[2][i] == '*')
{
printf("玩家赢:\n");
return '*';
}
}
if (add[0][0] == '*' && add[1][1] == '*' && add[2][2] == '*')
{
printf("玩家赢:\n");
return '*';
}
if (add[0][2] == '*' && add[1][1] == '*' && add[2][0] == '*')
{
printf("玩家赢:\n");
return '*';
}
for (i = 0; i < a; i++)
{
if (add[i][0] == '#' && add[i][1] == '#' && add[i][2] == '#')
{
printf("电脑赢:\n");
return '#';
}
}
for (i = 0; i < a; i++)
{
if (add[0][i] == '#' && add[1][i] == '#' && add[2][i] == '#')
{
printf("电脑赢:\n");
return '#';
}
}
if (add[0][0] == '#' && add[1][1] == '#' && add[2][2] == '#')
{
printf("电脑赢:\n");
return '#';
}
if (add[0][2] == '#' && add[1][1] == '#' && add[2][0] == '#')
{
printf("电脑赢:\n");
return '#';
}
int j;
for (i = 0; i < a; i++)
{
for (j = 0; j < b; j++)
{
if (add[i][j] == ' ')
return 'c';
}
}
printf("平局");
return 'k';
}
三 注意
在引用rand时,要注意其产生的随机值是伪随机值,所以引用了time,作为其的种子,从而达到其产生一个近似于随机值的效果。
总结
在编写程序时,一定要有模块化的思想,比如在上面的代码中,我将游戏主体分开来写,编写多个函数来实现其功能。模块化可以使代码更加清晰,可以更快的找到代码中的错误,同时避免了一处出错,整个程序都不能运行。