解释一下,为了步骤需要,我把程序都拆分开了。但最后我会附上全部程序!!
最近学校布置了一个写三子棋的小程序,所以现在我分享一下我的思路(程序不重要,网上有好多的程序。我感觉最重要的是思路)
首先第一步,游戏嘛,应该有游戏主界面的(游戏的主页面正如一个人的脸面,整的漂亮点看着也舒服)
void mune()
{
printf("|---------------------------|\n");
printf("|~~~~~~~~~~~~~~~~~~~~~~~~~~~|\n");
printf("|~~~~~~~~~~三子棋~~~~~~~~~~~|\n");
printf("|~~~~~~~~~~~~~~~~~~~~~~~~~~~|\n");
printf("|~~~~~1.play 0.end~~~~~|\n");
printf("|~~~~~~~~~~~~~~~~~~~~~~~~~~~|\n");
printf("|---------------------------|\n");
}
这是我的页面(是不是能好看点)
接下来那就得输入玩或者不玩了以及主函数的内容
#include "game.h"//这是这个游戏所有的头文件
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main()
{
int input = 0;
do
{
mune();
printf("请选择:");
scanf("%d",&input);
switch(input)
{
case 1:
game();//这里是游戏程序
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("输入有误\n");
}
}while(input);
return 0;
}
结果如下
接下来我们该打印棋盘了
void display_board(char board[ROWS][COLS],int row,int col)
{
int i = 0;
printf("|-----------|\n");
for(i=0; i<row; i++)
{
printf("| %c | %c | %c |\n",board[i][0],board[i][1],board[i][2]);
printf("|-----------|\n");
}
}
棋盘也是可以设计成很好看的
接下来我们就该下棋了
void play_move(char board[ROWS][COLS],int row,int col)
{
int i = 0;
int j = 0;
while(1)
{
printf("请输入坐标:");
scanf("%d%d",&i,&j);
i--;
j--;
printf("你走的:\n");
if(((i>=0)&&(i<=2))||((j>=0)&&(j<=2)))
//这里我们必须判断你输入的在棋盘范围内
{
if(board[i][j] == ' ')//这里是这个坐标是空的才可以放入
{
board[i][j] = 'X';
break;
}
else
{
printf("输入坐标有误,请重新输入:\n");
continue;
}
}
else
{
printf("输入坐标有误,请重新输入:\n");
continue;
}
}
}
这是正确执行一次的结果
这是错误的坐标和已被占用的坐标的坐标
接下来我们就得写电脑走了
void computer_move(char board[ROWS][COLS],int row,int col)
{
int i = 0;
int j = 0;
while(1)
{
i = rand()%3;
j = rand()%3;
printf("电脑走的:\n");
if(board[i][j] == ' ')
{
board[i][j] = '0';
break;
}
}
}
在这里我只能采用随机值了,毕竟水平不高,不过我想我一定能写出高级的电脑走的算法的
这样就剩最后的输赢判断了
char check_win(char board[ROWS][COLS],int row,int col)
{
int i = 0;
int j = 0;
for(i=0; i<row; i++)//行检查
{
if((board[i][0]==board[i][1])
&&(board[i][1]==board[i][2])
&&(board[i][0]=='X'))
return 1;
else if((board[i][0]==board[i][1])
&&(board[i][1]==board[i][2])
&&(board[i][0]=='0'))
return 2;
}
for(i=0; i<col; i++)//列检查
{
if((board[0][i]==board[1][i])
&&(board[1][i]==board[2][i])
&&(board[0][i]=='X'))
return 1;
else if((board[0][i]==board[1][i])
&&(board[1][i]==board[2][i])
&&(board[0][i]=='0'))
return 2;
}
//右斜检查
if((board[0][2]==board[1][1])
&&(board[2][0]==board[1][1])
&&(board[0][2]=='X'))
return 1;
if((board[0][2]==board[1][1])
&&(board[2][0]==board[1][1])
&&(board[0][2]=='0'))
return 2;
//左斜检查
if((board[0][0]==board[1][1])
&&(board[2][2]==board[1][1])
&&(board[0][0]=='X'))
return 1;
if((board[0][0]==board[1][1])
&&(board[2][2]==board[1][1])
&&(board[0][0]=='0'))
return 2;
return 0;
}
玩家赢
电脑赢
平局判断
char check_pingju(char board[ROWS][COLS],int row,int col)
{
int i = 0;
int j = 0;
int count = row*col;
for(i=0; i<row; i++)
{
for(j=0; j<col; j++)
{
if(board[i][j] != ' ')
count--;
}
}
if(count == 0)
{
return 1;
}
return 0;
}
游戏思路就是如上所述, 整体代码如下:
————————————————————————————game.h————————————————————————————
#ifndef __GAME_H__
#define __GAME_H__
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define ROWS 3
#define COLS 3
void init_board(char board[ROWS][COLS],int row,int col);
void display_board(char board[ROWS][COLS],int row,int col);
void play_move(char board[ROWS][COLS],int row,int col);
void computer_move(char board[ROWS][COLS],int row,int col);
char check_win(char board[ROWS][COLS],int row,int col);
char check_pingju(char board[ROWS][COLS],int row,int col);
#endif //__GAME_H__
——————————————————————————game.c————————————————————————————
#include <stdio.h>
#include "game.h"
void init_board(char board[ROWS][COLS],int row,int col)
{
int i = 0;
int j = 0;
for(i=0; i<row; i++)
{
for(j=0; j<col; j++)
{
board[i][j] =' ';
}
}
}
void display_board(char board[ROWS][COLS],int row,int col)
{
int i = 0;
printf("|-----------|\n");
for(i=0; i<row; i++)
{
printf("| %c | %c | %c |\n",board[i][0],board[i][1],board[i][2]);
printf("|-----------|\n");
}
}
void play_move(char board[ROWS][COLS],int row,int col)
{
int i = 0;
int j = 0;
while(1)
{
printf("请输入坐标:");
scanf("%d%d",&i,&j);
i--;
j--;
if(((i>=0)&&(i<=2))||((j>=0)&&(j<=2)))
{
if(board[i][j] == ' ')
{
board[i][j] = 'X';
printf("你走的:\n");
break;
}
else
{
printf("输入坐标有误,请重新输入:\n");
continue;
}
}
else
{
printf("输入坐标有误,请重新输入:\n");
continue;
}
}
}
void computer_move(char board[ROWS][COLS],int row,int col)
{
int i = 0;
int j = 0;
while(1)
{
i = rand()%3;
j = rand()%3;
if(board[i][j] == ' ')
{
board[i][j] = '0';
printf("电脑走的:\n");
break;
}
}
}
char check_win(char board[ROWS][COLS],int row,int col)
{
int i = 0;
int j = 0;
for(i=0; i<row; i++)
{
if((board[i][0]==board[i][1])
&&(board[i][1]==board[i][2])
&&(board[i][0]=='X'))
return 1;
else if((board[i][0]==board[i][1])
&&(board[i][1]==board[i][2])
&&(board[i][0]=='0'))
return 2;
}
for(i=0; i<col; i++)
{
if((board[0][i]==board[1][i])
&&(board[1][i]==board[2][i])
&&(board[0][i]=='X'))
return 1;
else if((board[0][i]==board[1][i])
&&(board[1][i]==board[2][i])
&&(board[0][i]=='0'))
return 2;
}
if((board[0][2]==board[1][1])
&&(board[2][0]==board[1][1])
&&(board[0][2]=='X'))
return 1;
if((board[0][2]==board[1][1])
&&(board[2][0]==board[1][1])
&&(board[0][2]=='0'))
return 2;
if((board[0][0]==board[1][1])
&&(board[2][2]==board[1][1])
&&(board[0][0]=='X'))
return 1;
if((board[0][0]==board[1][1])
&&(board[2][2]==board[1][1])
&&(board[0][0]=='0'))
return 2;
return 0;
}
char check_pingju(char board[ROWS][COLS],int row,int col)
{
int i = 0;
int j = 0;
int count = row*col;
for(i=0; i<row; i++)
{
for(j=0; j<col; j++)
{
if(board[i][j] != ' ')
count--;
}
}
if(count == 0)
{
return 1;
}
return 0;
}
————————————————————————————test.c————————————————————————————
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include "game.h"
void mune()
{
printf("|---------------------------|\n");
printf("|~~~~~~~~~~~~~~~~~~~~~~~~~~~|\n");
printf("|~~~~~~~~~~三子棋~~~~~~~~~~~|\n");
printf("|~~~~~~~~~~~~~~~~~~~~~~~~~~~|\n");
printf("|~~~~~1.play 0.end~~~~~|\n");
printf("|~~~~~~~~~~~~~~~~~~~~~~~~~~~|\n");
printf("|---------------------------|\n");
}
void game()
{
char board[ROWS][COLS];
char ret = 0;
char tmp = 2;
init_board(board,ROWS,COLS);
display_board(board,ROWS,COLS);
srand((unsigned int)time(NULL));
while(1)
{
play_move(board,ROWS,COLS);
display_board(board,ROWS,COLS);
ret=check_win(board,ROWS,COLS);
if(ret != 0)
break;
tmp=check_pingju(board,ROWS,COLS);
if(tmp != 0)
break;
printf("-----------\n");
computer_move(board,ROWS,COLS);
display_board(board,ROWS,COLS);
ret=check_win(board,ROWS,COLS);
if(ret != 0)
break;
tmp=check_pingju(board,ROWS,COLS);
if(tmp != 0)
break;
}
if(ret == 1)
printf("玩家赢\n");
else if(ret == 2)
printf("电脑赢\n");
if(tmp == 1)
printf("平局\n");
}
int main()
{
int input = 0;
do
{
mune();
printf("请选择:");
scanf("%d",&input);
switch(input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("输入有误\n");
}
}while(input);
return 0;
}