三子棋小游戏

来源:互联网 发布:数据库union和join 编辑:程序博客网 时间:2024/05/18 15:06

在编写三子棋时最好采用图片中创建项目方式,将源文件和头文件分开创建


以后头文件放在game.h中就可以在其他源文件直接调用game.h头文件就行

game.h中放的代码如下:

#ifndef _GAME_H_#define _GAME_H_#include<stdio.h>#include"game.h"#include<windows.h>#include<time.h>#define ROW 3#define COL 3void InitBoard(char board[ROW][COL],int row,int col);//初始化棋盘函数void DisplayBoard(char board[ROW][COL],int row,int col);//打印棋盘函数void CompeterMove(char board[ROW][COL],int row,int col);//电脑走函数void PlayerMove(char board[ROW][COL],int row,int col);//人走函数char Iswin(char board[ROW][COL],int row,int col); //判断谁赢函数#endif
game.c中主要放的是游戏中所需要的的功能

#define  _CRT_SECURE_NO_WARNINGS 1#include"game.h"void InitBoard(char board[ROW][COL],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 DisplayBoard(char board[ROW][COL],int row,int col){int i = 0;for(i = 0;i < ROW;i++){printf(" %c | %c | %c \n",board[i][0],board[i][1],board[i][2]);if(i < ROW - 1){printf("---|---|---\n");}}}void CompeterMove(char board[ROW][COL],int row,int col){int x = 0;int y = 0;printf("电脑走\n");while(1){x = rand()%row; //限制电脑行走范围0-2y = rand()%col;if(board[x][y] == ' '){board[x][y] = 'D';break;}    }}void PlayerMove(char board[ROW][COL],int row,int col){int x = 0;int y = 0;printf("玩家走\n");while(1){printf("请输入->(x,y)");scanf("%d%d",&x,&y);if(x>=1 && x<=3 && y>=1 && y<=3){if(board[x-1][y-1] == ' '){board[x-1][y-1] = '*';break;}else {printf("坐标被占,请重新输入\n");continue;}}else{printf("输入坐标不在棋盘内\n");continue;}}} static int Isfull(char board[ROW][COL],int row,int col){int i = 0;int j = 0;for(i = 0;i< row;i++){for(j= 0;j< col;j++){if(board[i][j] == ' '){return 0;}}}return 1;}char Iswin(char board[ROW][COL],int row,int col){int i = 0;char ret = 0;for(i = 0;i < row;i++){if((board[i][0]==board[i][1])&&(board[i][1]==board[i][2])&&(board[i][1]!= ' ')){return board[i][1];}}for(i = 0;i < col;i++){ if((board[0][i]==board[1][i])&&(board[1][i]==board[2][i])&&(board[1][i]!=' ')){return board[1][i];}}if((board[0][0]==board[1][1])&&(board[2][2]==board[1][1])&&(board[1][1]!=' ')){return board[1][1];}else if((board[0][2]==board[1][1])&&(board[2][0]==board[1][1])&&(board[1][1]!=' ')){return board[1][1];}if(Isfull(board,row,col)){return 'q';}else{return ' ';}}

test10.c中放的是main函数以及菜单的打印和调用game.c中功能的函数

#define  _CRT_SECURE_NO_WARNINGS 1#include"game.h"void menu(){printf("******************************\n");printf("****  欢迎来到三子棋游戏  ****\n");printf("****   1.玩游戏  0.退出   ****\n");printf("******************************\n");}void game(){char ret = 0;char board[ROW][COL]={0};InitBoard(board,ROW,COL); //初始化棋盘DisplayBoard(board,ROW,COL);//打印棋盘while(1){PlayerMove(board,ROW,COL);//玩家走DisplayBoard(board,ROW,COL);//显示棋盘ret = Iswin(board,ROW,COL);//判断谁获胜{if(ret!=' ')   //如果返回的是' ',这说明没有人获胜,游戏继续,如果不是,则有人获胜或平局,跳出while循环{break;}}CompeterMove(board,ROW,COL);//电脑走DisplayBoard(board,ROW,COL);//显示电脑棋盘ret = Iswin(board,ROW,COL);{if(ret!=' '){break;}}}if(ret == 'D'){printf("电脑赢\n");}else if(ret == '*'){printf("你赢了\n");}else if(ret == 'q'){printf("平局\n");}}void test(){int input = 0;srand((unsigned int)time(NULL));do{menu();printf("请输入:");scanf("%d",&input);switch(input){case 0:break;case 1:game();break;default:printf("输入错误,请重新输入\n");break;}}while(input);}int main(){test();system("pause");return 0;}


在编写这个程序时我出现的问题有:

 1.每行相等时==写成了=,这样判断值一直有问题;

2.在返回return 'q '   时,我多给q后面打了一个空格,然后就会出现逻辑错误;

 ret = Iswin(board,ROW,COL);

 { 

if(re t!= '  ' )     // 这里就会接收' ',而不是q,所以当我棋满是就会卡死   

{  

break;  

}

 } 

3.每次打印棋盘都是要判断是否有人获胜 

4.在你编写游戏时,你要一步一步编写,一个功能实现后再加另一个功能,有错误了慢慢调试