大家好,最近一直在學習C語言的相關知識,今天分享的是C語言中的三子棋代碼與思路
成都創新互聯是一家專注于成都網站設計、做網站、成都外貿網站建設公司與策劃設計,延平網站建設哪家好?成都創新互聯做網站,專注于網站建設10年,網設計領域的專業建站公司;建站業務涵蓋:延平等地區。延平做網站價格咨詢:13518219792首先分為頭文件game.h 和game.c與test.c三個文件??
目錄
1、菜單界面
2、玩家選擇游戲界面
3、初始化三子棋棋盤
4、打印棋盤
5、玩家下棋
6、電腦下棋
7、判斷輸贏 已經平局的函數
判斷棋盤是否滿的函數
在test.c中的game函數中調用
整體程序實現
test.c??
game.c
game.h
void menu()
{
printf("*****************************\n");
printf("*****************************\n");
printf("*******1、play ***********\n");
printf("*******0、exit ***********\n");
printf("*****************************\n");
printf("*****************************\n");
printf("*****************************\n");
}
2、玩家選擇游戲界面玩家輸入0/1進入游戲? 調用菜單界面? 選擇1調用game函數開始游戲? ?選擇0退出游戲
int main()
{
int input = 0;
srand((unsigned int)time(NULL)); //記得包含兩個頭文件
do
{
menu(); //先是打印菜單
printf("請選擇:");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戲\n");
break;
default:
printf("輸入錯誤,請重新輸入!\n");
break;
}
} while (input);
return 0;
}
3、初始化三子棋棋盤void initboard(char board[ROW][COL], int row, int col) //初始化棋盤
{
int i = 0;
for (i = 0; i< row; i++)
{
int j = 0;
for (j = 0; j< col; j++)
{
board[i][j] = ' '; //這是字符 不是字符串!!!!
}
}
}
初始化二維數組? ?這里將遍歷的行、列數組全部用字符‘ ’(字符空格)初始化
4、打印棋盤void display(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i< row; i++)
{
int j = 0;
for (j = 0; j< col; j++)
{
printf(" %c ", board[i][j]);
if (j< col - 1)
{
printf("|");
}
}
printf("\n");
if (i< row - 1)
{
for (j = 0; j< col; j++)
{
printf("---");
if (j< col - 1)
{
printf("|");
}
}
printf("\n");
}
}
}
這里將三子棋“井”字框架搭建起來
5、玩家下棋void player_move(char board[ROW][COL], int row, int col) //玩家下棋
{
int x = 0;
int y = 0;
while (1)
{
printf("玩家下棋:\n");
scanf("%d %d", &x, &y);
if (x >= 1 && x<= row && y >= 1 && y<= col)
{
if (board[x - 1][y - 1] == ' ') //因為玩家是送1開始的 數組的坐標是從0開始的 所以必須減1
{
board[x - 1][y - 1] = '*';
break;
}
else
{
printf("坐標已滿,請重新輸入!");
}
}
else
{
printf("輸入的坐標非法,請重新輸入");
}
}
}
這里輸入坐標,將‘? ’位置換成‘*’ 并加入判斷語句 ,如果輸入的坐標不符合條件范圍則坐標非法,如果輸入的坐標沒有‘ ’,則說明此坐標已經被占用。
6、電腦下棋#include#includevoid computer_move(char board[ROW][COL], int row, int col) //電腦下棋
{
int x = 0;
int y = 0;
printf("電腦下棋:\n");
while (1)
{
x = rand() % row; // 0~2 隨機數
y = rand() % col; // 0~2 隨機數
if (board[x ][y ] == ' ') //0~2的隨機數 這時坐標就不能在減1
{
board[x][y] = '#';
break;
}
}
}
電腦下棋需要生成隨機的坐標? 這里用到隨機函數,這樣對行、列取模? 得到的是0~2的隨機數,在坐標中while循環填入? ,填入后退出循環。
7、判斷輸贏 已經平局的函數int iswin(char board[ROW][COL], 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][2 ]!= ' ')//判斷行
{
return board[i][0]; //這里返回i行的幾列都行 結果都是相同的
}
}
for (j = 0; j< col; j++)
{
if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[2][j] != ' ')//判斷列
{
return board[0][j]; //這里返回j列的幾行都行 結果都是相同的
}
}
if (board[0][0] == board[1][1]&& board[1][1 ]== board[2][2] && board[2][2] != ' ') //判斷對角線
{
return board[0][0];
}
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[2][0] != ' ')
{
return board[2][0];
}
if (isfull(board, ROW, COL) == 1) //如果滿了 用Q表示
{
return 'Q';
}
return 'C'; //沒滿 繼續 用C表示
}
此函數通過判斷行、判斷列、判斷對角線是否相等且不等于‘ ’,來判斷是否滿足獲勝條件 如果滿足則返回結果? ‘*’說明玩家贏? ‘#’說明電腦贏? 返回‘Q’說明棋盤已滿 說明是平局? 如果以上條件都沒滿足則返回‘C’,游戲繼續 玩家與電腦繼續輸入
判斷棋盤是否滿的函數static int isfull(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i< row; i++)
{
int j = 0;
for (j = 0; j< col; j++)
{
if (board[i][j]==' ')
{
return 0; //返回0說明沒滿 返回1說明滿了
}
}
}
return 1;
}
此函數用來判斷棋盤是否滿? 如果有‘ ’說明沒滿返回0? ?不滿足說明滿了 返回1? ?同時此函數加入static說明在頭文件和test.c中都可以不出現 只用在iswin函數內部就行
以上就是游戲的基本邏輯了
在test.c中的game函數中調用void game()
{
char ret = '0';//初始化字符ret
char board[ROW][COL] = { 0 };
initboard(board, ROW, COL); //初始化棋盤
display(board, ROW, COL); //打印棋盤
while (1)
{
player_move(board, ROW, COL);//玩家下棋
display(board, ROW, COL); //打印棋盤
ret = iswin(board, ROW, COL); //輸贏結果判斷
if (ret != 'C') //如果不繼續 要不棋盤滿了 要不電腦或者玩家贏了 退出循環
{
break;
}
computer_move(board, ROW, COL);//電腦下棋
display(board, ROW, COL); //打印棋盤
ret = iswin(board, ROW, COL); //輸贏結果判斷
if (ret != 'C') //如果不繼續 要不棋盤滿了 要不電腦或者玩家贏了 退出循環
{
break;
}
}
if (ret == '*')
{
printf("玩家獲勝!\n");
}
else if (ret == '#')
{
printf("電腦獲勝!\n");
}
else if (ret == 'Q')
{
printf("平局!\n");
}
}
整體程序實現
test.c??#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void menu()
{
printf("*****************************\n");
printf("*****************************\n");
printf("*******1、play ***********\n");
printf("*******0、exit ***********\n");
printf("*****************************\n");
printf("*****************************\n");
printf("*****************************\n");
}
void game()
{
char ret = '0';//初始化字符ret
char board[ROW][COL] = { 0 };
initboard(board, ROW, COL); //初始化棋盤
display(board, ROW, COL); //打印棋盤
while (1)
{
player_move(board, ROW, COL);//玩家下棋
display(board, ROW, COL); //打印棋盤
ret = iswin(board, ROW, COL); //輸贏結果判斷
if (ret != 'C') //如果不繼續 要不棋盤滿了 要不電腦或者玩家贏了 退出循環
{
break;
}
computer_move(board, ROW, COL);//電腦下棋
display(board, ROW, COL); //打印棋盤
ret = iswin(board, ROW, COL); //輸贏結果判斷
if (ret != 'C') //如果不繼續 要不棋盤滿了 要不電腦或者玩家贏了 退出循環
{
break;
}
}
if (ret == '*')
{
printf("玩家獲勝!\n");
}
else if (ret == '#')
{
printf("電腦獲勝!\n");
}
else if (ret == 'Q')
{
printf("平局!\n");
}
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL)); //記得包含兩個頭文件
do
{
menu(); //先是打印菜單
printf("請選擇:");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戲\n");
break;
default:
printf("輸入錯誤,請重新輸入!\n");
break;
}
} while (input);
return 0;
}
game.c#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void initboard(char board[ROW][COL], int row, int col) //初始化棋盤
{
int i = 0;
for (i = 0; i< row; i++)
{
int j = 0;
for (j = 0; j< col; j++)
{
board[i][j] = ' '; //這是字符 不是字符串!!!!
}
}
}
void display(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i< row; i++)
{
int j = 0;
for (j = 0; j< col; j++)
{
printf(" %c ", board[i][j]);
if (j< col - 1)
{
printf("|");
}
}
printf("\n");
if (i< row - 1)
{
for (j = 0; j< col; j++)
{
printf("---");
if (j< col - 1)
{
printf("|");
}
}
printf("\n");
}
}
}
void player_move(char board[ROW][COL], int row, int col) //玩家下棋
{
int x = 0;
int y = 0;
while (1)
{
printf("玩家下棋:\n");
scanf("%d %d", &x, &y);
if (x >= 1 && x<= row && y >= 1 && y<= col)
{
if (board[x - 1][y - 1] == ' ') //因為玩家是送1開始的 數組的坐標是從0開始的 所以必須減1
{
board[x - 1][y - 1] = '*';
break;
}
else
{
printf("坐標已滿,請重新輸入!");
}
}
else
{
printf("輸入的坐標非法,請重新輸入");
}
}
}
void computer_move(char board[ROW][COL], int row, int col) //電腦下棋
{
int x = 0;
int y = 0;
printf("電腦下棋:\n");
while (1)
{
x = rand() % row; // 0~2 隨機數
y = rand() % col; // 0~2 隨機數
if (board[x ][y ] == ' ') //0~2的隨機數 這時坐標就不能在減1
{
board[x][y] = '#';
break;
}
}
}
//封裝一個棋盤滿的函數 并且不給頭文件用 前面加上static
static int isfull(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i< row; i++)
{
int j = 0;
for (j = 0; j< col; j++)
{
if (board[i][j]==' ')
{
return 0; //返回0說明沒滿 返回1說明滿了
}
}
}
return 1;
}
int iswin(char board[ROW][COL], 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][2 ]!= ' ')//判斷行
{
return board[i][0]; //這里返回i行的幾列都行 結果都是相同的
}
}
for (j = 0; j< col; j++)
{
if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[2][j] != ' ')//判斷列
{
return board[0][j]; //這里返回j列的幾行都行 結果都是相同的
}
}
if (board[0][0] == board[1][1]&& board[1][1 ]== board[2][2] && board[2][2] != ' ') //判斷對角線
{
return board[0][0];
}
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[2][0] != ' ')
{
return board[2][0];
}
if (isfull(board, ROW, COL) == 1) //如果滿了 用Q表示
{
return 'Q';
}
return 'C'; //沒滿 繼續 用C表示
}
game.h#pragma once
#include#include#include#define ROW 3
#define COL 3
void initboard(char board[ROW][COL], int row, int col); //初始化棋盤
void display(char board[ROW][COL], int row, int col); //打印棋盤
void player_move(char board[ROW][COL], int row, int col); //玩家下棋
void computer_move(char board[ROW][COL], int row, int col);//電腦下棋
int iswin(char board[ROW][COL], int row, int col); //輸贏結果
頭文件主要包括函數的聲明和庫函數頭文件
以上就是實現三字棋的全部代碼
你是否還在尋找穩定的海外服務器提供商?創新互聯www.cdcxhl.cn海外機房具備T級流量清洗系統配攻擊溯源,準確流量調度確保服務器高可用性,企業級服務器適合批量采購,新人活動首月15元起,快前往官網查看詳情吧
分享題目:【C語言】實現三字棋-創新互聯
轉載來于:http://vcdvsql.cn/article40/jjeeo.html
成都網站建設公司_創新互聯,為您提供品牌網站制作、網站制作、企業建站、Google、域名注冊、企業網站制作
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯