大家好,今天我们来写一个程序实现井字棋游戏
首先是主函数
#include<stdio.h>
#include<Windows.h>
include<time.h>
#define row 3
#define col 3
int main(){
int choice;
int board[row][col]={0};
while(1){
printf("**********************************\n");
printf(" 井字棋游戏 \n");
printf(" 1.游玩 2.退出 \n");
printf(" 请输入你的选择 \n");
printf("**********************************\n");
scanf("%d",&choice);
system("cls");
if(choice==1){
printf("start game\n");
game();
}
else if(choice==0){
printf("爱玩不玩");
break;
}
else{
printf("输入错误 请重新输入\n");
Sleep(2);
system("cls");
}
}
return 0;
}
主函数不易包含过多的代码以便更好的理解程序,这里的主函数主要实现的是游戏的多次游玩选择和主页面的设计(不算太美观);
接下来是游戏的主体函数game();可以将他令放入game.c中,并用game.h声明他所使用到的构造函数实现代码的进一步简化;
void game(){
initial_board(board);
while(judge(board)){
displayboard(board);
playergo(board);
if(judge(board)==0)
break;
computergo(board);
if(judge(board)==0)
break;
}
}
这里不难看出,想要实现游戏功能,需要构造五个函数 最后再由game进行判断
目录
#1.棋盘的初始
#2.棋盘的展示
#3.玩家下棋
#4.电脑下棋
#5.判断输赢平局
#game函数对上述函数的调用
#1.棋盘的初始
棋盘的初始initial_board
void initial_board(char board[row][col]){
for(int i=0;i<row;i++){
for(int j=0;j<=col;j++){
board[i][j]=' ';
}
}
这个没什么好说的,我们将board这个二维数组中的每个元素表示为稍后下棋时玩家和电脑的棋子
并把它的元素初始化为空格代表这里没有棋;为下一步搭建棋盘做准备
#2.棋盘的展示
棋盘的展示 displayboard
void displayboard(char board[row][col]){
for(int i=0;i<row;i++){
printf("| %c| %c| %c|\n",board[i][0],board[i][1],board[i][2]);
printf("|__|__|__|\n");
}
}
这里就是将棋盘一行行打印出来,使其可视化,方便玩家能够更好的下棋,值得注意的是,棋盘可以进行多次调试来达到竖线对齐与棋盘大小,棋子的形状,使棋盘更加美观.
#3.玩家下棋
玩家下棋 playergo
void playergo(char board[row][col]){
int x,y;
printf("轮到你下棋了\n");
again:;
printf("请输入你想下的坐标(1,1)~(3,3)\n");
scanf("%d%d",&x,&y);
if(x>3||y>3||x<1||y<1){
printf("输入错误请重新输入");
Sleep(1000);
system("cls");
goto again;
}
if(board[x-1][y-1]!=' '){
printf("该地方已经被下过棋了");
Sleep(1000);
system("cls");
goto again;
}
board[x-1][y-1]='*';
}
玩家需要在一个3x3的格子中进行操作,执子*棋,所以需要进行判断,如果输出超过这个值则需要重新输入;并且已经下过的地方不允许再下棋,所以也需要进行判断.为了使游戏更加的可玩,玩家的印象中数值是从一开始而不是数组的零开始,所以需要进行设置.此外,为了使显示窗口更加简洁,输入完成后需要清屏,并且错误提示需要有sleep进行停留,使玩家能够看到.此程序中有goto语句 该语句破坏了c语言程序从上往下读的顺序,最好不要使用
#4.电脑下棋
电脑下棋computergo
电脑执#棋 这里的电脑由于作者能力有限,不会根据你下的步骤进行下棋,他下棋的地方是随机的,由rand()%2实现,rand()会随机生成一个数,%2以后取值刚刚好为0~2;所以将xy都写为随机值,并且判断棋盘上是否有棋,为了使得程序更加真实,好似对面坐着个人,你每一步棋他都会思索,所以也可以加上sleep函数
void computergo(char board[3][3]){
int x,y;
system("cls");
printf("轮到电脑下棋\n");
printf("电脑思索中\n");
Sleep(2000);
system("cls") ;
again1:
srand(time(0));
x=rand()%2;
y=rand()%2;
if(board[x][y]!=' '){
goto again1;
}
board[x][y]='#';
#5.判断输赢平局
判断judge
这里通过遍历行.列.对角线判断输赢,如果棋盘全满了就输出平局 通过改变winner的符号进行判断和输出数值,值得注意的是,这个函数是既有返回值又有数值打印的,因此game调用时只需要用它做一次判断,不需要在单独执行一次,否则会打印出两个相同的结果
int judge(char board[3][3]){
char winner='x';
int flag=0;
for(int i=0;i<3;i++){
for(int k=0;k<3;k++){
if(board[i][k]==' ')
flag++;
}
}
if(flag==0)
winner='p';
else
winner='x';
if(board[0][0]==board[0][1]&&board[0][0]==board[0][2]&&board[0][0]!=' '){
winner=board[0][0];
}
if(board[1][0]==board[1][1]&&board[1][0]==board[1][2]&&board[1][0]!=' '){
winner=board[1][0];
}
if(board[2][0]==board[2][1]&&board[2][0]==board[2][2]&&board[2][0]!=' '){
winner=board[2][0];
}
if(board[0][0]==board[1][0]&&board[0][0]==board[2][0]&&board[0][0]!=' '){
winner=board[0][0];
}
if(board[0][2]==board[1][2]&&board[0][2]==board[2][2]&&board[0][2]!=' '){
winner=board[0][2];
}
if(board[0][1]==board[1][1]&&board[0][1]==board[2][1]&&board[0][1]!=' '){
winner=board[0][1];
}
if(board[0][0]==board[1][1]&&board[0][0]==board[2][2]&&board[0][0]!=' '){
winner=board[0][0];
}
if(board[0][2]==board[1][1]&&board[0][2]==board[2][0]&&board[0][2]!=' '){
winner=board[0][2];
}
if(winner=='#'){
printf("电脑赢了 3秒后将选择是否重新游玩\n");
Sleep(3000);
system("cls") ;
return 0;
}
if(winner=='*'){
printf("您赢了 3秒后将请选择是否重新游玩\n");
Sleep(3000);
system("cls") ;
return 0;
}
if(winner=='p'){
printf("和棋了 3秒后将选择是否重新游玩\n");
Sleep(3000);
system("cls") ;
return 0;
}
if(winner=='x'){
return 1;
}
}
#game函数对上述函数的调用
game函数对上述函数的调用主要是通过while循环,进行生成棋盘,玩家下棋,电脑下棋,清空棋盘,并在玩家与电脑每次下棋后进行判断,若有一方获胜或平局则跳出循环并输出结果