目錄
一:三子棋
1.游戲的基本開始流程()
2.三子棋的實作
2.1第一步寫出基本流程
2.2第二步列印選單
2.3游戲的實作
2.3.1初始化棋盤
2.3.2列印棋盤
2.3.3玩家下棋
2.3.4電腦下棋
2.3.5判斷
2.4游戲的整個代碼
game.c:
2.5三子棋的擴展
二:vs如何發布exe檔案并附帶元件
第一步:vs->工具->命令列->開發者 PowerShell(P)
第二步:查看vs 是Debug還是Releas 是x86還是x64
第三步:找到exe所在位置
第四步:查詢你exe檔案所需要的的元件(dll)
一:三子棋
1.游戲的基本開始流程()
首先肯定是main函式的創建:
test.c:
int main()
{
test();
return 0;
}
這里我們為了使其看起來簡單就把后續的流程用test函式去接收
test.c:
//這是我們剛才的test函式
void test()
{
//這里我們創建input 來接收我們剛開始要去選擇的值
int input = 0;
//我們進來后就可以列印一個選單,告訴玩家有哪些選項
menu();
//對于游戲開始,我們可以使用do while回圈(先使用,后判斷),因為只要玩家
//點擊進來就一定要進行選擇,
//這整個就是一個最初始的模板,大家一定要記住哈!
//這樣以后自己去寫的話思路就很清晰,只有自己思路清晰了才能寫出好的代碼,當然出BUG的
//概率也會小很多哈!別一杯茶一支煙,一個BUG一整天哈哈!(前兩天體驗過了QAQ)
do
{
printf("請選擇:\n");
scanf("%d", &input);
switch (input)
{
case 1:
printf("開始游戲\n");
game();
break;
//這個case 0 為退出大家最好以后就這么規定,為什么看下面的補充
case 0:
printf("退出游戲\n");
break;
default:
printf("輸入錯誤,請重新選擇\n");
break;
}
//接上,因為如果input==0,我們想要退出時輸入0,上面會列印退出游戲,
//但真正要退出游戲還是要看while()里面的值是否為0,但如果我們把input
//傳進while()里面,當我們輸入0時 while回圈判斷為假,就真正的退出回圈也就
//是退出游戲了哈!所以大家記住這兩點哈,1是case: 0退出游戲
//2是while()里面放input,
} while (input);
}
以上就是對于大部分游戲的基本流程,接下來我們來進行補充,
2.三子棋的實作
開始之前,我先為大家說明,當我們實作較為復雜的代碼時,我們一般會創建三個專案,以我們這個游戲為例,我們就創建了 test.c game.c game.h,前面的是我們測驗代碼的地方,后面兩個合起來為游戲的實作,
好的接下來我們正式開始:
有了上面的游戲基本流程,就到了游戲的實作,我們還是要先有一個思路,要知道我們要干什么,怎么干是后面的事情,重點思路還是要清晰,
這個三子棋的樣子我先給大家展示:

可以知道我們游戲實作的思路大致為5點:
1.初始化棋盤
2.列印棋盤
3.玩家下棋
4.電腦下棋
5.判斷
2.1第一步寫出基本流程
test.c:
void test()
{
int input = 0;
menu();
do
{
printf("請選擇:\n");
scanf("%d", &input);
switch (input)
{
case 1:
printf("開始游戲\n");
game();
break;
case 0:
printf("退出游戲\n");
break;
default:
printf("輸入錯誤,請重新選擇\n");
break;
}
} while (input);
}
2.2第二步列印選單
這個里面就自己設計就行,但是最好遵循我上面說的兩點:
test.c:
void menu()
{
printf("**********************************\n");
printf("****** 1.play ******\n");
printf("****** 2.exit ******\n");
printf("**********************************\n");
}
2.3游戲的實作
這里提一點,我們用#define來定義 ROW(行)和COL(列),因為這樣我們可以更好地去維護我們的代碼,后期想要改成更大的棋盤直接改這兩個值就可以了,而且對于寫的較多代碼的實作,我們盡可能去用有意義的值去定義他們,以便于提升代碼的閱讀能力,
test.c:
void game()
{
char Board[ROW][COL] = { 0 };
//初始化棋盤
InitBoard(Board, ROW, COL);
//列印棋盤
DisplayBoard(Board, ROW, COL);
//下棋
while (1)
{
//玩家下棋 *
printf("玩家下棋:\n");
Player_move(Board, ROW, COL);
DisplayBoard(Board, ROW, COL);
//電腦下棋 #
printf("電腦下棋\n");
Computer_move(Board, ROW, COL);
DisplayBoard(Board, ROW, COL);
}
當然寫到這里了就少不了函式的宣告,前面我們說了,我們要把函式的宣告放在一個叫做game.h的頭檔案當中,這里我就直接把所有的代碼發出來了防止大家代碼太多搞混:
game.h:
#pragma once
//上面這行大家不用管哈,等檔案操作部分會講,但是可以提一下這個的意思就是當有兩個一樣的
//頭檔案被宣告時就只會保留一個就這個意思哈!
#define ROW 3
#define COL 3
//這是剛剛定義的行和列
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
//對于函式的名稱大家可以發現都是有特殊意義的,這是很重要的哈!不然寫完了自己不知道寫的什么
//別人也不知道那就尷尬了哈!
//初始化棋盤宣告
void InitBoard(char Board[ROW][COL],int row,int col);
//列印棋盤宣告
void DisplayBoard(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);
//勝利宣告
char Is_win(char Board[ROW][COL], int row, int col);
//平局宣告
int Is_full(char Board[ROW][COL], int row, int col);
然后提一下,這里我們傳的引數都是陣列和他的行數和列數
還有這路的row和col都是小寫并不是大寫是因為大寫的已經被定義了,我們不能重復使用因為他們根本就不是一個東西,還有個很重要的原因就是接收的行參一定要是變數!這里的大寫已經被定義為常量了所以一定不能傳過去
再然后就是接收陣列或者常數的時候在前面要加上型別名,后面用 “;” 結尾,還有不用寫回傳型別,因為是函式的宣告(只告訴程式有這么個函式),回傳型別在函式的定義里面寫,然后函式的定義是寫在game.c里面的,
2.3.1初始化棋盤

由圖我們發現格式是 空格%c空格| 的形式,我們先把棋盤的元素都賦值為空格:
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] = ' ';
}
}
}
2.3.2列印棋盤
還是先分析

但是我們發現如果直接列印三部分對于后續的改變代碼適應性就很差
這兩條紅色的應該是上面連著下面的,但是怕大家看不清楚就畫出了第二行的
但這也是三部分這兩條,只是說最右邊少了" |" 所以我們用了if哈
對于上述代碼我們就可以發現有很強的適應性,我們可以用row和col來控制列印的多少,
如下:
game.c:
void DisplayBoard(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++)
{
printf(" %c ", Board[i][j]);
if(j<COL-1)
printf("|");
}
printf("\n");
//列印列
for (j = 0; j < COL; j++)
{
printf("---");
if (j < COL-1)
printf("|");
}
printf("\n");
}
}
2.3.3玩家下棋
game.c:
void Player_move(char Board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
while (1)
{
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (Board[x - 1][y - 1] == ' ')
{
Board[x - 1][y - 1] = '*';
break;
}
else
{
printf("輸過啦!!!\n");
}
}
else
{
printf("輸出去啦!!!!\n請重新輸入:\n");
}
}
}
這里我們用了一個whle回圈,只有當玩家真正把數輸入進去的時候才能跳出回圈,所以在此之前我們要進行判斷,并且輸入的要是有效值,
2.3.4電腦下棋
game.c:
void Computer_move(char Board[ROW][COL], int row, int col)
{
while (1)
{
int x = rand() % ROW;
int y = rand() % COL;
if (Board[x][y] == ' ')
{
Board[x][y] = '#';
break;
}
}
}
在這里我們電腦下棋使用的是亂數生成法,是最簡單的實作方法,這里值得注意的是
rand()%ROW 生成的數屬于0到2,然后還是和上面一樣,找到空格就輸入,(因為這里生成的數都在0到2所以不可能出現越出棋盤,所以就不需要輸入判斷),當然我使用rand()函式要再用srand生成亂數種子,然后用時間戳去生成種子即:(unsigned int)srand(time(NULL)),再把這個式子放在:
test.c:

就可以生成偽亂數而且不重復啦,至于原理目前了解就行,目前不用理解,
2.3.5判斷
對于玩家和電腦下棋后我們要對棋盤進行判斷輸(#)贏(*)或者平局(Q)又或者繼續(C)
game.c:
char Is_win(char Board[ROW][COL], int row, int col)
{
int i = 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[1][1] == Board[2][2] && Board[1][1] != ' ')
{
return Board[1][1];
}
if (Board[0][2] == Board[1][1] && Board[1][1] == Board[2][0] && Board[1][1] != ' ')
{
return Board[1][1];
}
//判斷平局
if (1 == Is_full(Board, row, col))
{
return 'Q';
}
//繼續
return 'C';
}
在這里面我們又參考了一個函式Is_full()來進行平局的判斷,因為如果棋盤滿了的話都還沒有贏就是平局了,當然,如果都不是,那就要繼續游戲,
game.c:
int Is_full(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;
}
這里我們發現這個函式是有回傳值的(int),因為我們要對其回傳值進行接收判斷,所以我們還要再定義一個變數去接收(ret),

這樣游戲全部思路就完成啦!!!
大家可以好好回憶一下!!!
2.4游戲的整個代碼
test.c:
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void menu()
{
printf("**********************************\n");
printf("****** 1.play ******\n");
printf("****** 2.exit ******\n");
printf("**********************************\n");
}
//1.初始化棋盤
//2.列印棋盤
//3.玩家下棋
//4.電腦下棋
//5.判斷
void game()
{
char Board[ROW][COL] = { 0 };
//初始化棋盤
InitBoard(Board, ROW, COL);
//列印棋盤
DisplayBoard(Board, ROW, COL);
//下棋
int ret = 0;
while (1)
{
//玩家下棋 *
printf("玩家下棋:\n");
Player_move(Board, ROW, COL);
DisplayBoard(Board, ROW, COL);
ret = Is_win(Board, ROW, COL);
if (ret != 'C')
{
break;
}
//電腦下棋 #
printf("電腦下棋\n");
Computer_move(Board, ROW, COL);
DisplayBoard(Board, ROW, COL);
ret = Is_win(Board, ROW, COL);
if (ret != 'C')
{
break;
}
}
if (ret == '*')
{
printf("玩家勝利!!!\n");
}
else if (ret == '#')
{
printf("電腦勝利!!!\n");
}
else
{
printf("平局\n");
}
}
void test()
{
int input = 0;
srand((unsigned)time(NULL));
menu();
do
{
printf("請選擇:\n");
scanf("%d", &input);
switch (input)
{
case 1:
printf("開始游戲\n");
game();
break;
case 0:
printf("退出游戲\n");
break;
default:
printf("輸入錯誤,請重新選擇\n");
break;
}
} while (input);
}
int main()
{
test();
return 0;
}
game.h:
#pragma once
#define ROW 3
#define COL 3
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
//初始化棋盤宣告
void InitBoard(char Board[ROW][COL], int row, int col);
//列印棋盤宣告
void DisplayBoard(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);
//勝利宣告
char Is_win(char Board[ROW][COL], int row, int col);
//平局宣告
int Is_full(char Board[ROW][COL], int row, int col);
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;
int j = 0;
for (i = 0; i < ROW; i++)
{
//列印行
for (j = 0; j < COL; j++)
{
printf(" %c ", Board[i][j]);
if (j < COL - 1)
printf("|");
}
printf("\n");
//列印列
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)
{
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (Board[x - 1][y - 1] == ' ')
{
Board[x - 1][y - 1] = '*';
break;
}
else
{
printf("輸過啦!!!\n");
}
}
else
{
printf("輸出去啦!!!!\n請重新輸入:\n");
}
}
}
void Computer_move(char Board[ROW][COL], int row, int col)
{
while (1)
{
int x = rand() % ROW;
int y = rand() % COL;
if (Board[x][y] == ' ')
{
Board[x][y] = '#';
break;
}
}
}
int Is_full(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;
}
//玩家贏回傳 *
//電腦贏回傳 #
//平局 回傳 Q
//繼續 回傳 C
char Is_win(char Board[ROW][COL], int row, int col)
{
int i = 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[1][1] == Board[2][2] && Board[1][1] != ' ')
{
return Board[1][1];
}
if (Board[0][2] == Board[1][1] && Board[1][1] == Board[2][0] && Board[1][1] != ' ')
{
return Board[1][1];
}
//判斷平局
if (1 == Is_full(Board, row, col))
{
return 'Q';
}
//繼續
return 'C';
}
2.5三子棋的擴展
大家可以發現,目前我們的電腦走時是靠亂數的生成,所以電腦就表現得十分笨拙,所以我們可以自己去思考一下,比如如果電腦發現自己有兩個連在一起了,就直接放在第三個取得勝利,有還有如果發現玩家要連在一起了,就去阻斷玩家等,這是個思考題哈!
二:vs如何發布exe檔案并附帶元件
們在學習的時候經常編一些自己寫的程式,在 自己的電腦上我們肯定是 可以運行的,但是有時候在別人的電腦上,我們就會發現,有些程式并不能運行,
這是因為你的exe移植到另一臺電腦上,沒有包含程式所需要的元件(dll),因此程式不能運行,
接下來就教大家如何用vs發布exe檔案并附帶元件哈:
當然在正式開始之前我們先勾選檔案擴展名以至于我們更好查找

第一步:vs->工具->命令列->開發者 PowerShell(P)


第二步:查看vs 是Debug還是Releas 是x86還是x64




第三步:找到exe所在位置
第四步:查詢你exe檔案所需要的的元件(dll)
dumpbin /dependents 你的程式名字.exe (這個是指令)(dumpbin后面有空格注意了)

今天的內容就到這里了哈!!!
肝了幾天,實屬不易QAQ(字數1w+)!要是認為作者有一點幫助你的話!
就來一個點贊加關注吧!!!當然訂閱是更是求之不得!
最后的最后謝謝大家的觀看!!!
你們的支持是作者寫作的最大動力!!!
下期見哈!!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/355379.html
標籤:其他
上一篇:如果還學不會什么是UDP、TCP和DHCP協議,請私信我
下一篇:cgb2109-day09
